diff options
author | Matthias Sohn <matthias.sohn@sap.com> | 2016-05-05 01:13:35 +0200 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2016-05-05 01:13:45 +0200 |
commit | 89db7e01fa9f1bfe93e3097a8c272eac3032723c (patch) | |
tree | df6a7b675794186288d53e7149d237b73ea99320 | |
parent | bc9df9c63c748a6cf3aa2a3ff929484e4bdcc78d (diff) | |
parent | 05fd01656ee295e4a8d3c1efff0ca3a6f48c1f4c (diff) | |
download | jgit-89db7e01fa9f1bfe93e3097a8c272eac3032723c.tar.gz jgit-89db7e01fa9f1bfe93e3097a8c272eac3032723c.zip |
Merge branch 'stable-4.3'
* stable-4.3:
Scan loose ref before packed in case gc about to remove the loose
Fix possible NPEs when reporting transport errors
Fix calling of clean/smudge filters from Checkout,MergeCommands
Fix ApplyCommand when result of patch is an empty file
Change-Id: I0dc76b7a8c87ce8e0386a1b9e0fa92a3aa62abf7
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
11 files changed, 67 insertions, 34 deletions
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/W.patch b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/W.patch new file mode 100644 index 0000000000..cfecb8c5c4 --- /dev/null +++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/W.patch @@ -0,0 +1,7 @@ +diff --git a/W b/W +index a3648a1..2d44096 100644 +--- a/W ++++ b/W +@@ -1 +0,0 @@ +-a +\ No newline at end of file
\ No newline at end of file diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/W_PostImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/W_PostImage new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/W_PostImage diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/W_PreImage b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/W_PreImage new file mode 100644 index 0000000000..2e65efe2a1 --- /dev/null +++ b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/diff/W_PreImage @@ -0,0 +1 @@ +a
\ No newline at end of file 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 239c844c33..f2b5b3ba95 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 @@ -147,6 +147,16 @@ public class ApplyCommandTest extends RepositoryTestCase { } @Test + public void testModifyW() throws Exception { + ApplyResult result = init("W"); + assertEquals(1, result.getUpdatedFiles().size()); + assertEquals(new File(db.getWorkTree(), "W"), + result.getUpdatedFiles().get(0)); + checkFile(new File(db.getWorkTree(), "W"), + b.getString(0, b.size(), false)); + } + + @Test public void testModifyX() throws Exception { ApplyResult result = init("X"); assertEquals(1, result.getUpdatedFiles().size()); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java index 8162ac4575..0bb6610a24 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CheckoutCommandTest.java @@ -88,7 +88,6 @@ import org.eclipse.jgit.transport.RemoteConfig; import org.eclipse.jgit.transport.URIish; import org.eclipse.jgit.util.FileUtils; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; public class CheckoutCommandTest extends RepositoryTestCase { @@ -740,11 +739,9 @@ public class CheckoutCommandTest extends RepositoryTestCase { } @Test - @Ignore - public void testSmudgeAndClean() throws IOException, GitAPIException { - // @TODO: fix this test - File clean_filter = writeTempFile("sed s/V1/@version/g -"); - File smudge_filter = writeTempFile("sed s/@version/V1/g -"); + public void testSmudgeAndClean() throws Exception { + File clean_filter = writeTempFile("sed s/V1/@version/g"); + File smudge_filter = writeTempFile("sed s/@version/V1/g"); try (Git git2 = new Git(db)) { StoredConfig config = git.getRepository().getConfig(); @@ -753,33 +750,39 @@ public class CheckoutCommandTest extends RepositoryTestCase { config.setString("filter", "tstFilter", "clean", "sh " + slashify(clean_filter.getPath())); config.save(); - writeTrashFile(".gitattributes", "*.txt filter=tstFilter"); + writeTrashFile(".gitattributes", "filterTest.txt filter=tstFilter"); git2.add().addFilepattern(".gitattributes").call(); git2.commit().setMessage("add attributes").call(); - writeTrashFile("filterTest.txt", "hello world, V1"); + fsTick(writeTrashFile("filterTest.txt", "hello world, V1\n")); git2.add().addFilepattern("filterTest.txt").call(); - git2.commit().setMessage("add filterText.txt").call(); + RevCommit one = git2.commit().setMessage("add filterText.txt").call(); assertEquals( - "[.gitattributes, mode:100644, content:*.txt filter=tstFilter][Test.txt, mode:100644, content:Some other change][filterTest.txt, mode:100644, content:hello world, @version]", + "[.gitattributes, mode:100644, content:filterTest.txt filter=tstFilter][Test.txt, mode:100644, content:Some change][filterTest.txt, mode:100644, content:hello world, @version\n]", indexState(CONTENT)); - git2.checkout().setCreateBranch(true).setName("test2").call(); - writeTrashFile("filterTest.txt", "bon giorno world, V1"); + fsTick(writeTrashFile("filterTest.txt", "bon giorno world, V1\n")); git2.add().addFilepattern("filterTest.txt").call(); - git2.commit().setMessage("modified filterText.txt").call(); + RevCommit two = git2.commit().setMessage("modified filterTest.txt").call(); assertTrue(git2.status().call().isClean()); assertEquals( - "[.gitattributes, mode:100644, content:*.txt filter=tstFilter][Test.txt, mode:100644, content:Some other change][filterTest.txt, mode:100644, content:bon giorno world, @version]", + "[.gitattributes, mode:100644, content:filterTest.txt filter=tstFilter][Test.txt, mode:100644, content:Some change][filterTest.txt, mode:100644, content:bon giorno world, @version\n]", indexState(CONTENT)); - git2.checkout().setName("refs/heads/test").call(); + git2.checkout().setName(one.getName()).call(); assertTrue(git2.status().call().isClean()); assertEquals( - "[.gitattributes, mode:100644, content:*.txt filter=tstFilter][Test.txt, mode:100644, content:Some other change][filterTest.txt, mode:100644, content:hello world, @version]", + "[.gitattributes, mode:100644, content:filterTest.txt filter=tstFilter][Test.txt, mode:100644, content:Some change][filterTest.txt, mode:100644, content:hello world, @version\n]", indexState(CONTENT)); - assertEquals("hello world, V1", read("filterTest.txt")); + assertEquals("hello world, V1\n", read("filterTest.txt")); + + git2.checkout().setName(two.getName()).call(); + assertTrue(git2.status().call().isClean()); + assertEquals( + "[.gitattributes, mode:100644, content:filterTest.txt filter=tstFilter][Test.txt, mode:100644, content:Some change][filterTest.txt, mode:100644, content:bon giorno world, @version\n]", + indexState(CONTENT)); + assertEquals("bon giorno world, V1\n", read("filterTest.txt")); } } 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 bde450f99d..8fbf83954c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ApplyCommand.java @@ -223,12 +223,16 @@ public class ApplyCommand extends GitCommand<ApplyResult> { pos++; break; case '-': - if (!newLines.get(hh.getNewStartLine() - 1 + pos).equals( - hunkLine.substring(1))) { - throw new PatchApplyException(MessageFormat.format( - JGitText.get().patchApplyException, hh)); + if (hh.getNewStartLine() == 0) { + newLines.clear(); + } else { + if (!newLines.get(hh.getNewStartLine() - 1 + pos) + .equals(hunkLine.substring(1))) { + throw new PatchApplyException(MessageFormat.format( + JGitText.get().patchApplyException, hh)); + } + newLines.remove(hh.getNewStartLine() - 1 + pos); } - newLines.remove(hh.getNewStartLine() - 1 + pos); break; case '+': newLines.add(hh.getNewStartLine() - 1 + pos, @@ -250,7 +254,9 @@ public class ApplyCommand extends GitCommand<ApplyResult> { // still there! sb.append(l).append('\n'); } - sb.deleteCharAt(sb.length() - 1); + if (sb.length() > 0) { + sb.deleteCharAt(sb.length() - 1); + } FileWriter fw = new FileWriter(f); fw.write(sb.toString()); fw.close(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java index 3fcaa38395..fc4cc90937 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java @@ -280,8 +280,9 @@ public class DirCacheCheckout { addTree(walk, headCommitTree); addTree(walk, mergeCommitTree); - walk.addTree(new DirCacheBuildIterator(builder)); + int dciPos = walk.addTree(new DirCacheBuildIterator(builder)); walk.addTree(workingTree); + workingTree.setDirCacheIterator(walk, dciPos); while (walk.next()) { processEntry(walk.getTree(0, CanonicalTreeParser.class), @@ -320,8 +321,9 @@ public class DirCacheCheckout { walk = new NameConflictTreeWalk(repo); addTree(walk, mergeCommitTree); - walk.addTree(new DirCacheBuildIterator(builder)); + int dciPos = walk.addTree(new DirCacheBuildIterator(builder)); walk.addTree(workingTree); + workingTree.setDirCacheIterator(walk, dciPos); while (walk.next()) { processEntry(walk.getTree(0, CanonicalTreeParser.class), @@ -1093,8 +1095,10 @@ public class DirCacheCheckout { private boolean isModifiedSubtree_IndexWorkingtree(String path) throws CorruptObjectException, IOException { try (NameConflictTreeWalk tw = new NameConflictTreeWalk(repo)) { - tw.addTree(new DirCacheIterator(dc)); - tw.addTree(new FileTreeIterator(repo)); + int dciPos = tw.addTree(new DirCacheIterator(dc)); + FileTreeIterator fti = new FileTreeIterator(repo); + tw.addTree(fti); + fti.setDirCacheIterator(tw, dciPos); tw.setRecursive(true); tw.setFilter(PathFilter.create(path)); DirCacheIterator dcIt; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java index 6f3166a680..4bb2982b48 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java @@ -312,11 +312,10 @@ public class RefDirectory extends RefDatabase { @Override public Map<String, Ref> getRefs(String prefix) throws IOException { - final RefList<Ref> packed = getPackedRefs(); final RefList<LooseRef> oldLoose = looseRefs.get(); - LooseScanner scan = new LooseScanner(oldLoose); scan.scan(prefix); + final RefList<Ref> packed = getPackedRefs(); RefList<LooseRef> loose; if (scan.newLoose != null) { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java index de08e4b6a0..e224d71d4b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java @@ -1005,13 +1005,14 @@ public class ResolveMerger extends ThreeWayMerger { builder = dircache.builder(); DirCacheBuildIterator buildIt = new DirCacheBuildIterator(builder); - tw = new NameConflictTreeWalk(reader); + tw = new NameConflictTreeWalk(db, reader); tw.addTree(baseTree); tw.addTree(headTree); tw.addTree(mergeTree); - tw.addTree(buildIt); + int dciPos = tw.addTree(buildIt); if (workingTreeIterator != null) { tw.addTree(workingTreeIterator); + workingTreeIterator.setDirCacheIterator(tw, dciPos); } else { tw.setFilter(TreeFilter.ANY_DIFF); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java index f18a522131..ec903c139d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java @@ -106,7 +106,7 @@ public class StrategySimpleTwoWayInCore extends ThreeWayMergeStrategy { InCoreMerger(final Repository local) { super(local); - tw = new NameConflictTreeWalk(reader); + tw = new NameConflictTreeWalk(local, reader); cache = DirCache.newInCore(); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java index 6a43c0f963..7cb2bf6c87 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java @@ -189,7 +189,8 @@ public class HttpSupport { try { return c.getResponseCode(); } catch (ConnectException ce) { - final String host = c.getURL().getHost(); + final URL url = c.getURL(); + final String host = (url == null) ? "<null>" : url.getHost(); // The standard J2SE error message is not very useful. // if ("Connection timed out: connect".equals(ce.getMessage())) //$NON-NLS-1$ @@ -216,7 +217,8 @@ public class HttpSupport { try { return c.getResponseCode(); } catch (ConnectException ce) { - final String host = c.getURL().getHost(); + final URL url = c.getURL(); + final String host = (url == null) ? "<null>" : url.getHost(); // The standard J2SE error message is not very useful. // if ("Connection timed out: connect".equals(ce.getMessage())) //$NON-NLS-1$ |