Skip to content

Commit

Permalink
checkout: clear commit marks after detached-orphan check
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Mar 20, 2011
1 parent 493dd6e commit 5c08dc4
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
13 changes: 13 additions & 0 deletions builtin/checkout.c
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,16 @@ static int add_one_ref_to_rev_list_arg(const char *refname,
return 0;
}

static int clear_commit_marks_from_one_ref(const char *refname,
const unsigned char *sha1,
int flags,
void *cb_data)
{
struct commit *commit = lookup_commit_reference_gently(sha1, 1);
if (commit)
clear_commit_marks(commit, -1);
return 0;
}

static void describe_one_orphan(struct strbuf *sb, struct commit *commit)
{
Expand Down Expand Up @@ -674,6 +684,9 @@ static void orphaned_commit_warning(struct commit *commit)
suggest_reattach(commit, &revs);
else
describe_detached_head("Previous HEAD position was", commit);

clear_commit_marks(commit, -1);
for_each_ref(clear_commit_marks_from_one_ref, NULL);
}

static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
Expand Down
13 changes: 13 additions & 0 deletions t/t2020-checkout-detach.sh
Original file line number Diff line number Diff line change
Expand Up @@ -126,4 +126,17 @@ test_expect_success 'checkout does not warn leaving reachable commit' '
check_no_orphan_warning stderr
'

cat >expect <<'EOF'
Your branch is behind 'master' by 1 commit, and can be fast-forwarded.
EOF
test_expect_success 'tracking count is accurate after orphan check' '
reset &&
git branch child master^ &&
git config branch.child.remote . &&
git config branch.child.merge refs/heads/master &&
git checkout child^ &&
git checkout child >stdout &&
test_cmp expect stdout
'

test_done

0 comments on commit 5c08dc4

Please sign in to comment.