threads / discuss / 26189

PostScript files: textconv and "git add -p"

Subject: PostScript files: textconv and "git add -p"

## tl;dr

7 messages between Jan 4, 2011 and Jan 11, 2011.

replies: 6people: 3as markdown or json

Matthieu Moy· Jan 4, 2011, 15:50 UTC · lore
Hi (and happy new year everybody !),

I have trouble setting up a comfortable configuration to version PostScript files. The particularity they have is that they are "text files" (i.e. git does not detect them as binary files by default, and neither do tools like less, diff, ...), but not meant to be human-readable.

If I do this:
,----[ .gitattributes ]
| *.ps diff=ps
`----
,----[ .gitconfig ]
| [diff "ps"]
|       textconv=ps2ascii
`----

then I get the textconv niceness when running "git diff", which is cool, but "git add -p" still proposes me to stage hunks one by one, which isn't.

If I set "*.ps binary" in .gitattributes, "git add -p" becomes quiet, but textconv is disabled.

I want "git diff" to run the textconv filter, and "git add -p" to consider the file as binary. Is there a way to do this?

Thanks,
-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
Jeff King· Jan 5, 2011, 05:18 UTC · re: Matthieu Moy · lore

Re: PostScript files: textconv and "git add -p"

On Tue, Jan 04, 2011 at 04:50:44PM +0100, Matthieu Moy wrote:
Show 17 quoted lines
> If I do this:
> 
> ,----[ .gitattributes ]
> | *.ps diff=ps
> `----
> 
> ,----[ .gitconfig ]
> | [diff "ps"]
> |       textconv=ps2ascii
> `----
> 
> then I get the textconv niceness when running "git diff", which is
> cool, but "git add -p" still proposes me to stage hunks one by one,
> which isn't.
> 
> If I set "*.ps binary" in .gitattributes, "git add -p" becomes quiet,
> but textconv is disabled.

Yeah the "binary" attribute (which is a synonym for !diff along with some crlf stuff) and "diff" are mutually exclusive. One says "don't diff this" and the other says "diff this according to some special rules". But fortunately, those special rules can contain "this is binary". So you can get what you want with:

  echo '*.ps diff=ps' >.gitattributes
  git config diff.ps.textconv ps2ascii
  git config diff.ps.binary true

which will textconv the file in the usual places, but consider it binary in all other circumstances (like "add -p").

-Peff
PS Your question made me very happy. I implemented "diff.*.binary" the
   way I did out of a vague sense of orthogonality, but I never quite
   came up with a concrete example where it was useful to set both.
   Thanks for providing one. :)
Matthieu Moy· Jan 9, 2011, 18:55 UTC · re: Jeff King · lore

Re: PostScript files: textconv and "git add -p"

Jeff King <peff@peff.net> writes:
Show 5 quoted lines
> you can get what you want with:
>
>   echo '*.ps diff=ps' >.gitattributes
>   git config diff.ps.textconv ps2ascii
>   git config diff.ps.binary true
Yes, this works great. Thanks.

Did I miss something, or is this undocumented? I can't find that in either man gitattributes or man git-config.

> PS Your question made me very happy. I implemented "diff.*.binary" the
>    way I did out of a vague sense of orthogonality, but I never quite
>    came up with a concrete example where it was useful to set both.
>    Thanks for providing one. :)

I vaguely remember such discussions, and may well have thought "hmm, yet another overkill stuff that nobody'll ever use" at that time ;-).

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
Jeff King· Jan 9, 2011, 20:10 UTC · re: Matthieu Moy · lore

[PATCH] docs: explain diff.*.binary option

This was added long ago as part of the userdiff refactoring for textconv, as internally it made the code simpler and cleaner. However, there was never a concrete use case for actually using the config variable.

Now that Matthieu Moy has provided such a use case, it's easy to explain it using his example.

Signed-off-by: Jeff King <peff@peff.net>
---
On Sun, Jan 09, 2011 at 07:55:43PM +0100, Matthieu Moy wrote:
Show 12 quoted lines
> Jeff King <peff@peff.net> writes:
> 
> > you can get what you want with:
> >
> >   echo '*.ps diff=ps' >.gitattributes
> >   git config diff.ps.textconv ps2ascii
> >   git config diff.ps.binary true
> 
> Yes, this works great. Thanks.
> 
> Did I miss something, or is this undocumented? I can't find that in
> either man gitattributes or man git-config.

