stash: add back the original, scripted `git stash`

This simply copies the version as of sd/stash-wo-user-name verbatim. As of now, it is not hooked up. The next commit will change the builtin `stash` to hand off to the scripted `git stash` when `stash.useBuiltin=false`. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Johannes Schindelin committed Feb 25, 2019 at 23:16 UTC 8d8e9c2a94c4cb60a0db2a496fd1f28fc6ec79f8
1 file changed +769
git-stash.sh new
+769
@@ -0,0 +1,769 @@
1 +#!/bin/sh
2 +# Copyright (c) 2007, Nanako Shiraishi
3 +
4 +dashless=$(basename "$0" | sed -e 's/-/ /')
5 +USAGE="list [<options>]
6 + or: $dashless show [<stash>]
7 + or: $dashless drop [-q|--quiet] [<stash>]
8 + or: $dashless ( pop | apply ) [--index] [-q|--quiet] [<stash>]
9 + or: $dashless branch <branchname> [<stash>]
10 + or: $dashless save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
11 + [-u|--include-untracked] [-a|--all] [<message>]
12 + or: $dashless [push [--patch] [-k|--[no-]keep-index] [-q|--quiet]
13 + [-u|--include-untracked] [-a|--all] [-m <message>]
14 + [-- <pathspec>...]]
15 + or: $dashless clear"
16 +
17 +SUBDIRECTORY_OK=Yes
18 +OPTIONS_SPEC=
19 +START_DIR=$(pwd)
20 +. git-sh-setup
21 +require_work_tree
22 +prefix=$(git rev-parse --show-prefix) || exit 1
23 +cd_to_toplevel
24 +
25 +TMP="$GIT_DIR/.git-stash.$$"
26 +TMPindex=${GIT_INDEX_FILE-"$(git rev-parse --git-path index)"}.stash.$$
27 +trap 'rm -f "$TMP-"* "$TMPindex"' 0
28 +
29 +ref_stash=refs/stash
30 +
31 +if git config --get-colorbool color.interactive; then
32 + help_color="$(git config --get-color color.interactive.help 'red bold')"
33 + reset_color="$(git config --get-color '' reset)"
34 +else
35 + help_color=
36 + reset_color=
37 +fi
38 +
39 +no_changes () {
40 + git diff-index --quiet --cached HEAD --ignore-submodules -- "$@" &&
41 + git diff-files --quiet --ignore-submodules -- "$@" &&
42 + (test -z "$untracked" || test -z "$(untracked_files "$@")")
43 +}
44 +
45 +untracked_files () {
46 + if test "$1" = "-z"
47 + then
48 + shift
49 + z=-z
50 + else
51 + z=
52 + fi
53 + excl_opt=--exclude-standard
54 + test "$untracked" = "all" && excl_opt=
55 + git ls-files -o $z $excl_opt -- "$@"
56 +}
57 +
58 +prepare_fallback_ident () {
59 + if ! git -c user.useconfigonly=yes var GIT_COMMITTER_IDENT >/dev/null 2>&1
60 + then
61 + GIT_AUTHOR_NAME="git stash"
62 + GIT_AUTHOR_EMAIL=git@stash
63 + GIT_COMMITTER_NAME="git stash"
64 + GIT_COMMITTER_EMAIL=git@stash
65 + export GIT_AUTHOR_NAME
66 + export GIT_AUTHOR_EMAIL
67 + export GIT_COMMITTER_NAME
68 + export GIT_COMMITTER_EMAIL
69 + fi
70 +}
71 +
72 +clear_stash () {
73 + if test $# != 0
74 + then
75 + die "$(gettext "git stash clear with parameters is unimplemented")"
76 + fi
77 + if current=$(git rev-parse --verify --quiet $ref_stash)
78 + then
79 + git update-ref -d $ref_stash $current
80 + fi
81 +}
82 +
83 +create_stash () {
84 +
85 + prepare_fallback_ident
86 +
87 + stash_msg=
88 + untracked=
89 + while test $# != 0
90 + do
91 + case "$1" in
92 + -m|--message)
93 + shift
94 + stash_msg=${1?"BUG: create_stash () -m requires an argument"}
95 + ;;
96 + -m*)
97 + stash_msg=${1#-m}
98 + ;;
99 + --message=*)
100 + stash_msg=${1#--message=}
101 + ;;
102 + -u|--include-untracked)
103 + shift
104 + untracked=${1?"BUG: create_stash () -u requires an argument"}
105 + ;;
106 + --)
107 + shift
108 + break
109 + ;;
110 + esac
111 + shift
112 + done
113 +
114 + git update-index -q --refresh
115 + if no_changes "$@"
116 + then
117 + exit 0
118 + fi
119 +
120 + # state of the base commit
121 + if b_commit=$(git rev-parse --verify HEAD)
122 + then
123 + head=$(git rev-list --oneline -n 1 HEAD --)
124 + else
125 + die "$(gettext "You do not have the initial commit yet")"
126 + fi
127 +
128 + if branch=$(git symbolic-ref -q HEAD)
129 + then
130 + branch=${branch#refs/heads/}
131 + else
132 + branch='(no branch)'
133 + fi
134 + msg=$(printf '%s: %s' "$branch" "$head")
135 +
136 + # state of the index
137 + i_tree=$(git write-tree) &&
138 + i_commit=$(printf 'index on %s\n' "$msg" |
139 + git commit-tree $i_tree -p $b_commit) ||
140 + die "$(gettext "Cannot save the current index state")"
141 +
142 + if test -n "$untracked"
143 + then
144 + # Untracked files are stored by themselves in a parentless commit, for
145 + # ease of unpacking later.
146 + u_commit=$(
147 + untracked_files -z "$@" | (
148 + GIT_INDEX_FILE="$TMPindex" &&
149 + export GIT_INDEX_FILE &&
150 + rm -f "$TMPindex" &&
151 + git update-index -z --add --remove --stdin &&
152 + u_tree=$(git write-tree) &&
153 + printf 'untracked files on %s\n' "$msg" | git commit-tree $u_tree &&
154 + rm -f "$TMPindex"
155 + ) ) || die "$(gettext "Cannot save the untracked files")"
156 +
157 + untracked_commit_option="-p $u_commit";
158 + else
159 + untracked_commit_option=
160 + fi
161 +
162 + if test -z "$patch_mode"
163 + then
164 +
165 + # state of the working tree
166 + w_tree=$( (
167 + git read-tree --index-output="$TMPindex" -m $i_tree &&
168 + GIT_INDEX_FILE="$TMPindex" &&
169 + export GIT_INDEX_FILE &&
170 + git diff-index --name-only -z HEAD -- "$@" >"$TMP-stagenames" &&
171 + git update-index -z --add --remove --stdin <"$TMP-stagenames" &&
172 + git write-tree &&
173 + rm -f "$TMPindex"
174 + ) ) ||
175 + die "$(gettext "Cannot save the current worktree state")"
176 +
177 + else
178 +
179 + rm -f "$TMP-index" &&
180 + GIT_INDEX_FILE="$TMP-index" git read-tree HEAD &&
181 +
182 + # find out what the user wants
183 + GIT_INDEX_FILE="$TMP-index" \
184 + git add--interactive --patch=stash -- "$@" &&
185 +
186 + # state of the working tree
187 + w_tree=$(GIT_INDEX_FILE="$TMP-index" git write-tree) ||
188 + die "$(gettext "Cannot save the current worktree state")"
189 +
190 + git diff-tree -p HEAD $w_tree -- >"$TMP-patch" &&
191 + test -s "$TMP-patch" ||
192 + die "$(gettext "No changes selected")"
193 +
194 + rm -f "$TMP-index" ||
195 + die "$(gettext "Cannot remove temporary index (can't happen)")"
196 +
197 + fi
198 +
199 + # create the stash
200 + if test -z "$stash_msg"
201 + then
202 + stash_msg=$(printf 'WIP on %s' "$msg")
203 + else
204 + stash_msg=$(printf 'On %s: %s' "$branch" "$stash_msg")
205 + fi
206 + w_commit=$(printf '%s\n' "$stash_msg" |
207 + git commit-tree $w_tree -p $b_commit -p $i_commit $untracked_commit_option) ||
208 + die "$(gettext "Cannot record working tree state")"
209 +}
210 +
211 +store_stash () {
212 + while test $# != 0
213 + do
214 + case "$1" in
215 + -m|--message)
216 + shift
217 + stash_msg="$1"
218 + ;;
219 + -m*)
220 + stash_msg=${1#-m}
221 + ;;
222 + --message=*)
223 + stash_msg=${1#--message=}
224 + ;;
225 + -q|--quiet)
226 + quiet=t
227 + ;;
228 + *)
229 + break
230 + ;;
231 + esac
232 + shift
233 + done
234 + test $# = 1 ||
235 + die "$(eval_gettext "\"$dashless store\" requires one <commit> argument")"
236 +
237 + w_commit="$1"
238 + if test -z "$stash_msg"
239 + then
240 + stash_msg="Created via \"git stash store\"."
241 + fi
242 +
243 + git update-ref --create-reflog -m "$stash_msg" $ref_stash $w_commit
244 + ret=$?
245 + test $ret != 0 && test -z "$quiet" &&
246 + die "$(eval_gettext "Cannot update \$ref_stash with \$w_commit")"
247 + return $ret
248 +}
249 +
250 +push_stash () {
251 + keep_index=
252 + patch_mode=
253 + untracked=
254 + stash_msg=
255 + while test $# != 0
256 + do
257 + case "$1" in
258 + -k|--keep-index)
259 + keep_index=t
260 + ;;
261 + --no-keep-index)
262 + keep_index=n
263 + ;;
264 + -p|--patch)
265 + patch_mode=t
266 + # only default to keep if we don't already have an override
267 + test -z "$keep_index" && keep_index=t
268 + ;;
269 + -q|--quiet)
270 + GIT_QUIET=t
271 + ;;
272 + -u|--include-untracked)
273 + untracked=untracked
274 + ;;
275 + -a|--all)
276 + untracked=all
277 + ;;
278 + -m|--message)
279 + shift
280 + test -z ${1+x} && usage
281 + stash_msg=$1
282 + ;;
283 + -m*)
284 + stash_msg=${1#-m}
285 + ;;
286 + --message=*)
287 + stash_msg=${1#--message=}
288 + ;;
289 + --help)
290 + show_help
291 + ;;
292 + --)
293 + shift
294 + break
295 + ;;
296 + -*)
297 + option="$1"
298 + eval_gettextln "error: unknown option for 'stash push': \$option"
299 + usage
300 + ;;
301 + *)
302 + break
303 + ;;
304 + esac
305 + shift
306 + done
307 +
308 + eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
309 +
310 + if test -n "$patch_mode" && test -n "$untracked"
311 + then
312 + die "$(gettext "Can't use --patch and --include-untracked or --all at the same time")"
313 + fi
314 +
315 + test -n "$untracked" || git ls-files --error-unmatch -- "$@" >/dev/null || exit 1
316 +
317 + git update-index -q --refresh
318 + if no_changes "$@"
319 + then
320 + say "$(gettext "No local changes to save")"
321 + exit 0
322 + fi
323 +
324 + git reflog exists $ref_stash ||
325 + clear_stash || die "$(gettext "Cannot initialize stash")"
326 +
327 + create_stash -m "$stash_msg" -u "$untracked" -- "$@"
328 + store_stash -m "$stash_msg" -q $w_commit ||
329 + die "$(gettext "Cannot save the current status")"
330 + say "$(eval_gettext "Saved working directory and index state \$stash_msg")"
331 +
332 + if test -z "$patch_mode"
333 + then
334 + test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
335 + if test -n "$untracked" && test $# = 0
336 + then
337 + git clean --force --quiet -d $CLEAN_X_OPTION
338 + fi
339 +
340 + if test $# != 0
341 + then
342 + test -z "$untracked" && UPDATE_OPTION="-u" || UPDATE_OPTION=
343 + test "$untracked" = "all" && FORCE_OPTION="--force" || FORCE_OPTION=
344 + git add $UPDATE_OPTION $FORCE_OPTION -- "$@"
345 + git diff-index -p --cached --binary HEAD -- "$@" |
346 + git apply --index -R
347 + else
348 + git reset --hard -q
349 + fi
350 +
351 + if test "$keep_index" = "t" && test -n "$i_tree"
352 + then
353 + git read-tree --reset $i_tree
354 + git ls-files -z --modified -- "$@" |
355 + git checkout-index -z --force --stdin
356 + fi
357 + else
358 + git apply -R < "$TMP-patch" ||
359 + die "$(gettext "Cannot remove worktree changes")"
360 +
361 + if test "$keep_index" != "t"
362 + then
363 + git reset -q -- "$@"
364 + fi
365 + fi
366 +}
367 +
368 +save_stash () {
369 + push_options=
370 + while test $# != 0
371 + do
372 + case "$1" in
373 + --)
374 + shift
375 + break
376 + ;;
377 + -*)
378 + # pass all options through to push_stash
379 + push_options="$push_options $1"
380 + ;;
381 + *)
382 + break
383 + ;;
384 + esac
385 + shift
386 + done
387 +
388 + stash_msg="$*"
389 +
390 + if test -z "$stash_msg"
391 + then
392 + push_stash $push_options
393 + else
394 + push_stash $push_options -m "$stash_msg"
395 + fi
396 +}
397 +
398 +have_stash () {
399 + git rev-parse --verify --quiet $ref_stash >/dev/null
400 +}
401 +
402 +list_stash () {
403 + have_stash || return 0
404 + git log --format="%gd: %gs" -g --first-parent -m "$@" $ref_stash --
405 +}
406 +
407 +show_stash () {
408 + ALLOW_UNKNOWN_FLAGS=t
409 + assert_stash_like "$@"
410 +
411 + if test -z "$FLAGS"
412 + then
413 + if test "$(git config --bool stash.showStat || echo true)" = "true"
414 + then
415 + FLAGS=--stat
416 + fi
417 +
418 + if test "$(git config --bool stash.showPatch || echo false)" = "true"
419 + then
420 + FLAGS=${FLAGS}${FLAGS:+ }-p
421 + fi
422 +
423 + if test -z "$FLAGS"
424 + then
425 + return 0
426 + fi
427 + fi
428 +
429 + git diff ${FLAGS} $b_commit $w_commit
430 +}
431 +
432 +show_help () {
433 + exec git help stash
434 + exit 1
435 +}
436 +
437 +#
438 +# Parses the remaining options looking for flags and
439 +# at most one revision defaulting to ${ref_stash}@{0}
440 +# if none found.
441 +#
442 +# Derives related tree and commit objects from the
443 +# revision, if one is found.
444 +#
445 +# stash records the work tree, and is a merge between the
446 +# base commit (first parent) and the index tree (second parent).
447 +#
448 +# REV is set to the symbolic version of the specified stash-like commit
449 +# IS_STASH_LIKE is non-blank if ${REV} looks like a stash
450 +# IS_STASH_REF is non-blank if the ${REV} looks like a stash ref
451 +# s is set to the SHA1 of the stash commit
452 +# w_commit is set to the commit containing the working tree
453 +# b_commit is set to the base commit
454 +# i_commit is set to the commit containing the index tree
455 +# u_commit is set to the commit containing the untracked files tree
456 +# w_tree is set to the working tree
457 +# b_tree is set to the base tree
458 +# i_tree is set to the index tree
459 +# u_tree is set to the untracked files tree
460 +#
461 +# GIT_QUIET is set to t if -q is specified
462 +# INDEX_OPTION is set to --index if --index is specified.
463 +# FLAGS is set to the remaining flags (if allowed)
464 +#
465 +# dies if:
466 +# * too many revisions specified
467 +# * no revision is specified and there is no stash stack
468 +# * a revision is specified which cannot be resolve to a SHA1
469 +# * a non-existent stash reference is specified
470 +# * unknown flags were set and ALLOW_UNKNOWN_FLAGS is not "t"
471 +#
472 +
473 +parse_flags_and_rev()
474 +{
475 + test "$PARSE_CACHE" = "$*" && return 0 # optimisation
476 + PARSE_CACHE="$*"
477 +
478 + IS_STASH_LIKE=
479 + IS_STASH_REF=
480 + INDEX_OPTION=
481 + s=
482 + w_commit=
483 + b_commit=
484 + i_commit=
485 + u_commit=
486 + w_tree=
487 + b_tree=
488 + i_tree=
489 + u_tree=
490 +
491 + FLAGS=
492 + REV=
493 + for opt
494 + do
495 + case "$opt" in
496 + -q|--quiet)
497 + GIT_QUIET=-t
498 + ;;
499 + --index)
500 + INDEX_OPTION=--index
501 + ;;
502 + --help)
503 + show_help
504 + ;;
505 + -*)
506 + test "$ALLOW_UNKNOWN_FLAGS" = t ||
507 + die "$(eval_gettext "unknown option: \$opt")"
508 + FLAGS="${FLAGS}${FLAGS:+ }$opt"
509 + ;;
510 + *)
511 + REV="${REV}${REV:+ }'$opt'"
512 + ;;
513 + esac
514 + done
515 +
516 + eval set -- $REV
517 +
518 + case $# in
519 + 0)
520 + have_stash || die "$(gettext "No stash entries found.")"
521 + set -- ${ref_stash}@{0}
522 + ;;
523 + 1)
524 + :
525 + ;;
526 + *)
527 + die "$(eval_gettext "Too many revisions specified: \$REV")"
528 + ;;
529 + esac
530 +
531 + case "$1" in
532 + *[!0-9]*)
533 + :
534 + ;;
535 + *)
536 + set -- "${ref_stash}@{$1}"
537 + ;;
538 + esac
539 +
540 + REV=$(git rev-parse --symbolic --verify --quiet "$1") || {
541 + reference="$1"
542 + die "$(eval_gettext "\$reference is not a valid reference")"
543 + }
544 +
545 + i_commit=$(git rev-parse --verify --quiet "$REV^2") &&
546 + set -- $(git rev-parse "$REV" "$REV^1" "$REV:" "$REV^1:" "$REV^2:" 2>/dev/null) &&
547 + s=$1 &&
548 + w_commit=$1 &&
549 + b_commit=$2 &&
550 + w_tree=$3 &&
551 + b_tree=$4 &&
552 + i_tree=$5 &&
553 + IS_STASH_LIKE=t &&
554 + test "$ref_stash" = "$(git rev-parse --symbolic-full-name "${REV%@*}")" &&
555 + IS_STASH_REF=t
556 +
557 + u_commit=$(git rev-parse --verify --quiet "$REV^3") &&
558 + u_tree=$(git rev-parse "$REV^3:" 2>/dev/null)
559 +}
560 +
561 +is_stash_like()
562 +{
563 + parse_flags_and_rev "$@"
564 + test -n "$IS_STASH_LIKE"
565 +}
566 +
567 +assert_stash_like() {
568 + is_stash_like "$@" || {
569 + args="$*"
570 + die "$(eval_gettext "'\$args' is not a stash-like commit")"
571 + }
572 +}
573 +
574 +is_stash_ref() {
575 + is_stash_like "$@" && test -n "$IS_STASH_REF"
576 +}
577 +
578 +assert_stash_ref() {
579 + is_stash_ref "$@" || {
580 + args="$*"
581 + die "$(eval_gettext "'\$args' is not a stash reference")"
582 + }
583 +}
584 +
585 +apply_stash () {
586 +
587 + assert_stash_like "$@"
588 +
589 + git update-index -q --refresh || die "$(gettext "unable to refresh index")"
590 +
591 + # current index state
592 + c_tree=$(git write-tree) ||
593 + die "$(gettext "Cannot apply a stash in the middle of a merge")"
594 +
595 + unstashed_index_tree=
596 + if test -n "$INDEX_OPTION" && test "$b_tree" != "$i_tree" &&
597 + test "$c_tree" != "$i_tree"
598 + then
599 + git diff-tree --binary $s^2^..$s^2 | git apply --cached
600 + test $? -ne 0 &&
601 + die "$(gettext "Conflicts in index. Try without --index.")"
602 + unstashed_index_tree=$(git write-tree) ||
603 + die "$(gettext "Could not save index tree")"
604 + git reset
605 + fi
606 +
607 + if test -n "$u_tree"
608 + then
609 + GIT_INDEX_FILE="$TMPindex" git read-tree "$u_tree" &&
610 + GIT_INDEX_FILE="$TMPindex" git checkout-index --all &&
611 + rm -f "$TMPindex" ||
612 + die "$(gettext "Could not restore untracked files from stash entry")"
613 + fi
614 +
615 + eval "
616 + GITHEAD_$w_tree='Stashed changes' &&
617 + GITHEAD_$c_tree='Updated upstream' &&
618 + GITHEAD_$b_tree='Version stash was based on' &&
619 + export GITHEAD_$w_tree GITHEAD_$c_tree GITHEAD_$b_tree
620 + "
621 +
622 + if test -n "$GIT_QUIET"
623 + then
624 + GIT_MERGE_VERBOSITY=0 && export GIT_MERGE_VERBOSITY
625 + fi
626 + if git merge-recursive $b_tree -- $c_tree $w_tree
627 + then
628 + # No conflict
629 + if test -n "$unstashed_index_tree"
630 + then
631 + git read-tree "$unstashed_index_tree"
632 + else
633 + a="$TMP-added" &&
634 + git diff-index --cached --name-only --diff-filter=A $c_tree >"$a" &&
635 + git read-tree --reset $c_tree &&
636 + git update-index --add --stdin <"$a" ||
637 + die "$(gettext "Cannot unstage modified files")"
638 + rm -f "$a"
639 + fi
640 + squelch=
641 + if test -n "$GIT_QUIET"
642 + then
643 + squelch='>/dev/null 2>&1'
644 + fi
645 + (cd "$START_DIR" && eval "git status $squelch") || :
646 + else
647 + # Merge conflict; keep the exit status from merge-recursive
648 + status=$?
649 + git rerere
650 + if test -n "$INDEX_OPTION"
651 + then
652 + gettextln "Index was not unstashed." >&2
653 + fi
654 + exit $status
655 + fi
656 +}
657 +
658 +pop_stash() {
659 + assert_stash_ref "$@"
660 +
661 + if apply_stash "$@"
662 + then
663 + drop_stash "$@"
664 + else
665 + status=$?
666 + say "$(gettext "The stash entry is kept in case you need it again.")"
667 + exit $status
668 + fi
669 +}
670 +
671 +drop_stash () {
672 + assert_stash_ref "$@"
673 +
674 + git reflog delete --updateref --rewrite "${REV}" &&
675 + say "$(eval_gettext "Dropped \${REV} (\$s)")" ||
676 + die "$(eval_gettext "\${REV}: Could not drop stash entry")"
677 +
678 + # clear_stash if we just dropped the last stash entry
679 + git rev-parse --verify --quiet "$ref_stash@{0}" >/dev/null ||
680 + clear_stash
681 +}
682 +
683 +apply_to_branch () {
684 + test -n "$1" || die "$(gettext "No branch name specified")"
685 + branch=$1
686 + shift 1
687 +
688 + set -- --index "$@"
689 + assert_stash_like "$@"
690 +
691 + git checkout -b $branch $REV^ &&
692 + apply_stash "$@" && {
693 + test -z "$IS_STASH_REF" || drop_stash "$@"
694 + }
695 +}
696 +
697 +test "$1" = "-p" && set "push" "$@"
698 +
699 +PARSE_CACHE='--not-parsed'
700 +# The default command is "push" if nothing but options are given
701 +seen_non_option=
702 +for opt
703 +do
704 + case "$opt" in
705 + --) break ;;
706 + -*) ;;
707 + *) seen_non_option=t; break ;;
708 + esac
709 +done
710 +
711 +test -n "$seen_non_option" || set "push" "$@"
712 +
713 +# Main command set
714 +case "$1" in
715 +list)
716 + shift
717 + list_stash "$@"
718 + ;;
719 +show)
720 + shift
721 + show_stash "$@"
722 + ;;
723 +save)
724 + shift
725 + save_stash "$@"
726 + ;;
727 +push)
728 + shift
729 + push_stash "$@"
730 + ;;
731 +apply)
732 + shift
733 + apply_stash "$@"
734 + ;;
735 +clear)
736 + shift
737 + clear_stash "$@"
738 + ;;
739 +create)
740 + shift
741 + create_stash -m "$*" && echo "$w_commit"
742 + ;;
743 +store)
744 + shift
745 + store_stash "$@"
746 + ;;
747 +drop)
748 + shift
749 + drop_stash "$@"
750 + ;;
751 +pop)
752 + shift
753 + pop_stash "$@"
754 + ;;
755 +branch)
756 + shift
757 + apply_to_branch "$@"
758 + ;;
759 +*)
760 + case $# in
761 + 0)
762 + push_stash &&
763 + say "$(gettext "(To restore them type \"git stash apply\")")"
764 + ;;
765 + *)
766 + usage
767 + esac
768 + ;;
769 +esac