git-stash.sh 15.1 KB
Newer Older
しらいしななこ's avatar
しらいしななこ committed
1 2 3
#!/bin/sh
# Copyright (c) 2007, Nanako Shiraishi

4 5
dashless=$(basename "$0" | sed -e 's/-/ /')
USAGE="list [<options>]
Stephen Boyd's avatar
Stephen Boyd committed
6 7 8
   or: $dashless show [<stash>]
   or: $dashless drop [-q|--quiet] [<stash>]
   or: $dashless ( pop | apply ) [--index] [-q|--quiet] [<stash>]
9
   or: $dashless branch <branchname> [<stash>]
10 11 12 13 14
   or: $dashless save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
		      [-u|--include-untracked] [-a|--all] [<message>]
   or: $dashless [push [--patch] [-k|--[no-]keep-index] [-q|--quiet]
		       [-u|--include-untracked] [-a|--all] [-m <message>]
		       [-- <pathspec>...]]
15
   or: $dashless clear"
しらいしななこ's avatar
しらいしななこ committed
16

17
SUBDIRECTORY_OK=Yes
18
OPTIONS_SPEC=
19
START_DIR=$(pwd)
しらいしななこ's avatar
しらいしななこ committed
20 21
. git-sh-setup
require_work_tree
22
prefix=$(git rev-parse --show-prefix) || exit 1
23
cd_to_toplevel
しらいしななこ's avatar
しらいしななこ committed
24 25

TMP="$GIT_DIR/.git-stash.$$"
Duy Nguyen's avatar
Duy Nguyen committed
26
TMPindex=${GIT_INDEX_FILE-"$(git rev-parse --git-path index)"}.stash.$$
27
trap 'rm -f "$TMP-"* "$TMPindex"' 0
しらいしななこ's avatar
しらいしななこ committed
28 29 30

ref_stash=refs/stash

31 32 33 34 35 36 37 38
if git config --get-colorbool color.interactive; then
       help_color="$(git config --get-color color.interactive.help 'red bold')"
       reset_color="$(git config --get-color '' reset)"
else
       help_color=
       reset_color=
fi

しらいしななこ's avatar
しらいしななこ committed
39
no_changes () {
40 41
	git diff-index --quiet --cached HEAD --ignore-submodules -- "$@" &&
	git diff-files --quiet --ignore-submodules -- "$@" &&
42 43 44 45
	(test -z "$untracked" || test -z "$(untracked_files)")
}

untracked_files () {
46 47 48 49 50 51 52
	if test "$1" = "-z"
	then
		shift
		z=-z
	else
		z=
	fi
53 54
	excl_opt=--exclude-standard
	test "$untracked" = "all" && excl_opt=
55
	git ls-files -o $z $excl_opt -- "$@"
しらいしななこ's avatar
しらいしななこ committed
56 57 58
}

clear_stash () {
59 60
	if test $# != 0
	then
61
		die "$(gettext "git stash clear with parameters is unimplemented")"
62
	fi
63
	if current=$(git rev-parse --verify --quiet $ref_stash)
64
	then
Emil Medve's avatar
Emil Medve committed
65
		git update-ref -d $ref_stash $current
66
	fi
しらいしななこ's avatar
しらいしななこ committed
67 68
}

69
create_stash () {
70 71 72 73 74 75 76 77 78
	stash_msg=
	untracked=
	while test $# != 0
	do
		case "$1" in
		-m|--message)
			shift
			stash_msg=${1?"BUG: create_stash () -m requires an argument"}
			;;
79 80 81 82 83 84
		-m*)
			stash_msg=${1#-m}
			;;
		--message=*)
			stash_msg=${1#--message=}
			;;
85 86 87 88
		-u|--include-untracked)
			shift
			untracked=${1?"BUG: create_stash () -u requires an argument"}
			;;
89 90 91 92
		--)
			shift
			break
			;;
93 94 95
		esac
		shift
	done
96

97
	git update-index -q --refresh
98
	if no_changes "$@"
しらいしななこ's avatar
しらいしななこ committed
99 100 101
	then
		exit 0
	fi
102

しらいしななこ's avatar
しらいしななこ committed
103
	# state of the base commit
104
	if b_commit=$(git rev-parse --verify HEAD)
しらいしななこ's avatar
しらいしななこ committed
105
	then
106
		head=$(git rev-list --oneline -n 1 HEAD --)
しらいしななこ's avatar
しらいしななこ committed
107
	else
108
		die "$(gettext "You do not have the initial commit yet")"
しらいしななこ's avatar
しらいしななこ committed
109 110
	fi

111
	if branch=$(git symbolic-ref -q HEAD)
しらいしななこ's avatar
しらいしななこ committed
112 113 114 115 116 117 118 119
	then
		branch=${branch#refs/heads/}
	else
		branch='(no branch)'
	fi
	msg=$(printf '%s: %s' "$branch" "$head")

	# state of the index
120
	i_tree=$(git write-tree) &&
121
	i_commit=$(printf 'index on %s\n' "$msg" |
122
		git commit-tree $i_tree -p $b_commit) ||
123
		die "$(gettext "Cannot save the current index state")"
しらいしななこ's avatar
しらいしななこ committed
124

125 126 127 128 129
	if test -n "$untracked"
	then
		# Untracked files are stored by themselves in a parentless commit, for
		# ease of unpacking later.
		u_commit=$(
130
			untracked_files -z "$@" | (
131 132
				GIT_INDEX_FILE="$TMPindex" &&
				export GIT_INDEX_FILE &&
133 134 135 136 137
				rm -f "$TMPindex" &&
				git update-index -z --add --remove --stdin &&
				u_tree=$(git write-tree) &&
				printf 'untracked files on %s\n' "$msg" | git commit-tree $u_tree  &&
				rm -f "$TMPindex"
138
		) ) || die "$(gettext "Cannot save the untracked files")"
139 140 141 142 143 144

		untracked_commit_option="-p $u_commit";
	else
		untracked_commit_option=
	fi

145 146 147 148 149
	if test -z "$patch_mode"
	then

		# state of the working tree
		w_tree=$( (
150 151
			git read-tree --index-output="$TMPindex" -m $i_tree &&
			GIT_INDEX_FILE="$TMPindex" &&
152
			export GIT_INDEX_FILE &&
153
			git diff-index --name-only -z HEAD -- "$@" >"$TMP-stagenames" &&
154
			git update-index -z --add --remove --stdin <"$TMP-stagenames" &&
155
			git write-tree &&
156
			rm -f "$TMPindex"
157
		) ) ||
158
			die "$(gettext "Cannot save the current worktree state")"
159 160 161

	else

162
		rm -f "$TMP-index" &&
163 164 165 166
		GIT_INDEX_FILE="$TMP-index" git read-tree HEAD &&

		# find out what the user wants
		GIT_INDEX_FILE="$TMP-index" \
167
			git add--interactive --patch=stash -- "$@" &&
168 169 170

		# state of the working tree
		w_tree=$(GIT_INDEX_FILE="$TMP-index" git write-tree) ||
171
		die "$(gettext "Cannot save the current worktree state")"
しらいしななこ's avatar
しらいしななこ committed
172

173
		git diff-tree -p HEAD $w_tree -- >"$TMP-patch" &&
174
		test -s "$TMP-patch" ||
175
		die "$(gettext "No changes selected")"
176 177

		rm -f "$TMP-index" ||
178
		die "$(gettext "Cannot remove temporary index (can't happen)")"
179 180 181

	fi

しらいしななこ's avatar
しらいしななこ committed
182
	# create the stash
183 184 185 186 187 188 189
	if test -z "$stash_msg"
	then
		stash_msg=$(printf 'WIP on %s' "$msg")
	else
		stash_msg=$(printf 'On %s: %s' "$branch" "$stash_msg")
	fi
	w_commit=$(printf '%s\n' "$stash_msg" |
190 191
	git commit-tree $w_tree -p $b_commit -p $i_commit $untracked_commit_option) ||
	die "$(gettext "Cannot record working tree state")"
192
}
しらいしななこ's avatar
しらいしななこ committed
193

194 195 196 197 198 199 200 201
store_stash () {
	while test $# != 0
	do
		case "$1" in
		-m|--message)
			shift
			stash_msg="$1"
			;;
202 203 204 205 206 207
		-m*)
			stash_msg=${1#-m}
			;;
		--message=*)
			stash_msg=${1#--message=}
			;;
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
		-q|--quiet)
			quiet=t
			;;
		*)
			break
			;;
		esac
		shift
	done
	test $# = 1 ||
	die "$(eval_gettext "\"$dashless store\" requires one <commit> argument")"

	w_commit="$1"
	if test -z "$stash_msg"
	then
		stash_msg="Created via \"git stash store\"."
	fi

226
	git update-ref --create-reflog -m "$stash_msg" $ref_stash $w_commit
227
	ret=$?
228
	test $ret != 0 && test -z "$quiet" &&
229 230 231 232
	die "$(eval_gettext "Cannot update \$ref_stash with \$w_commit")"
	return $ret
}

Thomas Gummerer's avatar
Thomas Gummerer committed
233
push_stash () {
234
	keep_index=
235
	patch_mode=
236
	untracked=
Thomas Gummerer's avatar
Thomas Gummerer committed
237
	stash_msg=
Stephen Boyd's avatar
Stephen Boyd committed
238 239 240
	while test $# != 0
	do
		case "$1" in
241
		-k|--keep-index)
Stephen Boyd's avatar
Stephen Boyd committed
242 243
			keep_index=t
			;;
244
		--no-keep-index)
245
			keep_index=n
246 247 248
			;;
		-p|--patch)
			patch_mode=t
249 250
			# only default to keep if we don't already have an override
			test -z "$keep_index" && keep_index=t
Stephen Boyd's avatar
Stephen Boyd committed
251 252 253 254
			;;
		-q|--quiet)
			GIT_QUIET=t
			;;
255 256 257 258 259 260
		-u|--include-untracked)
			untracked=untracked
			;;
		-a|--all)
			untracked=all
			;;
Thomas Gummerer's avatar
Thomas Gummerer committed
261 262 263 264 265
		-m|--message)
			shift
			test -z ${1+x} && usage
			stash_msg=$1
			;;
266 267 268 269 270 271
		-m*)
			stash_msg=${1#-m}
			;;
		--message=*)
			stash_msg=${1#--message=}
			;;
272 273 274
		--help)
			show_help
			;;
275 276 277 278 279
		--)
			shift
			break
			;;
		-*)
280
			option="$1"
281
			eval_gettextln "error: unknown option for 'stash push': \$option"
282 283
			usage
			;;
Stephen Boyd's avatar
Stephen Boyd committed
284 285 286 287
		*)
			break
			;;
		esac
288
		shift
Stephen Boyd's avatar
Stephen Boyd committed
289
	done
290

291 292
	eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"

293 294
	if test -n "$patch_mode" && test -n "$untracked"
	then
295
		die "$(gettext "Can't use --patch and --include-untracked or --all at the same time")"
296 297
	fi

298 299
	test -n "$untracked" || git ls-files --error-unmatch -- "$@" >/dev/null || exit 1

300
	git update-index -q --refresh
301
	if no_changes "$@"
302
	then
303
		say "$(gettext "No local changes to save")"
304 305
		exit 0
	fi
306

307
	git reflog exists $ref_stash ||
308
		clear_stash || die "$(gettext "Cannot initialize stash")"
309

310
	create_stash -m "$stash_msg" -u "$untracked" -- "$@"
311 312
	store_stash -m "$stash_msg" -q $w_commit ||
	die "$(gettext "Cannot save the current status")"
313
	say "$(eval_gettext "Saved working directory and index state \$stash_msg")"
314

315
	if test -z "$patch_mode"
316
	then
317 318 319 320 321 322
		test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
		if test -n "$untracked"
		then
			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
		fi

323 324
		if test $# != 0
		then
325
			git add -u -- "$@" |
326
			git checkout-index -z --force --stdin
327
			git diff-index -p --cached --binary HEAD -- "$@" | git apply --index -R
328
		else
329
			git reset --hard -q
330
		fi
331

332
		if test "$keep_index" = "t" && test -n "$i_tree"
333
		then
334 335 336
			git read-tree --reset $i_tree
			git ls-files -z --modified -- "$@" |
			git checkout-index -z --force --stdin
337 338 339
		fi
	else
		git apply -R < "$TMP-patch" ||
340
		die "$(gettext "Cannot remove worktree changes")"
341

342
		if test "$keep_index" != "t"
343
		then
344
			git reset -q -- "$@"
345
		fi
346
	fi
しらいしななこ's avatar
しらいしななこ committed
347 348
}

Thomas Gummerer's avatar
Thomas Gummerer committed
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
save_stash () {
	push_options=
	while test $# != 0
	do
		case "$1" in
		--)
			shift
			break
			;;
		-*)
			# pass all options through to push_stash
			push_options="$push_options $1"
			;;
		*)
			break
			;;
		esac
		shift
	done

	stash_msg="$*"

	if test -z "$stash_msg"
	then
		push_stash $push_options
	else
		push_stash $push_options -m "$stash_msg"
	fi
}

