git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 7/7] blame: actually use the diff opts parsed from the command line

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 23, 2016, 17:01 UTC
Message-ID
<xmqqtwebwhbg.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<8192012a6bf725e0460522f9e67bab83b613127a.1471864378.git.mhagger@alum.mit.edu>
Michael Haggerty <mhagger@alum.mit.edu> writes:
> Somebody who knows more about how diff operations are configured
> should please review this. I'm not certain that the change as
> implemented won't have other unwanted side-effects, though of course
> I checked that the test suite runs correctly.
Generally, I think this is a bad idea.  
We run "diff-tree" internally for multiple purposes:
 - When the same path we are drilling down appears, we use diff-tree
   to compare that path alone, to obtain textual diff, so that we
   can say "what did not appear in the textual diff output are
   attributable to the parent commit, we can exonerate this child".
   Even if the command line to "git blame" had "-Sfoo", you do not
   want to pass it down to this invocation.  If the child did not
   change the number of occurrences of string "foo" in the path
   being drilled down, it will pass down the blame for all lines to
   the parent.  And copying -R from the command line to this
   invocation does not make any sense.  Copying -C -C from the
   command line will defeat the whole purpose of having find_origin
   vs find_rename distinction, I would think, for this step.
 - When the path we have been drilling down for no longer appears in
   the parent, we use diff-tree with rename detection to find where
   the file _could_ have come from.
   It is a good idea to allow the similarity threshold to be tweaked
   from the command line.  Copying -R from the command line to this
   invocation may make sense, but I think you would break this step
   if you copied -C/-C -C
 - When -C/-C -C/-C -C -C is given from the command line, after
   running the "pass the blame to our primary suspect", we run
   tree-level diff-tree with find-copy option, only to enumerate
   paths that appear in the parent.  We pick pieces from these paths
   by doing blob-level diffs in diff_hunks() ourselves.  Copying -C
   from the command line would be useful if you are only doing a
   single '-C' (because it would allow you to tweak the similarity
   threshold), but otherwise it would probably break the command.

The design principle taken in "git blame" is to leave the decision on what diff options do or do not make sense for these particular invocations of the internal "diff-tree", and have "blame" give the selected options to the internal "diff-tree" invocations. "-w" happens to use xdl_opts that will eventually be passed down to diff machinery but you should consider it an accidental optimization (i.e. "blame" designer considered that it makes sense to give whitespace-ignoring comparison at the leaf-level "diff between blobs", and found that the most efficient way to do so is to just take "-w" from the command line and set the ignore-whitespace bit used to drive the internal "diff-tree" invocation). If we _were_ adding -R<num> to allow the users to affect similarity threshold, we would parse it in "git blame" command line option processing, and would give that _ONLY_ to the second invocation above, i.e. the one done in find_rename() but not in others like in find_origin.

Previous: Junio C Hamano
Message 13 of 13 in “Better heuristics make prettier diffs”
  1. 0/7 Better heuristics make prettier diffsMichael Haggerty, Aug 22, 2016
  2. 2/7 xdl_change_compact(): only use heuristic if group can't be matchedMichael Haggerty, Aug 22, 2016
  3. 1/7 xdl_change_compact(): fix compaction heuristic to adjust ixoMichael Haggerty, Aug 22, 2016
  4. 6/7 diff: improve positioning of add/delete blocks in diffsMichael Haggerty, Aug 22, 2016
  5. 3/7 is_blank_line(): take a single xrecord_t as argumentMichael Haggerty, Aug 22, 2016
  6. 5/7 xdl_change_compact(): introduce the concept of a change groupMichael Haggerty, Aug 22, 2016
  7. Junio C HamanoAug 23, 2016
  8. 4/7 recs_match(): take two xrecord_t pointers as argumentsMichael Haggerty, Aug 22, 2016
  9. 7/7 blame: actually use the diff opts parsed from the command lineMichael Haggerty, Aug 22, 2016
  10. René ScharfeAug 23, 2016
  11. Michael HaggertySep 5, 2016
  12. Junio C HamanoSep 7, 2016
  13. Junio C HamanoAug 23, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.