Skip to content

Commit

Permalink
stash: teach quiet option
Browse files Browse the repository at this point in the history
Teach stash pop, apply, save, and drop to be quiet when told. By using
the quiet option (-q), these actions will be silent unless errors are
encountered.

Signed-off-by: Stephen Boyd <bebarino@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
bebarino authored and gitster committed Jun 18, 2009
1 parent 0e987a1 commit fcdd0e9
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 24 deletions.
15 changes: 8 additions & 7 deletions Documentation/git-stash.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ SYNOPSIS
--------
[verse]
'git stash' list [<options>]
'git stash' ( show | drop ) [<stash>]
'git stash' ( pop | apply ) [--index] [<stash>]
'git stash' show [<stash>]
'git stash' drop [-q|--quiet] [<stash>]
'git stash' ( pop | apply ) [--index] [-q|--quiet] [<stash>]
'git stash' branch <branchname> [<stash>]
'git stash' [save [--keep-index] [<message>]]
'git stash' [save [--keep-index] [-q|--quiet] [<message>]]
'git stash' clear
'git stash' create

Expand Down Expand Up @@ -41,7 +42,7 @@ is also possible).
OPTIONS
-------

save [--keep-index] [<message>]::
save [--keep-index] [-q|--quiet] [<message>]::

Save your local modifications to a new 'stash', and run `git reset
--hard` to revert them. This is the default action when no
Expand Down Expand Up @@ -75,7 +76,7 @@ show [<stash>]::
it will accept any format known to 'git-diff' (e.g., `git stash show
-p stash@\{1}` to view the second most recent stash in patch form).

pop [<stash>]::
pop [--index] [-q|--quiet] [<stash>]::

Remove a single stashed state from the stash list and apply it
on top of the current working tree state, i.e., do the inverse
Expand All @@ -93,7 +94,7 @@ longer apply the changes as they were originally).
+
When no `<stash>` is given, `stash@\{0}` is assumed.

apply [--index] [<stash>]::
apply [--index] [-q|--quiet] [<stash>]::

Like `pop`, but do not remove the state from the stash list.

Expand All @@ -115,7 +116,7 @@ clear::
Remove all the stashed states. Note that those states will then
be subject to pruning, and may be difficult or impossible to recover.

drop [<stash>]::
drop [-q|--quiet] [<stash>]::

Remove a single stashed state from the stash list. When no `<stash>`
is given, it removes the latest one. i.e. `stash@\{0}`
Expand Down
78 changes: 61 additions & 17 deletions git-stash.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@

dashless=$(basename "$0" | sed -e 's/-/ /')
USAGE="list [<options>]
or: $dashless ( show | drop ) [<stash>]
or: $dashless ( pop | apply ) [--index] [<stash>]
or: $dashless show [<stash>]
or: $dashless drop [-q|--quiet] [<stash>]
or: $dashless ( pop | apply ) [--index] [-q|--quiet] [<stash>]
or: $dashless branch <branchname> [<stash>]
or: $dashless [save [--keep-index] [<message>]]
or: $dashless [save [--keep-index] [-q|--quiet] [<message>]]
or: $dashless clear"

SUBDIRECTORY_OK=Yes
Expand Down Expand Up @@ -94,18 +95,28 @@ create_stash () {

save_stash () {
keep_index=
case "$1" in
--keep-index)
keep_index=t
while test $# != 0
do
case "$1" in
--keep-index)
keep_index=t
;;
-q|--quiet)
GIT_QUIET=t
;;
*)
break
;;
esac
shift
esac
done

stash_msg="$*"

git update-index -q --refresh
if no_changes
then
echo 'No local changes to save'
say 'No local changes to save'
exit 0
fi
test -f "$GIT_DIR/logs/$ref_stash" ||
Expand All @@ -118,9 +129,9 @@ save_stash () {

git update-ref -m "$stash_msg" $ref_stash $w_commit ||
die "Cannot save the current status"
printf 'Saved working directory and index state "%s"\n' "$stash_msg"
say Saved working directory and index state "$stash_msg"

git reset --hard
git reset --hard ${GIT_QUIET:+-q}

if test -n "$keep_index" && test -n $i_tree
then
Expand Down Expand Up @@ -156,11 +167,22 @@ apply_stash () {
die 'Cannot apply to a dirty working tree, please stage your changes'

unstash_index=
case "$1" in
--index)
unstash_index=t

while test $# != 0
do
case "$1" in
--index)
unstash_index=t
;;
-q|--quiet)
GIT_QUIET=t
;;
*)
break
;;
esac
shift
esac
done

# current index state
c_tree=$(git write-tree) ||
Expand Down Expand Up @@ -193,6 +215,10 @@ apply_stash () {
export GITHEAD_$w_tree GITHEAD_$c_tree GITHEAD_$b_tree
"

if test -n "$GIT_QUIET"
then
export GIT_MERGE_VERBOSITY=0
fi
if git-merge-recursive $b_tree -- $c_tree $w_tree
then
# No conflict
Expand All @@ -207,7 +233,12 @@ apply_stash () {
die "Cannot unstage modified files"
rm -f "$a"
fi
git status || :
squelch=
if test -n "$GIT_QUIET"
then
squelch='>/dev/null 2>&1'
fi
eval "git status $squelch" || :
else
# Merge conflict; keep the exit status from merge-recursive
status=$?
Expand All @@ -222,6 +253,19 @@ apply_stash () {
drop_stash () {
have_stash || die 'No stash entries to drop'

while test $# != 0
do
case "$1" in
-q|--quiet)
GIT_QUIET=t
;;
*)
break
;;
esac
shift
done

if test $# = 0
then
set x "$ref_stash@{0}"
Expand All @@ -235,7 +279,7 @@ drop_stash () {
die "$*: not a valid stashed state"

git reflog delete --updateref --rewrite "$@" &&
echo "Dropped $* ($s)" || die "$*: Could not drop stash entry"
say "Dropped $* ($s)" || die "$*: Could not drop stash entry"

# clear_stash if we just dropped the last stash entry
git rev-parse --verify "$ref_stash@{0}" > /dev/null 2>&1 || clear_stash
Expand Down Expand Up @@ -312,7 +356,7 @@ branch)
if test $# -eq 0
then
save_stash &&
echo '(To restore them type "git stash apply")'
say '(To restore them type "git stash apply")'
else
usage
fi
Expand Down
23 changes: 23 additions & 0 deletions t/t3903-stash.sh
Original file line number Diff line number Diff line change
Expand Up @@ -177,4 +177,27 @@ test_expect_success 'stash branch' '
test 0 = $(git stash list | wc -l)
'

test_expect_success 'apply -q is quiet' '
echo foo > file &&
git stash &&
git stash apply -q > output.out 2>&1 &&
test ! -s output.out
'

test_expect_success 'save -q is quiet' '
git stash save --quiet > output.out 2>&1 &&
test ! -s output.out
'

test_expect_success 'pop -q is quiet' '
git stash pop -q > output.out 2>&1 &&
test ! -s output.out
'

test_expect_success 'drop -q is quiet' '
git stash &&
git stash drop -q > output.out 2>&1 &&
test ! -s output.out
'

test_done

0 comments on commit fcdd0e9

Please sign in to comment.