[PATCH] blame: allow --contents to work with bare repo

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The --contents option can be used with git blame to blame the file as if
it had the contents from the specified file. Since
1a3119ed06c8fbb1c00a6aa3615299252575abab ("blame: allow --contents to
work with non-HEAD commit"), the --contents option can work with
non-HEAD commit. However, if you try to use --contents in a bare
repository, you get the following error:

    fatal: this operation must be run in a work tree

This is because before trying to generate a fake working tree commit,
we always call setup_work_tree. But in a bare repo, work tree is not
available. The call to setup_work_tree is used to prepare the reading
of the blamed file in the work tree, which isn't neccessary if we are
reading the contents from the specific file instead of the file in the
work tree.

Add a check in setup_scoreboard to skip setup_work_tree if we are
reading from the file specified in --contents.

This enables us to use --contents in a bare repo. This is a nice
addtion on top of 1a3119ed06c8fbb1c00a6aa3615299252575abab, having a
working tree to use --contents is optional.

Add test for the --contents option with bare repo to the
annotate-tests.sh test script.

Signed-off-by: Han Young <hanyang.tony@xxxxxxxxxxxxx>
---
Before commit 1a3119ed06c8fbb1c00a6aa3615299252575abab using
--contents in a bare repo will lead to

        fatal: cannot use --contents with final commit object name

even without specify a revision, this is because in a bare repo, HEAD
is seem as a passed revision. After
1a3119ed06c8fbb1c00a6aa3615299252575abab, git will try to
setup_work_tree as long as --contents is passed. So we still cannot
use --contents on a bare repo.

I was comparing files between a bare repo on the server and my local
partial cloned repo. It is convenient for me to be able to use
--contents option on a bare repo, because the project is very large
and would occupy a lot of disk space if fully cloned on local machine.

With this change I can upload my local file to the server and get the
blame result without keeping a full clone of the repo on my local
machine.

 blame.c             | 4 +++-
 t/annotate-tests.sh | 9 +++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/blame.c b/blame.c
index d12bd9f97b..0b6703d636 100644
--- a/blame.c
+++ b/blame.c
@@ -2806,7 +2806,9 @@ void setup_scoreboard(struct blame_scoreboard *sb,
                         parent_oid = &head_oid;
                 }

-                setup_work_tree();
+                if (!sb->contents_from) {
+                        setup_work_tree();
+                }
                 sb->final = fake_working_tree_commit(sb->repo,
                                                      &sb->revs->diffopt,
                                                      sb->path,
sb->contents_from,
diff --git a/t/annotate-tests.sh b/t/annotate-tests.sh
index 2ef70235b1..5e21e84f38 100644
--- a/t/annotate-tests.sh
+++ b/t/annotate-tests.sh
@@ -83,6 +83,15 @@ test_expect_success 'blame with --contents' '
         check_count --contents=file A 2
 '

+test_expect_success 'blame with --contents in a bare repo' '
+        git clone --bare . bare-contents.git &&
+        (
+                cd bare-contents.git &&
+                echo "1A quick brown fox jumps over the" >contents &&
+                check_count --contents=contents A 1
+        )
+'
+
 test_expect_success 'blame with --contents changed' '
         echo "1A quick brown fox jumps over the" >contents &&
         echo "another lazy dog" >>contents &&
--
2.40.0




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux