diff options
author | Johannes Schindelin <Johannes.Schindelin@gmx.de> | 2007-07-02 12:14:49 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-07-06 01:43:24 -0700 |
commit | 150937c42591b0e9fb6c17f96c459d57b5f3bfdb (patch) | |
tree | c6e6c6563da7c6e5846056d49ffaee88a92aec60 /git-stash.sh | |
parent | 46f74f007b86452c4b4135f5145f94eefc994ea2 (diff) | |
download | git-150937c42591b0e9fb6c17f96c459d57b5f3bfdb.tar.gz |
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-x | git-stash.sh | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/git-stash.sh b/git-stash.sh index f01494dc1b..5c63ca5bce 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 } |