[PATCH] git stash: Give friendlier errors when there is nothing to apply
- From
Ori Avtalion <ori@avtalion.name>
- Date
- Aug 11, 2009, 11:12 UTC
- Message-ID
- <4a81787d.0e0f660a.5238.4c8b@mx.google.com>
- In-Reply-To
- <200908111409.04506.trast@student.ethz.ch>
The change makes sure a stash (given or default) exists before checking if the working tree is dirty.
If the default stash is requested, the old message was scary and
included a 'fatal' error from rev-parse:
fatal: Needed a single revision
: no valid stashed state foundIt is replaced with a friendlier 'Nothing to apply' error, similar to 'git stash branch'.
If a specific stash is specified, the 'Needed a single revision' errors from rev-parse are suppressed.
Signed-off-by: Ori Avtalion <ori@avtalion.name> ---
Thomas, I added handling for the 'git stash apply <stash>' case based on your reminder, and also changed the error messages related to it.
All of the stash tests pass, as before.
git-stash.sh | 27 ++++++++++++++++----------- 1 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/git-stash.sh b/git-stash.sh index 03e589f..d61c9d0 100755 --- a/git-stash.sh +++ b/git-stash.sh @@ -162,10 +162,6 @@ show_stash () { } apply_stash () { - git update-index -q --refresh && - git diff-files --quiet --ignore-submodules || - die 'Cannot apply to a dirty working tree, please stage your changes' - unstash_index= while test $# != 0 @@ -184,18 +180,27 @@ apply_stash () { shift done - # current index state - c_tree=$(git write-tree) || - die 'Cannot apply a stash in the middle of a merge' + if test $# = 0 + then + have_stash || die 'Nothing to apply' + fi # 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 --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:") || + s=$(git rev-parse --quiet --verify --default $ref_stash "$@") && + w_tree=$(git rev-parse --quiet --verify "$s:") && + b_tree=$(git rev-parse --quiet --verify "$s^1:") && + i_tree=$(git rev-parse --quiet --verify "$s^2:") || die "$*: no valid stashed state found" + git update-index -q --refresh && + git diff-files --quiet --ignore-submodules || + die 'Cannot apply to a dirty working tree, please stage your changes' + + # current index state + c_tree=$(git write-tree) || + die 'Cannot apply a stash in the middle of a merge' + unstashed_index_tree= if test -n "$unstash_index" && test "$b_tree" != "$i_tree" && test "$c_tree" != "$i_tree"
-- 1.6.4.115.g82cf7