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

Re: [PATCH 3/4] diff: introduce diff.<driver>.binary

From
Jeff King <peff@peff.net>
Date
Oct 24, 2008, 02:46 UTC
Message-ID
<20081024024631.GA20365@coredump.intra.peff.net>
In-Reply-To
<20081005214336.GC21925@coredump.intra.peff.net>
On Sun, Oct 05, 2008 at 05:43:36PM -0400, Jeff King wrote:
Show 5 quoted lines
> However, there is at least one conflicting situation: there
> is no way to say "use the regular rules to determine whether
> this file is binary, but if we do diff it textually, use
> this funcname pattern." That is, currently setting diff=foo
> indicates that the file is definitely text.

Hrm. I don't know what crack I was smoking when I wrote this (and then argued about it for weeks afterward). It is actually the _opposite_ situation. That is, once you have said "diff=foo", there is no way to say "btw, foo files are _definitely_ text."

See, this is the old code:
Show 32 quoted lines
> -static void diff_filespec_check_attr(struct diff_filespec *one)
> +void diff_filespec_load_driver(struct diff_filespec *one)
>  {
> -	struct userdiff_driver *drv;
> -	int check_from_data = 0;
> -
> -	if (one->checked_attr)
> -		return;
> -
> -	drv = userdiff_find_by_path(one->path);
> -	one->is_binary = 0;
> -
> -	/* binaryness */
> -	if (drv == USERDIFF_ATTR_TRUE)
> -		;
> -	else if (drv == USERDIFF_ATTR_FALSE)
> -		one->is_binary = 1;
> -	else
> -		check_from_data = 1;
> -
> -	if (check_from_data) {
> -		if (!one->data && DIFF_FILE_VALID(one))
> -			diff_populate_filespec(one, 0);
> -
> -		if (one->data)
> -			one->is_binary = buffer_is_binary(one->data, one->size);
> -	}
> +	if (!one->driver)
> +		one->driver = userdiff_find_by_path(one->path);
> +	if (!one->driver)
> +		one->driver = userdiff_find_by_name("default");
>  }

You can clearly see that we use check_from_data as long as the value is not true or false. Meaning if it is unspecified _or_ if it has a string value (actually, this text is hacked up by my previous patch, but you can look at maint:diff.c and see that it is similar).

And this makes sense. Otherwise, plumbing like "git diff-tree" would get mightily confused by external diff commands. For example, consider if you had "foo diff=bar" in your attributes file, and defined "diff.bar.command". That external diff would be used for git-diff, but _not_ for diff-tree. But it would be stupid for diff-tree to look at the attribute and say "oh, we have a diff attr, it must be text."

So the patch is right to keep the binary value to "-1" except for the few cases where it has been specified explicitly. I found this out when I tried to "fix" it to the old behavior tonight and discovered lots of breakage.

And this also means that diff.*.binary really _does_ do something useful. If you have, for example, a ".foo" file that looks like binary, but really isn't, _and_ you want to set a custom hunk header for it, previously you were out of luck. You could do one or the other. Now you can do:

  git config diff.foo.xfuncname whatever
  git config diff.foo.binary false
and get the desired effect.

As for the fallout from this with regards to our discussion last week, there were two relevant points:

 - Junio suggested that anytime we use funcname, we always want text
   anyway. I think that is reasonable, but it has never been the case up
   until now (in fact, you were stuck with the _opposite_ until now, so
   my series at least makes it possible to say "always text", though
   you have to do it manually). So I will leave it for now, and
   if people feel strongly, my series provides a sane basis for a patch
   that does this automatically.
 - Johannes complained about having to set "diff.foo.binary = false"
   when we have set "diff.foo.textconv".  I agree that having to set it
   is cumbersome, but what's worse is that it is wrong. You are saying
   "this file is not binary" which is only _sometimes_ true. That is, it
   is only true if we are in a command which actually performs the text
   conversion. Plumbing sees _just_ the binary half, which is outright
   wrong (and which became painfully obvious once I wrote some tests).
   The solution is that textconv'd data should always be treated as
   text, and that takes some refactoring of my patches. I will post a
   series dealing with this in a minute.

Hopefully that explanation made sense. This turned out to be a lot trickier than I thought (in combination with my apparent crack habit), and I just spent several hours trying to figure out all of the niggling details. But I realize the rest of you haven't thought about it for at least a week. :)

-Peff
Previous: Matthieu MoyNext: Jeff King
Message 31 of 85 in “Implementation of a "textconv" filter for easy custom diff.”
  1. Matthieu MoySep 28, 2008
  2. Facility to have multiple kinds of drivers for diff.Matthieu Moy, Sep 28, 2008
  3. Implement run_command_to_buf (spawn a process and reads its stdout)Matthieu Moy, Sep 28, 2008
  4. Implement a textconv filter for "git diff"Matthieu Moy, Sep 28, 2008
  5. Document the textconv filter.Matthieu Moy, Sep 28, 2008
  6. Add a basic test for the textconv filter.Matthieu Moy, Sep 28, 2008
  7. Johannes SixtSep 28, 2008
  8. Matthieu MoySep 28, 2008
  9. Jeff KingSep 28, 2008
  10. Matthieu MoySep 28, 2008
  11. Jeff KingSep 28, 2008
  12. Jeff KingSep 28, 2008
  13. Matthieu MoySep 28, 2008
  14. Jeff KingSep 28, 2008
  15. Matthieu MoySep 30, 2008
  16. Jeff KingSep 30, 2008
  17. 0/4 diff text conversion filterJeff King, Oct 5, 2008
  18. 1/4 t4012: use test_cmp instead of cmpJeff King, Oct 5, 2008
  19. 2/4 diff: unify external diff and funcname parsing codeJeff King, Oct 5, 2008
  20. 3/4 diff: introduce diff.<driver>.binaryJeff King, Oct 5, 2008
  21. Johannes SixtOct 7, 2008
  22. Jeff KingOct 7, 2008
  23. Johannes SixtOct 7, 2008
  24. Junio C HamanoOct 12, 2008
  25. Jeff KingOct 13, 2008
  26. Junio C HamanoOct 13, 2008
  27. Jeff KingOct 13, 2008
  28. Johannes SixtOct 13, 2008
  29. Junio C HamanoOct 13, 2008
  30. Matthieu MoyOct 13, 2008
  31. Jeff KingOct 24, 2008
  32. 1/5 diff: add missing static declarationJeff King, Oct 24, 2008
  33. 2/5 add userdiff textconv testsJeff King, Oct 24, 2008
  34. 3/5 refactor userdiff textconv codeJeff King, Oct 24, 2008
  35. Johannes SixtOct 24, 2008
  36. Jeff KingOct 24, 2008
  37. Jeff KingOct 24, 2008
  38. Johannes SixtOct 24, 2008
  39. Jeff KingOct 24, 2008
  40. Junio C HamanoOct 24, 2008
  41. Jeff KingOct 24, 2008
  42. Jeff KingOct 24, 2008
  43. Jeff KingOct 25, 2008
  44. 1/7 diff: add missing static declarationJeff King, Oct 25, 2008
  45. 2/7 add userdiff textconv testsJeff King, Oct 25, 2008
  46. 3/7 textconv: assume text-converted contents are not binaryJeff King, Oct 25, 2008
  47. 4/7 textconv: don't convert for every operationJeff King, Oct 25, 2008
  48. Junio C HamanoOct 25, 2008
  49. Jeff KingOct 25, 2008
  50. Junio C HamanoOct 25, 2008
  51. Jeff KingOct 25, 2008
  52. Junio C HamanoOct 25, 2008
  53. Junio C HamanoOct 25, 2008
  54. Jeff KingOct 26, 2008
  55. Jeff KingOct 26, 2008
  56. 1/8 diff: add missing static declarationJeff King, Oct 26, 2008
  57. 2/8 document the diff driver textconv featureJeff King, Oct 26, 2008
  58. 3/8 add userdiff textconv testsJeff King, Oct 26, 2008
  59. 4/8 refactor userdiff textconv codeJeff King, Oct 26, 2008
  60. 5/8 userdiff: require explicitly allowing textconvJeff King, Oct 26, 2008
  61. 6/8 only textconv regular filesJeff King, Oct 26, 2008
  62. 7/8 wt-status: load diff ui configJeff King, Oct 26, 2008
  63. Junio C HamanoOct 27, 2008
  64. Jeff KingOct 27, 2008
  65. 8/8 enable textconv for diff in verbose status/commitJeff King, Oct 26, 2008
  66. 5/7 userdiff: require explicitly allowing textconvJeff King, Oct 25, 2008
  67. 6/7 document the diff driver textconv featureJeff King, Oct 25, 2008
  68. 7/7 only textconv regular filesJeff King, Oct 25, 2008
  69. 4/5 userdiff: require explicitly allowing textconvJeff King, Oct 24, 2008
  70. Johannes SixtOct 24, 2008
  71. 5/5 document the diff driver textconv featureJeff King, Oct 24, 2008
  72. Johannes SixtOct 24, 2008
  73. 4/4 diff: add filter for converting binary to textJeff King, Oct 5, 2008
  74. Jakub NarebskiOct 5, 2008
  75. Johannes SixtOct 6, 2008
  76. Jeff KingOct 6, 2008
  77. Johannes SixtOct 6, 2008
  78. Matthieu MoyOct 6, 2008
  79. Jeff KingOct 7, 2008
  80. Johannes SixtOct 7, 2008
  81. Jeff KingOct 7, 2008
  82. Matthieu MoyOct 7, 2008
  83. Jeff KingOct 7, 2008
  84. Johannes SixtOct 7, 2008
  85. Jeff KingOct 13, 2008

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.