Nope, it was never documented, probably because I never figured out what it was good for. :)

 Documentation/gitattributes.txt |   33 +++++++++++++++++++++++++++++++++
 1 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index 22b8582..a282adb 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -591,6 +591,39 @@ and now produces better output), you can remove the cache
 manually with `git update-ref -d refs/notes/textconv/jpg` (where
 "jpg" is the name of the diff driver, as in the example above).
 
+Marking files as binary
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Git usually guesses correctly whether a blob contains text or binary
+data by examining the beginning of the contents. However, sometimes you
+may want to override its decision, either because a blob contains binary
+data later in the file, or because the content, while technically
+composed of text characters, is opaque to a human reader. For example,
+many postscript files contain only ascii characters, but produce noisy
+and meaningless diffs.
+
+The simplest way to mark a file as binary is to unset the diff
+attribute in the `.gitattributes` file:
+
+------------------------
+*.ps -diff
+------------------------
+
+This will cause git to generate `Binary files differ` (or a binary
+patch, if binary patches are enabled) instead of a regular diff.
+
+However, one may also want to specify other diff driver attributes. For
+example, you might want to use `textconv` to convert postscript files to
+an ascii representation for human viewing, but otherwise treat them as
+binary files. You cannot specify both `-diff` and `diff=ps` attributes.
+The solution is to use the `diff.*.binary` config option:
+
+------------------------
+[diff "ps"]
+  textconv = ps2ascii
+  binary = true
+------------------------
+
 Performing a three-way merge
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-- 
1.7.3.5.4.g0dc52
Matthieu Moy· Jan 9, 2011, 20:31 UTC · re: Jeff King · lore

Re: [PATCH] docs: explain diff.*.binary option

Jeff King <peff@peff.net> writes:
Show 9 quoted lines
> This was added long ago as part of the userdiff refactoring
> for textconv, as internally it made the code simpler and
> cleaner. However, there was never a concrete use case for
> actually using the config variable.
>
> Now that Matthieu Moy has provided such a use case, it's
> easy to explain it using his example.
>
> Signed-off-by: Jeff King <peff@peff.net>
Acked-by: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
Thanks,
-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
Junio C Hamano· Jan 10, 2011, 17:59 UTC · re: Jeff King · lore

Re: [PATCH] docs: explain diff.*.binary option

Jeff King <peff@peff.net> writes:
Show 7 quoted lines
> This was added long ago as part of the userdiff refactoring
> for textconv, as internally it made the code simpler and
> cleaner. However, there was never a concrete use case for
> actually using the config variable.
>
> Now that Matthieu Moy has provided such a use case, it's
> easy to explain it using his example.

Thanks. I take it that this documents 122aa6f (diff: introduce diff.<driver>.binary, 2008-10-05) where you said...

    This patch introduces a "binary" config option for a diff
    driver, so that one can explicitly set diff.foo.binary. We
    default this value to "don't know". That is, setting a diff
    attribute to "foo" and using "diff.foo.funcname" will have
    no effect on the binaryness of a file. To get the current
    behavior, one can set diff.foo.binary to true.

I am scratching my head about the last sentence, though. Shouldn't that be "false"? In the olden days, setting diff.foo.funcname made it text but with this change it no longer is the case and instead binaryness is determined by content inspection, so forcing "text" needs to be done by saying "this is _not_ binary", no?

Jeff King· Jan 11, 2011, 06:11 UTC · re: Junio C Hamano · lore

Re: [PATCH] docs: explain diff.*.binary option

On Mon, Jan 10, 2011 at 09:59:07AM -0800, Junio C Hamano wrote:
Show 15 quoted lines
> Thanks.  I take it that this documents 122aa6f (diff: introduce
> diff.<driver>.binary, 2008-10-05) where you said...
> 
>     This patch introduces a "binary" config option for a diff
>     driver, so that one can explicitly set diff.foo.binary. We
>     default this value to "don't know". That is, setting a diff
>     attribute to "foo" and using "diff.foo.funcname" will have
>     no effect on the binaryness of a file. To get the current
>     behavior, one can set diff.foo.binary to true.
> 
> I am scratching my head about the last sentence, though.  Shouldn't that
> be "false"?  In the olden days, setting diff.foo.funcname made it text but
> with this change it no longer is the case and instead binaryness is
> determined by content inspection, so forcing "text" needs to be done by
> saying "this is _not_ binary", no?

Yeah, that definitely should be "false". I think it was simply a think-o when typing the commit message (and I just did a quick test to double check that the behavior described by the message is in fact what happens).

Reading that thread, too, I think I was a little confused at first back then about how diff.*.binary would be used with respect to textconv, but between some thinking and JSixt beating some sense into me, it came out with at least the correct semantics, if not an accurate commit message. :)

-Peff

← back to recent threads