]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reset: parse rev as tree-ish in patch mode
authorNika Layzell <nika@thelayzells.com>
Sun, 24 Nov 2019 20:25:49 +0000 (20:25 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 25 Nov 2019 02:01:22 +0000 (11:01 +0900)
Since 2f328c3d ("reset $sha1 $pathspec: require $sha1 only to be
treeish", 2013-01-14), we allowed "git reset $object -- $path" to reset
individual paths that match the pathspec to take the blob from a tree
object, not necessarily a commit, while the form to reset the tip of the
current branch to some other commit still must be given a commit.

Like resetting with paths, "git reset --patch" does not update HEAD, and
need not require a commit. The path-filtered form, "git reset --patch
$object -- $pathspec", has accepted a tree-ish since 2f328c3d.

"git reset --patch" is documented as accepting a <tree-ish> since
bf44142f ("reset: update documentation to require only tree-ish with
paths", 2013-01-16). Documentation changes are not required.

Loosen the restriction that requires a commit for the unfiltered "git
reset --patch $object".

Signed-off-by: Nika Layzell <nika@thelayzells.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/reset.c
t/t7105-reset-patch.sh

index fdd572168b51cc388a098008c3636ffa60856233..5cbfb21ec4beb0c6f0016c17b00a3f462ea80209 100644 (file)
@@ -320,7 +320,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
        if (unborn) {
                /* reset on unborn branch: treat as reset to empty tree */
                oidcpy(&oid, the_hash_algo->empty_tree);
-       } else if (!pathspec.nr) {
+       } else if (!pathspec.nr && !patch_mode) {
                struct commit *commit;
                if (get_oid_committish(rev, &oid))
                        die(_("Failed to resolve '%s' as a valid revision."), rev);
index bd10a96727c573bdd53b53079943990d232431c3..fc2a6cf5c7a49a7971e23213d4d324799c2f92c9 100755 (executable)
@@ -38,6 +38,27 @@ test_expect_success PERL 'git reset -p HEAD^' '
        test_i18ngrep "Apply" output
 '
 
+test_expect_success PERL 'git reset -p HEAD^^{tree}' '
+       test_write_lines n y | git reset -p HEAD^^{tree} >output &&
+       verify_state dir/foo work parent &&
+       verify_saved_state bar &&
+       test_i18ngrep "Apply" output
+'
+
+test_expect_success PERL 'git reset -p HEAD^:dir/foo (blob fails)' '
+       set_and_save_state dir/foo work work &&
+       test_must_fail git reset -p HEAD^:dir/foo &&
+       verify_saved_state dir/foo &&
+       verify_saved_state bar
+'
+
+test_expect_success PERL 'git reset -p aaaaaaaa (unknown fails)' '
+       set_and_save_state dir/foo work work &&
+       test_must_fail git reset -p aaaaaaaa &&
+       verify_saved_state dir/foo &&
+       verify_saved_state bar
+'
+
 # The idea in the rest is that bar sorts first, so we always say 'y'
 # first and if the path limiter fails it'll apply to bar instead of
 # dir/foo.  There's always an extra 'n' to reject edits to dir/foo in