Subject: bug#8756: 23.3; vc-git.el doesn't use --follow argument in vc-git-print-log

From: Dan Nicolaescu <[email-masked]>
Date: Thu, 01 Dec 2011 13:15:16 -0500

Steinar Bang <[email-masked]> writes:

>>>>>> Dan Nicolaescu <[email-masked]>:
>> Steinar Bang <[email-masked]> writes:
>
>>> ....  The first problem I ran into, was that the emacs 23.1 version
>>> of `vc-git-print-log' used "git rev-list" instead of "git log".  And
>>> only "git log" supports "--follow" to track renames
>
>> vc-git-print-log currently uses "git log", so your changes should not
>> be needed.
>
> Something similar wille be needed, if vc-git-print-log is supposed to
> support a files argument of more than a single file, since "--follow" is
> only supported for a single file.
>
> #begin_example
>   sb@somehost:~$ git log --follow ~/apps/share/emacs23/site-lisp/vc-git.el ~/.emacs
>   usage: git logs can only follow renames on one pathname at a time
>   sb@somehost:~$ git log --follow 
>   usage: git logs can only follow renames on one pathname at a time
> #end_example
>
>> To solve this problem please figure out the git command (or set of
>> commands) that produces the expected diff.  Anything displayed in the
>> log buffer can be considered as available.  After that we need to figure
>> out how to make VC use that/those command(s).
>
> To be able to get a working diff beyond the rename, you need the path to
> where the file used to be.  If you add the "--name-only" flag to "git
> log", you will get an extra line containing the path of the file, in a
> form that can be given to a "git diff".
>
> Using the log result at the bottom, here's an example that gives a
> useful diff, using the path of the first commit:
> #begin_example
>   sb@somehost:~$ git diff a92a3d062dac1b0ec5eece4ed6f9570e59f1a69b 8d304db76993a0da0894b3d30794a2c5ec4927fe -- apps/share/emacs/site-lisp/vc-git.el

--name-only makes the output a bit ugly, each log entry has the file
name printed and an extra empty line.  Some users might hate that.

Is it possible to compute the file name just the sha1?  That would allow
us to avoid using --name-only.

> #begin_example

>   diff --git a/apps/share/emacs/site-lisp/vc-git.el b/apps/share/emacs/site-lisp/vc-git.el
>   index b9b63ce..e4b0188 100644
>   --- a/apps/share/emacs/site-lisp/vc-git.el
>   +++ b/apps/share/emacs/site-lisp/vc-git.el
>   @@ -604,7 +604,7 @@ for the --graph option."
>           (apply 'vc-git-command buffer
>                  'async files
>                  (append
>   -               '("log" "--no-color")
>   +               '("log" "--follow" "--no-color")
>                   (when shortlog
>                     '("--graph" "--decorate" "--date=short"
>                        "--pretty=tformat:%d%h  %ad  %s" "--abbrev-commit"))
> #end_example
>
> Blame for a path beyond the rename also works, just use the commit you
> want to blame from, and the path of that commit in the log buffer:
>  git blame a92a3d062dac1b0ec5eece4ed6f9570e59f1a69b -- apps/share/emacs/site-lisp/vc-git.e
>
> Here's the example of a diff output with paths I used to get the above
> commands.  The rename commit is a50a042e5af770928eaa8b636517d66bc2a13ee7
> and the path given on that log entry, is the new path.
> #begin_example
>   sb@somehost:~$ git log --follow --name-only ~/apps/share/emacs23/site-lisp/vc-git.el
>   commit ae93673cf7a325ac6882b73a4280cfba3fca41e9
>   Author: Steinar Bang <[email-masked]>
>   Date:   Mon Nov 28 23:12:47 2011 +0100
>   
>       Make `vc-git-print-log' on a single file use "git log --follow" instead of "git rev-list".
>       
>       This is to make the `C-x v l' command show log entries across file
>       renames.
>       
>       Only partially successful, since diffs, annotate, and finding the
>       version of the file, doesn't work across the renaming boundary.
>   
>   apps/share/emacs23/site-lisp/vc-git.el
>   
>   commit 4098e78805561b9af3e29184a8133baaf6d16621
>   Author: Steinar Bang <[email-masked]>
>   Date:   Mon Nov 28 10:28:49 2011 +0100
>   
>       Emacs 23.1 version of vc-git.el.
>   
>   apps/share/emacs23/site-lisp/vc-git.el
>   
>   commit a50a042e5af770928eaa8b636517d66bc2a13ee7
>   Author: Steinar Bang <[email-masked]>
>   Date:   Thu Jun 23 19:26:28 2011 +0200
>   
>       Load the locally modified vc-git.el only for emacs23 (fails on emacs22).
>   
>   apps/share/emacs23/site-lisp/vc-git.el
>   
>   commit 8d304db76993a0da0894b3d30794a2c5ec4927fe
>   Author: Steinar Bang <[email-masked]>
>   Date:   Sun May 29 22:24:58 2011 +0200
>   
>       Use the --follow flag on the "git log" command, to get full history across file moves in vc-git-print-log.
>   
>   apps/share/emacs/site-lisp/vc-git.el
>   
>   commit a92a3d062dac1b0ec5eece4ed6f9570e59f1a69b
>   Author: Steinar Bang <[email-masked]>
>   Date:   Sun May 29 22:23:51 2011 +0200
>   
>       Adding the vc-git.el from emacs 23.3.
>   
>   apps/share/emacs/site-lisp/vc-git.el
> #end_example