mirror of
https://github.com/git/git
synced 2024-08-28 20:20:07 +00:00
git-stash.sh: fix flawed fix of invalid ref handling (commit da65e7c1
)
The referenced commit tried to fix a flaw in stash's handling of a user supplied invalid ref. i.e. 'git stash apply fake_ref@{0}' should fail instead of applying stash@{0}. But, it did so in a naive way by avoiding the use of the --default option of rev-parse, and instead manually supplied the default revision if the user supplied an empty command line. This prevented a common usage scenario of supplying flags on the stash command line (i.e. non-empty command line) which would be parsed by lower level git commands, without supplying a specific revision. This should fall back to the default revision, but now it causes an error. e.g. 'git stash show -p' The correct fix is to use the --verify option of rev-parse, which fails properly if an invalid ref is supplied, and still allows falling back to a default ref when one is not supplied. Convert stash-drop to use --verify while we're at it, since specifying multiple revisions for any of these commands is also an error and --verify makes it so. Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
027b5a4f3e
commit
875471c510
22
git-stash.sh
22
git-stash.sh
|
@ -145,16 +145,8 @@ show_stash () {
|
||||||
flags=--stat
|
flags=--stat
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test $# = 0
|
w_commit=$(git rev-parse --verify --default $ref_stash "$@") &&
|
||||||
then
|
b_commit=$(git rev-parse --verify "$w_commit^") &&
|
||||||
set x "$ref_stash@{0}"
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
s=$(git rev-parse --revs-only --no-flags "$@")
|
|
||||||
|
|
||||||
w_commit=$(git rev-parse --verify "$s") &&
|
|
||||||
b_commit=$(git rev-parse --verify "$s^") &&
|
|
||||||
git diff $flags $b_commit $w_commit
|
git diff $flags $b_commit $w_commit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,19 +162,13 @@ apply_stash () {
|
||||||
shift
|
shift
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if test $# = 0
|
|
||||||
then
|
|
||||||
set x "$ref_stash@{0}"
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# current index state
|
# current index state
|
||||||
c_tree=$(git write-tree) ||
|
c_tree=$(git write-tree) ||
|
||||||
die 'Cannot apply a stash in the middle of a merge'
|
die 'Cannot apply a stash in the middle of a merge'
|
||||||
|
|
||||||
# stash records the work tree, and is a merge between the
|
# stash records the work tree, and is a merge between the
|
||||||
# base commit (first parent) and the index tree (second parent).
|
# base commit (first parent) and the index tree (second parent).
|
||||||
s=$(git rev-parse --revs-only --no-flags "$@") &&
|
s=$(git rev-parse --verify --default $ref_stash "$@") &&
|
||||||
w_tree=$(git rev-parse --verify "$s:") &&
|
w_tree=$(git rev-parse --verify "$s:") &&
|
||||||
b_tree=$(git rev-parse --verify "$s^1:") &&
|
b_tree=$(git rev-parse --verify "$s^1:") &&
|
||||||
i_tree=$(git rev-parse --verify "$s^2:") ||
|
i_tree=$(git rev-parse --verify "$s^2:") ||
|
||||||
|
@ -242,7 +228,7 @@ drop_stash () {
|
||||||
shift
|
shift
|
||||||
fi
|
fi
|
||||||
# Verify supplied argument looks like a stash entry
|
# Verify supplied argument looks like a stash entry
|
||||||
s=$(git rev-parse --revs-only --no-flags "$@") &&
|
s=$(git rev-parse --verify "$@") &&
|
||||||
git rev-parse --verify "$s:" > /dev/null 2>&1 &&
|
git rev-parse --verify "$s:" > /dev/null 2>&1 &&
|
||||||
git rev-parse --verify "$s^1:" > /dev/null 2>&1 &&
|
git rev-parse --verify "$s^1:" > /dev/null 2>&1 &&
|
||||||
git rev-parse --verify "$s^2:" > /dev/null 2>&1 ||
|
git rev-parse --verify "$s^2:" > /dev/null 2>&1 ||
|
||||||
|
|
Loading…
Reference in a new issue