From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: Piotr Krukowiecki <piotr.krukowiecki@gmail.com>,
Git Mailing List <git@vger.kernel.org>
Subject: [PATCH 2/3] checkout: clear commit marks after detached-orphan check
Date: Sun, 20 Mar 2011 05:09:18 -0400 [thread overview]
Message-ID: <20110320090918.GB15948@sigill.intra.peff.net> (raw)
In-Reply-To: <20110320090111.GA15641@sigill.intra.peff.net>
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>
---
This uses for_each_ref to re-find the list of commits we touched in our
traversal, which feels a little hacky. prepare_revision_walk already
generates the exact list of tips, but unfortunately writes it
into revs->commits, which then gets munged by limit_list in the second
half of prepare_revision_walk. I wonder if it should keep a copy
elsewhere in revs, and then we could add:
clear_all_commit_marks(&revs);
to let callers clean up after themselves easily.
I also just clear all marks; we could do just the ones that the revision
walker marks, but this seemed more future-proof to me than a set list of
marks.
builtin/checkout.c | 13 +++++++++++++
t/t2020-checkout-detach.sh | 13 +++++++++++++
2 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 2bf02f2..f88d2c8 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -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)
{
@@ -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)
diff --git a/t/t2020-checkout-detach.sh b/t/t2020-checkout-detach.sh
index bfeb2a6..569b27f 100755
--- a/t/t2020-checkout-detach.sh
+++ b/t/t2020-checkout-detach.sh
@@ -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
--
1.7.2.5.10.g62fe7
next prev parent reply other threads:[~2011-03-20 9:09 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-19 21:53 [bug] git checkout lies about number of ahead commits when switching from detached HEAD Piotr Krukowiecki
2011-03-19 22:28 ` Jeff King
2011-03-19 22:47 ` Jeff King
2011-03-20 0:35 ` Junio C Hamano
2011-03-20 9:01 ` Jeff King
2011-03-20 9:04 ` [PATCH 1/3] checkout: add basic tests for detached-orphan warning Jeff King
2011-03-20 9:09 ` Jeff King [this message]
2011-03-20 19:05 ` [PATCH 2/3] checkout: clear commit marks after detached-orphan check Junio C Hamano
2012-04-13 22:59 ` [PATCH] i18n: use test_i18ncmp in t2020 (checkout --detach) Jonathan Nieder
2012-04-13 23:25 ` [PATCH/RFC] checkout --detached test: write supporting files before start of tests Jonathan Nieder
2012-04-13 23:33 ` Jeff King
2012-04-13 23:49 ` Jonathan Nieder
2012-04-14 2:26 ` Jeff King
2012-04-13 23:30 ` [PATCH] i18n: use test_i18ncmp in t2020 (checkout --detach) Jeff King
2012-04-13 23:46 ` Jonathan Nieder
2012-04-14 2:24 ` Jeff King
2012-04-14 4:44 ` [PATCH v2 0/3] " Jonathan Nieder
2012-04-14 4:45 ` [PATCH 1/3] test: do not rely on US English tracking-info messages Jonathan Nieder
2012-04-14 4:46 ` [PATCH 2/3] test: use test_i18ncmp for "Patch format detection failed" message Jonathan Nieder
2012-04-14 4:48 ` [PATCH 3/3] test: am of empty patch should not succeed Jonathan Nieder
2012-04-14 8:15 ` [PATCH v2 0/3] Re: i18n: use test_i18ncmp in t2020 (checkout --detach) Jeff King
2012-04-14 5:02 ` [PATCH] " Jonathan Nieder
2012-04-14 8:22 ` Jeff King
2012-04-14 12:47 ` Jonathan Nieder
2011-03-20 9:19 ` [PATCH 3/3] checkout: tweak detached-orphan warning format Jeff King
2011-03-20 19:00 ` [bug] git checkout lies about number of ahead commits when switching from detached HEAD Junio C Hamano
2011-03-21 10:35 ` Jeff King
2011-03-21 15:17 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110320090918.GB15948@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=piotr.krukowiecki@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).