]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/reset: compute checkout metadata for reset
authorbrian m. carlson <bk2204@github.com>
Mon, 16 Mar 2020 18:05:07 +0000 (18:05 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Mar 2020 18:37:02 +0000 (11:37 -0700)
Pass the commit, and if we have it, the ref to the filters when we
perform a checkout.  This should only be the case when we invoke git
reset --hard; the metadata will be unused otherwise.

Signed-off-by: brian m. carlson <bk2204@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/reset.c
t/t0021-conversion.sh

index 18228c312ea009e79b1ae179f4a40ad3b4a35574..4c634111bd80f62b948ccb8935e0d1f6d21ab438 100644 (file)
@@ -46,7 +46,7 @@ static inline int is_merge(void)
        return !access(git_path_merge_head(the_repository), F_OK);
 }
 
-static int reset_index(const struct object_id *oid, int reset_type, int quiet)
+static int reset_index(const char *ref, const struct object_id *oid, int reset_type, int quiet)
 {
        int i, nr = 0;
        struct tree_desc desc[2];
@@ -60,6 +60,7 @@ static int reset_index(const struct object_id *oid, int reset_type, int quiet)
        opts.dst_index = &the_index;
        opts.fn = oneway_merge;
        opts.merge = 1;
+       init_checkout_metadata(&opts.meta, ref, oid, NULL);
        if (!quiet)
                opts.verbose_update = 1;
        switch (reset_type) {
@@ -418,11 +419,20 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
                                }
                        }
                } else {
-                       int err = reset_index(&oid, reset_type, quiet);
+                       struct object_id dummy;
+                       char *ref = NULL;
+                       int err;
+
+                       dwim_ref(rev, strlen(rev), &dummy, &ref);
+                       if (ref && !starts_with(ref, "refs/"))
+                               ref = NULL;
+
+                       err = reset_index(ref, &oid, reset_type, quiet);
                        if (reset_type == KEEP && !err)
-                               err = reset_index(&oid, MIXED, quiet);
+                               err = reset_index(ref, &oid, MIXED, quiet);
                        if (err)
                                die(_("Could not reset index file to revision '%s'."), rev);
+                       free(ref);
                }
 
                if (write_locked_index(&the_index, &lock, COMMIT_LOCK))
index 3efb0dad20b47a3275eab6ad0595064f23d1fd9a..a026fd46b4ee369b550d970fd545baa8ea69021e 100755 (executable)
@@ -447,7 +447,8 @@ test_expect_success PERL 'required process filter should filter data for various
                git commit -m "test commit 3" &&
                git checkout empty-branch &&
                filter_git rebase --onto empty-branch master^^ master &&
-               META="ref=refs/heads/master treeish=$(git rev-parse --verify master)" &&
+               MASTER2=$(git rev-parse --verify master) &&
+               META="ref=refs/heads/master treeish=$MASTER2" &&
                cat >expected.log <<-EOF &&
                        START
                        init handshake complete
@@ -458,6 +459,35 @@ test_expect_success PERL 'required process filter should filter data for various
                        IN: smudge testsubdir/test3 '\''sq'\'',\$x=.r $META blob=$M3 $S3 [OK] -- OUT: $S3 . [OK]
                        STOP
                EOF
+               test_cmp_exclude_clean expected.log debug.log &&
+
+               git reset --hard empty-branch &&
+               filter_git reset --hard $MASTER &&
+               META="treeish=$MASTER" &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: smudge test.r $META blob=$M $S [OK] -- OUT: $S . [OK]
+                       IN: smudge test2.r $META blob=$M2 $S2 [OK] -- OUT: $S2 . [OK]
+                       IN: smudge test4-empty.r $META blob=$EMPTY 0 [OK] -- OUT: 0  [OK]
+                       IN: smudge testsubdir/test3 '\''sq'\'',\$x=.r $META blob=$M3 $S3 [OK] -- OUT: $S3 . [OK]
+                       STOP
+               EOF
+               test_cmp_exclude_clean expected.log debug.log &&
+
+               git branch old-master $MASTER &&
+               git reset --hard empty-branch &&
+               filter_git reset --hard old-master &&
+               META="ref=refs/heads/old-master treeish=$MASTER" &&
+               cat >expected.log <<-EOF &&
+                       START
+                       init handshake complete
+                       IN: smudge test.r $META blob=$M $S [OK] -- OUT: $S . [OK]
+                       IN: smudge test2.r $META blob=$M2 $S2 [OK] -- OUT: $S2 . [OK]
+                       IN: smudge test4-empty.r $META blob=$EMPTY 0 [OK] -- OUT: 0  [OK]
+                       IN: smudge testsubdir/test3 '\''sq'\'',\$x=.r $META blob=$M3 $S3 [OK] -- OUT: $S3 . [OK]
+                       STOP
+               EOF
                test_cmp_exclude_clean expected.log debug.log
        )
 '