379
have_stash () {
380
	git rev-parse --verify --quiet $ref_stash >/dev/null
381 382
}

しらいしななこ's avatar
しらいしななこ committed
383
list_stash () {
384
	have_stash || return 0
385
	git log --format="%gd: %gs" -g --first-parent -m "$@" $ref_stash --
しらいしななこ's avatar
しらいしななこ committed
386 387 388
}

show_stash () {
389
	ALLOW_UNKNOWN_FLAGS=t
390
	assert_stash_like "$@"
391

392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
	if test -z "$FLAGS"
	then
		if test "$(git config --bool stash.showStat || echo true)" = "true"
		then
			FLAGS=--stat
		fi

		if test "$(git config --bool stash.showPatch || echo false)" = "true"
		then
			FLAGS=${FLAGS}${FLAGS:+ }-p
		fi

		if test -z "$FLAGS"
		then
			return 0
		fi
	fi

	git diff ${FLAGS} $b_commit $w_commit
しらいしななこ's avatar
しらいしななこ committed
411 412
}

413 414 415 416 417
show_help () {
	exec git help stash
	exit 1
}

418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435
#
# Parses the remaining options looking for flags and
# at most one revision defaulting to ${ref_stash}@{0}
# if none found.
#
# Derives related tree and commit objects from the
# revision, if one is found.
#
# stash records the work tree, and is a merge between the
# base commit (first parent) and the index tree (second parent).
#
#   REV is set to the symbolic version of the specified stash-like commit
#   IS_STASH_LIKE is non-blank if ${REV} looks like a stash
#   IS_STASH_REF is non-blank if the ${REV} looks like a stash ref
#   s is set to the SHA1 of the stash commit
#   w_commit is set to the commit containing the working tree
#   b_commit is set to the base commit
#   i_commit is set to the commit containing the index tree
436
#   u_commit is set to the commit containing the untracked files tree
437 438 439
#   w_tree is set to the working tree
#   b_tree is set to the base tree
#   i_tree is set to the index tree
440
#   u_tree is set to the untracked files tree
441 442 443
#
#   GIT_QUIET is set to t if -q is specified
#   INDEX_OPTION is set to --index if --index is specified.
444
#   FLAGS is set to the remaining flags (if allowed)
445 446 447 448 449 450
#
# dies if:
#   * too many revisions specified
#   * no revision is specified and there is no stash stack
#   * a revision is specified which cannot be resolve to a SHA1
#   * a non-existent stash reference is specified
451
#   * unknown flags were set and ALLOW_UNKNOWN_FLAGS is not "t"
452 453 454 455 456 457 458 459 460 461 462 463 464 465
#

parse_flags_and_rev()
{
	test "$PARSE_CACHE" = "$*" && return 0 # optimisation
	PARSE_CACHE="$*"

	IS_STASH_LIKE=
	IS_STASH_REF=
	INDEX_OPTION=
	s=
	w_commit=
	b_commit=
	i_commit=
466
	u_commit=
467 468 469
	w_tree=
	b_tree=
	i_tree=
470
	u_tree=
471 472

	FLAGS=
473
	REV=
Jon Seymour's avatar
Jon Seymour committed
474
	for opt
475
	do
Jon Seymour's avatar
Jon Seymour committed
476 477 478 479
		case "$opt" in
			-q|--quiet)
				GIT_QUIET=-t
			;;
480 481 482
			--index)
				INDEX_OPTION=--index
			;;
483 484 485
			--help)
				show_help
			;;
Jon Seymour's avatar
Jon Seymour committed
486
			-*)
487 488
				test "$ALLOW_UNKNOWN_FLAGS" = t ||
					die "$(eval_gettext "unknown option: \$opt")"
Jon Seymour's avatar
Jon Seymour committed
489
				FLAGS="${FLAGS}${FLAGS:+ }$opt"
490
			;;
491 492 493
			*)
				REV="${REV}${REV:+ }'$opt'"
			;;
494 495 496
		esac
	done

497
	eval set -- $REV
498 499 500

	case $# in
		0)
501
			have_stash || die "$(gettext "No stash entries found.")"
502 503 504 505 506 507
			set -- ${ref_stash}@{0}
		;;
		1)
			:
		;;
		*)
508
			die "$(eval_gettext "Too many revisions specified: \$REV")"
509 510 511
		;;
	esac

512 513 514 515 516 517 518 519 520
	case "$1" in
		*[!0-9]*)
			:
		;;
		*)
			set -- "${ref_stash}@{$1}"
		;;
	esac

521
	REV=$(git rev-parse --symbolic --verify --quiet "$1") || {
522
		reference="$1"
523
		die "$(eval_gettext "\$reference is not a valid reference")"
524
	}
525

526
	i_commit=$(git rev-parse --verify --quiet "$REV^2") &&
527
	set -- $(git rev-parse "$REV" "$REV^1" "$REV:" "$REV^1:" "$REV^2:" 2>/dev/null) &&
528 529 530 531 532 533 534 535 536
	s=$1 &&
	w_commit=$1 &&
	b_commit=$2 &&
	w_tree=$3 &&
	b_tree=$4 &&
	i_tree=$5 &&
	IS_STASH_LIKE=t &&
	test "$ref_stash" = "$(git rev-parse --symbolic-full-name "${REV%@*}")" &&
	IS_STASH_REF=t
537

538
	u_commit=$(git rev-parse --verify --quiet "$REV^3") &&
539
	u_tree=$(git rev-parse "$REV^3:" 2>/dev/null)
540 541 542 543 544 545 546 547 548
}

is_stash_like()
{
	parse_flags_and_rev "$@"
	test -n "$IS_STASH_LIKE"
}

assert_stash_like() {
549 550 551 552
	is_stash_like "$@" || {
		args="$*"
		die "$(eval_gettext "'\$args' is not a stash-like commit")"
	}
553 554 555 556 557 558 559
}

is_stash_ref() {
	is_stash_like "$@" && test -n "$IS_STASH_REF"
}

assert_stash_ref() {
560 561 562 563
	is_stash_ref "$@" || {
		args="$*"
		die "$(eval_gettext "'\$args' is not a stash reference")"
	}
564 565
}

しらいしななこ's avatar
しらいしななこ committed
566
apply_stash () {
Stephen Boyd's avatar
Stephen Boyd committed
567

568
	assert_stash_like "$@"
しらいしななこ's avatar
しらいしななこ committed
569

570
	git update-index -q --refresh || die "$(gettext "unable to refresh index")"
571 572 573

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

Junio C Hamano's avatar
Junio C Hamano committed
576
	unstashed_index_tree=
577
	if test -n "$INDEX_OPTION" && test "$b_tree" != "$i_tree" &&
578
			test "$c_tree" != "$i_tree"
Junio C Hamano's avatar
Junio C Hamano committed
579
	then
580
		git diff-tree --binary $s^2^..$s^2 | git apply --cached
581
		test $? -ne 0 &&
582
			die "$(gettext "Conflicts in index. Try without --index.")"
583
		unstashed_index_tree=$(git write-tree) ||
584
			die "$(gettext "Could not save index tree")"
585
		git reset
Junio C Hamano's avatar
Junio C Hamano committed
586
	fi
587

588 589
	if test -n "$u_tree"
	then
590
		GIT_INDEX_FILE="$TMPindex" git read-tree "$u_tree" &&
591 592
		GIT_INDEX_FILE="$TMPindex" git checkout-index --all &&
		rm -f "$TMPindex" ||
593
		die "$(gettext "Could not restore untracked files from stash entry")"
594 595
	fi

しらいしななこ's avatar
しらいしななこ committed
596 597 598 599 600 601 602
	eval "
		GITHEAD_$w_tree='Stashed changes' &&
		GITHEAD_$c_tree='Updated upstream' &&
		GITHEAD_$b_tree='Version stash was based on' &&
		export GITHEAD_$w_tree GITHEAD_$c_tree GITHEAD_$b_tree
	"

Stephen Boyd's avatar
Stephen Boyd committed
603 604
	if test -n "$GIT_QUIET"
	then
605
		GIT_MERGE_VERBOSITY=0 && export GIT_MERGE_VERBOSITY
Stephen Boyd's avatar
Stephen Boyd committed
606
	fi
607
	if git merge-recursive $b_tree -- $c_tree $w_tree
しらいしななこ's avatar
しらいしななこ committed
608 609
	then
		# No conflict
Junio C Hamano's avatar
Junio C Hamano committed
610 611 612
		if test -n "$unstashed_index_tree"
		then
			git read-tree "$unstashed_index_tree"
613 614
		else
			a="$TMP-added" &&
615
			git diff-index --cached --name-only --diff-filter=A $c_tree >"$a" &&
616 617
			git read-tree --reset $c_tree &&
			git update-index --add --stdin <"$a" ||
618
				die "$(gettext "Cannot unstage modified files")"
619
			rm -f "$a"
Junio C Hamano's avatar
Junio C Hamano committed
620
		fi
Stephen Boyd's avatar
Stephen Boyd committed
621 622 623 624 625
		squelch=
		if test -n "$GIT_QUIET"
		then
			squelch='>/dev/null 2>&1'
		fi
626
		(cd "$START_DIR" && eval "git status $squelch") || :
しらいしななこ's avatar
しらいしななこ committed
627 628
	else
		# Merge conflict; keep the exit status from merge-recursive
629
		status=$?
630
		git rerere
631
		if test -n "$INDEX_OPTION"
Junio C Hamano's avatar
Junio C Hamano committed
632
		then
633
			gettextln "Index was not unstashed." >&2
Junio C Hamano's avatar
Junio C Hamano committed
634
		fi
635
		exit $status
しらいしななこ's avatar
しらいしななこ committed
636 637 638
	fi
}

