aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/Unaffected_PostImage2
-rw-r--r--org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/Unaffected_PreImage2
-rw-r--r--org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/XAndY.patch32
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchApplierTest.java67
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java2
5 files changed, 83 insertions, 22 deletions
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/Unaffected_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/Unaffected_PostImage
new file mode 100644
index 0000000000..6b664d90c4
--- /dev/null
+++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/Unaffected_PostImage
@@ -0,0 +1,2 @@
+This file
+should not be changed. \ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/Unaffected_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/Unaffected_PreImage
new file mode 100644
index 0000000000..6b664d90c4
--- /dev/null
+++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/Unaffected_PreImage
@@ -0,0 +1,2 @@
+This file
+should not be changed. \ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/XAndY.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/XAndY.patch
new file mode 100644
index 0000000000..35950f3d08
--- /dev/null
+++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/XAndY.patch
@@ -0,0 +1,32 @@
+diff --git a/X b/X
+index a3648a1..2d44096 100644
+--- a/X
++++ b/X
+@@ -2,2 +2,3 @@ a
+ b
++c
+ d
+@@ -16,4 +17,2 @@ p
+ q
+-r
+-s
+ t
+@@ -22,4 +21,8 @@ v
+ w
+-x
+-y
++0
++1
++2
++3
++4
++5
+ z
+diff --git a/Y b/Y
+index 2e65efe..7898192 100644
+--- a/Y
++++ b/Y
+@@ -1 +1 @@
+-a
+\ No newline at end of file
++a \ No newline at end of file
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchApplierTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchApplierTest.java
index bcde022d40..893fd61556 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchApplierTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/patch/PatchApplierTest.java
@@ -24,6 +24,7 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
+import org.eclipse.jgit.annotations.Nullable;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.PatchApplyException;
import org.eclipse.jgit.api.errors.PatchFormatException;
@@ -71,27 +72,21 @@ public class PatchApplierTest {
this.inCore = inCore;
}
+ void init(final String aName) throws Exception {
+ init(aName, true, true);
+ }
+
protected void init(String aName, boolean preExists, boolean postExists)
throws Exception {
// Patch and pre/postimage are read from data
// org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/
this.name = aName;
if (postExists) {
- postImage = IO
- .readWholeStream(getTestResource(name + "_PostImage"), 0)
- .array();
- expectedText = new String(postImage, StandardCharsets.UTF_8);
+ expectedText = initPostImage(aName);
}
- File f = new File(db.getWorkTree(), name);
if (preExists) {
- preImage = IO
- .readWholeStream(getTestResource(name + "_PreImage"), 0)
- .array();
- try (Git git = new Git(db)) {
- Files.write(f.toPath(), preImage);
- git.add().addFilepattern(name).call();
- }
+ initPreImage(aName);
}
try (Git git = new Git(db)) {
RevCommit base = git.commit().setMessage("PreImage").call();
@@ -99,8 +94,22 @@ public class PatchApplierTest {
}
}
- void init(final String aName) throws Exception {
- init(aName, true, true);
+ protected void initPreImage(String aName) throws Exception {
+ File f = new File(db.getWorkTree(), aName);
+ preImage = IO
+ .readWholeStream(getTestResource(aName + "_PreImage"), 0)
+ .array();
+ try (Git git = new Git(db)) {
+ Files.write(f.toPath(), preImage);
+ git.add().addFilepattern(aName).call();
+ }
+ }
+
+ protected String initPostImage(String aName) throws Exception {
+ postImage = IO
+ .readWholeStream(getTestResource(aName + "_PostImage"), 0)
+ .array();
+ return new String(postImage, StandardCharsets.UTF_8);
}
protected Result applyPatch()
@@ -118,27 +127,33 @@ public class PatchApplierTest {
return PatchApplierTest.class.getClassLoader()
.getResourceAsStream("org/eclipse/jgit/diff/" + patchFile);
}
+
void verifyChange(Result result, String aName) throws Exception {
verifyChange(result, aName, true);
}
protected void verifyContent(Result result, String path, boolean exists)
throws Exception {
+ verifyContent(result, path, exists ? expectedText : null);
+ }
+
+ protected void verifyContent(Result result, String path,
+ @Nullable String expectedContent) throws Exception {
if (inCore) {
byte[] output = readBlob(result.getTreeId(), path);
- if (!exists)
+ if (expectedContent == null)
assertNull(output);
else {
assertNotNull(output);
- assertEquals(expectedText,
+ assertEquals(expectedContent,
new String(output, StandardCharsets.UTF_8));
}
} else {
File f = new File(db.getWorkTree(), path);
- if (!exists)
+ if (expectedContent == null)
assertFalse(f.exists());
else
- checkFile(f, expectedText);
+ checkFile(f, expectedContent);
}
}
@@ -154,7 +169,7 @@ public class PatchApplierTest {
RevWalk rw = tr.getRevWalk()) {
db.incrementOpen();
RevTree tree = rw.parseTree(treeish);
- try (TreeWalk tw = TreeWalk.forPath(db,path,tree)){
+ try (TreeWalk tw = TreeWalk.forPath(db, path, tree)) {
if (tw == null) {
return null;
}
@@ -300,7 +315,7 @@ public class PatchApplierTest {
assertTrue(result.getPaths().contains("RenameNoHunks"));
assertTrue(result.getPaths().contains("nested/subdir/Renamed"));
- verifyContent(result,"nested/subdir/Renamed", true);
+ verifyContent(result, "nested/subdir/Renamed", true);
}
@Test
@@ -312,7 +327,7 @@ public class PatchApplierTest {
assertTrue(result.getPaths().contains("RenameWithHunks"));
assertTrue(result.getPaths().contains("nested/subdir/Renamed"));
- verifyContent(result,"nested/subdir/Renamed", true);
+ verifyContent(result, "nested/subdir/Renamed", true);
}
@Test
@@ -355,6 +370,16 @@ public class PatchApplierTest {
verifyChange(result, "ShiftDown2");
}
+ @Test
+ public void testDoesNotAffectUnrelatedFiles() throws Exception {
+ initPreImage("Unaffected");
+ String expectedUnaffectedText = initPostImage("Unaffected");
+ init("X");
+
+ Result result = applyPatch();
+ verifyChange(result, "X");
+ verifyContent(result, "Unaffected", expectedUnaffectedText);
+ }
}
public static class InCore extends Base {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java b/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java
index 2a4de1331d..98a2804ee4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/patch/PatchApplier.java
@@ -194,7 +194,7 @@ public class PatchApplier {
throw new PatchFormatException(p.getErrors());
}
- DirCache dirCache = (inCore()) ? DirCache.newInCore()
+ DirCache dirCache = inCore() ? DirCache.read(reader, beforeTree)
: repo.lockDirCache();
DirCacheBuilder dirCacheBuilder = dirCache.builder();