summaryrefslogtreecommitdiff
path: root/git-stash.sh
diff options
context:
space:
mode:
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>2007-07-02 11:14:49 (GMT)
committerJunio C Hamano <gitster@pobox.com>2007-07-06 08:43:24 (GMT)
commit150937c42591b0e9fb6c17f96c459d57b5f3bfdb (patch)
treec6e6c6563da7c6e5846056d49ffaee88a92aec60 /git-stash.sh
parent46f74f007b86452c4b4135f5145f94eefc994ea2 (diff)
downloadgit-150937c42591b0e9fb6c17f96c459d57b5f3bfdb.zip
git-150937c42591b0e9fb6c17f96c459d57b5f3bfdb.tar.gz
git-150937c42591b0e9fb6c17f96c459d57b5f3bfdb.tar.bz2
Teach git-stash to "apply --index"
When given this subcommand, git-stash will try to merge the stashed index into the current one. Only trivial merges are possible, since we have no index for the index ;-) If a trivial merge is not possible, git-stash will bail out with a hint to skip the --index option. For good measure, finally include a test case. Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'git-stash.sh')
-rwxr-xr-xgit-stash.sh21
1 files changed, 20 insertions, 1 deletions
diff --git a/git-stash.sh b/git-stash.sh
index f01494d..5c63ca5 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -111,6 +111,13 @@ apply_stash () {
git diff-files --quiet ||
die 'Cannot restore on top of a dirty state'
+ unstash_index=
+ case "$1" in
+ --index)
+ unstash_index=t
+ shift
+ esac
+
# current index state
c_tree=$(git write-tree) ||
die 'Cannot apply a stash in the middle of a merge'
@@ -120,6 +127,15 @@ apply_stash () {
b_tree=$(git rev-parse --verify "$s^:") ||
die "$*: no valid stashed state found"
+ test -z "$unstash_index" || {
+ git diff --binary $s^2^..$s^2 | git apply --cached
+ test $? -ne 0 &&
+ die 'Conflicts in index. Try without --index.'
+ unstashed_index_tree=$(git-write-tree) ||
+ die 'Could not save index tree'
+ git reset
+ }
+
eval "
GITHEAD_$w_tree='Stashed changes' &&
GITHEAD_$c_tree='Updated upstream' &&
@@ -137,9 +153,12 @@ apply_stash () {
die "Cannot unstage modified files"
git-status
rm -f "$a"
+ test -z "$unstash_index" || git read-tree $unstashed_index_tree
else
# Merge conflict; keep the exit status from merge-recursive
- exit
+ status=$?
+ test -z "$unstash_index" || echo 'Index was not unstashed.' >&2
+ exit $status
fi
}