@matheusbsbs / matheus-bagliano / commits / 875471c510
Fork 0

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>

Brandon Casey committed Oct 2, 2008 at 18:52 UTC 875471c510b29f920693834b43a992c99694af58
1 file changed +4 -18
git-stash.sh
+4 -18
@@ -145,16 +145,8 @@ show_stash () {
145 flags=--stat
146 fi
147
148 - if test $# = 0
149 - then
150 - set x "$ref_stash@{0}"
151 - shift
152 - fi
153 -
154 - s=$(git rev-parse --revs-only --no-flags "$@")
155 -
156 - w_commit=$(git rev-parse --verify "$s") &&
157 - b_commit=$(git rev-parse --verify "$s^") &&
148 + w_commit=$(git rev-parse --verify --default $ref_stash "$@") &&
149 + b_commit=$(git rev-parse --verify "$w_commit^") &&
150 git diff $flags $b_commit $w_commit
151 }
152
@@ -170,19 +162,13 @@ apply_stash () {
162 shift
163 esac
164
173 - if test $# = 0
174 - then
175 - set x "$ref_stash@{0}"
176 - shift
177 - fi
178 -
165 # current index state
166 c_tree=$(git write-tree) ||
167 die 'Cannot apply a stash in the middle of a merge'
168
169 # stash records the work tree, and is a merge between the
170 # base commit (first parent) and the index tree (second parent).
185 - s=$(git rev-parse --revs-only --no-flags "$@") &&
171 + s=$(git rev-parse --verify --default $ref_stash "$@") &&
172 w_tree=$(git rev-parse --verify "$s:") &&
173 b_tree=$(git rev-parse --verify "$s^1:") &&
174 i_tree=$(git rev-parse --verify "$s^2:") ||
@@ -242,7 +228,7 @@ drop_stash () {
228 shift
229 fi
230 # Verify supplied argument looks like a stash entry
245 - s=$(git rev-parse --revs-only --no-flags "$@") &&
231 + s=$(git rev-parse --verify "$@") &&
232 git rev-parse --verify "$s:" > /dev/null 2>&1 &&
233 git rev-parse --verify "$s^1:" > /dev/null 2>&1 &&
234 git rev-parse --verify "$s^2:" > /dev/null 2>&1 ||