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

Re: [BUG, PATCH 0/3] Fix {blame,cat-file} --textconv for cases with symlinks

From
Jeff King <peff@peff.net>
Date
Sep 20, 2010, 18:00 UTC
Message-ID
<20100920180046.GA1790@sigill.intra.peff.net>
In-Reply-To
<7vpqwa254i.fsf@alter.siamese.dyndns.org>
On Sat, Sep 18, 2010 at 01:01:17PM -0700, Junio C Hamano wrote:
Show 9 quoted lines
> diff knows symlinks and regular files are different, and produces "delete
> old then add new" if you changed a regular file to a symlink.
> 
> That said, if you changed a symlink from pointing at A to pointing at B,
> it does run the textual diff between the string we get from readlink(3).
> 
> I happen to think that textconv, if specified, for such a path should be
> honored, so that people can keep doing whatever munging they have been
> doing in their existing textconv filters.

I think you came to the conclusion later in the thread that this is a bad idea, if only because it is not how "git diff" works, but I wanted to make one additional point.

I think that git, being symlink aware, needs to behave similarly to "lstat". That is, we should never dereference symlinks transparently when diffing or analyzing content, because otherwise there is no way to actually look at the symlink data itself. It is the user's responsibility to dereference symlinks in their diffs (e.g., I can get either the symlink data _or_ the actual file data by doing "git diff symlink-to-foo.bin" or "git diff foo.bin". If git dereferenced for me, I would get file data for _both_). Not to mention that we can't always dereference anyway because of broken links or links outside the repo, as Matthieu pointed out.

So doing anything but a straight text diff for the pathnames in symlink blobs is, IMHO, a bug.

The one thing this does not enable is using a special diff driver on the _pathnames_ of symlinks. Since these are by-definition text, I don't know why anyone would want to do that. But it is an orthogonal problem, anyway. We would need some way in the .gitattributes or the .gitconfig to say "this is the diff driver to use not based on pathname matching, but based on the file's mode". E.g., a special "SYMLINK" diff driver like:

  [diff "SYMLINK"]
    textconv = pointless-munge

But again, I have no idea why anyone would want such a feature, so it is not worth thinking too hard about it.

-Peff
Previous: Junio C HamanoNext: Johannes Sixt
Message 21 of 35 in “Fix {blame,cat-file} --textconv for cases with symlinks”
  1. 0/3 Fix {blame,cat-file} --textconv for cases with symlinksKirill Smelkov, Sep 18, 2010
  2. 1/3 tests: Prepare --textconv tests for correctly-failing conversion programKirill Smelkov, Sep 18, 2010
  3. Matthieu MoySep 18, 2010
  4. 2/3 blame,cat-file: Demonstrate --textconv is wrongly running converter on symlinksKirill Smelkov, Sep 18, 2010
  5. Matthieu MoySep 18, 2010
  6. 3/3 RFC: blame,cat-file --textconv: Don't assume mode is ``S_IFREF | 0664''Kirill Smelkov, Sep 18, 2010
  7. Matthieu MoySep 18, 2010
  8. Jeff KingSep 20, 2010
  9. Kirill SmelkovSep 20, 2010
  10. Matthieu MoySep 20, 2010
  11. Kirill SmelkovSep 21, 2010
  12. sha1_name.c: update comment to mention :/foo syntaxMatthieu Moy, Sep 20, 2010
  13. Junio C HamanoSep 21, 2010
  14. Matthieu MoySep 21, 2010
  15. Junio C HamanoSep 21, 2010
  16. update comment and documentation for :/foo syntaxMatthieu Moy, Sep 24, 2010
  17. Matthieu MoySep 18, 2010
  18. Junio C HamanoSep 18, 2010
  19. Matthieu MoySep 19, 2010
  20. Junio C HamanoSep 19, 2010
  21. Jeff KingSep 20, 2010
  22. Johannes SixtSep 20, 2010
  23. Junio C HamanoSep 21, 2010
  24. Jeff KingSep 21, 2010
  25. Jeff KingSep 21, 2010
  26. 0/2 better userdiff behavior for symlinksJeff King, Sep 21, 2010
  27. 1/2 diff: don't use pathname-based diff drivers for symlinksJeff King, Sep 21, 2010
  28. Matthieu MoySep 22, 2010
  29. Jeff KingSep 22, 2010
  30. 2/2 diff: add a special SYMLINK user-diff driverJeff King, Sep 21, 2010
  31. Ævar Arnfjörð BjarmasonSep 22, 2010
  32. Jeff KingSep 22, 2010
  33. Ævar Arnfjörð BjarmasonSep 22, 2010
  34. Matthieu MoySep 22, 2010
  35. Matthieu MoySep 22, 2010

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.