Merge branch 'jc/maint-reset' into maint

* jc/maint-reset:
  Allow "git-reset path" when unambiguous
This commit is contained in:
Junio C Hamano 2008-07-02 21:32:44 -07:00
commit 4df0d7af6b
2 changed files with 81 additions and 5 deletions

View File

@ -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. */

View File

@ -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