From 493dd6ed5b46659d7e20aaef00f97e279ce1c4cb Mon Sep 17 00:00:00 2001 From: Jeff King Date: Sun, 20 Mar 2011 05:04:16 -0400 Subject: [PATCH 1/3] checkout: add basic tests for detached-orphan warning Commit 8e2dc6ac added a warning when we leave a detached HEAD whose commit is not reachable from any ref tip. Let's add a few basic tests to make sure it works. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- t/t2020-checkout-detach.sh | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/t/t2020-checkout-detach.sh b/t/t2020-checkout-detach.sh index 00421453b..bfeb2a651 100755 --- a/t/t2020-checkout-detach.sh +++ b/t/t2020-checkout-detach.sh @@ -11,6 +11,14 @@ check_not_detached () { git symbolic-ref -q HEAD >/dev/null } +ORPHAN_WARNING='you are leaving .* commit.*behind' +check_orphan_warning() { + grep "$ORPHAN_WARNING" "$1" +} +check_no_orphan_warning() { + ! grep "$ORPHAN_WARNING" "$1" +} + reset () { git checkout master && check_not_detached @@ -19,6 +27,8 @@ reset () { test_expect_success 'setup' ' test_commit one && test_commit two && + test_commit three && git tag -d three && + test_commit four && git tag -d four && git branch branch && git tag tag ' @@ -92,4 +102,28 @@ test_expect_success 'checkout --detach moves HEAD' ' git diff --exit-code two ' +test_expect_success 'checkout warns on orphan commits' ' + reset && + git checkout --detach two && + echo content >orphan && + git add orphan && + git commit -a -m orphan && + git checkout master 2>stderr && + check_orphan_warning stderr +' + +test_expect_success 'checkout does not warn leaving ref tip' ' + reset && + git checkout --detach two && + git checkout master 2>stderr && + check_no_orphan_warning stderr +' + +test_expect_success 'checkout does not warn leaving reachable commit' ' + reset && + git checkout --detach HEAD^ && + git checkout master 2>stderr && + check_no_orphan_warning stderr +' + test_done From 5c08dc48a8cf987c3a14006b5a82651e9b3f5423 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Sun, 20 Mar 2011 05:09:18 -0400 Subject: [PATCH 2/3] 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 Signed-off-by: Junio C Hamano --- builtin/checkout.c | 13 +++++++++++++ t/t2020-checkout-detach.sh | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/builtin/checkout.c b/builtin/checkout.c index 2bf02f284..f88d2c84a 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 bfeb2a651..569b27fe8 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 From 0be240cc65c2230d0c9732dbe0e2490a9331ea32 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Sun, 20 Mar 2011 05:19:01 -0400 Subject: [PATCH 3/3] checkout: tweak detached-orphan warning format When orphaning a commit on a detached HEAD, the warning currently looks like: Warning: you are leaving 3 commits behind, not connected to any of your branches: - commit subject 1 - commit subject 2 - commit subject 3 If you want to keep them by creating a new branch, this may be a good time to do so with: git branch new_branch_name 933a615ab0bc566dcfd8c01ec8af159f770d3fe5 Instead of using the "-" list, let's provide a more traditional oneline format, with the abbreviated sha1 before each subject. Users are accustomed to seeing commits in this format, and having the sha1 of each commit can be useful if you want to cherry-pick instead of creating a new branch. The new format looks like: Warning: you are leaving 3 commits behind, not connected to any of your branches: 933a615 commit subject 1 824fcde commit subject 2 fa49b1a commit subject 3 Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- builtin/checkout.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/builtin/checkout.c b/builtin/checkout.c index f88d2c84a..686d0ffd3 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -619,7 +619,10 @@ static void describe_one_orphan(struct strbuf *sb, struct commit *commit) struct pretty_print_context ctx = { 0 }; parse_commit(commit); - strbuf_addstr(sb, " - "); + strbuf_addstr(sb, " "); + strbuf_addstr(sb, + find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV)); + strbuf_addch(sb, ' '); pretty_print_commit(CMIT_FMT_ONELINE, commit, sb, &ctx); strbuf_addch(sb, '\n'); }