Merge branch 'sg/blame-in-bare-start-at-head'
authorJunio C Hamano <gitster@pobox.com>
Thu, 25 Apr 2019 07:41:21 +0000 (16:41 +0900)
committerJunio C Hamano <gitster@pobox.com>
Thu, 25 Apr 2019 07:41:21 +0000 (16:41 +0900)
"git blame -- path" in a non-bare repository starts blaming from
the working tree, and the same command in a bare repository errors
out because there is no working tree by definition. The command
has been taught to instead start blaming from the commit at HEAD,
which is more useful.

* sg/blame-in-bare-start-at-head:
blame: default to HEAD in a bare repo when no start commit is given

builtin/blame.c
t/annotate-tests.sh
index 177c1022a0c46dbd8983224719d4d9cc0106a9fb..21cde57e711e337f3c123b35332bb2af0ebdf9cf 100644 (file)
@@ -27,6 +27,7 @@
 #include "object-store.h"
 #include "blame.h"
 #include "string-list.h"
+#include "refs.h"
 
 static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] <file>");
 
@@ -993,6 +994,18 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
 
        revs.disable_stdin = 1;
        setup_revisions(argc, argv, &revs, NULL);
+       if (!revs.pending.nr && is_bare_repository()) {
+               struct commit *head_commit;
+               struct object_id head_oid;
+
+               if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
+                                       &head_oid, NULL) ||
+                   !(head_commit = lookup_commit_reference_gently(revs.repo,
+                                                            &head_oid, 1)))
+                       die("no such ref: HEAD");
+
+               add_pending_object(&revs, &head_commit->object, "HEAD");
+       }
 
        init_scoreboard(&sb);
        sb.revs = &revs;
index 6da48a2e0a461e35f31fdd05712ee5c2bb9fda31..d933af571474f365c8e6ad478f5c833f3b67b315 100644 (file)
@@ -68,6 +68,14 @@ test_expect_success 'blame 1 author' '
        check_count A 2
 '
 
+test_expect_success 'blame in a bare repo without starting commit' '
+       git clone --bare . bare.git &&
+       (
+               cd bare.git &&
+               check_count A 2
+       )
+'
+
 test_expect_success 'blame by tag objects' '
        git tag -m "test tag" testTag &&
        git tag -m "test tag #2" testTag2 testTag &&