[RFC] git stash --snapshot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



About two weeks ago there was a discussion about building an undo stack. 
https://public-inbox.org/git/000401d4d6c8$f68bb020$e3a31060$@nexbridge.com/

it had me thinking about whether a stash --snapshot might be useful. Below
is a conceptual change - by no means even close to complete. This would
allow scripting to wrap critical commands with a "git stash push --snapshot"
without changing the working directory. For symmetry, a "git stash pop
--force" is needed if --include-untracked were used to stash everything in
the first place. It might be more useful also to wait until stash is
converted to C, I suppose. I'm wondering whether to pursue this or drop it.
Thoughts? (and I beg forgiveness for what my mailer might do to the wrapping
of this patch, and I already know the indent is wrong between 329 and 370,
and that the granularity of the --force option is wrong).

diff --git a/git-stash.sh b/git-stash.sh
index 789ce2f41d..7741192980 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -5,12 +5,13 @@ dashless=$(basename "$0" | sed -e 's/-/ /')
 USAGE="list [<options>]
    or: $dashless show [<stash>]
    or: $dashless drop [-q|--quiet] [<stash>]
-   or: $dashless ( pop | apply ) [--index] [-q|--quiet] [<stash>]
+   or: $dashless ( pop | apply ) [--index] [-q|--quiet] [-f|--force]
[<stash>]
    or: $dashless branch <branchname> [<stash>]
    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>]
+                      [--snapshot]
                       [-- <pathspec>...]]
    or: $dashless clear"

@@ -252,6 +253,7 @@ push_stash () {
        patch_mode=
        untracked=
        stash_msg=
+       snapshot=
        while test $# != 0
        do
                case "$1" in
@@ -286,6 +288,9 @@ push_stash () {
                --message=*)
                        stash_msg=${1#--message=}
                        ;;
+               --snapshot)
+                       snapshot=t
+                       ;;
                --help)
                        show_help
                        ;;
@@ -329,6 +334,8 @@ push_stash () {
        die "$(gettext "Cannot save the current status")"
        say "$(eval_gettext "Saved working directory and index state
\$stash_msg")"

+       if test -z "$snapshot"
+       then
        if test -z "$patch_mode"
        then
                test "$untracked" = "all" && CLEAN_X_OPTION=-x ||
CLEAN_X_OPTION=
@@ -363,6 +370,7 @@ push_stash () {
                        git reset -q -- "$@"
                fi
        fi
+       fi
 }

 save_stash () {
@@ -490,6 +498,7 @@ parse_flags_and_rev()

        FLAGS=
        REV=
+       FORCE_OPTION=
        for opt
        do
                case "$opt" in
@@ -499,6 +508,9 @@ parse_flags_and_rev()
                        --index)
                                INDEX_OPTION=--index
                        ;;
+                       -f|--force)
+                               FORCE_OPTION=--force
+                       ;;
                        --help)
                                show_help
                        ;;
@@ -607,7 +619,7 @@ apply_stash () {
        if test -n "$u_tree"
        then
                GIT_INDEX_FILE="$TMPindex" git read-tree "$u_tree" &&
-               GIT_INDEX_FILE="$TMPindex" git checkout-index --all &&
+               GIT_INDEX_FILE="$TMPindex" git checkout-index --all
$FORCE_OPTION &&
                rm -f "$TMPindex" ||
                die "$(gettext "Could not restore untracked files from stash
entry")"
        fi
@@ -688,7 +700,7 @@ apply_to_branch () {
        set -- --index "$@"
        assert_stash_like "$@"

-       git checkout -b $branch $REV^ &&
+       git checkout -b $branch $FORCE_OPTION $REV^ &&
        apply_stash "$@" && {
                test -z "$IS_STASH_REF" || drop_stash "$@"
        }

Regards,
Randall

-- Brief whoami:
 NonStop developer since approximately 211288444200000000
 UNIX developer since approximately 421664400
-- In my real life, I talk too much.






[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux