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

Re: [PATCH 2/2] pickaxe: use textconv for -S counting

From
Jeff King <peff@peff.net>
Date
Nov 21, 2012, 20:27 UTC
Message-ID
<20121121202704.GH16280@sigill.intra.peff.net>
In-Reply-To
<7vr4npt7zd.fsf@alter.siamese.dyndns.org>
On Mon, Nov 19, 2012 at 04:48:22PM -0800, Junio C Hamano wrote:
Show 18 quoted lines
> Junio C Hamano <gitster@pobox.com> writes:
> 
> >> Exact renames are the obvious one, but they are not handled here.
> >
> > That is half true.  Before this change, we will find the same number
> > of needles and this function would have said "no differences" in a
> > very inefficient way.  After this change, we may apply different
> > textconv filters and this function will say "there is a difference",
> > even though we wouldn't see such a difference at the content level
> > if there wasn't any rename.
> 
> ... but I think that is a good thing anyway.
> 
> If you renamed foo.c to foo.cc with different conversions from C
> code to the text that explain what the code does, if we special case
> only the exact rename case but let pickaxe examine the converted
> result in a case where blobs are modified only by one byte, we would
> get drastically different results between the two cases.

Right, exactly. I think the only sane thing is to always textconv or always not textconv (whether they are identical renames or not), and any "these are the same" optimization for identical content needs to take into account whether we _would have_ done a different textconv (which most of the time is going to be "no", as textconv is either not in use, or both paths use the same diff driver; but it is not too expensive to look up).

The diff_unmodified_pair at the top off diff_flush_patch is correct, because it treats renames as interesting (because we have to show the diff header, anyway). I do not know offhand if we avoid feeding identical content to xdiff at all, but if so, we should be doing so only after checking that the textconv filters are identical.

Show 5 quoted lines
> Corollary to this is what should happen when you update the attributes
> between two trees so that textconv for a path that did not change
> between preimage and postimage are different.  Ideally, we should
> notice that the two converted result are different, perhaps, but I
> do not like the performance implications very much.

The content to compare cannot be different unless either the input content changed or the path changed, and we treat either as "interesting" in most code paths. So I do not think there are any performance implications, except that we may need to make sure to look up textconvs a few lines sooner in some cases.

I'll re-roll the series next week and break out the rename-optimization bits separately so it is more obvious that it is doing the right thing.

As an aside, I also need to revisit the regex half of that code, which is still buggy (before and after my patch, due to the expecting-a-NUL behavior we talked about a week or two ago). That is a separate topic, but the same area of code.

-Peff
Previous: Junio C HamanoNext: Peter Oberndorfer
Message 10 of 24 in “crash on git diff-tree -Ganything <tree> for new files with textconv filter”
  1. Peter OberndorferOct 27, 2012
  2. Jeff KingOct 28, 2012
  3. 0/2 textconv support for "log -S"Jeff King, Oct 28, 2012
  4. 1/2 pickaxe: hoist empty needle checkJeff King, Oct 28, 2012
  5. 2/2 pickaxe: use textconv for -S countingJeff King, Oct 28, 2012
  6. Junio C HamanoNov 13, 2012
  7. Jeff KingNov 15, 2012
  8. Junio C HamanoNov 20, 2012
  9. Junio C HamanoNov 20, 2012
  10. Jeff KingNov 21, 2012
  11. Peter OberndorferOct 28, 2012
  12. Jeff KingOct 29, 2012
  13. Jeff KingOct 29, 2012
  14. Peter OberndorferOct 29, 2012
  15. Jeff KingOct 29, 2012
  16. Jeff KingOct 29, 2012
  17. Jeff KingOct 30, 2012
  18. Junio C HamanoOct 30, 2012
  19. Jeff KingOct 30, 2012
  20. Ramsay JonesNov 1, 2012
  21. Peter OberndorferNov 7, 2012
  22. Jeff KingNov 7, 2012
  23. Peter OberndorferJun 3, 2013
  24. Jeff KingJun 3, 2013

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.