expose a helper function peel_to_type().
[gitweb.git] / git-stash.sh
index 696b465b7c7853f717dca6b2c865647161df25d9..b00f8881693ff09516ea058816dc96697ca56483 100755 (executable)
@@ -1,9 +1,10 @@
 #!/bin/sh
 # Copyright (c) 2007, Nanako Shiraishi
 
-USAGE='[ | list | show | apply | clear]'
+USAGE='[  | save | list | show | apply | clear | create ]'
 
 SUBDIRECTORY_OK=Yes
+OPTIONS_SPEC=
 . git-sh-setup
 require_work_tree
 cd_to_toplevel
@@ -14,11 +15,15 @@ trap 'rm -f "$TMP-*"' 0
 ref_stash=refs/stash
 
 no_changes () {
-       git diff-index --quiet --cached HEAD &&
+       git diff-index --quiet --cached HEAD -- &&
        git diff-files --quiet
 }
 
 clear_stash () {
+       if test $# != 0
+       then
+               die "git stash clear with parameters is unimplemented"
+       fi
        if current=$(git rev-parse --verify $ref_stash 2>/dev/null)
        then
                git update-ref -d $ref_stash $current
@@ -36,7 +41,7 @@ create_stash () {
        # state of the base commit
        if b_commit=$(git rev-parse --verify HEAD)
        then
-               head=$(git log --abbrev-commit --pretty=oneline -n 1 HEAD)
+               head=$(git log --no-color --abbrev-commit --pretty=oneline -n 1 HEAD --)
        else
                die "You do not have the initial commit yet"
        fi
@@ -85,7 +90,7 @@ save_stash () {
 
        if no_changes
        then
-               echo >&2 'No local changes to save'
+               echo 'No local changes to save'
                exit 0
        fi
        test -f "$GIT_DIR/logs/$ref_stash" ||
@@ -98,7 +103,7 @@ save_stash () {
 
        git update-ref -m "$stash_msg" $ref_stash $w_commit ||
                die "Cannot save the current status"
-       printf >&2 'Saved "%s"\n' "$stash_msg"
+       printf 'Saved working directory and index state "%s"\n' "$stash_msg"
 }
 
 have_stash () {
@@ -107,7 +112,7 @@ have_stash () {
 
 list_stash () {
        have_stash || return 0
-       git log --pretty=oneline -g "$@" $ref_stash |
+       git log --no-color --pretty=oneline -g "$@" $ref_stash -- |
        sed -n -e 's/^[.0-9a-f]* refs\///p'
 }
 
@@ -150,7 +155,7 @@ apply_stash () {
        unstashed_index_tree=
        if test -n "$unstash_index" && test "$b_tree" != "$i_tree"
        then
-               git diff --binary $s^2^..$s^2 | git apply --cached
+               git diff-tree --binary $s^2^..$s^2 | git apply --cached
                test $? -ne 0 &&
                        die 'Conflicts in index. Try without --index.'
                unstashed_index_tree=$(git-write-tree) ||
@@ -173,7 +178,7 @@ apply_stash () {
                        git read-tree "$unstashed_index_tree"
                else
                        a="$TMP-added" &&
-                       git diff --cached --name-only --diff-filter=A $c_tree >"$a" &&
+                       git diff-index --cached --name-only --diff-filter=A $c_tree >"$a" &&
                        git read-tree --reset $c_tree &&
                        git update-index --add --stdin <"$a" ||
                                die "Cannot unstage modified files"
@@ -206,12 +211,17 @@ show)
        shift
        show_stash "$@"
        ;;
+save)
+       shift
+       save_stash "$*" && git-reset --hard
+       ;;
 apply)
        shift
        apply_stash "$@"
        ;;
 clear)
-       clear_stash
+       shift
+       clear_stash "$@"
        ;;
 create)
        if test $# -gt 0 && test "$1" = create
@@ -220,14 +230,14 @@ create)
        fi
        create_stash "$*" && echo "$w_commit"
        ;;
-help | usage)
-       usage
-       ;;
 *)
-       if test $# -gt 0 && test "$1" = save
+       if test $# -eq 0
        then
-               shift
+               save_stash &&
+               echo '(To restore them type "git stash apply")' &&
+               git-reset --hard
+       else
+               usage
        fi
-       save_stash "$*" && git-reset --hard
        ;;
 esac