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

From: Steinar Bang <[email-masked]>
Date: Tue, 29 Nov 2011 18:29:27 +0100

>>>>> 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
  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