checkout: clear commit marks after detached-orphan check
When leaving a detached HEAD, we do a revision walk to make sure the commit we are leaving isn't being orphaned. However, this leaves crufty marks in the commit objects which can confuse later walkers, like the one in stat_tracking_info. Let's clean up after ourselves to prevent this conflict. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King committed
Mar 20, 2011 at 05:09 UTC
5c08dc48a8cf987c3a14006b5a82651e9b3f5423
2 files changed
+26
builtin/checkout.c
+13
@@ -603,6 +603,16 @@ static int add_one_ref_to_rev_list_arg(const char *refname,
603
return 0;
604
}
605
606
+static int clear_commit_marks_from_one_ref(const char *refname,
607
+ const unsigned char *sha1,
608
+ int flags,
609
+ void *cb_data)
610
+{
611
+ struct commit *commit = lookup_commit_reference_gently(sha1, 1);
612
+ if (commit)
613
+ clear_commit_marks(commit, -1);
614
+ return 0;
615
+}
616
617
static void describe_one_orphan(struct strbuf *sb, struct commit *commit)
618
{
@@ -674,6 +684,9 @@ static void orphaned_commit_warning(struct commit *commit)
684
suggest_reattach(commit, &revs);
685
else
686
describe_detached_head("Previous HEAD position was", commit);
687
+
688
+ clear_commit_marks(commit, -1);
689
+ for_each_ref(clear_commit_marks_from_one_ref, NULL);
690
}
691
692
static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
t/t2020-checkout-detach.sh
+13
@@ -126,4 +126,17 @@ test_expect_success 'checkout does not warn leaving reachable commit' '
126
check_no_orphan_warning stderr
127
'
128
129
+cat >expect <<'EOF'
130
+Your branch is behind 'master' by 1 commit, and can be fast-forwarded.
131
+EOF
132
+test_expect_success 'tracking count is accurate after orphan check' '
133
+ reset &&
134
+ git branch child master^ &&
135
+ git config branch.child.remote . &&
136
+ git config branch.child.merge refs/heads/master &&
137
+ git checkout child^ &&
138
+ git checkout child >stdout &&
139
+ test_cmp expect stdout
140
+'
141
+
142
test_done