]> source.dussan.org Git - jgit.git/commit
Keep line endings for text files committed with CR/LF on text=auto 55/166755/10
authorThomas Wolf <thomas.wolf@paranor.ch>
Tue, 21 Jul 2020 22:51:24 +0000 (00:51 +0200)
committerThomas Wolf <thomas.wolf@paranor.ch>
Mon, 17 Aug 2020 06:52:55 +0000 (08:52 +0200)
commitefd1cc05af7e59a24763dfedb7fc44cda151be50
tree203d3bcf409a1df3229607a89d5901ca52630b3f
parent71aeedb6ec79a91e41251a88c1ab3235c40a9b70
Keep line endings for text files committed with CR/LF on text=auto

Git never converts line endings if the version in the repository is a
text file with CR/LF and text=auto. See [1]: "When the file has been
committed with CRLF, no conversion is done."

Because the sentence just before is about converting line endings on
check-in, I had understood that in commit 60cf85a [2] to mean that no
conversion on check-in was to be done. However, as bug 565048 and a
code inspection of the C git code showed it really means no conversion
is done on check-in *or check-out*.

If the text attribute is not set but core.autocrlf = true, this is
the same as text=auto eol=crlf. C git does not convert on check-out
even on text=auto eol=lf if the index version is a text file with
CR/LF.

For check-in, one has to look at the intended target, which is done
in WorkingTreeIterator since commit 60cf85a. For check-out, it can
be done by looking at the source and can thus be done in the
AutoLFOutputStream.

Additionally, provide a constructor for AutoLFInputStream to do
the same; for cases where the equivalent of a check-out is done via
an input stream obtained from a blob. (EGit does that in its
GitBlobStorage for the Eclipse compare framework; it's more efficient
than using a TemporaryBuffer and DirCacheCheckout.getContent(), and
it avoids the need for a temporary file.)

Adapt existing tests, and add new checkout and merge tests to verify
the resulting files have the correct line endings.

EGit's GitBlobStorage will need to call the new version of
EolStreamTypeUtil.wrapInputStream().

[1] https://git-scm.com/docs/gitattributes#Documentation/gitattributes.txt-Settostringvalueauto
[2] https://git.eclipse.org/r/c/jgit/jgit/+/127324

Bug: 565048
Change-Id: If1282ef43e2abd00263541bd10a01fe1f5c619fc
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
org.eclipse.jgit.test/tst/org/eclipse/jgit/api/EolStreamTypeUtilTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/DirCacheCheckoutTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergerTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/AutoLFInputStreamTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/AutoLFOutputStreamTest.java [new file with mode: 0644]
org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoLFInputStream.java
org.eclipse.jgit/src/org/eclipse/jgit/util/io/AutoLFOutputStream.java
org.eclipse.jgit/src/org/eclipse/jgit/util/io/EolStreamTypeUtil.java