639 640 641
pop_stash() {
	assert_stash_ref "$@"

642 643 644 645 646
	if apply_stash "$@"
	then
		drop_stash "$@"
	else
		status=$?
647
		say "$(gettext "The stash entry is kept in case you need it again.")"
648 649
		exit $status
	fi
650 651
}

652
drop_stash () {
653
	assert_stash_ref "$@"
654

655
	git reflog delete --updateref --rewrite "${REV}" &&
656 657
		say "$(eval_gettext "Dropped \${REV} (\$s)")" ||
		die "$(eval_gettext "\${REV}: Could not drop stash entry")"
658 659

	# clear_stash if we just dropped the last stash entry
660 661
	git rev-parse --verify --quiet "$ref_stash@{0}" >/dev/null ||
	clear_stash
662 663
}

664
apply_to_branch () {
665
	test -n "$1" || die "$(gettext "No branch name specified")"
666
	branch=$1
667
	shift 1
668

669 670 671 672
	set -- --index "$@"
	assert_stash_like "$@"

	git checkout -b $branch $REV^ &&
673 674 675
	apply_stash "$@" && {
		test -z "$IS_STASH_REF" || drop_stash "$@"
	}
676 677
}

678 679
test "$1" = "-p" && set "push" "$@"

680
PARSE_CACHE='--not-parsed'
681
# The default command is "push" if nothing but options are given
682 683 684 685
seen_non_option=
for opt
do
	case "$opt" in
686
	--) break ;;
687 688 689 690 691
	-*) ;;
	*) seen_non_option=t; break ;;
	esac
done

692
test -n "$seen_non_option" || set "push" "$@"
693

しらいしななこ's avatar
しらいしななこ committed
694 695
# Main command set
case "$1" in
696 697
list)
	shift
しらいしななこ's avatar
しらいしななこ committed
698 699 700 701 702 703
	list_stash "$@"
	;;
show)
	shift
	show_stash "$@"
	;;
704 705
save)
	shift
706
	save_stash "$@"
707
	;;
Thomas Gummerer's avatar
Thomas Gummerer committed
708 709 710 711
push)
	shift
	push_stash "$@"
	;;
しらいしななこ's avatar
しらいしななこ committed
712 713 714 715 716
apply)
	shift
	apply_stash "$@"
	;;
clear)
717 718
	shift
	clear_stash "$@"
しらいしななこ's avatar
しらいしななこ committed
719
	;;
720
create)
721
	shift
722
	create_stash -m "$*" && echo "$w_commit"
723
	;;
724 725 726 727
store)
	shift
	store_stash "$@"
	;;
728 729 730 731
drop)
	shift
	drop_stash "$@"
	;;
732 733
pop)
	shift
734
	pop_stash "$@"
735
	;;
736 737 738 739
branch)
	shift
	apply_to_branch "$@"
	;;
しらいしななこ's avatar
しらいしななこ committed
740
*)
741 742
	case $# in
	0)
743
		push_stash &&
744
		say "$(gettext "(To restore them type \"git stash apply\")")"
745 746
		;;
	*)
747
		usage
748
	esac
749
	;;
しらいしななこ's avatar
しらいしななこ committed
750
esac