Code

Merge branch 'jk/checkout-orphan-warning'
authorJunio C Hamano <gitster@pobox.com>
Sun, 27 Mar 2011 03:13:16 +0000 (20:13 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 27 Mar 2011 03:13:16 +0000 (20:13 -0700)
* jk/checkout-orphan-warning:
  checkout: tweak detached-orphan warning format
  checkout: clear commit marks after detached-orphan check
  checkout: add basic tests for detached-orphan warning

builtin/checkout.c
t/t2020-checkout-detach.sh

index 2bf02f2841a84a2a86de08e53328dbbb87ff3587..686d0ffd300e3e23cfd31b12d4267b5930787317 100644 (file)
@@ -603,13 +603,26 @@ 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)
 {
        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');
 }
@@ -674,6 +687,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)
index 00421453ba26327b929fa7b5133a3072fce2bb03..569b27fe8d488833c3ec0d9952ae064764a0183f 100755 (executable)
@@ -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,41 @@ 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
+'
+
+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