mirror of
https://github.com/git/git.git
synced 2024-11-08 02:03:12 +01:00
Merge branch 'jc/maint-reset'
* jc/maint-reset: Allow "git-reset path" when unambiguous
This commit is contained in:
commit
24cd49f627
2 changed files with 81 additions and 5 deletions
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue