Skip to content

Commit

Permalink
git-stash.sh: fix flawed fix of invalid ref handling (commit da65e7c)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Brandon Casey authored and Shawn O. Pearce committed Oct 9, 2008
1 parent 027b5a4 commit 875471c
Showing 1 changed file with 4 additions and 18 deletions.
22 changes: 4 additions & 18 deletions git-stash.sh
Original file line number Diff line number Diff line change
Expand Up @@ -145,16 +145,8 @@ show_stash () {
flags=--stat
fi

if test $# = 0
then
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^") &&
w_commit=$(git rev-parse --verify --default $ref_stash "$@") &&
b_commit=$(git rev-parse --verify "$w_commit^") &&
git diff $flags $b_commit $w_commit
}

Expand All @@ -170,19 +162,13 @@ apply_stash () {
shift
esac

if test $# = 0
then
set x "$ref_stash@{0}"
shift
fi

# current index state
c_tree=$(git write-tree) ||
die 'Cannot apply a stash in the middle of a merge'

# stash records the work tree, and is a merge between the
# 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:") &&
b_tree=$(git rev-parse --verify "$s^1:") &&
i_tree=$(git rev-parse --verify "$s^2:") ||
Expand Down Expand Up @@ -242,7 +228,7 @@ drop_stash () {
shift
fi
# 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^1:" > /dev/null 2>&1 &&
git rev-parse --verify "$s^2:" > /dev/null 2>&1 ||
Expand Down

0 comments on commit 875471c

Please sign in to comment.