ApplyCommand: fix "no newline at end" detection

Check the last line of the last hunk of a file, not the last line of
the whole patch.

Note that C git only checks that this line starts with "\ " and is at
least 12 characters long because of possible different texts when non-
English messages are used.

Change-Id: I0db81699eb3e99ed7b536a3e2b8dc97df1f58a89
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
This commit is contained in:
Thomas Wolf 2021-03-10 19:26:39 +01:00 committed by Matthias Sohn
parent 2a0295ccfd
commit 1126f26d21
5 changed files with 24 additions and 2 deletions

View File

@ -20,6 +20,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import org.eclipse.jgit.api.errors.PatchApplyException;
@ -251,6 +252,11 @@ public void testFiltering() throws Exception {
private void checkBinary(String name, boolean hasPreImage)
throws Exception {
checkBinary(name, hasPreImage, 1);
}
private void checkBinary(String name, boolean hasPreImage,
int numberOfFiles) throws Exception {
try (Git git = new Git(db)) {
byte[] post = IO
.readWholeStream(getTestResource(name + "_PostImage"), 0)
@ -266,7 +272,7 @@ private void checkBinary(String name, boolean hasPreImage)
}
ApplyResult result = git.apply()
.setPatch(getTestResource(name + ".patch")).call();
assertEquals(1, result.getUpdatedFiles().size());
assertEquals(numberOfFiles, result.getUpdatedFiles().size());
assertEquals(f, result.getUpdatedFiles().get(0));
assertArrayEquals(post, Files.readAllBytes(f.toPath()));
}
@ -303,6 +309,18 @@ public void testEmptyLine() throws Exception {
checkBinary("emptyLine", true);
}
@Test
public void testMultiFileNoNewline() throws Exception {
// This test needs two files. One is in the test resources.
try (Git git = new Git(db)) {
Files.write(db.getWorkTree().toPath().resolve("yello"),
"yello".getBytes(StandardCharsets.US_ASCII));
git.add().addFilepattern("yello").call();
git.commit().setMessage("yello").call();
}
checkBinary("hello", true, 2);
}
@Test
public void testAddA1() throws Exception {
ApplyResult result = init("A1", false, true);

View File

@ -742,7 +742,11 @@ private boolean isNoNewlineAtEndOfFile(FileHeader fh) {
return false;
}
HunkHeader lastHunk = hunks.get(hunks.size() - 1);
RawText lhrt = new RawText(lastHunk.getBuffer());
byte[] buf = new byte[lastHunk.getEndOffset()
- lastHunk.getStartOffset()];
System.arraycopy(lastHunk.getBuffer(), lastHunk.getStartOffset(), buf,
0, buf.length);
RawText lhrt = new RawText(buf);
return lhrt.getString(lhrt.size() - 1)
.equals("\\ No newline at end of file"); //$NON-NLS-1$
}