diff options
author | Junio C Hamano <gitster@pobox.com> | 2008-07-02 21:32:44 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-07-02 21:32:44 -0700 |
commit | 4df0d7af6be27fe5b0ffef438ef0169607253f66 (patch) | |
tree | 8d76ec961e9667b4a6efedecb3fd590e38875ba8 | |
parent | 14d4642e2a472ba4c06e10a3f5623d944b869314 (diff) | |
parent | dfc8f39e4346d000052c39ef7cb6bfe8fdb48c51 (diff) | |
download | git-4df0d7af6be27fe5b0ffef438ef0169607253f66.tar.gz git-4df0d7af6be27fe5b0ffef438ef0169607253f66.tar.xz |
Merge branch 'jc/maint-reset' into maint
* jc/maint-reset:
Allow "git-reset path" when unambiguous
-rw-r--r-- | builtin-reset.c | 39 | ||||
-rwxr-xr-x | t/t7102-reset.sh | 47 |
2 files changed, 81 insertions, 5 deletions
diff --git a/builtin-reset.c b/builtin-reset.c index f34acb191..a0321694c 100644 --- a/builtin-reset.c +++ b/builtin-reset.c @@ -194,8 +194,40 @@ int cmd_reset(int argc, const char **argv, const char *prefix) reflog_action = args_to_str(argv); setenv("GIT_REFLOG_ACTION", reflog_action, 0); - if (i < argc && strcmp(argv[i], "--")) - rev = argv[i++]; + /* + * Possible arguments are: + * + * git reset [-opts] <rev> <paths>... + * git reset [-opts] <rev> -- <paths>... + * git reset [-opts] -- <paths>... + * git reset [-opts] <paths>... + * + * At this point, argv[i] points immediately after [-opts]. + */ + + if (i < argc) { + if (!strcmp(argv[i], "--")) { + i++; /* reset to HEAD, possibly with paths */ + } else if (i + 1 < argc && !strcmp(argv[i+1], "--")) { + rev = argv[i]; + i += 2; + } + /* + * Otherwise, argv[i] could be either <rev> or <paths> and + * has to be unambigous. + */ + else if (!get_sha1(argv[i], sha1)) { + /* + * Ok, argv[i] looks like a rev; it should not + * be a filename. + */ + verify_non_filename(prefix, argv[i]); + rev = argv[i++]; + } else { + /* Otherwise we treat this as a filename */ + verify_filename(prefix, argv[i]); + } + } if (get_sha1(rev, sha1)) die("Failed to resolve '%s' as a valid ref.", rev); @@ -205,9 +237,6 @@ int cmd_reset(int argc, const char **argv, const char *prefix) die("Could not parse object '%s'.", rev); hashcpy(sha1, commit->object.sha1); - if (i < argc && !strcmp(argv[i], "--")) - i++; - /* git reset tree [--] paths... can be used to * load chosen paths from the tree into the index without * affecting the working tree nor HEAD. */ diff --git a/t/t7102-reset.sh b/t/t7102-reset.sh index 39ba14148..96d15083f 100755 --- a/t/t7102-reset.sh +++ b/t/t7102-reset.sh @@ -428,4 +428,51 @@ test_expect_success '--mixed refreshes the index' ' test_cmp expect output ' +test_expect_success 'disambiguation (1)' ' + + git reset --hard && + >secondfile && + git add secondfile && + test_must_fail git reset secondfile && + test -z "$(git diff --cached --name-only)" && + test -f secondfile && + test ! -s secondfile + +' + +test_expect_success 'disambiguation (2)' ' + + git reset --hard && + >secondfile && + git add secondfile && + rm -f secondfile && + test_must_fail git reset secondfile && + test -n "$(git diff --cached --name-only -- secondfile)" && + test ! -f secondfile + +' + +test_expect_success 'disambiguation (3)' ' + + git reset --hard && + >secondfile && + git add secondfile && + rm -f secondfile && + test_must_fail git reset HEAD secondfile && + test -z "$(git diff --cached --name-only)" && + test ! -f secondfile + +' + +test_expect_success 'disambiguation (4)' ' + + git reset --hard && + >secondfile && + git add secondfile && + rm -f secondfile && + test_must_fail git reset -- secondfile && + test -z "$(git diff --cached --name-only)" && + test ! -f secondfile +' + test_done |