summaryrefslogtreecommitdiffstatsabout
diff options
context:
space:
mode:
authorMarkus Duft2012-06-12 01:02:58 (EDT)
committer Robin Rosenberg2013-01-19 07:29:02 (EST)
commit3d18f65af1341bc1ebc8c5c1e92726d701e5a55e (patch)
tree4574852ddd65687155c6e99dd3a6cca163441606
parent3f0176aea6e77cb39be35f091100f8874693593d (diff)
downloadjgit-3d18f65af1341bc1ebc8c5c1e92726d701e5a55e.zip
jgit-3d18f65af1341bc1ebc8c5c1e92726d701e5a55e.tar.gz
jgit-3d18f65af1341bc1ebc8c5c1e92726d701e5a55e.tar.bz2
Fix patch application WRT windows line endings.refs/changes/14/6314/5
Previously the result of an application would have been \r\r\n in the case of windows line endings, as RawText does not touch the \r, and ApplyCommand adds "\r\n" if this is the ending of the first line in the target file. Only always adding \n should be ok, since \r\n would be the result if the file and the patch include windows line endings. Also add according test. Change-Id: Ibd4c4948d81bd1c511ecf5fd6c906444930d236e
-rw-r--r--org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1.patch10
-rw-r--r--org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1_PostImage4
-rw-r--r--org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1_PreImage4
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java10
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java11
5 files changed, 32 insertions, 7 deletions
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1.patch
new file mode 100644
index 0000000..ba5a4fc
--- /dev/null
+++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1.patch
@@ -0,0 +1,10 @@
+diff --git a/NL1 b/NL1
+index 68abad7..b14088c 100644
+--- a/NL1
++++ b/NL1
+@@ -1,4 +1,4 @@
+ a
+-b
++d
+ c
+
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1_PostImage
new file mode 100644
index 0000000..b14088c
--- /dev/null
+++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1_PostImage
@@ -0,0 +1,4 @@
+a
+d
+c
+
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1_PreImage
new file mode 100644
index 0000000..68abad7
--- /dev/null
+++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/NL1_PreImage
@@ -0,0 +1,4 @@
+a
+b
+c
+
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java
index 5513b44..a0a4ddc 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/ApplyCommandTest.java
@@ -178,6 +178,16 @@ public class ApplyCommandTest extends RepositoryTestCase {
b.getString(0, b.size(), false));
}
+ @Test
+ public void testModifyNL1() throws Exception {
+ ApplyResult result = init("NL1");
+ assertEquals(1, result.getUpdatedFiles().size());
+ assertEquals(new File(db.getWorkTree(), "NL1"), result
+ .getUpdatedFiles().get(0));
+ checkFile(new File(db.getWorkTree(), "NL1"),
+ b.getString(0, b.size(), false));
+ }
+
private static byte[] readFile(final String patchFile) throws IOException {
final InputStream in = DiffFormatterReflowTest.class
.getResourceAsStream(patchFile);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java
index 2147a2e..6a945e4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java
@@ -238,13 +238,10 @@ public class ApplyCommand extends GitCommand<ApplyResult> {
if (!isChanged(oldLines, newLines))
return; // don't touch the file
StringBuilder sb = new StringBuilder();
- final String eol = rt.size() == 0
- || (rt.size() == 1 && rt.isMissingNewlineAtEnd()) ? "\n" : rt //$NON-NLS-1$
- .getLineDelimiter();
for (String l : newLines) {
- sb.append(l);
- if (eol != null)
- sb.append(eol);
+ // don't bother handling line endings - if it was windows, the \r is
+ // still there!
+ sb.append(l).append('\n');
}
sb.deleteCharAt(sb.length() - 1);
FileWriter fw = new FileWriter(f);
@@ -252,7 +249,7 @@ public class ApplyCommand extends GitCommand<ApplyResult> {
fw.close();
}
- private boolean isChanged(List<String> ol, List<String> nl) {
+ private static boolean isChanged(List<String> ol, List<String> nl) {
if (ol.size() != nl.size())
return true;
for (int i = 0; i < ol.size(); i++)