From f1a15f7eb09183124ea645a8bfc16a03d58fd385 Mon Sep 17 00:00:00 2001 From: Dave Borowitz Date: Wed, 18 Mar 2015 10:46:41 -0700 Subject: [PATCH 01/68] TestRepository: Add a cherryPick method CherryPickCommand only works on a non-bare repository, as it must modify the working tree and index in case of a merge conflict. In tests, being able to recover from a merge conflict is less important, as the caller should be able to control the full contents of files in advance of the cherry-pick. Change-Id: Ic332e44df1308b9336e884666b08c1f6db64513d --- org.eclipse.jgit.junit/META-INF/MANIFEST.MF | 1 + .../eclipse/jgit/junit/TestRepository.java | 62 ++++++++++++++ .../jgit/junit/TestRepositoryTest.java | 80 ++++++++++++++++++- 3 files changed, 142 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF index b20464e39..327a697f6 100644 --- a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF @@ -14,6 +14,7 @@ Import-Package: org.eclipse.jgit.api;version="[4.0.0,4.1.0)", org.eclipse.jgit.internal.storage.file;version="[4.0.0,4.1.0)", org.eclipse.jgit.internal.storage.pack;version="[4.0.0,4.1.0)", org.eclipse.jgit.lib;version="[4.0.0,4.1.0)", + org.eclipse.jgit.merge;version="[4.0.0,4.1.0)", org.eclipse.jgit.revwalk;version="[4.0.0,4.1.0)", org.eclipse.jgit.storage.file;version="[4.0.0,4.1.0)", org.eclipse.jgit.treewalk;version="[4.0.0,4.1.0)", diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java index ce33ec709..925a6b021 100644 --- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java +++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java @@ -52,11 +52,13 @@ import java.io.OutputStream; import java.security.MessageDigest; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.TimeZone; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.dircache.DirCache; @@ -88,6 +90,8 @@ import org.eclipse.jgit.lib.RefWriter; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.TagBuilder; +import org.eclipse.jgit.merge.MergeStrategy; +import org.eclipse.jgit.merge.ThreeWayMerger; import org.eclipse.jgit.revwalk.ObjectWalk; import org.eclipse.jgit.revwalk.RevBlob; import org.eclipse.jgit.revwalk.RevCommit; @@ -187,6 +191,11 @@ public Date getClock() { return new Date(now); } + /** @return timezone used for default identities. */ + public TimeZone getTimeZone() { + return defaultCommitter.getTimeZone(); + } + /** * Adjust the current time that will used by the next commit. * @@ -615,6 +624,59 @@ public void reset(String name) throws Exception { } } + /** + * Cherry-pick a commit onto HEAD. + *

+ * This differs from {@code git cherry-pick} in that it works in a bare + * repository. As a result, any merge failure results in an exception, as + * there is no way to recover. + * + * @param id + * commit-ish to cherry-pick. + * @return newly created commit, or null if no work was done due to the + * resulting tree being identical. + * @throws Exception + */ + public RevCommit cherryPick(AnyObjectId id) throws Exception { + RevCommit commit = pool.parseCommit(id); + pool.parseBody(commit); + if (commit.getParentCount() != 1) + throw new IOException(String.format( + "Expected 1 parent for %s, found: %s", + id.name(), Arrays.asList(commit.getParents()))); + RevCommit parent = commit.getParent(0); + pool.parseHeaders(parent); + + Ref headRef = db.getRef(Constants.HEAD); + if (headRef == null) + throw new IOException("Missing HEAD"); + RevCommit head = pool.parseCommit(headRef.getObjectId()); + + ThreeWayMerger merger = MergeStrategy.RECURSIVE.newMerger(db, true); + merger.setBase(parent.getTree()); + if (merger.merge(head, commit)) { + if (AnyObjectId.equals(head.getTree(), merger.getResultTreeId())) + return null; + tick(1); + org.eclipse.jgit.lib.CommitBuilder b = + new org.eclipse.jgit.lib.CommitBuilder(); + b.setParentId(head); + b.setTreeId(merger.getResultTreeId()); + b.setAuthor(commit.getAuthorIdent()); + b.setCommitter(new PersonIdent(defaultCommitter, new Date(now))); + b.setMessage(commit.getFullMessage()); + ObjectId result; + try (ObjectInserter ins = inserter) { + result = ins.insert(b); + ins.flush(); + } + update(Constants.HEAD, result); + return pool.parseCommit(result); + } else { + throw new IOException("Merge conflict"); + } + } + /** * Update the dumb client server info files. * diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java index cefc779a2..fbb9eecdf 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/junit/TestRepositoryTest.java @@ -46,6 +46,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; @@ -55,9 +56,9 @@ import org.eclipse.jgit.internal.storage.dfs.DfsRepositoryDescription; import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; -import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectLoader; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Ref; @@ -296,6 +297,83 @@ public void commitToUnbornHead() throws Exception { assertEquals("refs/heads/master", ref.getTarget().getName()); } + @Test + public void cherryPick() throws Exception { + repo.updateRef("HEAD").link("refs/heads/master"); + RevCommit head = tr.branch("master").commit() + .add("foo", "foo contents\n") + .create(); + rw.parseBody(head); + RevCommit toPick = tr.commit() + .parent(tr.commit().create()) // Can't cherry-pick root. + .author(new PersonIdent("Cherrypick Author", "cpa@example.com", + tr.getClock(), tr.getTimeZone())) + .author(new PersonIdent("Cherrypick Committer", "cpc@example.com", + tr.getClock(), tr.getTimeZone())) + .message("message to cherry-pick") + .add("bar", "bar contents\n") + .create(); + RevCommit result = tr.cherryPick(toPick); + rw.parseBody(result); + + Ref headRef = tr.getRepository().getRef("HEAD"); + assertEquals(result, headRef.getObjectId()); + assertTrue(headRef.isSymbolic()); + assertEquals("refs/heads/master", headRef.getLeaf().getName()); + + assertEquals(1, result.getParentCount()); + assertEquals(head, result.getParent(0)); + assertEquals(toPick.getAuthorIdent(), result.getAuthorIdent()); + + // Committer name/email matches default, and time was incremented. + assertEquals(new PersonIdent(head.getCommitterIdent(), new Date(0)), + new PersonIdent(result.getCommitterIdent(), new Date(0))); + assertTrue(toPick.getCommitTime() < result.getCommitTime()); + + assertEquals("message to cherry-pick", result.getFullMessage()); + assertEquals("foo contents\n", blobAsString(result, "foo")); + assertEquals("bar contents\n", blobAsString(result, "bar")); + } + + @Test + public void cherryPickWithContentMerge() throws Exception { + RevCommit base = tr.branch("HEAD").commit() + .add("foo", "foo contents\n\n") + .create(); + tr.branch("HEAD").commit() + .add("foo", "foo contents\n\nlast line\n") + .create(); + RevCommit toPick = tr.commit() + .message("message to cherry-pick") + .parent(base) + .add("foo", "changed foo contents\n\n") + .create(); + RevCommit result = tr.cherryPick(toPick); + rw.parseBody(result); + + assertEquals("message to cherry-pick", result.getFullMessage()); + assertEquals("changed foo contents\n\nlast line\n", + blobAsString(result, "foo")); + } + + @Test + public void cherryPickWithIdenticalContents() throws Exception { + RevCommit base = tr.branch("HEAD").commit().add("foo", "foo contents\n") + .create(); + RevCommit head = tr.branch("HEAD").commit() + .parent(base) + .add("bar", "bar contents\n") + .create(); + RevCommit toPick = tr.commit() + .parent(base) + .message("message to cherry-pick") + .add("bar", "bar contents\n") + .create(); + assertNotEquals(head, toPick); + assertNull(tr.cherryPick(toPick)); + assertEquals(head, repo.getRef("HEAD").getObjectId()); + } + private String blobAsString(AnyObjectId treeish, String path) throws Exception { RevObject obj = tr.get(rw.parseTree(treeish), path); From 2bd3556e7e1f07c4bb06282ead95a936758e388e Mon Sep 17 00:00:00 2001 From: Christian Halstrick Date: Wed, 25 Mar 2015 10:48:03 +0100 Subject: [PATCH 02/68] Fix RecursiveMerger in case of multiple, independent base commits When RecursiveMerger found that there are multiple base-commits for the commits to be merged it tries to temporarily merge the base commits. But if these base commits have no common predecessor there was a bug in JGit leading to a NPE. This commit fixes this by enforcing that an empty tree is used as base when merging two unrelated base commits. This logic was already there when merging two commits which have no common predecessor (ThreeWayMerger.mergeBase()). But the code which was computing a new temporary base commit in case of criss-cross merges didn't take care to pick an empty tree when no common predecessor can be found. Bug: 462671 Change-Id: Ibd96302f5f81383f36d3b1e3edcbf5822147b1a4 --- .../jgit/merge/RecursiveMergerTest.java | 63 +++++++++++++++++++ .../eclipse/jgit/merge/RecursiveMerger.java | 12 ++-- 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/RecursiveMergerTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/RecursiveMergerTest.java index 37cc88be1..19e495b40 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/RecursiveMergerTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/RecursiveMergerTest.java @@ -175,6 +175,69 @@ public void crissCrossMerge(MergeStrategy strategy, IndexState indexState, } } + @Theory + /** + * Merging m2,s2 from the following topology. m1 and s1 are the two root + * commits of the repo. In master and side different files are touched. + * No need to do a real content merge. + * + *

+	 * m1--m2
+	 *   \/
+	 *   /\
+	 * s1--s2
+	 * 
+ */ + public void crissCrossMerge_twoRoots(MergeStrategy strategy, + IndexState indexState, WorktreeState worktreeState) + throws Exception { + if (!validateStates(indexState, worktreeState)) + return; + // fill the repo + BranchBuilder master = db_t.branch("master"); + BranchBuilder side = db_t.branch("side"); + RevCommit m1 = master.commit().add("m", "m1").message("m1").create(); + db_t.getRevWalk().parseCommit(m1); + + RevCommit s1 = side.commit().add("s", "s1").message("s1").create(); + RevCommit s2 = side.commit().parent(m1).add("m", "m1") + .message("s2(merge)").create(); + RevCommit m2 = master.commit().parent(s1).add("s", "s1") + .message("m2(merge)").create(); + + Git git = Git.wrap(db); + git.checkout().setName("master").call(); + modifyWorktree(worktreeState, "m", "side"); + modifyWorktree(worktreeState, "s", "side"); + modifyIndex(indexState, "m", "side"); + modifyIndex(indexState, "s", "side"); + + ResolveMerger merger = (ResolveMerger) strategy.newMerger(db, + worktreeState == WorktreeState.Bare); + if (worktreeState != WorktreeState.Bare) + merger.setWorkingTreeIterator(new FileTreeIterator(db)); + try { + boolean expectSuccess = true; + if (!(indexState == IndexState.Bare + || indexState == IndexState.Missing + || indexState == IndexState.SameAsHead || indexState == IndexState.SameAsOther)) + // index is dirty + expectSuccess = false; + + assertEquals(Boolean.valueOf(expectSuccess), + Boolean.valueOf(merger.merge(new RevCommit[] { m2, s2 }))); + assertEquals(MergeStrategy.RECURSIVE, strategy); + assertEquals("m1", + contentAsString(db, merger.getResultTreeId(), "m")); + assertEquals("s1", + contentAsString(db, merger.getResultTreeId(), "s")); + } catch (NoMergeBaseException e) { + assertEquals(MergeStrategy.RESOLVE, strategy); + assertEquals(e.getReason(), + MergeBaseFailureReason.MULTIPLE_MERGE_BASES_NOT_SUPPORTED); + } + } + @Theory /** * Merging m2,s2 from the following topology. The same file is modified diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java index 85cdb7684..36ffe7a63 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/RecursiveMerger.java @@ -68,6 +68,8 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.filter.RevFilter; +import org.eclipse.jgit.treewalk.AbstractTreeIterator; +import org.eclipse.jgit.treewalk.EmptyTreeIterator; import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.WorkingTreeIterator; @@ -194,10 +196,12 @@ protected RevCommit getBaseCommit(RevCommit a, RevCommit b, int callDepth) Integer.valueOf(MAX_BASES), a.name(), b.name(), Integer.valueOf(baseCommits.size()))); parents.add(nextBase); - if (mergeTrees( - openTree(getBaseCommit(currentBase, nextBase, - callDepth + 1).getTree()), - currentBase.getTree(), nextBase.getTree(), true)) + RevCommit bc = getBaseCommit(currentBase, nextBase, + callDepth + 1); + AbstractTreeIterator bcTree = (bc == null) ? new EmptyTreeIterator() + : openTree(bc.getTree()); + if (mergeTrees(bcTree, currentBase.getTree(), + nextBase.getTree(), true)) currentBase = createCommitForTree(resultTree, parents); else throw new NoMergeBaseException( From a5c40a38622db55d323084f766f0bf50a5299765 Mon Sep 17 00:00:00 2001 From: Laurent Delaigue Date: Fri, 21 Nov 2014 11:28:19 +0100 Subject: [PATCH 03/68] Make RepositoryState.REBASING_MERGE reachable again. If a non interactive rebase is launched, stopping after a conflict should set the repository state to RepositoryState.REBASING_MERGE instead of RepositoryState.REBASING_INTERACTIVE. Bug: 452623 Change-Id: Ie885aab6d71dabd158a718af0d14fff643c9b850 Also-by: Arthur Daussy Signed-off-by: Laurent Delaigue Signed-off-by: Matthias Sohn --- .../eclipse/jgit/api/PullCommandWithRebaseTest.java | 4 ++-- .../tst/org/eclipse/jgit/api/RebaseCommandTest.java | 10 +++++----- .../src/org/eclipse/jgit/api/RebaseCommand.java | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandWithRebaseTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandWithRebaseTest.java index 25534fdda..9ad845b2a 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandWithRebaseTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/PullCommandWithRebaseTest.java @@ -180,7 +180,7 @@ public void testPullConflict() throws Exception { + remoteUri + "\nSource change\n=======\nTarget change\n>>>>>>> 42453fd Target change in local\n"; assertFileContentsEqual(targetFile, result); - assertEquals(RepositoryState.REBASING_INTERACTIVE, target + assertEquals(RepositoryState.REBASING_MERGE, target .getRepository().getRepositoryState()); } @@ -225,7 +225,7 @@ public void testPullLocalConflict() throws Exception { String result = "<<<<<<< Upstream, based on branch 'master' of local repository\n" + "Master change\n=======\nSlave change\n>>>>>>> 4049c9e Source change in based on master\n"; assertFileContentsEqual(targetFile, result); - assertEquals(RepositoryState.REBASING_INTERACTIVE, target + assertEquals(RepositoryState.REBASING_MERGE, target .getRepository().getRepositoryState()); } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java index 8e64776f7..6b641c495 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseCommandTest.java @@ -824,7 +824,7 @@ public void testStopOnConflict() throws Exception { "<<<<<<< Upstream, based on master\n1master\n=======\n1topic", ">>>>>>> e0d1dea change file1 in topic\n2\n3\ntopic4"); - assertEquals(RepositoryState.REBASING_INTERACTIVE, db + assertEquals(RepositoryState.REBASING_MERGE, db .getRepositoryState()); assertTrue(new File(db.getDirectory(), "rebase-merge").exists()); // the first one should be included, so we should have left two picks in @@ -887,7 +887,7 @@ public void testStopOnConflictAndAbortWithDetachedHEAD() throws Exception { "<<<<<<< Upstream, based on master\n1master\n=======\n1topic", ">>>>>>> e0d1dea change file1 in topic\n2\n3\ntopic4"); - assertEquals(RepositoryState.REBASING_INTERACTIVE, + assertEquals(RepositoryState.REBASING_MERGE, db.getRepositoryState()); assertTrue(new File(db.getDirectory(), "rebase-merge").exists()); // the first one should be included, so we should have left two picks in @@ -1009,7 +1009,7 @@ public void testStopOnConflictAndContinueWithNoDeltaToMaster() res = git.rebase().setOperation(Operation.CONTINUE).call(); assertNotNull(res); assertEquals(Status.NOTHING_TO_COMMIT, res.getStatus()); - assertEquals(RepositoryState.REBASING_INTERACTIVE, + assertEquals(RepositoryState.REBASING_MERGE, db.getRepositoryState()); git.rebase().setOperation(Operation.SKIP).call(); @@ -1300,7 +1300,7 @@ public void testStopOnConflictCommitAndContinue() throws Exception { // user can decide what to do. if he accidentally committed, reset soft, // and continue, if he really has nothing to commit, skip. assertEquals(Status.NOTHING_TO_COMMIT, res.getStatus()); - assertEquals(RepositoryState.REBASING_INTERACTIVE, + assertEquals(RepositoryState.REBASING_MERGE, db.getRepositoryState()); git.rebase().setOperation(Operation.SKIP).call(); @@ -1401,7 +1401,7 @@ public void testStopOnConflictFileCreationAndDeletion() throws Exception { assertEquals(Status.STOPPED, res.getStatus()); assertEquals(conflicting, res.getCurrentCommit()); - assertEquals(RepositoryState.REBASING_INTERACTIVE, db + assertEquals(RepositoryState.REBASING_MERGE, db .getRepositoryState()); assertTrue(new File(db.getDirectory(), "rebase-merge").exists()); // the first one should be included, so we should have left two picks in diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java index 7d3e82318..62001d0a7 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java @@ -1088,7 +1088,9 @@ else if (!isInteractive() && walk.isMergedInto(headCommit, upstream)) { rebaseState.createFile(HEAD_NAME, headName); rebaseState.createFile(ONTO, upstreamCommit.name()); rebaseState.createFile(ONTO_NAME, upstreamCommitName); - rebaseState.createFile(INTERACTIVE, ""); //$NON-NLS-1$ + if (isInteractive()) { + rebaseState.createFile(INTERACTIVE, ""); //$NON-NLS-1$ + } rebaseState.createFile(QUIET, ""); //$NON-NLS-1$ ArrayList toDoSteps = new ArrayList(); From 3cd7d0d85a5fe6ba03f218898e866f06258b7405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20de=20Oliveira?= Date: Wed, 10 Sep 2014 16:02:05 -0300 Subject: [PATCH 04/68] Do not add a newline at the end if neither merged side had one MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: 390833 Change-Id: I29f7b79b241929877c93ac485c677487a91bb77b Signed-off-by: André de Oliveira Signed-off-by: Matthias Sohn --- .../jgit/merge/MergeAlgorithmTest.java | 60 +++++-- .../eclipse/jgit/merge/ResolveMergerTest.java | 6 +- .../jgit/merge/EolAwareOutputStream.java | 87 +++++++++++ .../eclipse/jgit/merge/MergeFormatter.java | 43 +----- .../jgit/merge/MergeFormatterPass.java | 146 ++++++++++++++++++ 5 files changed, 288 insertions(+), 54 deletions(-) create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatterPass.java diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java index 8a33425b1..d4a3d62da 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergeAlgorithmTest.java @@ -51,11 +51,25 @@ import org.eclipse.jgit.diff.RawText; import org.eclipse.jgit.diff.RawTextComparator; import org.eclipse.jgit.lib.Constants; +import org.junit.Assume; import org.junit.Test; +import org.junit.experimental.theories.DataPoints; +import org.junit.experimental.theories.Theories; +import org.junit.runner.RunWith; +@RunWith(Theories.class) public class MergeAlgorithmTest { MergeFormatter fmt=new MergeFormatter(); + private final boolean newlineAtEnd; + + @DataPoints + public static boolean[] newlineAtEndDataPoints = { false, true }; + + public MergeAlgorithmTest(boolean newlineAtEnd) { + this.newlineAtEnd = newlineAtEnd; + } + /** * Check for a conflict where the second text was changed similar to the * first one, but the second texts modification covers one more line. @@ -174,28 +188,55 @@ public void testAdjacentModifications() throws IOException { } @Test - public void testSeperateModifications() throws IOException { + public void testSeparateModifications() throws IOException { assertEquals(t("aZcYe"), merge("abcde", "aZcde", "abcYe")); } + @Test + public void testBlankLines() throws IOException { + assertEquals(t("aZc\nYe"), merge("abc\nde", "aZc\nde", "abc\nYe")); + } + /** * Test merging two contents which do one similar modification and one - * insertion is only done by one side. Between modification and insertion is - * a block which is common between the two contents and the common base + * insertion is only done by one side, in the middle. Between modification + * and insertion is a block which is common between the two contents and the + * common base * * @throws IOException */ @Test public void testTwoSimilarModsAndOneInsert() throws IOException { - assertEquals(t("IAAJ"), merge("iA", "IA", "IAAJ")); assertEquals(t("aBcDde"), merge("abcde", "aBcde", "aBcDde")); - assertEquals(t("IAJ"), merge("iA", "IA", "IAJ")); - assertEquals(t("IAAAJ"), merge("iA", "IA", "IAAAJ")); assertEquals(t("IAAAJCAB"), merge("iACAB", "IACAB", "IAAAJCAB")); assertEquals(t("HIAAAJCAB"), merge("HiACAB", "HIACAB", "HIAAAJCAB")); assertEquals(t("AGADEFHIAAAJCAB"), merge("AGADEFHiACAB", "AGADEFHIACAB", "AGADEFHIAAAJCAB")); + } + /** + * Test merging two contents which do one similar modification and one + * insertion is only done by one side, at the end. Between modification and + * insertion is a block which is common between the two contents and the + * common base + * + * @throws IOException + */ + @Test + public void testTwoSimilarModsAndOneInsertAtEnd() throws IOException { + Assume.assumeTrue(newlineAtEnd); + assertEquals(t("IAAJ"), merge("iA", "IA", "IAAJ")); + assertEquals(t("IAJ"), merge("iA", "IA", "IAJ")); + assertEquals(t("IAAAJ"), merge("iA", "IA", "IAAAJ")); + } + + @Test + public void testTwoSimilarModsAndOneInsertAtEndNoNewlineAtEnd() + throws IOException { + Assume.assumeFalse(newlineAtEnd); + assertEquals(t("I"), merge("iA", "IA", "IAAJ")); + assertEquals(t("I"), merge("iA", "IA", "IAJ")); + assertEquals(t("I"), merge("iA", "IA", "IAAAJ")); } /** @@ -225,7 +266,7 @@ private String merge(String commonBase, String ours, String theirs) throws IOExc return new String(bo.toByteArray(), Constants.CHARACTER_ENCODING); } - public static String t(String text) { + public String t(String text) { StringBuilder r = new StringBuilder(); for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); @@ -241,13 +282,14 @@ public static String t(String text) { break; default: r.append(c); - r.append('\n'); + if (newlineAtEnd || i < text.length() - 1) + r.append('\n'); } } return r.toString(); } - public static RawText T(String text) { + public RawText T(String text) { return new RawText(Constants.encode(t(text))); } } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java index dd06168c3..478a93b77 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/ResolveMergerTest.java @@ -184,7 +184,7 @@ public void checkMergeMergeableTreesWithoutIndex(MergeStrategy strategy) MergeResult mergeRes = git.merge().setStrategy(strategy) .include(masterCommit).call(); assertEquals(MergeStatus.MERGED, mergeRes.getMergeStatus()); - assertEquals("[d/1, mode:100644, content:1master\n2\n3side\n]", + assertEquals("[d/1, mode:100644, content:1master\n2\n3side]", indexState(CONTENT)); } @@ -561,7 +561,7 @@ public void checkMergeCrissCross(MergeStrategy strategy) throws Exception { assertEquals(MergeStrategy.RECURSIVE, strategy); assertEquals(MergeResult.MergeStatus.MERGED, mergeResult.getMergeStatus()); - assertEquals("1master2\n2\n3side2\n", read("1")); + assertEquals("1master2\n2\n3side2", read("1")); } catch (JGitInternalException e) { assertEquals(MergeStrategy.RESOLVE, strategy); assertTrue(e.getCause() instanceof NoMergeBaseException); @@ -697,7 +697,7 @@ public void checkForCorrectIndex(MergeStrategy strategy) throws Exception { assertEquals( "[0, mode:100644, content:master]" // + "[1, mode:100644, content:side]" // - + "[2, mode:100644, content:1master\n2\n3side\n]" // + + "[2, mode:100644, content:1master\n2\n3side]" // + "[3, mode:100644, stage:1, content:orig][3, mode:100644, stage:2, content:side][3, mode:100644, stage:3, content:master]" // + "[4, mode:100644, content:orig]", // indexState(CONTENT)); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java new file mode 100644 index 000000000..3fd2374f3 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2014, André de Oliveira + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.eclipse.jgit.merge; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * An output stream which is aware of newlines and can be asked to begin a new + * line if not already in one. + */ +class EolAwareOutputStream extends OutputStream { + private final OutputStream out; + + private boolean bol = true; + + /** + * Initialize a new EOL aware stream. + * + * @param out + * stream to output all writes to. + */ + EolAwareOutputStream(OutputStream out) { + this.out = out; + } + + /** + * Begin a new line if not already in one. + * + * @exception IOException + * if an I/O error occurs. + */ + void beginln() throws IOException { + if (!bol) + write('\n'); + } + + /** @return true if a new line has just begun. */ + boolean isBeginln() { + return bol; + } + + @Override + public void write(int val) throws IOException { + out.write(val); + bol = (val == '\n'); + } +} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java index eed1dcfa8..977f95341 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatter.java @@ -49,7 +49,6 @@ import java.util.List; import org.eclipse.jgit.diff.RawText; -import org.eclipse.jgit.merge.MergeChunk.ConflictState; /** * A class to convert merge results into a Git conformant textual presentation @@ -78,47 +77,7 @@ public class MergeFormatter { */ public void formatMerge(OutputStream out, MergeResult res, List seqName, String charsetName) throws IOException { - String lastConflictingName = null; // is set to non-null whenever we are - // in a conflict - boolean threeWayMerge = (res.getSequences().size() == 3); - for (MergeChunk chunk : res) { - RawText seq = res.getSequences().get(chunk.getSequenceIndex()); - if (lastConflictingName != null - && chunk.getConflictState() != ConflictState.NEXT_CONFLICTING_RANGE) { - // found the end of an conflict - out.write((">>>>>>> " + lastConflictingName + "\n").getBytes(charsetName)); //$NON-NLS-1$ //$NON-NLS-2$ - lastConflictingName = null; - } - if (chunk.getConflictState() == ConflictState.FIRST_CONFLICTING_RANGE) { - // found the start of an conflict - out.write(("<<<<<<< " + seqName.get(chunk.getSequenceIndex()) + //$NON-NLS-1$ - "\n").getBytes(charsetName)); //$NON-NLS-1$ - lastConflictingName = seqName.get(chunk.getSequenceIndex()); - } else if (chunk.getConflictState() == ConflictState.NEXT_CONFLICTING_RANGE) { - // found another conflicting chunk - - /* - * In case of a non-three-way merge I'll add the name of the - * conflicting chunk behind the equal signs. I also append the - * name of the last conflicting chunk after the ending - * greater-than signs. If somebody knows a better notation to - * present non-three-way merges - feel free to correct here. - */ - lastConflictingName = seqName.get(chunk.getSequenceIndex()); - out.write((threeWayMerge ? "=======\n" : "======= " //$NON-NLS-1$ //$NON-NLS-2$ - + lastConflictingName + "\n").getBytes(charsetName)); //$NON-NLS-1$ - } - // the lines with conflict-metadata are written. Now write the chunk - for (int i = chunk.getBegin(); i < chunk.getEnd(); i++) { - seq.writeLine(out, i); - out.write('\n'); - } - } - // one possible leftover: if the merge result ended with a conflict we - // have to close the last conflict here - if (lastConflictingName != null) { - out.write((">>>>>>> " + lastConflictingName + "\n").getBytes(charsetName)); //$NON-NLS-1$ //$NON-NLS-2$ - } + new MergeFormatterPass(out, res, seqName, charsetName).formatMerge(); } /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatterPass.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatterPass.java new file mode 100644 index 000000000..0345921bd --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeFormatterPass.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2009, Christian Halstrick + * Copyright (C) 2014, André de Oliveira + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.eclipse.jgit.merge; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; + +import org.eclipse.jgit.diff.RawText; +import org.eclipse.jgit.merge.MergeChunk.ConflictState; + +class MergeFormatterPass { + + private final EolAwareOutputStream out; + + private final MergeResult res; + + private final List seqName; + + private final String charsetName; + + private final boolean threeWayMerge; + + private String lastConflictingName; // is set to non-null whenever we are in + // a conflict + + MergeFormatterPass(OutputStream out, MergeResult res, List seqName, + String charsetName) { + this.out = new EolAwareOutputStream(out); + this.res = res; + this.seqName = seqName; + this.charsetName = charsetName; + this.threeWayMerge = (res.getSequences().size() == 3); + } + + void formatMerge() throws IOException { + boolean missingNewlineAtEnd = false; + for (MergeChunk chunk : res) { + RawText seq = res.getSequences().get(chunk.getSequenceIndex()); + writeConflictMetadata(chunk); + // the lines with conflict-metadata are written. Now write the chunk + for (int i = chunk.getBegin(); i < chunk.getEnd(); i++) + writeLine(seq, i); + missingNewlineAtEnd = seq.isMissingNewlineAtEnd(); + } + // one possible leftover: if the merge result ended with a conflict we + // have to close the last conflict here + if (lastConflictingName != null) + writeConflictEnd(); + if (!missingNewlineAtEnd) + out.beginln(); + } + + private void writeConflictMetadata(MergeChunk chunk) throws IOException { + if (lastConflictingName != null + && chunk.getConflictState() != ConflictState.NEXT_CONFLICTING_RANGE) { + // found the end of an conflict + writeConflictEnd(); + } + if (chunk.getConflictState() == ConflictState.FIRST_CONFLICTING_RANGE) { + // found the start of an conflict + writeConflictStart(chunk); + } else if (chunk.getConflictState() == ConflictState.NEXT_CONFLICTING_RANGE) { + // found another conflicting chunk + writeConflictChange(chunk); + } + } + + private void writeConflictEnd() throws IOException { + writeln(">>>>>>> " + lastConflictingName); //$NON-NLS-1$ + lastConflictingName = null; + } + + private void writeConflictStart(MergeChunk chunk) throws IOException { + lastConflictingName = seqName.get(chunk.getSequenceIndex()); + writeln("<<<<<<< " + lastConflictingName); //$NON-NLS-1$ + } + + private void writeConflictChange(MergeChunk chunk) throws IOException { + /* + * In case of a non-three-way merge I'll add the name of the conflicting + * chunk behind the equal signs. I also append the name of the last + * conflicting chunk after the ending greater-than signs. If somebody + * knows a better notation to present non-three-way merges - feel free + * to correct here. + */ + lastConflictingName = seqName.get(chunk.getSequenceIndex()); + writeln(threeWayMerge ? "=======" : "======= " //$NON-NLS-1$ //$NON-NLS-2$ + + lastConflictingName); + } + + private void writeln(String s) throws IOException { + out.beginln(); + out.write((s + "\n").getBytes(charsetName)); //$NON-NLS-1$ + } + + private void writeLine(RawText seq, int i) throws IOException { + out.beginln(); + seq.writeLine(out, i); + // still BOL? It was a blank line. But writeLine won't lf, so we do. + if (out.isBeginln()) + out.write('\n'); + } +} \ No newline at end of file From 6e653aef1d407cf33768d85fc1350ce3698c1cad Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 28 Mar 2015 10:10:47 +0100 Subject: [PATCH 05/68] FS.readPipe() shouldn't log IOException as an error This unintentionally was changed from severity debug to error which is causing unexpected log entries. Bug: 463349 Change-Id: I4b6d42a1420652ab6824e237bd231ba86896acbf Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java index 706b54e16..d11b03e67 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java @@ -481,7 +481,7 @@ public void run() { } } } catch (IOException e) { - LOG.error("Caught exception in FS.readPipe()", e); //$NON-NLS-1$ + LOG.debug("Caught exception in FS.readPipe()", e); //$NON-NLS-1$ } if (debug) { LOG.debug("readpipe returns null"); //$NON-NLS-1$ From bda5e764200dafb2311149a9152c02373127287d Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Tue, 31 Mar 2015 17:33:31 +0200 Subject: [PATCH 06/68] ResolveMerge only needs to visit differing TreeEntries This should considerably speed up the treewalk on larger repositories. Found by discussing new EGit API to support model merge in change eda23bb556d342f421f03b93c7faa160998598aa Change-Id: I822721c76c64e614f87a080ced2457941f53adcd Signed-off-by: Matthias Sohn cc: Laurent Delaigue --- org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java | 2 ++ 1 file changed, 2 insertions(+) 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 8e70f57fa..6b87e645f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java @@ -88,6 +88,7 @@ import org.eclipse.jgit.treewalk.NameConflictTreeWalk; import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.WorkingTreeIterator; +import org.eclipse.jgit.treewalk.filter.TreeFilter; import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.TemporaryBuffer; @@ -1006,6 +1007,7 @@ protected boolean mergeTrees(AbstractTreeIterator baseTree, DirCacheBuildIterator buildIt = new DirCacheBuildIterator(builder); tw = new NameConflictTreeWalk(reader); + tw.setFilter(TreeFilter.ANY_DIFF); tw.addTree(baseTree); tw.addTree(headTree); tw.addTree(mergeTree); From 1b633232127b28696186f55d3eba40ab38c54088 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Wed, 1 Apr 2015 12:47:57 -0700 Subject: [PATCH 07/68] Optimize EolAwareOutputStream for bulk output Formatting merge conflicts one byte at a time is going to be very slow when the final OutputStream is a FileOutputStream and the JVM is making system calls for each byte output. When outputting a range of bytes from a byte[] the bol (beginning of line) value only depends on the value of the last byte written. Other bytes in the array can be passed directly to the lower stream for more efficient output. Change-Id: I3415f9a390ee215210a17bb5bf39164d197e1348 --- .../src/org/eclipse/jgit/merge/EolAwareOutputStream.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java index 3fd2374f3..1ddac18e5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/EolAwareOutputStream.java @@ -84,4 +84,12 @@ public void write(int val) throws IOException { out.write(val); bol = (val == '\n'); } + + @Override + public void write(byte[] buf, int pos, int cnt) throws IOException { + if (cnt > 0) { + out.write(buf, pos, cnt); + bol = (buf[pos + (cnt - 1)] == '\n'); + } + } } From 835955fc5b3dcb27d7da0cdfcf24b436f9828d4a Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Wed, 1 Apr 2015 12:52:14 -0700 Subject: [PATCH 08/68] Use try-with-resources and BufferedOutputStream for local merge conflicts Change-Id: If5539aab1de19bb22400c862bbe2cdf7c3e85535 --- .../src/org/eclipse/jgit/merge/ResolveMerger.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 6b87e645f..923224b31 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java @@ -47,12 +47,14 @@ import static org.eclipse.jgit.lib.Constants.CHARACTER_ENCODING; import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -792,12 +794,10 @@ private File writeMergedFile(MergeResult result) File parentFolder = of.getParentFile(); if (!fs.exists(parentFolder)) parentFolder.mkdirs(); - FileOutputStream fos = new FileOutputStream(of); - try { - new MergeFormatter().formatMerge(fos, result, + try (OutputStream os = new BufferedOutputStream( + new FileOutputStream(of))) { + new MergeFormatter().formatMerge(os, result, Arrays.asList(commitNames), CHARACTER_ENCODING); - } finally { - fos.close(); } return of; } From 6884ea24cd0fcce78e9653e4d1a658eefa2cd68a Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Wed, 1 Apr 2015 12:53:00 -0700 Subject: [PATCH 09/68] Use local GIT_DIR for overflow during merge conflicts By writing the temporary overflow merge result to $GIT_DIR JGit can ensure the same filesystem permissions apply to protect the file contents. If no directory is available from the repository (e.g. DfsRepository) null will be passed and the system temporary directory will be used instead. Change-Id: I95532aa092676d18f1dc1e3fdbe6dcb1f91b782e --- org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 923224b31..1ddac1b57 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java @@ -804,7 +804,8 @@ private File writeMergedFile(MergeResult result) private ObjectId insertMergeResult(MergeResult result) throws IOException { - TemporaryBuffer.LocalFile buf = new TemporaryBuffer.LocalFile(10 << 20); + TemporaryBuffer.LocalFile buf = new TemporaryBuffer.LocalFile( + db.getDirectory(), 10 << 20); try { new MergeFormatter().formatMerge(buf, result, Arrays.asList(commitNames), CHARACTER_ENCODING); From e4433e5e37b827aa6af3320635c8af0877cd4a60 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Wed, 1 Apr 2015 12:57:06 -0700 Subject: [PATCH 10/68] Fix overflow stream leak during merge conflicts When reading back from an overflowed TemporaryBuffer the InputStream must be closed to close the FileInputStream that is reading from the backing file. Change-Id: Id83d8f16f5b2c2618a9f841ec3508508455a6ae1 --- .../src/org/eclipse/jgit/merge/ResolveMerger.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 1ddac1b57..98c8342de 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java @@ -810,8 +810,9 @@ private ObjectId insertMergeResult(MergeResult result) new MergeFormatter().formatMerge(buf, result, Arrays.asList(commitNames), CHARACTER_ENCODING); buf.close(); - return getObjectInserter().insert(OBJ_BLOB, buf.length(), - buf.openInputStream()); + try (InputStream in = buf.openInputStream()) { + return getObjectInserter().insert(OBJ_BLOB, buf.length(), in); + } } finally { buf.destroy(); } From d94ce9c754b740defbd75230663d323f64cc9648 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Wed, 1 Apr 2015 12:59:33 -0700 Subject: [PATCH 11/68] Buffer overflow output stream Most callers/users of TemporaryBuffer are sizing the in-memory portion large enough that most outputs fit into RAM. With this assumption they don't pay close attention to the size of IOs being written, as it "should" just be a copy from one byte array to another. Overflow sets up a local file handle, which is costly to write to for small IO units. Wrap the local file in a BufferedOutputStream to combine small writes together. Larger writes can still bypass the buffer as BOS automatically avoids copying for larger writes. Change-Id: I09f4136dd65c48830cfda86d9101bc647581018a --- .../src/org/eclipse/jgit/util/TemporaryBuffer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/TemporaryBuffer.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/TemporaryBuffer.java index 006c3c0a0..3719bf794 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/TemporaryBuffer.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/TemporaryBuffer.java @@ -44,6 +44,7 @@ package org.eclipse.jgit.util; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -435,7 +436,7 @@ public LocalFile(final File directory, final int inCoreLimit) { protected OutputStream overflow() throws IOException { onDiskFile = File.createTempFile("jgit_", ".buf", directory); //$NON-NLS-1$ //$NON-NLS-2$ - return new FileOutputStream(onDiskFile); + return new BufferedOutputStream(new FileOutputStream(onDiskFile)); } public long length() { From 5d22a7b108b4c6017ea9fe49eeee28d4b3c0ed94 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 00:29:34 +0200 Subject: [PATCH 12/68] Remove obsolete API warning filters to silence warnings Change-Id: I958d540a6afb1462a3fbb3d76c8f51f386ac068e Signed-off-by: Matthias Sohn --- org.eclipse.jgit/.settings/.api_filters | 45 ------------------------- 1 file changed, 45 deletions(-) diff --git a/org.eclipse.jgit/.settings/.api_filters b/org.eclipse.jgit/.settings/.api_filters index 3dfa7b452..124435a81 100644 --- a/org.eclipse.jgit/.settings/.api_filters +++ b/org.eclipse.jgit/.settings/.api_filters @@ -1,50 +1,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From e5b81e49e8819e023ae1ca89e9d9edb218d23371 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 00:40:44 +0200 Subject: [PATCH 13/68] Use try-with-resources to fix warnings in AddCommand - replaces use of deprecated ObjectInserter.release() - auto-close TreeWalk Change-Id: I540ee711b8c3430a71fdff07add506b7d9c039dc Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java index c23256c74..de6c32a80 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java @@ -137,13 +137,12 @@ public DirCache call() throws GitAPIException, NoFilepatternException { if (filepatterns.contains(".")) //$NON-NLS-1$ addAll = true; - ObjectInserter inserter = repo.newObjectInserter(); - try { + try (ObjectInserter inserter = repo.newObjectInserter(); + final TreeWalk tw = new TreeWalk(repo)) { dc = repo.lockDirCache(); DirCacheIterator c; DirCacheBuilder builder = dc.builder(); - final TreeWalk tw = new TreeWalk(repo); tw.addTree(new DirCacheBuildIterator(builder)); if (workingTreeIterator == null) workingTreeIterator = new FileTreeIterator(repo); @@ -212,7 +211,6 @@ else if (!(path.equals(lastAddedFile))) { throw new JGitInternalException( JGitText.get().exceptionCaughtDuringExecutionOfAddCommand, e); } finally { - inserter.release(); if (dc != null) dc.unlock(); } From 3206f37cc3b9e500bd531e72310b7a3987114d6e Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 00:46:59 +0200 Subject: [PATCH 14/68] Use try-with-resources to fix warnings in AddNoteCommand Replaces use of deprecated release() methods. Change-Id: I0211bcf0a76a2fccc2c85fa74778e20c256984ba Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/api/AddNoteCommand.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java index 3af86959d..f4ff5ce04 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java @@ -83,11 +83,10 @@ protected AddNoteCommand(Repository repo) { public Note call() throws GitAPIException { checkCallable(); - RevWalk walk = new RevWalk(repo); - ObjectInserter inserter = repo.newObjectInserter(); NoteMap map = NoteMap.newEmptyMap(); RevCommit notesCommit = null; - try { + try (RevWalk walk = new RevWalk(repo); + ObjectInserter inserter = repo.newObjectInserter()) { Ref ref = repo.getRef(notesRef); // if we have a notes ref, use it if (ref != null) { @@ -100,9 +99,6 @@ public Note call() throws GitAPIException { return map.getNote(id); } catch (IOException e) { throw new JGitInternalException(e.getMessage(), e); - } finally { - inserter.release(); - walk.release(); } } From 114dee677076e842a5af12e9fb197d6199f5d53f Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 00:51:02 +0200 Subject: [PATCH 15/68] Silence warning for non-translatable String in AddNoteCommand Change-Id: Iad4d41271eff4e8744efece5bc777c1cb06dead7 Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java index f4ff5ce04..9cf888195 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/AddNoteCommand.java @@ -95,7 +95,7 @@ public Note call() throws GitAPIException { } map.set(id, message, inserter); commitNoteMap(walk, map, notesCommit, inserter, - "Notes added by 'git notes add'"); + "Notes added by 'git notes add'"); //$NON-NLS-1$ return map.getNote(id); } catch (IOException e) { throw new JGitInternalException(e.getMessage(), e); From 81c84c088f85e5babe73e1799fe786bf32750a5a Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 00:58:13 +0200 Subject: [PATCH 16/68] Use try-with-resources to close walks in ArchiveCommand Change-Id: I77120d77a12f1bab5c918a23b0e3eac90e320b2b Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/api/ArchiveCommand.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java index 9014aaf1a..713866dc5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java @@ -365,13 +365,11 @@ public ArchiveCommand(Repository repo) { private OutputStream writeArchive(Format fmt) { final String pfx = prefix == null ? "" : prefix; //$NON-NLS-1$ - final TreeWalk walk = new TreeWalk(repo); - try { + try (final TreeWalk walk = new TreeWalk(repo)) { final T outa = fmt.createArchiveOutputStream(out, formatOptions); - try { + try (final RevWalk rw = new RevWalk(walk.getObjectReader())) { final MutableObjectId idBuf = new MutableObjectId(); final ObjectReader reader = walk.getObjectReader(); - final RevWalk rw = new RevWalk(walk.getObjectReader()); walk.reset(rw.parseTree(tree)); if (!paths.isEmpty()) @@ -405,8 +403,6 @@ private OutputStream writeArchive(Format fmt) { // TODO(jrn): Throw finer-grained errors. throw new JGitInternalException( JGitText.get().exceptionCaughtDuringExecutionOfArchiveCommand, e); - } finally { - walk.release(); } } From b61be2cf3ebe865d6d6f7cb5fa406c1a61c4f68e Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 01:02:21 +0200 Subject: [PATCH 17/68] Replace use of deprecated release() in BasePackFetchConnection Change-Id: If90a6cca9a2ae80474f5ad023cb2a0a8905010be Signed-off-by: Matthias Sohn --- .../eclipse/jgit/transport/BasePackFetchConnection.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java index f907891ba..4036c0028 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java @@ -377,7 +377,7 @@ protected void doFetch(final ProgressMonitor monitor, @Override public void close() { if (walk != null) - walk.release(); + walk.close(); super.close(); } @@ -753,16 +753,13 @@ private void receivePack(final ProgressMonitor monitor, input = new SideBandInputStream(input, monitor, getMessageWriter(), outputStream); - ObjectInserter ins = local.newObjectInserter(); - try { + try (ObjectInserter ins = local.newObjectInserter()) { PackParser parser = ins.newPackParser(input); parser.setAllowThin(thinPack); parser.setObjectChecker(transport.getObjectChecker()); parser.setLockMessage(lockMessage); packLock = parser.parse(monitor); ins.flush(); - } finally { - ins.release(); } } From 6691c20bc2cdc39fd339e37ff6cc80215beb48c3 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 01:06:08 +0200 Subject: [PATCH 18/68] Replace use of deprecated release() in BasePackPushConnection Change-Id: I28a5c7e222daf35e3d1a1a6fda8ed6ef9b960f78 Signed-off-by: Matthias Sohn --- .../eclipse/jgit/transport/BasePackPushConnection.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java index e367ab44c..863934da1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java @@ -279,9 +279,8 @@ private void writePack(final Map refUpdates, Set remoteObjects = new HashSet(); Set newObjects = new HashSet(); - final PackWriter writer = new PackWriter(transport.getPackConfig(), - local.newObjectReader()); - try { + try (final PackWriter writer = new PackWriter(transport.getPackConfig(), + local.newObjectReader())) { for (final Ref r : getRefs()) { // only add objects that we actually have @@ -303,10 +302,9 @@ private void writePack(final Map refUpdates, writer.setDeltaBaseAsOffset(capableOfsDelta); writer.preparePack(monitor, newObjects, remoteObjects); writer.writePack(monitor, monitor, out); - } finally { - writer.release(); + + packTransferTime = writer.getStatistics().getTimeWriting(); } - packTransferTime = writer.getStatistics().getTimeWriting(); } private void readStatusReport(final Map refUpdates) From c1edc1a07ebbc4cf7b39a59c9e183db5b37284c2 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 01:11:22 +0200 Subject: [PATCH 19/68] Use try-with-resources to close resources in BaseReceivePack Change-Id: Iacaad1a7e0719541e5616d231422ea6fd4c95161 Signed-off-by: Matthias Sohn --- .../jgit/transport/BaseReceivePack.java | 119 +++++++++--------- 1 file changed, 59 insertions(+), 60 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java index dfb8ca93a..9bdfbf52e 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java @@ -1070,8 +1070,7 @@ private void receivePack() throws IOException { if (sideBand) resolving = new SideBandProgressMonitor(msgOut); - ObjectInserter ins = db.newObjectInserter(); - try { + try (ObjectInserter ins = db.newObjectInserter()) { String lockMsg = "jgit receive-pack"; //$NON-NLS-1$ if (getRefLogIdent() != null) lockMsg += " from " + getRefLogIdent().toExternalString(); //$NON-NLS-1$ @@ -1089,8 +1088,6 @@ private void receivePack() throws IOException { packLock = parser.parse(receiving, resolving); packSize = Long.valueOf(parser.getPackSize()); ins.flush(); - } finally { - ins.release(); } if (timeoutIn != null) @@ -1119,67 +1116,69 @@ private void checkConnectivity() throws IOException { } parser = null; - final ObjectWalk ow = new ObjectWalk(db); - ow.setRetainBody(false); - if (baseObjects != null) { - ow.sort(RevSort.TOPO); - if (!baseObjects.isEmpty()) - ow.sort(RevSort.BOUNDARY, true); - } - - for (final ReceiveCommand cmd : commands) { - if (cmd.getResult() != Result.NOT_ATTEMPTED) - continue; - if (cmd.getType() == ReceiveCommand.Type.DELETE) - continue; - ow.markStart(ow.parseAny(cmd.getNewId())); - } - for (final ObjectId have : advertisedHaves) { - RevObject o = ow.parseAny(have); - ow.markUninteresting(o); - - if (baseObjects != null && !baseObjects.isEmpty()) { - o = ow.peel(o); - if (o instanceof RevCommit) - o = ((RevCommit) o).getTree(); - if (o instanceof RevTree) - ow.markUninteresting(o); + try (final ObjectWalk ow = new ObjectWalk(db)) { + ow.setRetainBody(false); + if (baseObjects != null) { + ow.sort(RevSort.TOPO); + if (!baseObjects.isEmpty()) + ow.sort(RevSort.BOUNDARY, true); } - } - checking.beginTask(JGitText.get().countingObjects, ProgressMonitor.UNKNOWN); - RevCommit c; - while ((c = ow.next()) != null) { - checking.update(1); - if (providedObjects != null // - && !c.has(RevFlag.UNINTERESTING) // - && !providedObjects.contains(c)) - throw new MissingObjectException(c, Constants.TYPE_COMMIT); - } - - RevObject o; - while ((o = ow.nextObject()) != null) { - checking.update(1); - if (o.has(RevFlag.UNINTERESTING)) - continue; - - if (providedObjects != null) { - if (providedObjects.contains(o)) + for (final ReceiveCommand cmd : commands) { + if (cmd.getResult() != Result.NOT_ATTEMPTED) continue; - else - throw new MissingObjectException(o, o.getType()); + if (cmd.getType() == ReceiveCommand.Type.DELETE) + continue; + ow.markStart(ow.parseAny(cmd.getNewId())); + } + for (final ObjectId have : advertisedHaves) { + RevObject o = ow.parseAny(have); + ow.markUninteresting(o); + + if (baseObjects != null && !baseObjects.isEmpty()) { + o = ow.peel(o); + if (o instanceof RevCommit) + o = ((RevCommit) o).getTree(); + if (o instanceof RevTree) + ow.markUninteresting(o); + } } - if (o instanceof RevBlob && !db.hasObject(o)) - throw new MissingObjectException(o, Constants.TYPE_BLOB); - } - checking.endTask(); + checking.beginTask(JGitText.get().countingObjects, + ProgressMonitor.UNKNOWN); + RevCommit c; + while ((c = ow.next()) != null) { + checking.update(1); + if (providedObjects != null // + && !c.has(RevFlag.UNINTERESTING) // + && !providedObjects.contains(c)) + throw new MissingObjectException(c, Constants.TYPE_COMMIT); + } - if (baseObjects != null) { - for (ObjectId id : baseObjects) { - o = ow.parseAny(id); - if (!o.has(RevFlag.UNINTERESTING)) - throw new MissingObjectException(o, o.getType()); + RevObject o; + while ((o = ow.nextObject()) != null) { + checking.update(1); + if (o.has(RevFlag.UNINTERESTING)) + continue; + + if (providedObjects != null) { + if (providedObjects.contains(o)) + continue; + else + throw new MissingObjectException(o, o.getType()); + } + + if (o instanceof RevBlob && !db.hasObject(o)) + throw new MissingObjectException(o, Constants.TYPE_BLOB); + } + checking.endTask(); + + if (baseObjects != null) { + for (ObjectId id : baseObjects) { + o = ow.parseAny(id); + if (!o.has(RevFlag.UNINTERESTING)) + throw new MissingObjectException(o, o.getType()); + } } } } @@ -1502,7 +1501,7 @@ protected void close() throws IOException { * the pack could not be unlocked. */ protected void release() throws IOException { - walk.release(); + walk.close(); unlockPack(); timeoutIn = null; rawIn = null; From 21eee62f7d55cf4da69df3f2210e66900652d3ed Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 01:12:22 +0200 Subject: [PATCH 20/68] Remove unnecessary $NON-NLS comment in BaseReceivePack Change-Id: I184945ee29fb9a6b1f30aec88958375e7b5239b3 Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/transport/BaseReceivePack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java index 9bdfbf52e..b7a599bad 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java @@ -317,7 +317,7 @@ public ReceiveConfig parse(final Config cfg) { "denynonfastforwards", false); //$NON-NLS-1$ allowOfsDelta = config.getBoolean("repack", "usedeltabaseoffset", //$NON-NLS-1$ //$NON-NLS-2$ true); - certNonceSeed = config.getString("receive", null, "certnonceseed"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + certNonceSeed = config.getString("receive", null, "certnonceseed"); //$NON-NLS-1$ //$NON-NLS-2$ certNonceSlopLimit = config.getInt("receive", "certnonceslop", 0); //$NON-NLS-1$ //$NON-NLS-2$ } From e03b6c5cf86c7bcaef8ec40cd9e07193709aad8a Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 01:15:59 +0200 Subject: [PATCH 21/68] Use try-with-resource to close BlameGenerator Change-Id: Id4cb9a236dddfc674b55e9e7037329a885455288 Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/api/BlameCommand.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/BlameCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/BlameCommand.java index f7ce835d5..a83814eb4 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/BlameCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/BlameCommand.java @@ -200,8 +200,7 @@ public BlameCommand reverse(AnyObjectId start, Collection end) */ public BlameResult call() throws GitAPIException { checkCallable(); - BlameGenerator gen = new BlameGenerator(repo, path); - try { + try (BlameGenerator gen = new BlameGenerator(repo, path)) { if (diffAlgorithm != null) gen.setDiffAlgorithm(diffAlgorithm); if (textComparator != null) @@ -231,8 +230,6 @@ else if (startCommit != null) return gen.computeBlameResult(); } catch (IOException e) { throw new JGitInternalException(e.getMessage(), e); - } finally { - gen.release(); } } From 48622e0ec284858a3058dc9055a85c0523087883 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 01:18:42 +0200 Subject: [PATCH 22/68] Replace use of deprecated release() method in BlameResult Change-Id: Ic555e6e0443337aed694bc6445a60abe08e07ad2 Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/blame/BlameResult.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java index 735eef7ed..e34db38fd 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java @@ -85,7 +85,7 @@ public static BlameResult create(BlameGenerator gen) throws IOException { String path = gen.getResultPath(); RawText contents = gen.getResultContents(); if (contents == null) { - gen.release(); + gen.close(); return null; } return new BlameResult(gen, path, contents); @@ -239,7 +239,7 @@ public void computeAll() throws IOException { while (gen.next()) loadFrom(gen); } finally { - gen.release(); + gen.close(); generator = null; } } @@ -265,7 +265,7 @@ public int computeNext() throws IOException { lastLength = gen.getRegionLength(); return gen.getResultStart(); } else { - gen.release(); + gen.close(); generator = null; return -1; } @@ -300,7 +300,7 @@ public void computeRange(int start, int end) throws IOException { return; if (!gen.next()) { - gen.release(); + gen.close(); generator = null; return; } From d6692d54a96fe58699213e881c39227666729b5a Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 01:21:55 +0200 Subject: [PATCH 23/68] Use try-with-resource to close resources in BlobBasedConfig Change-Id: Idb890788a88049d07326cd48e7c5534148f18e32 Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/lib/BlobBasedConfig.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobBasedConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobBasedConfig.java index a0197d022..cbb2f5b85 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobBasedConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/BlobBasedConfig.java @@ -104,11 +104,8 @@ public BlobBasedConfig(Config base, Repository db, AnyObjectId objectId) private static byte[] read(Repository db, AnyObjectId blobId) throws MissingObjectException, IncorrectObjectTypeException, IOException { - ObjectReader or = db.newObjectReader(); - try { + try (ObjectReader or = db.newObjectReader()) { return read(or, blobId); - } finally { - or.release(); } } @@ -146,15 +143,12 @@ public BlobBasedConfig(Config base, Repository db, AnyObjectId treeish, private static byte[] read(Repository db, AnyObjectId treeish, String path) throws MissingObjectException, IncorrectObjectTypeException, IOException { - ObjectReader or = db.newObjectReader(); - try { + try (ObjectReader or = db.newObjectReader()) { TreeWalk tree = TreeWalk.forPath(or, path, asTree(or, treeish)); if (tree == null) throw new FileNotFoundException(MessageFormat.format(JGitText .get().entryNotFoundByPath, path)); return read(or, tree.getObjectId(0)); - } finally { - or.release(); } } @@ -168,6 +162,8 @@ private static AnyObjectId asTree(ObjectReader or, AnyObjectId treeish) && ((RevCommit) treeish).getTree() != null) return ((RevCommit) treeish).getTree(); - return new RevWalk(or).parseTree(treeish).getId(); + try (RevWalk rw = new RevWalk(or)) { + return rw.parseTree(treeish).getId(); + } } } From 9e37f6d1442ee306190f8f85019e76d77e8ac417 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 01:24:05 +0200 Subject: [PATCH 24/68] Use try-with-resource to close resources in BundleFetchConnection Change-Id: Id79c01133b835e278d5b494b5bc5972d7aeed9a9 Signed-off-by: Matthias Sohn --- .../eclipse/jgit/transport/BundleFetchConnection.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleFetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleFetchConnection.java index e3cfd22ad..e53c04b53 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleFetchConnection.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleFetchConnection.java @@ -183,16 +183,13 @@ protected void doFetch(final ProgressMonitor monitor, throws TransportException { verifyPrerequisites(); try { - ObjectInserter ins = transport.local.newObjectInserter(); - try { + try (ObjectInserter ins = transport.local.newObjectInserter()) { PackParser parser = ins.newPackParser(bin); parser.setAllowThin(true); parser.setObjectChecker(transport.getObjectChecker()); parser.setLockMessage(lockMessage); packLock = parser.parse(NullProgressMonitor.INSTANCE); ins.flush(); - } finally { - ins.release(); } } catch (IOException err) { close(); @@ -217,8 +214,7 @@ private void verifyPrerequisites() throws TransportException { if (prereqs.isEmpty()) return; - final RevWalk rw = new RevWalk(transport.local); - try { + try (final RevWalk rw = new RevWalk(transport.local)) { final RevFlag PREREQ = rw.newFlag("PREREQ"); //$NON-NLS-1$ final RevFlag SEEN = rw.newFlag("SEEN"); //$NON-NLS-1$ @@ -281,8 +277,6 @@ private void verifyPrerequisites() throws TransportException { throw new MissingBundlePrerequisiteException(transport.uri, missing); } - } finally { - rw.release(); } } From d4380a9c819ffe598b53778fe1444aab7f32076c Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 01:25:46 +0200 Subject: [PATCH 25/68] Use try-with-resource to close resources in BundleWriter Change-Id: I5341973737f6d21c04982bcbefc2ed672ac9bcff Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/transport/BundleWriter.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java index d0f005cde..81ad98191 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java @@ -194,8 +194,7 @@ public void writeBundle(ProgressMonitor monitor, OutputStream os) PackConfig pc = packConfig; if (pc == null) pc = new PackConfig(db); - PackWriter packWriter = new PackWriter(pc, db.newObjectReader()); - try { + try (PackWriter packWriter = new PackWriter(pc, db.newObjectReader())) { final HashSet inc = new HashSet(); final HashSet exc = new HashSet(); inc.addAll(include.values()); @@ -233,8 +232,6 @@ public void writeBundle(ProgressMonitor monitor, OutputStream os) w.write('\n'); w.flush(); packWriter.writePack(monitor, monitor, os); - } finally { - packWriter.release(); } } } From 3f791820813c4415f5de8a02b326631d0fb0f284 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 01:30:14 +0200 Subject: [PATCH 26/68] Fix resource leak in ChangeIdUtil Change-Id: I5cb3e9c7e167248697932933eef925c446514683 Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/util/ChangeIdUtil.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java index 35850dcaa..35fc99e54 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java @@ -115,8 +115,10 @@ public static ObjectId computeChangeId(final ObjectId treeId, b.append(committer.toExternalString()); b.append("\n\n"); //$NON-NLS-1$ b.append(cleanMessage); - return new ObjectInserter.Formatter().idFor(Constants.OBJ_COMMIT, // - b.toString().getBytes(Constants.CHARACTER_ENCODING)); + try (ObjectInserter f = new ObjectInserter.Formatter()) { + return f.idFor(Constants.OBJ_COMMIT, // + b.toString().getBytes(Constants.CHARACTER_ENCODING)); + } } private static final Pattern issuePattern = Pattern From 58c2c52219af57d47bade73a0e7f2a6d4713ea9d Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 00:32:08 +0200 Subject: [PATCH 27/68] Use try-with-resource to close resources in CherryPickCommand Change-Id: I62d6de7d67c7de2460f4cbe918ad2bb8109650b9 Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/api/CherryPickCommand.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java index d4eb0b3b2..0a6875dbc 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java @@ -123,8 +123,7 @@ public CherryPickResult call() throws GitAPIException, NoMessageException, List cherryPickedRefs = new LinkedList(); checkCallable(); - RevWalk revWalk = new RevWalk(repo); - try { + try (RevWalk revWalk = new RevWalk(repo)) { // get the head commit Ref headRef = repo.getRef(Constants.HEAD); @@ -194,8 +193,6 @@ public CherryPickResult call() throws GitAPIException, NoMessageException, MessageFormat.format( JGitText.get().exceptionCaughtDuringExecutionOfCherryPickCommand, e), e); - } finally { - revWalk.release(); } return new CherryPickResult(newHead, cherryPickedRefs); } From 588965c6dad556f4e63010414eb19db334d9c8d7 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 00:33:01 +0200 Subject: [PATCH 28/68] Silence non-externalized string warning in CherryPickCommand Change-Id: I8c06635ce655470b5b650fa5c0c546e64445420c Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/api/CherryPickCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java index 0a6875dbc..d6e930ada 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickCommand.java @@ -152,7 +152,7 @@ public CherryPickResult call() throws GitAPIException, NoMessageException, ResolveMerger merger = (ResolveMerger) strategy.newMerger(repo); merger.setWorkingTreeIterator(new FileTreeIterator(repo)); merger.setBase(srcParent.getTree()); - merger.setCommitNames(new String[] { "BASE", ourName, + merger.setCommitNames(new String[] { "BASE", ourName, //$NON-NLS-1$ cherryPickName }); if (merger.merge(newHead, srcCommit)) { if (AnyObjectId.equals(newHead.getTree().getId(), merger From b53e2a99b38c180f375f1676c94cab3fc42ba049 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 00:36:36 +0200 Subject: [PATCH 29/68] Silence non-externalized string warnings in CherryPickResult Change-Id: I515abbcb4319b744c5074de5a0c56caed13c2fb5 Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/api/CherryPickResult.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickResult.java index 5b3c5d4e7..b121291fc 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickResult.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CherryPickResult.java @@ -63,21 +63,21 @@ public enum CherryPickStatus { OK { @Override public String toString() { - return "Ok"; + return "Ok"; //$NON-NLS-1$ } }, /** */ FAILED { @Override public String toString() { - return "Failed"; + return "Failed"; //$NON-NLS-1$ } }, /** */ CONFLICTING { @Override public String toString() { - return "Conflicting"; + return "Conflicting"; //$NON-NLS-1$ } } } From 4bae608e8444e6a69ebb218f6a954700ba7173a6 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 00:38:42 +0200 Subject: [PATCH 30/68] Use try-with-resource to close resources in CloneCommand Change-Id: I9536bc208a5f3ec34f0a82fb565b4253be38e074 Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java index f058f799d..53901f589 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CloneCommand.java @@ -322,12 +322,9 @@ private void addMergeConfig(Repository clonedRepo, Ref head) private RevCommit parseCommit(final Repository clonedRepo, final Ref ref) throws MissingObjectException, IncorrectObjectTypeException, IOException { - final RevWalk rw = new RevWalk(clonedRepo); final RevCommit commit; - try { + try (final RevWalk rw = new RevWalk(clonedRepo)) { commit = rw.parseCommit(ref.getObjectId()); - } finally { - rw.release(); } return commit; } From 5f8308bdb9bb2bc9931b171e4b1957cf7c967f95 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 00:58:50 +0200 Subject: [PATCH 31/68] Replace call to deprecated RevWalk.release() in DescribeCommand Change-Id: Ie4bfdeb37d345d6ff1525a737f3b7653b2f8e23e Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java index bf6da45ca..be456662d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/DescribeCommand.java @@ -315,7 +315,7 @@ public int compare(Candidate o1, Candidate o2) { throw new JGitInternalException(e.getMessage(), e); } finally { setCallable(false); - w.release(); + w.close(); } } } From b8658e486c25c018aa1cf00fd704c9cdae899742 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 01:15:37 +0200 Subject: [PATCH 32/68] Use try-with-resource to close resources in DiffCommand Change-Id: I13d7c8bd0eb049aa69effd8b74384746226414cb Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/api/DiffCommand.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/DiffCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/DiffCommand.java index f31198f94..527daef81 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/DiffCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/DiffCommand.java @@ -124,11 +124,8 @@ public List call() throws GitAPIException { if (head == null) throw new NoHeadException(JGitText.get().cannotReadTree); CanonicalTreeParser p = new CanonicalTreeParser(); - ObjectReader reader = repo.newObjectReader(); - try { + try (ObjectReader reader = repo.newObjectReader()) { p.reset(reader, head); - } finally { - reader.release(); } oldTree = p; } @@ -159,7 +156,7 @@ public List call() throws GitAPIException { } catch (IOException e) { throw new JGitInternalException(e.getMessage(), e); } finally { - diffFmt.release(); + diffFmt.close(); } } From ff0a7b719e4d05f3f69a7b8028e972101661317f Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 01:23:31 +0200 Subject: [PATCH 33/68] Fix resource leak in DiffFormatter - close RevWalk allocated in scan() - replace use of deprecated ObjectReader.release() method Change-Id: I41b2b10a1a44270a6ceaa1741e996c0921439852 Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/diff/DiffFormatter.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java index 1aab51e9c..b71e9902c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java @@ -173,7 +173,7 @@ protected OutputStream getOutputStream() { */ public void setRepository(Repository repository) { if (reader != null) - reader.release(); + reader.close(); db = repository; reader = db.newObjectReader(); @@ -422,10 +422,11 @@ public List scan(AnyObjectId a, AnyObjectId b) throws IOException { assertHaveRepository(); - RevWalk rw = new RevWalk(reader); - RevTree aTree = a != null ? rw.parseTree(a) : null; - RevTree bTree = b != null ? rw.parseTree(b) : null; - return scan(aTree, bTree); + try (RevWalk rw = new RevWalk(reader)) { + RevTree aTree = a != null ? rw.parseTree(a) : null; + RevTree bTree = b != null ? rw.parseTree(b) : null; + return scan(aTree, bTree); + } } /** From b84623ac64dff1821c4255d7495042e50bb8d890 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 01:25:45 +0200 Subject: [PATCH 34/68] Use try-with-resource to close resources in DirCache Change-Id: I7dd3fd38784689816a1a8e9d8ccb499ae2138a8a Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java index 98a1c8ca4..6d9a32db9 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java @@ -961,9 +961,8 @@ private void registerIndexChangedListener(IndexChangedListener listener) { * @throws IOException */ private void updateSmudgedEntries() throws IOException { - TreeWalk walk = new TreeWalk(repository); List paths = new ArrayList(128); - try { + try (TreeWalk walk = new TreeWalk(repository)) { for (int i = 0; i < entryCnt; i++) if (sortedEntries[i].isSmudged()) paths.add(sortedEntries[i].getPathString()); @@ -989,8 +988,6 @@ private void updateSmudgedEntries() throws IOException { entry.setLastModified(fIter.getEntryLastModified()); } } - } finally { - walk.release(); } } } From 787ca168a9568bd640a1dbf3b7324dc3adf2aa23 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 02:03:00 +0200 Subject: [PATCH 35/68] Reduce visibility of DirCacheCheckout.checkValidPath() This was deprecated and should only be used by DirCacheCheckout and friends. Other classes should use SystemReader.checkPath() instead. Change-Id: I37cf753b1f081602dee9f0f47979eff39d735f92 Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/dircache/DirCacheCheckout.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 015d9d6a8..99e022bfe 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheCheckout.java @@ -1284,10 +1284,8 @@ private static void checkValidPath(CanonicalTreeParser t) * @throws InvalidPathException * if the path is invalid * @since 3.3 - * @deprecated Use {@link SystemReader#checkPath(String)}. */ - @Deprecated - public static void checkValidPath(String path) throws InvalidPathException { + static void checkValidPath(String path) throws InvalidPathException { try { SystemReader.getInstance().checkPath(path); } catch (CorruptObjectException e) { From cbb617603ab657f3cb38a96726ec287bc6fda175 Mon Sep 17 00:00:00 2001 From: Hector Oswaldo Caballero Date: Mon, 16 Mar 2015 08:48:56 -0400 Subject: [PATCH 36/68] Clearer error message when service is not enabled When a user tried to use a service not enabled in the remote server a misleading error message was given: fatal: remote error: Git access forbidden This patch modifies the error message to make the cause clearer to the user. Now, when the user tries to use a not enabled service, the message error clearly states it: fatal: remote error: Service not enabled Change-Id: If096c4ddd17c5aae0e99e3ea6eea4b69bd3c5466 Signed-off-by: Hector Oswaldo Caballero --- .../src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java index 481075377..51332194b 100644 --- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java +++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/SmartServiceInfoRefs.java @@ -101,7 +101,7 @@ public void doFilter(ServletRequest request, ServletResponse response, res.sendError(SC_UNAUTHORIZED); return; } catch (ServiceNotEnabledException e) { - sendError(req, res, SC_FORBIDDEN); + sendError(req, res, SC_FORBIDDEN, e.getMessage()); return; } From 2693d6075d771bc1503168653ed2ce91b703fb7d Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 4 Apr 2015 00:05:14 +0200 Subject: [PATCH 37/68] Use try-with-resource to close resources in FetchProcess Change-Id: If489d530ca39ae279c8da848f870b561c38eac3c Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/transport/FetchProcess.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java index 52a9bab4b..d2902a35b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java @@ -196,8 +196,7 @@ else if (tagopt == TagOpt.FETCH_TAGS) .newBatchUpdate() .setAllowNonFastForwards(true) .setRefLogMessage("fetch", true); //$NON-NLS-1$ - final RevWalk walk = new RevWalk(transport.local); - try { + try (final RevWalk walk = new RevWalk(transport.local)) { if (monitor instanceof BatchingProgressMonitor) { ((BatchingProgressMonitor) monitor).setDelayStart( 250, TimeUnit.MILLISECONDS); @@ -226,8 +225,6 @@ else if (tagopt == TagOpt.FETCH_TAGS) throw new TransportException(MessageFormat.format( JGitText.get().failureUpdatingTrackingRef, getFirstFailedRefName(batch), err.getMessage()), err); - } finally { - walk.release(); } if (!fetchHeadUpdates.isEmpty()) { @@ -338,15 +335,12 @@ private void updateFETCH_HEAD(final FetchResult result) throws IOException { private boolean askForIsComplete() throws TransportException { try { - final ObjectWalk ow = new ObjectWalk(transport.local); - try { + try (final ObjectWalk ow = new ObjectWalk(transport.local)) { for (final ObjectId want : askFor.keySet()) ow.markStart(ow.parseAny(want)); for (final Ref ref : localRefs().values()) ow.markUninteresting(ow.parseAny(ref.getObjectId())); ow.checkConnectivity(); - } finally { - ow.release(); } return true; } catch (MissingObjectException e) { From ed42bad1c6dc11ca39e5edd0903390aa7371363f Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 4 Apr 2015 00:17:03 +0200 Subject: [PATCH 38/68] Use try-with-resource to close resources in GC Change-Id: I62a755a4ce839a252a5e80abf3f0d21243862376 Signed-off-by: Matthias Sohn --- .../jgit/internal/storage/file/GC.java | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java index 48335e48c..338106f8e 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java @@ -618,22 +618,19 @@ private Map getAllRefs() throws IOException { */ private Set listNonHEADIndexObjects() throws CorruptObjectException, IOException { - RevWalk revWalk = null; try { if (repo.getIndexFile() == null) return Collections.emptySet(); } catch (NoWorkTreeException e) { return Collections.emptySet(); } - TreeWalk treeWalk = new TreeWalk(repo); - try { + try (TreeWalk treeWalk = new TreeWalk(repo)) { treeWalk.addTree(new DirCacheIterator(repo.readDirCache())); ObjectId headID = repo.resolve(Constants.HEAD); if (headID != null) { - revWalk = new RevWalk(repo); - treeWalk.addTree(revWalk.parseTree(headID)); - revWalk.dispose(); - revWalk = null; + try (RevWalk revWalk = new RevWalk(repo)) { + treeWalk.addTree(revWalk.parseTree(headID)); + } } treeWalk.setFilter(TreeFilter.ANY_DIFF); @@ -662,10 +659,6 @@ private Set listNonHEADIndexObjects() } } return ret; - } finally { - if (revWalk != null) - revWalk.dispose(); - treeWalk.release(); } } @@ -689,8 +682,9 @@ public int compare(PackExt o1, PackExt o2) { } }); - PackWriter pw = new PackWriter((pconfig == null) ? new PackConfig(repo) : pconfig, repo.newObjectReader()); - try { + try (PackWriter pw = new PackWriter( + (pconfig == null) ? new PackConfig(repo) : pconfig, + repo.newObjectReader())) { // prepare the PackWriter pw.setDeltaBaseAsOffset(true); pw.setReuseDeltaCommits(false); @@ -810,7 +804,6 @@ public int compare(PackExt o1, PackExt o2) { } return repo.getObjectDatabase().openPack(realPack); } finally { - pw.release(); if (tmpPack != null && tmpPack.exists()) tmpPack.delete(); for (File tmpExt : tmpExts.values()) { From 8e332f10577a93b83885ba36d994e780b8724ef1 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 4 Apr 2015 00:19:39 +0200 Subject: [PATCH 39/68] Replace deprecated release() methods by close() in Merger Change-Id: I80ce98511a6e9048f1eea93288d6960dcbf3326f Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/merge/Merger.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java index d786a18ff..a76dd350d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java @@ -125,9 +125,9 @@ public ObjectInserter getObjectInserter() { * repository instance returned by {@link #getRepository()}. */ public void setObjectInserter(ObjectInserter oi) { - walk.release(); - reader.release(); - inserter.release(); + walk.close(); + reader.close(); + inserter.close(); inserter = oi; reader = oi.newReader(); walk = new RevWalk(reader); @@ -206,8 +206,8 @@ public boolean merge(final boolean flush, final AnyObjectId... tips) return ok; } finally { if (flush) - inserter.release(); - reader.release(); + inserter.close(); + reader.close(); } } From f434f29fd9e9e2d6babd3587eebf9b5dece98a7d Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 4 Apr 2015 00:32:59 +0200 Subject: [PATCH 40/68] Ensure that NameRevCommand.call() closes RevWalk Change-Id: Icc35a81081759d664fe9e2b05e962ff3cd9aad92 Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java index cce42fc51..fd28d0ec4 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java @@ -185,11 +185,11 @@ public Map call() throws GitAPIException { } setCallable(false); - walk.release(); return result; } catch (IOException e) { - walk.reset(); throw new JGitInternalException(e.getMessage(), e); + } finally { + walk.close(); } } From f777ed1d24d1d227fff7bcd0e08d138b9f1c1aba Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 4 Apr 2015 00:36:28 +0200 Subject: [PATCH 41/68] Replace deprecated release() methods by close() in NoteMapMerger Change-Id: Iaa76f0e853bb82cd7f231fd2f462a319f4196d8c Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/notes/NoteMapMerger.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java index 061447666..19ec1a13d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java @@ -135,8 +135,8 @@ public NoteMap merge(NoteMap base, NoteMap ours, NoteMap theirs) inserter.flush(); return NoteMap.newMap(mergedBucket, reader); } finally { - reader.release(); - inserter.release(); + reader.close(); + inserter.close(); } } From 1728d1d760154afafa99706b5169c9656d40a428 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 4 Apr 2015 00:38:39 +0200 Subject: [PATCH 42/68] Use try-with-resource to close resources in ObjectDatabase Change-Id: Ib410bf0d3c300c25b615bb6a51488b3d88aeb3bd Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/lib/ObjectDatabase.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDatabase.java index 0cc51d1a5..2abd6dae6 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDatabase.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDatabase.java @@ -120,11 +120,8 @@ public void create() throws IOException { * the object store cannot be accessed. */ public boolean has(final AnyObjectId objectId) throws IOException { - final ObjectReader or = newReader(); - try { + try (final ObjectReader or = newReader()) { return or.has(objectId); - } finally { - or.release(); } } @@ -172,11 +169,8 @@ public ObjectLoader open(final AnyObjectId objectId) public ObjectLoader open(AnyObjectId objectId, int typeHint) throws MissingObjectException, IncorrectObjectTypeException, IOException { - final ObjectReader or = newReader(); - try { + try (final ObjectReader or = newReader()) { return or.open(objectId, typeHint); - } finally { - or.release(); } } From fc2d723dd993b4d5e34db2b984189b4b6367c26a Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 4 Apr 2015 00:45:33 +0200 Subject: [PATCH 43/68] Externalize error messages used in ObjectDirectoryInserter Change-Id: I3bc26847071fbc31267a4a4cf5a10b428bcf229d Signed-off-by: Matthias Sohn --- .../org/eclipse/jgit/internal/JGitText.properties | 2 ++ .../src/org/eclipse/jgit/internal/JGitText.java | 2 ++ .../internal/storage/file/ObjectDirectoryInserter.java | 9 ++++++--- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties index a003b02cc..33156553b 100644 --- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties +++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties @@ -258,6 +258,7 @@ indexWriteException=Modified index could not be written initFailedBareRepoDifferentDirs=When initializing a bare repo with directory {0} and separate git-dir {1} specified both folders must point to the same location initFailedNonBareRepoSameDirs=When initializing a non-bare repo with directory {0} and separate git-dir {1} specified both folders should not point to the same location inMemoryBufferLimitExceeded=In-memory buffer limit exceeded +inputDidntMatchLength=Input did not match supplied length. {0} bytes are missing. inputStreamMustSupportMark=InputStream must support mark() integerValueOutOfRange=Integer value {0}.{1} out of range internalRevisionError=internal revision error @@ -536,6 +537,7 @@ truncatedHunkNewLinesMissing=Truncated hunk, at least {0} new lines is missing truncatedHunkOldLinesMissing=Truncated hunk, at least {0} old lines is missing tSizeMustBeGreaterOrEqual1=tSize must be >= 1 unableToCheckConnectivity=Unable to check connectivity. +unableToCreateNewObject=Unable to create new object: {0} unableToStore=Unable to store {0}. unableToWrite=Unable to write {0} unencodeableFile=Unencodable file: {0} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java index 63b788f6b..587af5725 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java @@ -317,6 +317,7 @@ public static JGitText get() { /***/ public String initFailedBareRepoDifferentDirs; /***/ public String initFailedNonBareRepoSameDirs; /***/ public String inMemoryBufferLimitExceeded; + /***/ public String inputDidntMatchLength; /***/ public String inputStreamMustSupportMark; /***/ public String integerValueOutOfRange; /***/ public String internalRevisionError; @@ -595,6 +596,7 @@ public static JGitText get() { /***/ public String truncatedHunkOldLinesMissing; /***/ public String tSizeMustBeGreaterOrEqual1; /***/ public String unableToCheckConnectivity; + /***/ public String unableToCreateNewObject; /***/ public String unableToStore; /***/ public String unableToWrite; /***/ public String unencodeableFile; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java index 812c899a8..eb87460d8 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java @@ -55,10 +55,12 @@ import java.nio.channels.Channels; import java.security.DigestOutputStream; import java.security.MessageDigest; +import java.text.MessageFormat; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import org.eclipse.jgit.errors.ObjectWritingException; +import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; @@ -123,7 +125,8 @@ private ObjectId insertOneObject(final File tmp, final ObjectId id) } final File dst = db.fileFor(id); - throw new ObjectWritingException("Unable to create new object: " + dst); + throw new ObjectWritingException(MessageFormat + .format(JGitText.get().unableToCreateNewObject, dst)); } @Override @@ -242,7 +245,7 @@ DeflaterOutputStream compress(final OutputStream out) { } private static EOFException shortInput(long missing) { - return new EOFException("Input did not match supplied length. " - + missing + " bytes are missing."); + return new EOFException(MessageFormat.format( + JGitText.get().inputDidntMatchLength, Long.valueOf(missing))); } } From 4dd4d7e12abec2740c14d681d91c1b799f55f686 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 4 Apr 2015 00:49:05 +0200 Subject: [PATCH 44/68] Silence false null pointer access warnings in PackFile Change-Id: Ia39085557b38840dfaa9b4995e6f6c40e19042cb Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/internal/storage/file/PackFile.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java index eb2293874..ad3322e0d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java @@ -362,6 +362,7 @@ final void copyAsIs(PackOutputStream out, LocalObjectToPack src, } } + @SuppressWarnings("null") private void copyAsIs2(PackOutputStream out, LocalObjectToPack src, boolean validate, WindowCursor curs) throws IOException, StoredObjectRepresentationNotAvailableException { @@ -703,6 +704,7 @@ private void onOpenPack() throws IOException { , getPackFile())); } + @SuppressWarnings("null") ObjectLoader load(final WindowCursor curs, long pos) throws IOException, LargeObjectException { try { From 6feb7bc9dd490c291587d863beb9c7363260d29d Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 4 Apr 2015 00:51:05 +0200 Subject: [PATCH 45/68] Silence non-externalized string warning in PackIndexV2 Change-Id: I8c94811972c593c898f6375178f250a2123d01c6 Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java index 70cf20fb9..cb8c91a5a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackIndexV2.java @@ -232,7 +232,7 @@ public long findCRC32(AnyObjectId objId) throws MissingObjectException { final int levelOne = objId.getFirstByte(); final int levelTwo = binarySearchLevelTwo(objId, levelOne); if (levelTwo == -1) - throw new MissingObjectException(objId.copy(), "unknown"); + throw new MissingObjectException(objId.copy(), "unknown"); //$NON-NLS-1$ return NB.decodeUInt32(crc32[levelOne], levelTwo << 2); } From e5a6290ac907ff912216f19e319247ef1d393e0b Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 4 Apr 2015 00:53:47 +0200 Subject: [PATCH 46/68] Replace call to deprecated release() by close() in PackParser Change-Id: Ic2db051130059cce89486f55ecca32a7ce6715fd Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java index 5b54891cd..de52a4bb3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java @@ -529,7 +529,7 @@ public PackLock parse(ProgressMonitor receiving, ProgressMonitor resolving) } finally { try { if (readCurs != null) - readCurs.release(); + readCurs.close(); } finally { readCurs = null; } From 8d41c783c0f07ffb2abec85ce05ad963387c5855 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sat, 4 Apr 2015 00:54:24 +0200 Subject: [PATCH 47/68] Silence non-externalized string warning in PackParser Change-Id: I1a4181fc292c42157c69479f71c7674b2e00d2ce Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java index de52a4bb3..04abe2232 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java @@ -812,7 +812,7 @@ private void resolveDeltasWithExternalBases(final ProgressMonitor progress) for (final DeltaChain base : missing) { if (base.head != null) - throw new MissingObjectException(base, "delta base"); + throw new MissingObjectException(base, "delta base"); //$NON-NLS-1$ } onEndThinPack(); From 13cfc83b2b1b6ca0eba50357d39487c7f8bef403 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 01:03:15 +0200 Subject: [PATCH 48/68] Use try-with-resource to close resources in DfsGarbageCollector Change-Id: Iaa51a46a9dde13d6f5c0f9ff54a68cea0ef1fde3 Signed-off-by: Matthias Sohn --- .../storage/dfs/DfsGarbageCollector.java | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java index deb6b7ff4..be370c7ed 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java @@ -272,14 +272,11 @@ private void packHeads(ProgressMonitor pm) throws IOException { if (allHeads.isEmpty()) return; - PackWriter pw = newPackWriter(); - try { + try (PackWriter pw = newPackWriter()) { pw.setTagTargets(tagTargets); pw.preparePack(pm, allHeads, Collections. emptySet()); if (0 < pw.getObjectCount()) writePack(GC, pw, pm); - } finally { - pw.release(); } } @@ -287,15 +284,12 @@ private void packRest(ProgressMonitor pm) throws IOException { if (nonHeads.isEmpty()) return; - PackWriter pw = newPackWriter(); - try { + try (PackWriter pw = newPackWriter()) { for (PackWriter.ObjectIdSet packedObjs : newPackObj) pw.excludeObjects(packedObjs); pw.preparePack(pm, nonHeads, allHeads); if (0 < pw.getObjectCount()) writePack(GC, pw, pm); - } finally { - pw.release(); } } @@ -307,11 +301,10 @@ private void packGarbage(ProgressMonitor pm) throws IOException { cfg.setDeltaCompress(false); cfg.setBuildBitmaps(false); - PackWriter pw = new PackWriter(cfg, ctx); - pw.setDeltaBaseAsOffset(true); - pw.setReuseDeltaCommits(true); - try { - RevWalk pool = new RevWalk(ctx); + try (PackWriter pw = new PackWriter(cfg, ctx); + RevWalk pool = new RevWalk(ctx)) { + pw.setDeltaBaseAsOffset(true); + pw.setReuseDeltaCommits(true); pm.beginTask("Finding garbage", objectsBefore()); for (DfsPackFile oldPack : packsBefore) { PackIndex oldIdx = oldPack.getPackIndex(ctx); @@ -328,8 +321,6 @@ private void packGarbage(ProgressMonitor pm) throws IOException { pm.endTask(); if (0 < pw.getObjectCount()) writePack(UNREACHABLE_GARBAGE, pw, pm); - } finally { - pw.release(); } } From 842ae868cff4349f8df0344c02c9c9ece3d78ca5 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 01:09:32 +0200 Subject: [PATCH 49/68] Externalize error messages used in DfsGarbageCollector Change-Id: I11631afb33a2bb29d994551a0be8775bbe277300 Signed-off-by: Matthias Sohn --- .../resources/org/eclipse/jgit/internal/JGitText.properties | 2 ++ .../src/org/eclipse/jgit/internal/JGitText.java | 2 ++ .../jgit/internal/storage/dfs/DfsGarbageCollector.java | 6 ++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties index 33156553b..2e20ada6e 100644 --- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties +++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties @@ -231,6 +231,7 @@ fileCannotBeDeleted=File cannot be deleted: {0} fileIsTooBigForThisConvenienceMethod=File is too big for this convenience method ({0} bytes). fileIsTooLarge=File is too large: {0} fileModeNotSetForPath=FileMode not set for path {0} +findingGarbage=Finding garbage flagIsDisposed={0} is disposed. flagNotFromThis={0} not from this. flagsAlreadyCreated={0} flags already created. @@ -503,6 +504,7 @@ statelessRPCRequiresOptionToBeEnabled=stateless RPC requires {0} to be enabled submoduleExists=Submodule ''{0}'' already exists in the index submoduleParentRemoteUrlInvalid=Cannot remove segment from remote url ''{0}'' submodulesNotSupported=Submodules are not supported +supportOnlyPackIndexVersion2=Only support index version 2 symlinkCannotBeWrittenAsTheLinkTarget=Symlink "{0}" cannot be written as the link target cannot be read from within Java. systemConfigFileInvalid=Systen wide config file {0} is invalid {1} tagAlreadyExists=tag ''{0}'' already exists diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java index 587af5725..efd161384 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java @@ -290,6 +290,7 @@ public static JGitText get() { /***/ public String fileIsTooBigForThisConvenienceMethod; /***/ public String fileIsTooLarge; /***/ public String fileModeNotSetForPath; + /***/ public String findingGarbage; /***/ public String flagIsDisposed; /***/ public String flagNotFromThis; /***/ public String flagsAlreadyCreated; @@ -562,6 +563,7 @@ public static JGitText get() { /***/ public String submoduleExists; /***/ public String submodulesNotSupported; /***/ public String submoduleParentRemoteUrlInvalid; + /***/ public String supportOnlyPackIndexVersion2; /***/ public String symlinkCannotBeWrittenAsTheLinkTarget; /***/ public String systemConfigFileInvalid; /***/ public String tagAlreadyExists; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java index be370c7ed..fed533880 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsGarbageCollector.java @@ -58,6 +58,7 @@ import java.util.Map; import java.util.Set; +import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.internal.storage.dfs.DfsObjDatabase.PackSource; import org.eclipse.jgit.internal.storage.file.PackIndex; import org.eclipse.jgit.internal.storage.pack.PackExt; @@ -188,7 +189,8 @@ public boolean pack(ProgressMonitor pm) throws IOException { if (pm == null) pm = NullProgressMonitor.INSTANCE; if (packConfig.getIndexVersion() != 2) - throw new IllegalStateException("Only index version 2"); + throw new IllegalStateException( + JGitText.get().supportOnlyPackIndexVersion2); ctx = (DfsReader) objdb.newReader(); try { @@ -305,7 +307,7 @@ private void packGarbage(ProgressMonitor pm) throws IOException { RevWalk pool = new RevWalk(ctx)) { pw.setDeltaBaseAsOffset(true); pw.setReuseDeltaCommits(true); - pm.beginTask("Finding garbage", objectsBefore()); + pm.beginTask(JGitText.get().findingGarbage, objectsBefore()); for (DfsPackFile oldPack : packsBefore) { PackIndex oldIdx = oldPack.getPackIndex(ctx); for (PackIndex.MutableEntry ent : oldIdx) { From 7343c7a10f7cd180c77a985e793c27873918146d Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Thu, 2 Apr 2015 01:36:22 +0200 Subject: [PATCH 50/68] Use try-with-resource to close resources in CheckoutCommand Change-Id: Ia4d4f9bff03a03d116b80022d7691df67bf8b51b Signed-off-by: Matthias Sohn --- .../org/eclipse/jgit/api/CheckoutCommand.java | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java index 3787ac511..00c3e1f4b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java @@ -208,16 +208,17 @@ public Ref call() throws GitAPIException, RefAlreadyExistsException, } if (createBranch) { - Git git = new Git(repo); - CreateBranchCommand command = git.branchCreate(); - command.setName(name); - if (startCommit != null) - command.setStartPoint(startCommit); - else - command.setStartPoint(startPoint); - if (upstreamMode != null) - command.setUpstreamMode(upstreamMode); - command.call(); + try (Git git = new Git(repo)) { + CreateBranchCommand command = git.branchCreate(); + command.setName(name); + if (startCommit != null) + command.setStartPoint(startCommit); + else + command.setStartPoint(startPoint); + if (upstreamMode != null) + command.setUpstreamMode(upstreamMode); + command.call(); + } } Ref headRef = repo.getRef(Constants.HEAD); @@ -243,11 +244,14 @@ public Ref call() throws GitAPIException, RefAlreadyExistsException, JGitText.get().refNotResolved, name)); } - RevWalk revWalk = new RevWalk(repo); - AnyObjectId headId = headRef.getObjectId(); - RevCommit headCommit = headId == null ? null : revWalk - .parseCommit(headId); - RevCommit newCommit = revWalk.parseCommit(branch); + RevCommit headCommit = null; + RevCommit newCommit = null; + try (RevWalk revWalk = new RevWalk(repo)) { + AnyObjectId headId = headRef.getObjectId(); + headCommit = headId == null ? null + : revWalk.parseCommit(headId); + newCommit = revWalk.parseCommit(branch); + } RevTree headTree = headCommit == null ? null : headCommit.getTree(); DirCacheCheckout dco; DirCache dc = repo.lockDirCache(); @@ -376,26 +380,20 @@ public CheckoutCommand setAllPaths(boolean all) { */ protected CheckoutCommand checkoutPaths() throws IOException, RefNotFoundException { - RevWalk revWalk = new RevWalk(repo); DirCache dc = repo.lockDirCache(); - try { - TreeWalk treeWalk = new TreeWalk(revWalk.getObjectReader()); + try (RevWalk revWalk = new RevWalk(repo); + TreeWalk treeWalk = new TreeWalk(revWalk.getObjectReader())) { treeWalk.setRecursive(true); if (!checkoutAllPaths) treeWalk.setFilter(PathFilterGroup.createFromStrings(paths)); - try { - if (isCheckoutIndex()) - checkoutPathsFromIndex(treeWalk, dc); - else { - RevCommit commit = revWalk.parseCommit(getStartPointObjectId()); - checkoutPathsFromCommit(treeWalk, dc, commit); - } - } finally { - treeWalk.release(); + if (isCheckoutIndex()) + checkoutPathsFromIndex(treeWalk, dc); + else { + RevCommit commit = revWalk.parseCommit(getStartPointObjectId()); + checkoutPathsFromCommit(treeWalk, dc, commit); } } finally { dc.unlock(); - revWalk.release(); } return this; } From bb2ca576ff4012bfc40de8bc8c7ed24276a75519 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 00:29:41 +0200 Subject: [PATCH 51/68] Externalize error message used in CheckoutCommand Change-Id: Ifbc469b07e63218107157ffbf23ae55c52a55ef4 Signed-off-by: Matthias Sohn --- .../resources/org/eclipse/jgit/internal/JGitText.properties | 1 + org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java | 3 +-- org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties index 2e20ada6e..10f5339ae 100644 --- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties +++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties @@ -44,6 +44,7 @@ cannotBeCombined=Cannot be combined. cannotBeRecursiveWhenTreesAreIncluded=TreeWalk shouldn't be recursive when tree objects are included. cannotChangeActionOnComment=Cannot change action on comment line in git-rebase-todo file, old action: {0}, new action: {1}. cannotChangeToComment=Cannot change a non-comment line to a comment line. +cannotCheckoutOursSwitchBranch=Checking out ours/theirs is only possible when checking out index, not when switching branches. cannotCombineSquashWithNoff=Cannot combine --squash with --no-ff. cannotCombineTreeFilterWithRevFilter=Cannot combine TreeFilter {0} with RevFilter {1}. cannotCommitOnARepoWithState=Cannot commit on a repo with state: {0} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java index 00c3e1f4b..8d8aada62 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CheckoutCommand.java @@ -673,7 +673,6 @@ public CheckoutResult getResult() { private void checkOptions() { if (checkoutStage != null && !isCheckoutIndex()) throw new IllegalStateException( - "Checking out ours/theirs is only possible when checking out index, " - + "not when switching branches."); + JGitText.get().cannotCheckoutOursSwitchBranch); } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java index efd161384..2448bf896 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java @@ -103,6 +103,7 @@ public static JGitText get() { /***/ public String cannotBeRecursiveWhenTreesAreIncluded; /***/ public String cannotChangeActionOnComment; /***/ public String cannotChangeToComment; + /***/ public String cannotCheckoutOursSwitchBranch; /***/ public String cannotCombineSquashWithNoff; /***/ public String cannotCombineTreeFilterWithRevFilter; /***/ public String cannotCommitOnARepoWithState; From d726f0c1e02c196e2dd87de53b54338be15503f1 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 3 Apr 2015 00:52:41 +0200 Subject: [PATCH 52/68] Use try-with-resource to close resources in CommitCommand Change-Id: Ibbbc74acfd050f28e68f318970660b5959caf7e3 Signed-off-by: Matthias Sohn --- .../org/eclipse/jgit/api/CommitCommand.java | 321 +++++++++--------- 1 file changed, 158 insertions(+), 163 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java index b57cff7ea..87efd7983 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java @@ -165,9 +165,7 @@ public RevCommit call() throws GitAPIException, NoHeadException, checkCallable(); Collections.sort(only); - RevWalk rw = new RevWalk(repo); - - try { + try (RevWalk rw = new RevWalk(repo)) { RepositoryState state = repo.getRepositoryState(); if (!state.canCommit()) throw new WrongRepositoryStateException(MessageFormat.format( @@ -181,8 +179,7 @@ public RevCommit call() throws GitAPIException, NoHeadException, processOptions(state, rw); if (all && !repo.isBare() && repo.getWorkTree() != null) { - Git git = new Git(repo); - try { + try (Git git = new Git(repo)) { git.add() .addFilepattern(".") //$NON-NLS-1$ .setUpdate(true).call(); @@ -221,80 +218,74 @@ public RevCommit call() throws GitAPIException, NoHeadException, // lock the index DirCache index = repo.lockDirCache(); - try { + try (ObjectInserter odi = repo.newObjectInserter()) { if (!only.isEmpty()) index = createTemporaryIndex(headId, index, rw); - ObjectInserter odi = repo.newObjectInserter(); - try { - // Write the index as tree to the object database. This may - // fail for example when the index contains unmerged paths - // (unresolved conflicts) - ObjectId indexTreeId = index.writeTree(odi); + // Write the index as tree to the object database. This may + // fail for example when the index contains unmerged paths + // (unresolved conflicts) + ObjectId indexTreeId = index.writeTree(odi); - if (insertChangeId) - insertChangeId(indexTreeId); + if (insertChangeId) + insertChangeId(indexTreeId); - // Create a Commit object, populate it and write it - CommitBuilder commit = new CommitBuilder(); - commit.setCommitter(committer); - commit.setAuthor(author); - commit.setMessage(message); + // Create a Commit object, populate it and write it + CommitBuilder commit = new CommitBuilder(); + commit.setCommitter(committer); + commit.setAuthor(author); + commit.setMessage(message); - commit.setParentIds(parents); - commit.setTreeId(indexTreeId); - ObjectId commitId = odi.insert(commit); - odi.flush(); + commit.setParentIds(parents); + commit.setTreeId(indexTreeId); + ObjectId commitId = odi.insert(commit); + odi.flush(); - RevCommit revCommit = rw.parseCommit(commitId); - RefUpdate ru = repo.updateRef(Constants.HEAD); - ru.setNewObjectId(commitId); - if (reflogComment != null) { - ru.setRefLogMessage(reflogComment, false); - } else { - String prefix = amend ? "commit (amend): " //$NON-NLS-1$ - : parents.size() == 0 ? "commit (initial): " //$NON-NLS-1$ - : "commit: "; //$NON-NLS-1$ - ru.setRefLogMessage( - prefix + revCommit.getShortMessage(), false); + RevCommit revCommit = rw.parseCommit(commitId); + RefUpdate ru = repo.updateRef(Constants.HEAD); + ru.setNewObjectId(commitId); + if (reflogComment != null) { + ru.setRefLogMessage(reflogComment, false); + } else { + String prefix = amend ? "commit (amend): " //$NON-NLS-1$ + : parents.size() == 0 ? "commit (initial): " //$NON-NLS-1$ + : "commit: "; //$NON-NLS-1$ + ru.setRefLogMessage(prefix + revCommit.getShortMessage(), + false); + } + if (headId != null) + ru.setExpectedOldObjectId(headId); + else + ru.setExpectedOldObjectId(ObjectId.zeroId()); + Result rc = ru.forceUpdate(); + switch (rc) { + case NEW: + case FORCED: + case FAST_FORWARD: { + setCallable(false); + if (state == RepositoryState.MERGING_RESOLVED + || isMergeDuringRebase(state)) { + // Commit was successful. Now delete the files + // used for merge commits + repo.writeMergeCommitMsg(null); + repo.writeMergeHeads(null); + } else if (state == RepositoryState.CHERRY_PICKING_RESOLVED) { + repo.writeMergeCommitMsg(null); + repo.writeCherryPickHead(null); + } else if (state == RepositoryState.REVERTING_RESOLVED) { + repo.writeMergeCommitMsg(null); + repo.writeRevertHead(null); } - if (headId != null) - ru.setExpectedOldObjectId(headId); - else - ru.setExpectedOldObjectId(ObjectId.zeroId()); - Result rc = ru.forceUpdate(); - switch (rc) { - case NEW: - case FORCED: - case FAST_FORWARD: { - setCallable(false); - if (state == RepositoryState.MERGING_RESOLVED - || isMergeDuringRebase(state)) { - // Commit was successful. Now delete the files - // used for merge commits - repo.writeMergeCommitMsg(null); - repo.writeMergeHeads(null); - } else if (state == RepositoryState.CHERRY_PICKING_RESOLVED) { - repo.writeMergeCommitMsg(null); - repo.writeCherryPickHead(null); - } else if (state == RepositoryState.REVERTING_RESOLVED) { - repo.writeMergeCommitMsg(null); - repo.writeRevertHead(null); - } - return revCommit; - } - case REJECTED: - case LOCK_FAILURE: - throw new ConcurrentRefUpdateException( - JGitText.get().couldNotLockHEAD, ru.getRef(), - rc); - default: - throw new JGitInternalException(MessageFormat.format( - JGitText.get().updatingRefFailed, - Constants.HEAD, commitId.toString(), rc)); - } - } finally { - odi.release(); + return revCommit; + } + case REJECTED: + case LOCK_FAILURE: + throw new ConcurrentRefUpdateException( + JGitText.get().couldNotLockHEAD, ru.getRef(), rc); + default: + throw new JGitInternalException(MessageFormat.format( + JGitText.get().updatingRefFailed, Constants.HEAD, + commitId.toString(), rc)); } } finally { index.unlock(); @@ -304,8 +295,6 @@ public RevCommit call() throws GitAPIException, NoHeadException, } catch (IOException e) { throw new JGitInternalException( JGitText.get().exceptionCaughtDuringExecutionOfCommitCommand, e); - } finally { - rw.dispose(); } } @@ -338,114 +327,120 @@ private DirCache createTemporaryIndex(ObjectId headId, DirCache index, onlyProcessed = new boolean[only.size()]; boolean emptyCommit = true; - TreeWalk treeWalk = new TreeWalk(repo); - int dcIdx = treeWalk.addTree(new DirCacheBuildIterator(existingBuilder)); - int fIdx = treeWalk.addTree(new FileTreeIterator(repo)); - int hIdx = -1; - if (headId != null) - hIdx = treeWalk.addTree(rw.parseTree(headId)); - treeWalk.setRecursive(true); + try (TreeWalk treeWalk = new TreeWalk(repo)) { + int dcIdx = treeWalk + .addTree(new DirCacheBuildIterator(existingBuilder)); + int fIdx = treeWalk.addTree(new FileTreeIterator(repo)); + int hIdx = -1; + if (headId != null) + hIdx = treeWalk.addTree(rw.parseTree(headId)); + treeWalk.setRecursive(true); - String lastAddedFile = null; - while (treeWalk.next()) { - String path = treeWalk.getPathString(); - // check if current entry's path matches a specified path - int pos = lookupOnly(path); + String lastAddedFile = null; + while (treeWalk.next()) { + String path = treeWalk.getPathString(); + // check if current entry's path matches a specified path + int pos = lookupOnly(path); - CanonicalTreeParser hTree = null; - if (hIdx != -1) - hTree = treeWalk.getTree(hIdx, CanonicalTreeParser.class); + CanonicalTreeParser hTree = null; + if (hIdx != -1) + hTree = treeWalk.getTree(hIdx, CanonicalTreeParser.class); - DirCacheIterator dcTree = treeWalk.getTree(dcIdx, - DirCacheIterator.class); + DirCacheIterator dcTree = treeWalk.getTree(dcIdx, + DirCacheIterator.class); - if (pos >= 0) { - // include entry in commit + if (pos >= 0) { + // include entry in commit - FileTreeIterator fTree = treeWalk.getTree(fIdx, - FileTreeIterator.class); + FileTreeIterator fTree = treeWalk.getTree(fIdx, + FileTreeIterator.class); - // check if entry refers to a tracked file - boolean tracked = dcTree != null || hTree != null; - if (!tracked) - break; + // check if entry refers to a tracked file + boolean tracked = dcTree != null || hTree != null; + if (!tracked) + break; - // for an unmerged path, DirCacheBuildIterator will yield 3 - // entries, we only want to add one - if (path.equals(lastAddedFile)) - continue; + // for an unmerged path, DirCacheBuildIterator will yield 3 + // entries, we only want to add one + if (path.equals(lastAddedFile)) + continue; - lastAddedFile = path; + lastAddedFile = path; - if (fTree != null) { - // create a new DirCacheEntry with data retrieved from disk - final DirCacheEntry dcEntry = new DirCacheEntry(path); - long entryLength = fTree.getEntryLength(); - dcEntry.setLength(entryLength); - dcEntry.setLastModified(fTree.getEntryLastModified()); - dcEntry.setFileMode(fTree.getIndexFileMode(dcTree)); + if (fTree != null) { + // create a new DirCacheEntry with data retrieved from + // disk + final DirCacheEntry dcEntry = new DirCacheEntry(path); + long entryLength = fTree.getEntryLength(); + dcEntry.setLength(entryLength); + dcEntry.setLastModified(fTree.getEntryLastModified()); + dcEntry.setFileMode(fTree.getIndexFileMode(dcTree)); - boolean objectExists = (dcTree != null && fTree - .idEqual(dcTree)) - || (hTree != null && fTree.idEqual(hTree)); - if (objectExists) { - dcEntry.setObjectId(fTree.getEntryObjectId()); - } else { - if (FileMode.GITLINK.equals(dcEntry.getFileMode())) + boolean objectExists = (dcTree != null + && fTree.idEqual(dcTree)) + || (hTree != null && fTree.idEqual(hTree)); + if (objectExists) { dcEntry.setObjectId(fTree.getEntryObjectId()); - else { - // insert object - if (inserter == null) - inserter = repo.newObjectInserter(); - long contentLength = fTree.getEntryContentLength(); - InputStream inputStream = fTree.openEntryStream(); - try { - dcEntry.setObjectId(inserter.insert( - Constants.OBJ_BLOB, contentLength, - inputStream)); - } finally { - inputStream.close(); + } else { + if (FileMode.GITLINK.equals(dcEntry.getFileMode())) + dcEntry.setObjectId(fTree.getEntryObjectId()); + else { + // insert object + if (inserter == null) + inserter = repo.newObjectInserter(); + long contentLength = fTree + .getEntryContentLength(); + InputStream inputStream = fTree + .openEntryStream(); + try { + dcEntry.setObjectId(inserter.insert( + Constants.OBJ_BLOB, contentLength, + inputStream)); + } finally { + inputStream.close(); + } } } + + // add to existing index + existingBuilder.add(dcEntry); + // add to temporary in-core index + tempBuilder.add(dcEntry); + + if (emptyCommit + && (hTree == null || !hTree.idEqual(fTree) + || hTree.getEntryRawMode() != fTree + .getEntryRawMode())) + // this is a change + emptyCommit = false; + } else { + // if no file exists on disk, neither add it to + // index nor to temporary in-core index + + if (emptyCommit && hTree != null) + // this is a change + emptyCommit = false; } - // add to existing index - existingBuilder.add(dcEntry); - // add to temporary in-core index - tempBuilder.add(dcEntry); - - if (emptyCommit - && (hTree == null || !hTree.idEqual(fTree) || hTree - .getEntryRawMode() != fTree - .getEntryRawMode())) - // this is a change - emptyCommit = false; + // keep track of processed path + onlyProcessed[pos] = true; } else { - // if no file exists on disk, neither add it to - // index nor to temporary in-core index + // add entries from HEAD for all other paths + if (hTree != null) { + // create a new DirCacheEntry with data retrieved from + // HEAD + final DirCacheEntry dcEntry = new DirCacheEntry(path); + dcEntry.setObjectId(hTree.getEntryObjectId()); + dcEntry.setFileMode(hTree.getEntryFileMode()); - if (emptyCommit && hTree != null) - // this is a change - emptyCommit = false; + // add to temporary in-core index + tempBuilder.add(dcEntry); + } + + // preserve existing entry in index + if (dcTree != null) + existingBuilder.add(dcTree.getDirCacheEntry()); } - - // keep track of processed path - onlyProcessed[pos] = true; - } else { - // add entries from HEAD for all other paths - if (hTree != null) { - // create a new DirCacheEntry with data retrieved from HEAD - final DirCacheEntry dcEntry = new DirCacheEntry(path); - dcEntry.setObjectId(hTree.getEntryObjectId()); - dcEntry.setFileMode(hTree.getEntryFileMode()); - - // add to temporary in-core index - tempBuilder.add(dcEntry); - } - - // preserve existing entry in index - if (dcTree != null) - existingBuilder.add(dcTree.getDirCacheEntry()); } } From 510aed1493df6d767152c3f35f3878bbeb524495 Mon Sep 17 00:00:00 2001 From: Christian Halstrick Date: Fri, 10 Apr 2015 07:52:19 +0200 Subject: [PATCH 53/68] Revert "ResolveMerge only needs to visit differing TreeEntries" This reverts commit bda5e764200dafb2311149a9152c02373127287d. This reduces performance at least for non-bare repositories. Change-Id: Ib26cf8372f210798e104112edf14e91bfeaf23ec --- org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java | 2 -- 1 file changed, 2 deletions(-) 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 98c8342de..953d3a2cd 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/ResolveMerger.java @@ -90,7 +90,6 @@ import org.eclipse.jgit.treewalk.NameConflictTreeWalk; import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.WorkingTreeIterator; -import org.eclipse.jgit.treewalk.filter.TreeFilter; import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.TemporaryBuffer; @@ -1009,7 +1008,6 @@ protected boolean mergeTrees(AbstractTreeIterator baseTree, DirCacheBuildIterator buildIt = new DirCacheBuildIterator(builder); tw = new NameConflictTreeWalk(reader); - tw.setFilter(TreeFilter.ANY_DIFF); tw.addTree(baseTree); tw.addTree(headTree); tw.addTree(mergeTree); From 41c4f9cb2a0f6754722409f373f6a1197f4d8820 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Tue, 14 Apr 2015 15:28:19 +0200 Subject: [PATCH 54/68] Fix error message to include cause if ResetCommand fails Bug: 464048 Change-Id: I6e7d9262b94cb168c84faef1dea22c1e082fe5ad Signed-off-by: Matthias Sohn --- org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java index 17b124230..ac67037b8 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/ResetCommand.java @@ -227,9 +227,9 @@ else if (repo.readSquashCommitMsg() != null) setCallable(false); return result; } catch (IOException e) { - throw new JGitInternalException( + throw new JGitInternalException(MessageFormat.format( JGitText.get().exceptionCaughtDuringExecutionOfResetCommand, - e); + e.getMessage()), e); } } From 12e38d72758b486f19ccfa6c830d1ef95dfb1d11 Mon Sep 17 00:00:00 2001 From: David Pletcher Date: Thu, 16 Apr 2015 12:47:15 -0700 Subject: [PATCH 55/68] Expose public getDepth method The clone or fetch depth is a valuable bit of information for access logging. Create a public getter to faciliate access. A precondition check prevents unintentional misuse when the data isn't valid yet. Change-Id: I4603d5fd3bd4a767e3e2419b0f2da3664cfbd7f8 Signed-off-by: David Pletcher --- .../src/org/eclipse/jgit/transport/UploadPack.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java index 1a653bd2b..51718c027 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -884,6 +884,19 @@ private void recvWants() throws IOException { } } + /** + * Returns the clone/fetch depth. Valid only after calling recvWants(). + * + * @return the depth requested by the client, or 0 if unbounded. + * @since 4.0 + */ + public int getDepth() { + if (options == null) { + throw new IllegalStateException("do not call getDepth() before recvWants()"); + } + return depth; + } + private boolean negotiate() throws IOException { okToGiveUp = Boolean.FALSE; From ff798f13da5f6e57bb8480c57e8db486c9007174 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Wed, 22 Apr 2015 12:53:35 +0200 Subject: [PATCH 56/68] Restore AwtCredentialsProvider to enable debugging pgm in Eclipse In 6c1f7393882baf8464859136a70199ea96fcae0f the AWT based credentials provider was dropped because we don't support Java 5 any longer so we can always use the ConsoleCredentialsProvider which requires Java 6. This broke debugging org.eclipse.jgit.pgm since Eclipse doesn't support using a system console authenticator [1]. [1] see https://bugs.eclipse.org/bugs/show_bug.cgi?id=148831 Change-Id: Iba71001a7762e73d6579ba9dfa5a08ddaba777ea --- .../src/org/eclipse/jgit/pgm/Main.java | 50 ++++- .../jgit/awtui/AwtCredentialsProvider.java | 204 ++++++++++++++++++ 2 files changed, 250 insertions(+), 4 deletions(-) create mode 100644 org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtCredentialsProvider.java diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java index 38c3a2fcd..7151de794 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Main.java @@ -47,14 +47,15 @@ import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; -import org.eclipse.jgit.console.ConsoleAuthenticator; -import org.eclipse.jgit.console.ConsoleCredentialsProvider; +import org.eclipse.jgit.awtui.AwtAuthenticator; +import org.eclipse.jgit.awtui.AwtCredentialsProvider; import org.eclipse.jgit.errors.TransportException; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.RepositoryBuilder; @@ -115,8 +116,10 @@ public static void main(final String[] argv) { */ protected void run(final String[] argv) { try { - ConsoleAuthenticator.install(); - ConsoleCredentialsProvider.install(); + if (!installConsole()) { + AwtAuthenticator.install(); + AwtCredentialsProvider.install(); + } configureHttpProxy(); execute(argv); } catch (Die err) { @@ -246,6 +249,45 @@ protected Repository openGitDir(String aGitdir) throws IOException { return rb.build(); } + private static boolean installConsole() { + try { + install("org.eclipse.jgit.console.ConsoleAuthenticator"); //$NON-NLS-1$ + install("org.eclipse.jgit.console.ConsoleCredentialsProvider"); //$NON-NLS-1$ + return true; + } catch (ClassNotFoundException e) { + return false; + } catch (NoClassDefFoundError e) { + return false; + } catch (UnsupportedClassVersionError e) { + return false; + + } catch (IllegalArgumentException e) { + throw new RuntimeException(CLIText.get().cannotSetupConsole, e); + } catch (SecurityException e) { + throw new RuntimeException(CLIText.get().cannotSetupConsole, e); + } catch (IllegalAccessException e) { + throw new RuntimeException(CLIText.get().cannotSetupConsole, e); + } catch (InvocationTargetException e) { + throw new RuntimeException(CLIText.get().cannotSetupConsole, e); + } catch (NoSuchMethodException e) { + throw new RuntimeException(CLIText.get().cannotSetupConsole, e); + } + } + + private static void install(final String name) + throws IllegalAccessException, InvocationTargetException, + NoSuchMethodException, ClassNotFoundException { + try { + Class.forName(name).getMethod("install").invoke(null); //$NON-NLS-1$ + } catch (InvocationTargetException e) { + if (e.getCause() instanceof RuntimeException) + throw (RuntimeException) e.getCause(); + if (e.getCause() instanceof Error) + throw (Error) e.getCause(); + throw e; + } + } + /** * Configure the JRE's standard HTTP based on http_proxy. *

diff --git a/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtCredentialsProvider.java b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtCredentialsProvider.java new file mode 100644 index 000000000..fd26bfa7f --- /dev/null +++ b/org.eclipse.jgit.ui/src/org/eclipse/jgit/awtui/AwtCredentialsProvider.java @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2010, Google Inc. + * Copyright (C) 2008, Robin Rosenberg + * Copyright (C) 2008, Shawn O. Pearce + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.eclipse.jgit.awtui; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; + +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTextField; + +import org.eclipse.jgit.errors.UnsupportedCredentialItem; +import org.eclipse.jgit.transport.CredentialItem; +import org.eclipse.jgit.transport.CredentialsProvider; +import org.eclipse.jgit.transport.URIish; + +/** Interacts with the user during authentication by using AWT/Swing dialogs. */ +public class AwtCredentialsProvider extends CredentialsProvider { + /** Install this implementation as the default. */ + public static void install() { + CredentialsProvider.setDefault(new AwtCredentialsProvider()); + } + + @Override + public boolean isInteractive() { + return true; + } + + @Override + public boolean supports(CredentialItem... items) { + for (CredentialItem i : items) { + if (i instanceof CredentialItem.StringType) + continue; + + else if (i instanceof CredentialItem.CharArrayType) + continue; + + else if (i instanceof CredentialItem.YesNoType) + continue; + + else if (i instanceof CredentialItem.InformationalMessage) + continue; + + else + return false; + } + return true; + } + + @Override + public boolean get(URIish uri, CredentialItem... items) + throws UnsupportedCredentialItem { + if (items.length == 0) { + return true; + + } else if (items.length == 1) { + final CredentialItem item = items[0]; + + if (item instanceof CredentialItem.InformationalMessage) { + JOptionPane.showMessageDialog(null, item.getPromptText(), + UIText.get().warning, JOptionPane.INFORMATION_MESSAGE); + return true; + + } else if (item instanceof CredentialItem.YesNoType) { + CredentialItem.YesNoType v = (CredentialItem.YesNoType) item; + int r = JOptionPane.showConfirmDialog(null, v.getPromptText(), + UIText.get().warning, JOptionPane.YES_NO_OPTION); + switch (r) { + case JOptionPane.YES_OPTION: + v.setValue(true); + return true; + + case JOptionPane.NO_OPTION: + v.setValue(false); + return true; + + case JOptionPane.CANCEL_OPTION: + case JOptionPane.CLOSED_OPTION: + default: + return false; + } + + } else { + return interactive(uri, items); + } + + } else { + return interactive(uri, items); + } + } + + private static boolean interactive(URIish uri, CredentialItem[] items) { + final GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1, 1, + GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, + new Insets(0, 0, 0, 0), 0, 0); + final JPanel panel = new JPanel(); + panel.setLayout(new GridBagLayout()); + + final JTextField[] texts = new JTextField[items.length]; + for (int i = 0; i < items.length; i++) { + CredentialItem item = items[i]; + + if (item instanceof CredentialItem.StringType + || item instanceof CredentialItem.CharArrayType) { + gbc.fill = GridBagConstraints.NONE; + gbc.gridwidth = GridBagConstraints.RELATIVE; + gbc.gridx = 0; + panel.add(new JLabel(item.getPromptText()), gbc); + + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.gridwidth = GridBagConstraints.RELATIVE; + gbc.gridx = 1; + if (item.isValueSecure()) + texts[i] = new JPasswordField(20); + else + texts[i] = new JTextField(20); + panel.add(texts[i], gbc); + gbc.gridy++; + + } else if (item instanceof CredentialItem.InformationalMessage) { + gbc.fill = GridBagConstraints.NONE; + gbc.gridwidth = GridBagConstraints.REMAINDER; + gbc.gridx = 0; + panel.add(new JLabel(item.getPromptText()), gbc); + gbc.gridy++; + + } else { + throw new UnsupportedCredentialItem(uri, item.getPromptText()); + } + } + + if (JOptionPane.showConfirmDialog(null, panel, + UIText.get().authenticationRequired, + JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.OK_OPTION) + return false; // cancel + + for (int i = 0; i < items.length; i++) { + CredentialItem item = items[i]; + JTextField f = texts[i]; + + if (item instanceof CredentialItem.StringType) { + CredentialItem.StringType v = (CredentialItem.StringType) item; + if (f instanceof JPasswordField) + v.setValue(new String(((JPasswordField) f).getPassword())); + else + v.setValue(f.getText()); + + } else if (item instanceof CredentialItem.CharArrayType) { + CredentialItem.CharArrayType v = (CredentialItem.CharArrayType) item; + if (f instanceof JPasswordField) + v.setValueNoCopy(((JPasswordField) f).getPassword()); + else + v.setValueNoCopy(f.getText().toCharArray()); + } + } + return true; + } +} From c761c8bb5c02c816dd233f3d47ce138c216e870b Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Thu, 23 Apr 2015 12:12:43 -0700 Subject: [PATCH 57/68] Avoid storing large packs in block cache during reuse When a large pack (> 30% of the block cache) is being reused by copying it pollutes the block cache with noise by storing blocks that are never referenced again. Avoid this by streaming the file directly from its channel onto the output stream. Change-Id: I2e53de27f3dcfb93de68b1fad45f75ab23e79fe7 --- .../internal/storage/dfs/DfsBlockCache.java | 8 + .../storage/dfs/DfsBlockCacheConfig.java | 44 ++++- .../internal/storage/dfs/DfsPackFile.java | 159 ++++++++++++++++-- .../jgit/internal/storage/dfs/DfsReader.java | 56 +----- .../storage/dfs/DfsReaderOptions.java | 31 +++- .../org/eclipse/jgit/lib/ConfigConstants.java | 12 ++ 6 files changed, 239 insertions(+), 71 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java index 748a4a38e..f3f75c3fb 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java @@ -135,6 +135,9 @@ public static DfsBlockCache getInstance() { /** Maximum number of bytes the cache should hold. */ private final long maxBytes; + /** Pack files smaller than this size can be copied through the cache. */ + private final long maxStreamThroughCache; + /** * Suggested block size to read from pack files in. *

@@ -191,6 +194,7 @@ else if (eb < 4) eb = tableSize; maxBytes = cfg.getBlockLimit(); + maxStreamThroughCache = (long) (maxBytes * cfg.getStreamRatio()); blockSize = cfg.getBlockSize(); blockSizeShift = Integer.numberOfTrailingZeros(blockSize); @@ -206,6 +210,10 @@ else if (eb < 4) statMiss = new AtomicLong(); } + boolean copyThroughCache(long length) { + return length <= maxStreamThroughCache; + } + /** @return total number of bytes in the cache. */ public long getCurrentSize() { return liveBytes; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java index ca1451a2b..a7d13defd 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java @@ -47,7 +47,11 @@ import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_DFS_SECTION; import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_BLOCK_LIMIT; import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_BLOCK_SIZE; +import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_STREAM_RATIO; +import java.text.MessageFormat; + +import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.lib.Config; /** Configuration parameters for {@link DfsBlockCache}. */ @@ -59,13 +63,14 @@ public class DfsBlockCacheConfig { public static final int MB = 1024 * KB; private long blockLimit; - private int blockSize; + private double streamRatio; /** Create a default configuration. */ public DfsBlockCacheConfig() { setBlockLimit(32 * MB); setBlockSize(64 * KB); + setStreamRatio(0.30); } /** @@ -105,6 +110,27 @@ public DfsBlockCacheConfig setBlockSize(final int newSize) { return this; } + /** + * @return highest percentage of {@link #getBlockLimit()} a single pack can + * occupy while being copied by the pack reuse strategy. Default + * is 0.30, or 30%. + * @since 4.0 + */ + public double getStreamRatio() { + return streamRatio; + } + + /** + * @param ratio + * percentage of cache to occupy with a copied pack. + * @return {@code this} + * @since 4.0 + */ + public DfsBlockCacheConfig setStreamRatio(double ratio) { + streamRatio = Math.max(0, Math.min(ratio, 1.0)); + return this; + } + /** * Update properties by setting fields from the configuration. *

@@ -127,6 +153,22 @@ public DfsBlockCacheConfig fromConfig(final Config rc) { CONFIG_DFS_SECTION, CONFIG_KEY_BLOCK_SIZE, getBlockSize())); + + String v = rc.getString( + CONFIG_CORE_SECTION, + CONFIG_DFS_SECTION, + CONFIG_KEY_STREAM_RATIO); + if (v != null) { + try { + setStreamRatio(Double.parseDouble(v)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(MessageFormat.format( + JGitText.get().enumValueNotSupported3, + CONFIG_CORE_SECTION, + CONFIG_DFS_SECTION, + CONFIG_KEY_STREAM_RATIO, v)); + } + } return this; } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java index 58df895b4..386754fc2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java @@ -54,8 +54,11 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; +import java.nio.ByteBuffer; import java.nio.channels.Channels; +import java.security.MessageDigest; import java.text.MessageFormat; +import java.util.Arrays; import java.util.Set; import java.util.zip.CRC32; import java.util.zip.DataFormatException; @@ -80,7 +83,6 @@ import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectLoader; import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.util.IO; import org.eclipse.jgit.util.LongList; /** @@ -466,9 +468,112 @@ private byte[] decompress(long position, int sz, DfsReader ctx) void copyPackAsIs(PackOutputStream out, boolean validate, DfsReader ctx) throws IOException { - // Pin the first window, this ensures the length is accurate. - ctx.pin(this, 0); - ctx.copyPackAsIs(this, length, validate, out); + MessageDigest md = initCopyPack(out, validate, ctx); + long p; + if (cache.copyThroughCache(length)) + p = copyPackThroughCache(out, ctx, md); + else + p = copyPackBypassCache(out, ctx, md); + verifyPackChecksum(p, md, ctx); + } + + private MessageDigest initCopyPack(PackOutputStream out, boolean validate, + DfsReader ctx) throws IOException { + // If the length hasn't been determined yet, pin to set it. + if (length == -1) + ctx.pin(this, 0); + if (!validate) { + ctx.unpin(); + return null; + } + + int hdrlen = 12; + byte[] buf = out.getCopyBuffer(); + int n = ctx.copy(this, 0, buf, 0, hdrlen); + ctx.unpin(); + if (n != hdrlen) + throw packfileIsTruncated(); + MessageDigest md = Constants.newMessageDigest(); + md.update(buf, 0, hdrlen); + return md; + } + + private long copyPackThroughCache(PackOutputStream out, DfsReader ctx, + MessageDigest md) throws IOException { + long position = 12; + long remaining = length - (12 + 20); + while (0 < remaining) { + DfsBlock b = cache.getOrLoad(this, position, ctx); + int ptr = (int) (position - b.start); + int n = (int) Math.min(b.size() - ptr, remaining); + b.write(out, position, n, md); + position += n; + remaining -= n; + } + return position; + } + + private long copyPackBypassCache(PackOutputStream out, DfsReader ctx, + MessageDigest md) throws IOException { + try (ReadableChannel rc = ctx.db.openFile(packDesc, PACK)) { + ByteBuffer buf = newCopyBuffer(out, rc, ctx); + long position = 12; + long remaining = length - (12 + 20); + while (0 < remaining) { + DfsBlock b = cache.get(key, alignToBlock(position)); + if (b != null) { + int ptr = (int) (position - b.start); + int n = (int) Math.min(b.size() - ptr, remaining); + b.write(out, position, n, md); + position += n; + remaining -= n; + rc.position(position); + continue; + } + + buf.position(0); + int n = read(rc, buf); + if (n <= 0) + throw packfileIsTruncated(); + else if (n > remaining) + n = (int) remaining; + out.write(buf.array(), 0, n); + if (md != null) + md.update(buf.array(), 0, n); + position += n; + remaining -= n; + } + return position; + } + } + + private ByteBuffer newCopyBuffer(PackOutputStream out, ReadableChannel rc, + DfsReader ctx) { + int bs = blockSize(rc); + int bufferSize = ctx.getOptions().getStreamPackBufferSize(); + if (bufferSize > bs) + bs = (bufferSize / bs) * bs; + + byte[] copyBuf = out.getCopyBuffer(); + if (bs > copyBuf.length) + copyBuf = new byte[bs]; + return ByteBuffer.wrap(copyBuf, 0, bs); + } + + private void verifyPackChecksum(long position, MessageDigest md, + DfsReader ctx) throws IOException { + if (md != null) { + byte[] buf = new byte[20]; + byte[] actHash = md.digest(); + if (ctx.copy(this, position, buf, 0, 20) != 20) + throw packfileIsTruncated(); + if (!Arrays.equals(actHash, buf)) { + invalid = true; + throw new IOException(MessageFormat.format( + JGitText.get().packfileCorruptionDetected, + getPackName())); + } + } } void copyAsIs(PackOutputStream out, DfsObjectToPack src, @@ -668,6 +773,12 @@ void setInvalid() { invalid = true; } + private IOException packfileIsTruncated() { + invalid = true; + return new IOException(MessageFormat.format( + JGitText.get().packfileIsTruncated, getPackName())); + } + private void readFully(long position, byte[] dstbuf, int dstoff, int cnt, DfsReader ctx) throws IOException { if (ctx.copy(this, position, dstbuf, dstoff, cnt) != cnt) @@ -692,18 +803,8 @@ DfsBlock readOneBlock(long pos, DfsReader ctx) ReadableChannel rc = ctx.db.openFile(packDesc, PACK); try { - // If the block alignment is not yet known, discover it. Prefer the - // larger size from either the cache or the file itself. - int size = blockSize; - if (size == 0) { - size = rc.blockSize(); - if (size <= 0) - size = cache.getBlockSize(); - else if (size < cache.getBlockSize()) - size = (cache.getBlockSize() / size) * size; - blockSize = size; - pos = (pos / size) * size; - } + int size = blockSize(rc); + pos = (pos / size) * size; // If the size of the file is not yet known, try to discover it. // Channels may choose to return -1 to indicate they don't @@ -725,7 +826,7 @@ else if (size < cache.getBlockSize()) byte[] buf = new byte[size]; rc.position(pos); - int cnt = IO.read(rc, buf, 0, size); + int cnt = read(rc, ByteBuffer.wrap(buf, 0, size)); if (cnt != size) { if (0 <= len) { throw new EOFException(MessageFormat.format( @@ -754,6 +855,30 @@ else if (size < cache.getBlockSize()) } } + private int blockSize(ReadableChannel rc) { + // If the block alignment is not yet known, discover it. Prefer the + // larger size from either the cache or the file itself. + int size = blockSize; + if (size == 0) { + size = rc.blockSize(); + if (size <= 0) + size = cache.getBlockSize(); + else if (size < cache.getBlockSize()) + size = (cache.getBlockSize() / size) * size; + blockSize = size; + } + return size; + } + + private static int read(ReadableChannel rc, ByteBuffer buf) + throws IOException { + int n; + do { + n = rc.read(buf); + } while (0 < n && buf.hasRemaining()); + return buf.position(); + } + ObjectLoader load(DfsReader ctx, long pos) throws IOException { try { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java index 4cf7cbefc..dc8552e49 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java @@ -44,14 +44,10 @@ package org.eclipse.jgit.internal.storage.dfs; -import static org.eclipse.jgit.internal.storage.pack.PackExt.PACK; import static org.eclipse.jgit.lib.Constants.OBJECT_ID_LENGTH; import java.io.IOException; -import java.security.MessageDigest; -import java.text.MessageFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -65,7 +61,6 @@ import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.errors.StoredObjectRepresentationNotAvailableException; -import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.internal.storage.file.BitmapIndexImpl; import org.eclipse.jgit.internal.storage.file.PackBitmapIndex; import org.eclipse.jgit.internal.storage.file.PackIndex; @@ -81,7 +76,6 @@ import org.eclipse.jgit.lib.AsyncObjectSizeQueue; import org.eclipse.jgit.lib.BitmapIndex; import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder; -import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.InflaterCache; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectLoader; @@ -547,52 +541,6 @@ int copy(DfsPackFile pack, long position, byte[] dstbuf, int dstoff, int cnt) return cnt - need; } - void copyPackAsIs(DfsPackFile pack, long length, boolean validate, - PackOutputStream out) throws IOException { - MessageDigest md = null; - if (validate) { - md = Constants.newMessageDigest(); - byte[] buf = out.getCopyBuffer(); - pin(pack, 0); - if (block.copy(0, buf, 0, 12) != 12) { - pack.setInvalid(); - throw new IOException(MessageFormat.format( - JGitText.get().packfileIsTruncated, pack.getPackName())); - } - md.update(buf, 0, 12); - } - - long position = 12; - long remaining = length - (12 + 20); - while (0 < remaining) { - pin(pack, position); - - int ptr = (int) (position - block.start); - int n = (int) Math.min(block.size() - ptr, remaining); - block.write(out, position, n, md); - position += n; - remaining -= n; - } - - if (md != null) { - byte[] buf = new byte[20]; - byte[] actHash = md.digest(); - - pin(pack, position); - if (block.copy(position, buf, 0, 20) != 20) { - pack.setInvalid(); - throw new IOException(MessageFormat.format( - JGitText.get().packfileIsTruncated, pack.getPackName())); - } - if (!Arrays.equals(actHash, buf)) { - pack.setInvalid(); - throw new IOException(MessageFormat.format( - JGitText.get().packfileCorruptionDetected, - pack.getPackDescription().getFileName(PACK))); - } - } - } - /** * Inflate a region of the pack starting at {@code position}. * @@ -664,6 +612,10 @@ void pin(DfsPackFile pack, long position) throws IOException { } } + void unpin() { + block = null; + } + /** Release the current window cursor. */ @Override public void release() { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderOptions.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderOptions.java index 2a625473b..84198077e 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderOptions.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReaderOptions.java @@ -46,6 +46,7 @@ import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_CORE_SECTION; import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_DFS_SECTION; import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_DELTA_BASE_CACHE_LIMIT; +import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_STREAM_BUFFER; import static org.eclipse.jgit.lib.ConfigConstants.CONFIG_KEY_STREAM_FILE_TRESHOLD; import org.eclipse.jgit.lib.Config; @@ -60,9 +61,10 @@ public class DfsReaderOptions { public static final int MiB = 1024 * KiB; private int deltaBaseCacheLimit; - private int streamFileThreshold; + private int streamPackBufferSize; + /** Create a default reader configuration. */ public DfsReaderOptions() { setDeltaBaseCacheLimit(10 * MiB); @@ -104,6 +106,27 @@ public DfsReaderOptions setStreamFileThreshold(final int newLimit) { return this; } + /** + * @return number of bytes to use for buffering when streaming a pack file + * during copying. If 0 the block size of the pack is used. + * @since 4.0 + */ + public int getStreamPackBufferSize() { + return streamPackBufferSize; + } + + /** + * @param bufsz + * new buffer size in bytes for buffers used when streaming pack + * files during copying. + * @return {@code this} + * @since 4.0 + */ + public DfsReaderOptions setStreamPackBufferSize(int bufsz) { + streamPackBufferSize = Math.max(0, bufsz); + return this; + } + /** * Update properties by setting fields from the configuration. *

@@ -130,6 +153,12 @@ public DfsReaderOptions fromConfig(Config rc) { sft = Math.min(sft, maxMem / 4); // don't use more than 1/4 of the heap sft = Math.min(sft, Integer.MAX_VALUE); // cannot exceed array length setStreamFileThreshold((int) sft); + + setStreamPackBufferSize(rc.getInt( + CONFIG_CORE_SECTION, + CONFIG_DFS_SECTION, + CONFIG_KEY_STREAM_BUFFER, + getStreamPackBufferSize())); return this; } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java index 8a2080bac..a89bcee73 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java @@ -299,4 +299,16 @@ public class ConfigConstants { * @since 3.3 */ public static final String CONFIG_KEY_PRUNE = "prune"; + + /** + * The "streamBuffer" key + * @since 4.0 + */ + public static final String CONFIG_KEY_STREAM_BUFFER = "streamBuffer"; + + /** + * The "streamRatio" key + * @since 4.0 + */ + public static final String CONFIG_KEY_STREAM_RATIO = "streamRatio"; } From 1553a6ff555d14ff165daf642d9c7a8969dfa530 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Thu, 23 Apr 2015 21:59:23 -0700 Subject: [PATCH 58/68] Add readAheadBuffer hint to ReadableChannel This hint allows an underlying implementation to read more bytes when possible and buffer them locally for future read calls to consume. Change-Id: Ia986a1bb8640eecb91cfbd515c61fa1ff1574a6f --- .../internal/storage/dfs/DfsPackFile.java | 11 +++---- .../storage/dfs/InMemoryRepository.java | 4 +++ .../internal/storage/dfs/ReadableChannel.java | 29 +++++++++++++++++++ 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java index 386754fc2..88ef0dd04 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java @@ -516,7 +516,9 @@ private long copyPackThroughCache(PackOutputStream out, DfsReader ctx, private long copyPackBypassCache(PackOutputStream out, DfsReader ctx, MessageDigest md) throws IOException { try (ReadableChannel rc = ctx.db.openFile(packDesc, PACK)) { - ByteBuffer buf = newCopyBuffer(out, rc, ctx); + ByteBuffer buf = newCopyBuffer(out, rc); + if (ctx.getOptions().getStreamPackBufferSize() > 0) + rc.setReadAheadBytes(ctx.getOptions().getStreamPackBufferSize()); long position = 12; long remaining = length - (12 + 20); while (0 < remaining) { @@ -547,13 +549,8 @@ else if (n > remaining) } } - private ByteBuffer newCopyBuffer(PackOutputStream out, ReadableChannel rc, - DfsReader ctx) { + private ByteBuffer newCopyBuffer(PackOutputStream out, ReadableChannel rc) { int bs = blockSize(rc); - int bufferSize = ctx.getOptions().getStreamPackBufferSize(); - if (bufferSize > bs) - bs = (bufferSize / bs) * bs; - byte[] copyBuf = out.getCopyBuffer(); if (bs > copyBuf.length) copyBuf = new byte[bs]; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/InMemoryRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/InMemoryRepository.java index ae05536de..8e7af0d29 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/InMemoryRepository.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/InMemoryRepository.java @@ -227,6 +227,10 @@ public long size() { public int blockSize() { return 0; } + + public void setReadAheadBytes(int b) { + // Unnecessary on a byte array. + } } private class MemRefDatabase extends DfsRefDatabase { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReadableChannel.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReadableChannel.java index 5ec7079a8..240d552aa 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReadableChannel.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/ReadableChannel.java @@ -100,4 +100,33 @@ public interface ReadableChannel extends ReadableByteChannel { * not need to be a power of 2. */ public int blockSize(); + + /** + * Recommend the channel maintain a read-ahead buffer. + *

+ * A read-ahead buffer of approximately {@code bufferSize} in bytes may be + * allocated and used by the channel to smooth out latency for read. + *

+ * Callers can continue to read in smaller than {@code bufferSize} chunks. + * With read-ahead buffering enabled read latency may fluctuate in a pattern + * of one slower read followed by {@code (bufferSize / readSize) - 1} fast + * reads satisfied by the read-ahead buffer. When summed up overall time to + * read the same contiguous range should be lower than if read-ahead was not + * enabled, as the implementation can combine reads to increase throughput. + *

+ * To avoid unnecessary IO callers should only enable read-ahead if the + * majority of the channel will be accessed in order. + *

+ * Implementations may chose to read-ahead using asynchronous APIs or + * background threads, or may simply aggregate reads using a buffer. + *

+ * This read ahead stays in effect until the channel is closed or the buffer + * size is set to 0. + * + * @param bufferSize + * requested size of the read ahead buffer, in bytes. + * @throws IOException + * if the read ahead cannot be adjusted. + */ + public void setReadAheadBytes(int bufferSize) throws IOException; } From a3476ced1fcebeeb0d9837aac4c2e833732a236b Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Fri, 24 Apr 2015 10:22:28 -0700 Subject: [PATCH 59/68] Rename copyThroughCache to shouldCopyThroughCache Sensible suggestion from Terry Parker as a late comment on commit f2efcdc6f769d59722b17e9274932d585035cfb6. Change-Id: I225775bfb6d3d91ae066ff00f9d80a9c02a422c2 --- .../org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java | 2 +- .../src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java index f3f75c3fb..2e170a5d0 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java @@ -210,7 +210,7 @@ else if (eb < 4) statMiss = new AtomicLong(); } - boolean copyThroughCache(long length) { + boolean shouldCopyThroughCache(long length) { return length <= maxStreamThroughCache; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java index 88ef0dd04..b51ee2f4d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java @@ -470,7 +470,7 @@ void copyPackAsIs(PackOutputStream out, boolean validate, DfsReader ctx) throws IOException { MessageDigest md = initCopyPack(out, validate, ctx); long p; - if (cache.copyThroughCache(length)) + if (cache.shouldCopyThroughCache(length)) p = copyPackThroughCache(out, ctx, md); else p = copyPackBypassCache(out, ctx, md); From 6e5c71b358e9b9b883f24f073e869ff6affe5bf4 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Fri, 24 Apr 2015 11:16:33 -0700 Subject: [PATCH 60/68] Remove validate support when reusing cached pack Cached packs are only used when writing over the network or to a bundle file and reuse validation is always disabled in these two contexts. The client/consumer of the stream will be SHA-1 checksumming every object. Reuse validation is most critical during local GC to avoid silently ignoring corruption by stopping as soon as a problem is found and leaving everything alone for the end-user to debug and salvage. Cached packs are not supported during local GC as the bitmap rebuild logic does not support including a cached pack in the result. Strip out the validation and force PackWriter to always disable the cached pack feature if reuseValidation is enabled. Change-Id: If0d7baf2ae1bf1f7e71bf773151302c9f7887039 --- .../jgit/internal/storage/dfs/DfsBlock.java | 8 +-- .../internal/storage/dfs/DfsCachedPack.java | 5 +- .../internal/storage/dfs/DfsPackFile.java | 66 ++++--------------- .../jgit/internal/storage/dfs/DfsReader.java | 6 +- .../storage/file/ByteArrayWindow.java | 5 +- .../storage/file/ByteBufferWindow.java | 5 +- .../internal/storage/file/ByteWindow.java | 5 +- .../storage/file/LocalCachedPack.java | 4 +- .../jgit/internal/storage/file/PackFile.java | 6 +- .../internal/storage/file/WindowCursor.java | 47 ++----------- .../storage/pack/ObjectReuseAsIs.java | 9 +-- .../internal/storage/pack/PackWriter.java | 4 +- 12 files changed, 38 insertions(+), 132 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlock.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlock.java index c1853327f..79265363e 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlock.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlock.java @@ -46,7 +46,6 @@ package org.eclipse.jgit.internal.storage.dfs; import java.io.IOException; -import java.security.MessageDigest; import java.util.zip.CRC32; import java.util.zip.DataFormatException; import java.util.zip.Inflater; @@ -101,12 +100,9 @@ void crc32(CRC32 out, long pos, int cnt) { out.update(block, ptr, cnt); } - void write(PackOutputStream out, long pos, int cnt, MessageDigest digest) + void write(PackOutputStream out, long pos, int cnt) throws IOException { - int ptr = (int) (pos - start); - out.write(block, ptr, cnt); - if (digest != null) - digest.update(block, ptr, cnt); + out.write(block, (int) (pos - start), cnt); } void check(Inflater inf, byte[] tmp, long pos, int cnt) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsCachedPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsCachedPack.java index 3da5184e0..a5308f617 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsCachedPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsCachedPack.java @@ -78,8 +78,7 @@ public boolean hasObject(ObjectToPack obj, StoredObjectRepresentation rep) { return ((DfsObjectRepresentation) rep).pack == pack; } - void copyAsIs(PackOutputStream out, boolean validate, DfsReader ctx) - throws IOException { - pack.copyPackAsIs(out, validate, ctx); + void copyAsIs(PackOutputStream out, DfsReader ctx) throws IOException { + pack.copyPackAsIs(out, ctx); } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java index b51ee2f4d..e03488b3c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java @@ -56,9 +56,7 @@ import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.channels.Channels; -import java.security.MessageDigest; import java.text.MessageFormat; -import java.util.Arrays; import java.util.Set; import java.util.zip.CRC32; import java.util.zip.DataFormatException; @@ -466,55 +464,35 @@ private byte[] decompress(long position, int sz, DfsReader ctx) return dstbuf; } - void copyPackAsIs(PackOutputStream out, boolean validate, DfsReader ctx) + void copyPackAsIs(PackOutputStream out, DfsReader ctx) throws IOException { - MessageDigest md = initCopyPack(out, validate, ctx); - long p; - if (cache.shouldCopyThroughCache(length)) - p = copyPackThroughCache(out, ctx, md); - else - p = copyPackBypassCache(out, ctx, md); - verifyPackChecksum(p, md, ctx); - } - - private MessageDigest initCopyPack(PackOutputStream out, boolean validate, - DfsReader ctx) throws IOException { // If the length hasn't been determined yet, pin to set it. - if (length == -1) + if (length == -1) { ctx.pin(this, 0); - if (!validate) { ctx.unpin(); - return null; } - - int hdrlen = 12; - byte[] buf = out.getCopyBuffer(); - int n = ctx.copy(this, 0, buf, 0, hdrlen); - ctx.unpin(); - if (n != hdrlen) - throw packfileIsTruncated(); - MessageDigest md = Constants.newMessageDigest(); - md.update(buf, 0, hdrlen); - return md; + if (cache.shouldCopyThroughCache(length)) + copyPackThroughCache(out, ctx); + else + copyPackBypassCache(out, ctx); } - private long copyPackThroughCache(PackOutputStream out, DfsReader ctx, - MessageDigest md) throws IOException { + private void copyPackThroughCache(PackOutputStream out, DfsReader ctx) + throws IOException { long position = 12; long remaining = length - (12 + 20); while (0 < remaining) { DfsBlock b = cache.getOrLoad(this, position, ctx); int ptr = (int) (position - b.start); int n = (int) Math.min(b.size() - ptr, remaining); - b.write(out, position, n, md); + b.write(out, position, n); position += n; remaining -= n; } - return position; } - private long copyPackBypassCache(PackOutputStream out, DfsReader ctx, - MessageDigest md) throws IOException { + private long copyPackBypassCache(PackOutputStream out, DfsReader ctx) + throws IOException { try (ReadableChannel rc = ctx.db.openFile(packDesc, PACK)) { ByteBuffer buf = newCopyBuffer(out, rc); if (ctx.getOptions().getStreamPackBufferSize() > 0) @@ -526,7 +504,7 @@ private long copyPackBypassCache(PackOutputStream out, DfsReader ctx, if (b != null) { int ptr = (int) (position - b.start); int n = (int) Math.min(b.size() - ptr, remaining); - b.write(out, position, n, md); + b.write(out, position, n); position += n; remaining -= n; rc.position(position); @@ -540,8 +518,6 @@ private long copyPackBypassCache(PackOutputStream out, DfsReader ctx, else if (n > remaining) n = (int) remaining; out.write(buf.array(), 0, n); - if (md != null) - md.update(buf.array(), 0, n); position += n; remaining -= n; } @@ -557,22 +533,6 @@ private ByteBuffer newCopyBuffer(PackOutputStream out, ReadableChannel rc) { return ByteBuffer.wrap(copyBuf, 0, bs); } - private void verifyPackChecksum(long position, MessageDigest md, - DfsReader ctx) throws IOException { - if (md != null) { - byte[] buf = new byte[20]; - byte[] actHash = md.digest(); - if (ctx.copy(this, position, buf, 0, 20) != 20) - throw packfileIsTruncated(); - if (!Arrays.equals(actHash, buf)) { - invalid = true; - throw new IOException(MessageFormat.format( - JGitText.get().packfileCorruptionDetected, - getPackName())); - } - } - } - void copyAsIs(PackOutputStream out, DfsObjectToPack src, boolean validate, DfsReader ctx) throws IOException, StoredObjectRepresentationNotAvailableException { @@ -719,7 +679,7 @@ void copyAsIs(PackOutputStream out, DfsObjectToPack src, // and we have it pinned. Write this out without copying. // out.writeHeader(src, inflatedLength); - quickCopy.write(out, dataOffset, (int) dataLength, null); + quickCopy.write(out, dataOffset, (int) dataLength); } else if (dataLength <= buf.length) { // Tiny optimization: Lots of objects are very small deltas or diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java index dc8552e49..f5f3375fa 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java @@ -492,9 +492,9 @@ public void writeObjects(PackOutputStream out, List list) out.writeObject(otp); } - public void copyPackAsIs(PackOutputStream out, CachedPack pack, - boolean validate) throws IOException { - ((DfsCachedPack) pack).copyAsIs(out, validate, this); + public void copyPackAsIs(PackOutputStream out, CachedPack pack) + throws IOException { + ((DfsCachedPack) pack).copyAsIs(out, this); } /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteArrayWindow.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteArrayWindow.java index 863c553b3..dc720bc62 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteArrayWindow.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteArrayWindow.java @@ -46,7 +46,6 @@ package org.eclipse.jgit.internal.storage.file; import java.io.IOException; -import java.security.MessageDigest; import java.util.zip.CRC32; import java.util.zip.DataFormatException; import java.util.zip.Inflater; @@ -84,12 +83,10 @@ void crc32(CRC32 out, long pos, int cnt) { } @Override - void write(PackOutputStream out, long pos, int cnt, MessageDigest digest) + void write(PackOutputStream out, long pos, int cnt) throws IOException { int ptr = (int) (pos - start); out.write(array, ptr, cnt); - if (digest != null) - digest.update(array, ptr, cnt); } void check(Inflater inf, byte[] tmp, long pos, int cnt) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteBufferWindow.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteBufferWindow.java index 31925d28e..05ddd69b3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteBufferWindow.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteBufferWindow.java @@ -47,7 +47,6 @@ import java.io.IOException; import java.nio.ByteBuffer; -import java.security.MessageDigest; import java.util.zip.DataFormatException; import java.util.zip.Inflater; @@ -76,7 +75,7 @@ protected int copy(final int p, final byte[] b, final int o, int n) { } @Override - void write(PackOutputStream out, long pos, int cnt, MessageDigest digest) + void write(PackOutputStream out, long pos, int cnt) throws IOException { final ByteBuffer s = buffer.slice(); s.position((int) (pos - start)); @@ -86,8 +85,6 @@ void write(PackOutputStream out, long pos, int cnt, MessageDigest digest) int n = Math.min(cnt, buf.length); s.get(buf, 0, n); out.write(buf, 0, n); - if (digest != null) - digest.update(buf, 0, n); cnt -= n; } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteWindow.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteWindow.java index ab5eb7c90..e774a1464 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteWindow.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ByteWindow.java @@ -45,7 +45,6 @@ package org.eclipse.jgit.internal.storage.file; import java.io.IOException; -import java.security.MessageDigest; import java.util.zip.DataFormatException; import java.util.zip.Inflater; @@ -121,8 +120,8 @@ final int copy(long pos, byte[] dstbuf, int dstoff, int cnt) { */ protected abstract int copy(int pos, byte[] dstbuf, int dstoff, int cnt); - abstract void write(PackOutputStream out, long pos, int cnt, - MessageDigest md) throws IOException; + abstract void write(PackOutputStream out, long pos, int cnt) + throws IOException; final int setInput(long pos, Inflater inf) throws DataFormatException { return setInput((int) (pos - start), inf); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalCachedPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalCachedPack.java index b70ebcf9e..fd9dcdafa 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalCachedPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LocalCachedPack.java @@ -79,10 +79,10 @@ public long getObjectCount() throws IOException { return cnt; } - void copyAsIs(PackOutputStream out, boolean validate, WindowCursor wc) + void copyAsIs(PackOutputStream out, WindowCursor wc) throws IOException { for (PackFile pack : getPacks()) - pack.copyPackAsIs(out, validate, wc); + pack.copyPackAsIs(out, wc); } @Override diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java index ad3322e0d..75c361e10 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java @@ -344,11 +344,11 @@ private final byte[] decompress(final long position, final int sz, return dstbuf; } - void copyPackAsIs(PackOutputStream out, boolean validate, WindowCursor curs) + void copyPackAsIs(PackOutputStream out, WindowCursor curs) throws IOException { // Pin the first window, this ensures the length is accurate. curs.pin(this, 0); - curs.copyPackAsIs(this, length, validate, out); + curs.copyPackAsIs(this, length, out); } final void copyAsIs(PackOutputStream out, LocalObjectToPack src, @@ -502,7 +502,7 @@ private void copyAsIs2(PackOutputStream out, LocalObjectToPack src, // and we have it pinned. Write this out without copying. // out.writeHeader(src, inflatedLength); - quickCopy.write(out, dataOffset, (int) dataLength, null); + quickCopy.write(out, dataOffset, (int) dataLength); } else if (dataLength <= buf.length) { // Tiny optimization: Lots of objects are very small deltas or diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java index 85c3c7425..21d6cd2ca 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java @@ -45,9 +45,6 @@ package org.eclipse.jgit.internal.storage.file; import java.io.IOException; -import java.security.MessageDigest; -import java.text.MessageFormat; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -59,7 +56,6 @@ import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.errors.StoredObjectRepresentationNotAvailableException; -import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.internal.storage.pack.CachedPack; import org.eclipse.jgit.internal.storage.pack.ObjectReuseAsIs; import org.eclipse.jgit.internal.storage.pack.ObjectToPack; @@ -232,27 +228,13 @@ int copy(final PackFile pack, long position, final byte[] dstbuf, return cnt - need; } - public void copyPackAsIs(PackOutputStream out, CachedPack pack, - boolean validate) throws IOException { - ((LocalCachedPack) pack).copyAsIs(out, validate, this); + public void copyPackAsIs(PackOutputStream out, CachedPack pack) + throws IOException { + ((LocalCachedPack) pack).copyAsIs(out, this); } - void copyPackAsIs(final PackFile pack, final long length, boolean validate, + void copyPackAsIs(final PackFile pack, final long length, final PackOutputStream out) throws IOException { - MessageDigest md = null; - if (validate) { - md = Constants.newMessageDigest(); - byte[] buf = out.getCopyBuffer(); - pin(pack, 0); - if (window.copy(0, buf, 0, 12) != 12) { - pack.setInvalid(); - throw new IOException(MessageFormat.format( - JGitText.get().packfileIsTruncated, pack.getPackFile() - .getPath())); - } - md.update(buf, 0, 12); - } - long position = 12; long remaining = length - (12 + 20); while (0 < remaining) { @@ -260,29 +242,10 @@ void copyPackAsIs(final PackFile pack, final long length, boolean validate, int ptr = (int) (position - window.start); int n = (int) Math.min(window.size() - ptr, remaining); - window.write(out, position, n, md); + window.write(out, position, n); position += n; remaining -= n; } - - if (md != null) { - byte[] buf = new byte[20]; - byte[] actHash = md.digest(); - - pin(pack, position); - if (window.copy(position, buf, 0, 20) != 20) { - pack.setInvalid(); - throw new IOException(MessageFormat.format( - JGitText.get().packfileIsTruncated, pack.getPackFile() - .getPath())); - } - if (!Arrays.equals(actHash, buf)) { - pack.setInvalid(); - throw new IOException(MessageFormat.format( - JGitText.get().packfileCorruptionDetected, pack - .getPackFile().getPath())); - } - } } /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/ObjectReuseAsIs.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/ObjectReuseAsIs.java index 00b6b6536..2e5d59960 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/ObjectReuseAsIs.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/ObjectReuseAsIs.java @@ -209,16 +209,11 @@ public void copyObjectAsIs(PackOutputStream out, ObjectToPack otp, * stream to append the pack onto. * @param pack * the cached pack to send. - * @param validate - * if true the representation must be validated and not be - * corrupt before being reused. If false, validation may be - * skipped as it will be performed elsewhere in the processing - * pipeline. * @throws IOException * the pack cannot be read, or stream did not accept a write. */ - public abstract void copyPackAsIs(PackOutputStream out, CachedPack pack, - boolean validate) throws IOException; + public abstract void copyPackAsIs(PackOutputStream out, CachedPack pack) + throws IOException; /** * Obtain the available cached packs that match the bitmap and update diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java index 510538d86..6d0c8e6cd 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java @@ -1048,7 +1048,7 @@ public void writePack(ProgressMonitor compressMonitor, stats.reusedObjects += pack.getObjectCount(); stats.reusedDeltas += deltaCnt; stats.totalDeltas += deltaCnt; - reuseSupport.copyPackAsIs(out, pack, reuseValidate); + reuseSupport.copyPackAsIs(out, pack); } writeChecksum(out); out.flush(); @@ -1866,7 +1866,7 @@ private void findObjectsToPackUsingBitmaps( false); BitmapBuilder needBitmap = wantBitmap.andNot(haveBitmap); - if (useCachedPacks && reuseSupport != null + if (useCachedPacks && reuseSupport != null && !reuseValidate && (excludeInPacks == null || excludeInPacks.length == 0)) cachedPacks.addAll( reuseSupport.getCachedPacksAndUpdate(needBitmap)); From d1da2780c2488151c7a5d44e08e6bf459e65338d Mon Sep 17 00:00:00 2001 From: David Ostrovsky Date: Fri, 24 Apr 2015 18:55:31 +0200 Subject: [PATCH 61/68] Revert "Let ObjectWalk.markUninteresting also mark the root tree as" The Iff2de881 tried to fix missing tree ..." but introduced severe performance degradation (>10x in some cases) when acting as server (git push) and as client (replication). IOW cure is worse than the disease. This reverts commit c4797fe98655b3d52d0a90ba44fce6e053db3b8b. Change-Id: I4e6056eb352d51277867f857a0cab380eca153ac Signed-off-by: David Ostrovsky --- .../org/eclipse/jgit/revwalk/ObjectWalkTest.java | 15 --------------- .../src/org/eclipse/jgit/revwalk/ObjectWalk.java | 14 +------------- 2 files changed, 1 insertion(+), 28 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/ObjectWalkTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/ObjectWalkTest.java index 9cbb1c875..dfde7fcf2 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/ObjectWalkTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/ObjectWalkTest.java @@ -214,21 +214,6 @@ public void testCull() throws Exception { assertNull(objw.nextObject()); } - @Test - public void testMarkUninterestingPropagation() throws Exception { - final RevBlob f = blob("1"); - final RevTree t = tree(file("f", f)); - final RevCommit c1 = commit(t); - final RevCommit c2 = commit(t); - - markUninteresting(c1); - markStart(c2); - - assertSame(c2, objw.next()); - assertNull(objw.next()); - assertNull(objw.nextObject()); - } - @Test public void testEmptyTreeCorruption() throws Exception { ObjectId bId = ObjectId diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java index b73ccb197..a0af067dc 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java @@ -232,7 +232,7 @@ public void markUninteresting(RevObject o) throws MissingObjectException, } if (o instanceof RevCommit) - markUninteresting((RevCommit) o); + super.markUninteresting((RevCommit) o); else if (o instanceof RevTree) markTreeUninteresting((RevTree) o); else @@ -242,18 +242,6 @@ else if (o instanceof RevTree) addObject(o); } - @Override - public void markUninteresting(RevCommit c) throws MissingObjectException, - IncorrectObjectTypeException, IOException { - super.markUninteresting(c); - try { - markTreeUninteresting(c.getTree()); - } catch (MissingObjectException e) { - // we don't care if the tree of the commit does not exist locally - } - } - - @Override public void sort(RevSort s) { super.sort(s); boundary = hasRevSort(RevSort.BOUNDARY); From 2383cccf1226ad4c3140846517458de1e5283c27 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Sun, 26 Apr 2015 23:23:20 +0200 Subject: [PATCH 62/68] JGit v3.7.1.201504261725-r Change-Id: I80639e317df80c103aef5cad75ad9079d43fb9d0 Signed-off-by: Matthias Sohn --- org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.ant.test/pom.xml | 2 +- org.eclipse.jgit.ant/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.ant/pom.xml | 2 +- org.eclipse.jgit.archive/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF | 4 ++-- org.eclipse.jgit.archive/pom.xml | 2 +- org.eclipse.jgit.console/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.console/pom.xml | 2 +- org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.http.apache/pom.xml | 2 +- org.eclipse.jgit.http.server/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.http.server/pom.xml | 2 +- org.eclipse.jgit.http.test/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.http.test/pom.xml | 2 +- org.eclipse.jgit.java7.test/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.java7.test/pom.xml | 2 +- org.eclipse.jgit.java7/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.java7/META-INF/SOURCE-MANIFEST.MF | 4 ++-- org.eclipse.jgit.java7/pom.xml | 2 +- org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.junit.http/pom.xml | 2 +- org.eclipse.jgit.junit/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.junit/pom.xml | 2 +- .../org.eclipse.jgit.feature/feature.xml | 2 +- org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml | 2 +- .../org.eclipse.jgit.http.apache.feature/feature.xml | 2 +- .../org.eclipse.jgit.http.apache.feature/pom.xml | 2 +- .../org.eclipse.jgit.java7.feature/feature.xml | 2 +- .../org.eclipse.jgit.java7.feature/pom.xml | 2 +- .../org.eclipse.jgit.junit.feature/feature.xml | 2 +- .../org.eclipse.jgit.junit.feature/pom.xml | 2 +- .../org.eclipse.jgit.pgm.feature/feature.xml | 2 +- .../org.eclipse.jgit.pgm.feature/pom.xml | 2 +- .../org.eclipse.jgit.pgm.source.feature/feature.xml | 2 +- .../org.eclipse.jgit.pgm.source.feature/pom.xml | 2 +- .../org.eclipse.jgit.repository/pom.xml | 2 +- .../org.eclipse.jgit.source.feature/feature.xml | 2 +- .../org.eclipse.jgit.source.feature/pom.xml | 2 +- .../org.eclipse.jgit.target/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml | 2 +- org.eclipse.jgit.packaging/pom.xml | 2 +- org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.pgm.test/pom.xml | 2 +- org.eclipse.jgit.pgm/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF | 4 ++-- org.eclipse.jgit.pgm/pom.xml | 2 +- org.eclipse.jgit.test/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.test/pom.xml | 2 +- org.eclipse.jgit.ui/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit.ui/pom.xml | 2 +- org.eclipse.jgit/META-INF/MANIFEST.MF | 2 +- org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF | 4 ++-- org.eclipse.jgit/pom.xml | 2 +- pom.xml | 2 +- 55 files changed, 59 insertions(+), 59 deletions(-) diff --git a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF index aa65c05a4..66ff855f8 100644 --- a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.ant.test -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: J2SE-1.5 Import-Package: org.apache.tools.ant, diff --git a/org.eclipse.jgit.ant.test/pom.xml b/org.eclipse.jgit.ant.test/pom.xml index 7bbc672eb..6171b61a1 100644 --- a/org.eclipse.jgit.ant.test/pom.xml +++ b/org.eclipse.jgit.ant.test/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.ant.test diff --git a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF index cccfa9bdb..d2ed6b471 100644 --- a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.eclipse.jgit.ant -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-RequiredExecutionEnvironment: J2SE-1.5 Import-Package: org.apache.tools.ant, org.eclipse.jgit.storage.file;version="[3.7.1,3.8.0)" diff --git a/org.eclipse.jgit.ant/pom.xml b/org.eclipse.jgit.ant/pom.xml index bf2b83649..030805efa 100644 --- a/org.eclipse.jgit.ant/pom.xml +++ b/org.eclipse.jgit.ant/pom.xml @@ -48,7 +48,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.ant diff --git a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF index d4733cb84..cbecbd1ce 100644 --- a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.archive -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: J2SE-1.5 diff --git a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF index 9ef1d7be1..c00e35aa8 100644 --- a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.archive - Sources Bundle-SymbolicName: org.eclipse.jgit.archive.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 3.7.1.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.archive;version="3.7.1.qualifier";roots="." +Bundle-Version: 3.7.1.201504261725-r +Eclipse-SourceBundle: org.eclipse.jgit.archive;version="3.7.1.201504261725-r";roots="." diff --git a/org.eclipse.jgit.archive/pom.xml b/org.eclipse.jgit.archive/pom.xml index a587f58da..c2d01b5f3 100644 --- a/org.eclipse.jgit.archive/pom.xml +++ b/org.eclipse.jgit.archive/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.archive diff --git a/org.eclipse.jgit.console/META-INF/MANIFEST.MF b/org.eclipse.jgit.console/META-INF/MANIFEST.MF index 52b865df5..25155d5b9 100644 --- a/org.eclipse.jgit.console/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.console/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.console -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Vendor: %provider_name Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Export-Package: org.eclipse.jgit.console;version="3.7.1" diff --git a/org.eclipse.jgit.console/pom.xml b/org.eclipse.jgit.console/pom.xml index 16bc429df..e542d25d9 100644 --- a/org.eclipse.jgit.console/pom.xml +++ b/org.eclipse.jgit.console/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.console diff --git a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF index 27b44d202..cc1f543a3 100644 --- a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.eclipse.jgit.http.apache -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-Localization: plugin Bundle-Vendor: %Provider-Name diff --git a/org.eclipse.jgit.http.apache/pom.xml b/org.eclipse.jgit.http.apache/pom.xml index 3511e1291..01540711b 100644 --- a/org.eclipse.jgit.http.apache/pom.xml +++ b/org.eclipse.jgit.http.apache/pom.xml @@ -48,7 +48,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.http.apache diff --git a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF index 49caec07d..af45217be 100644 --- a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.http.server -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Localization: plugin Bundle-Vendor: %provider_name Export-Package: org.eclipse.jgit.http.server;version="3.7.1", diff --git a/org.eclipse.jgit.http.server/pom.xml b/org.eclipse.jgit.http.server/pom.xml index 506e6d5ac..7df85ff19 100644 --- a/org.eclipse.jgit.http.server/pom.xml +++ b/org.eclipse.jgit.http.server/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.http.server diff --git a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF index ed3b95a28..bd98ed3c7 100644 --- a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.http.test -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: J2SE-1.5 diff --git a/org.eclipse.jgit.http.test/pom.xml b/org.eclipse.jgit.http.test/pom.xml index 361f119fb..5a03cc8e1 100644 --- a/org.eclipse.jgit.http.test/pom.xml +++ b/org.eclipse.jgit.http.test/pom.xml @@ -51,7 +51,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.http.test diff --git a/org.eclipse.jgit.java7.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.java7.test/META-INF/MANIFEST.MF index 59846ba19..cf1485589 100644 --- a/org.eclipse.jgit.java7.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.java7.test/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.java7.test -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Vendor: %provider_name Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Import-Package: org.eclipse.jgit.api;version="[3.7.1,3.8.0)", diff --git a/org.eclipse.jgit.java7.test/pom.xml b/org.eclipse.jgit.java7.test/pom.xml index c2f916795..33a0dd89d 100644 --- a/org.eclipse.jgit.java7.test/pom.xml +++ b/org.eclipse.jgit.java7.test/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.java7.test diff --git a/org.eclipse.jgit.java7/META-INF/MANIFEST.MF b/org.eclipse.jgit.java7/META-INF/MANIFEST.MF index 6574ecc89..88e910338 100644 --- a/org.eclipse.jgit.java7/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.java7/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Fragment-Host: org.eclipse.jgit;bundle-version="3.1.1" Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.java7 -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-RequiredExecutionEnvironment: JavaSE-1.7 diff --git a/org.eclipse.jgit.java7/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.java7/META-INF/SOURCE-MANIFEST.MF index d1b3e2bac..5dce9d4f7 100644 --- a/org.eclipse.jgit.java7/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.java7/META-INF/SOURCE-MANIFEST.MF @@ -3,6 +3,6 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.java7 - Sources Bundle-SymbolicName: org.eclipse.jgit.java7.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 3.7.1.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.java7;version="3.7.1.qualifier";roots="." +Bundle-Version: 3.7.1.201504261725-r +Eclipse-SourceBundle: org.eclipse.jgit.java7;version="3.7.1.201504261725-r";roots="." diff --git a/org.eclipse.jgit.java7/pom.xml b/org.eclipse.jgit.java7/pom.xml index f56179e63..c71d1a4db 100644 --- a/org.eclipse.jgit.java7/pom.xml +++ b/org.eclipse.jgit.java7/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.java7 diff --git a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF index da0034724..0fab1f7f1 100644 --- a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.junit.http -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy diff --git a/org.eclipse.jgit.junit.http/pom.xml b/org.eclipse.jgit.junit.http/pom.xml index d14ef78b2..1cc96d768 100644 --- a/org.eclipse.jgit.junit.http/pom.xml +++ b/org.eclipse.jgit.junit.http/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.junit.http diff --git a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF index dff3925e0..80bdae03f 100644 --- a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.junit -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy diff --git a/org.eclipse.jgit.junit/pom.xml b/org.eclipse.jgit.junit/pom.xml index e93d72151..ee7101b95 100644 --- a/org.eclipse.jgit.junit/pom.xml +++ b/org.eclipse.jgit.junit/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.junit diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml index ccfcdbf3b..209702eac 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml index 90f60453a..9e9156b47 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml index 8f4ca40b3..def0ac0d3 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml index 75d6cf644..c7cb43117 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/feature.xml index d9a976de4..af3de057b 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/pom.xml index 294bdad84..35f82434a 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml index 2e03973f5..96475628f 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml index fe1ba8bce..828154993 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml index 794281cf6..0069f36c2 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml index 043eeb7b7..fc2415f07 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml index 9d6b1f1c8..b69b0b00b 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml index 520af21d2..e7ee3241d 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml index bb6cca49b..80c5bc5a6 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.repository diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml index 7cb01342b..b5698124a 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml index e902ebc98..911122949 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF index 0c5b4912f..5aa3c33f9 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF @@ -2,4 +2,4 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JGit Target Platform Bundle Bundle-SymbolicName: org.eclipse.jgit.target -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml index 9b88a1b84..64a2d31c6 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml @@ -49,7 +49,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.target diff --git a/org.eclipse.jgit.packaging/pom.xml b/org.eclipse.jgit.packaging/pom.xml index 228462e8a..5b0c3b21f 100644 --- a/org.eclipse.jgit.packaging/pom.xml +++ b/org.eclipse.jgit.packaging/pom.xml @@ -53,7 +53,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r pom JGit Tycho Parent diff --git a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF index 69edad64e..7624c09a6 100644 --- a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.pgm.test -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-ActivationPolicy: lazy diff --git a/org.eclipse.jgit.pgm.test/pom.xml b/org.eclipse.jgit.pgm.test/pom.xml index b1e2eed17..891488e91 100644 --- a/org.eclipse.jgit.pgm.test/pom.xml +++ b/org.eclipse.jgit.pgm.test/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.pgm.test diff --git a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF index cc7358c20..9ea4a0aff 100644 --- a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.pgm -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: J2SE-1.5 diff --git a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF index 3f25ce23b..5a520a296 100644 --- a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.pgm - Sources Bundle-SymbolicName: org.eclipse.jgit.pgm.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 3.7.1.qualifier -Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="3.7.1.qualifier";roots="." +Bundle-Version: 3.7.1.201504261725-r +Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="3.7.1.201504261725-r";roots="." diff --git a/org.eclipse.jgit.pgm/pom.xml b/org.eclipse.jgit.pgm/pom.xml index 646c6a133..713f9f667 100644 --- a/org.eclipse.jgit.pgm/pom.xml +++ b/org.eclipse.jgit.pgm/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.pgm diff --git a/org.eclipse.jgit.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.test/META-INF/MANIFEST.MF index 8433731ba..1c67bab92 100644 --- a/org.eclipse.jgit.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.test/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.test -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy diff --git a/org.eclipse.jgit.test/pom.xml b/org.eclipse.jgit.test/pom.xml index e064b57b0..7c72b6504 100644 --- a/org.eclipse.jgit.test/pom.xml +++ b/org.eclipse.jgit.test/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.test diff --git a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF index 9373efe6a..6272f8581 100644 --- a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.ui -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Vendor: %provider_name Bundle-RequiredExecutionEnvironment: J2SE-1.5 Export-Package: org.eclipse.jgit.awtui;version="3.7.1" diff --git a/org.eclipse.jgit.ui/pom.xml b/org.eclipse.jgit.ui/pom.xml index d16fc6c43..8e92a1661 100644 --- a/org.eclipse.jgit.ui/pom.xml +++ b/org.eclipse.jgit.ui/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit.ui diff --git a/org.eclipse.jgit/META-INF/MANIFEST.MF b/org.eclipse.jgit/META-INF/MANIFEST.MF index 97c25dd16..4dc4b79e5 100644 --- a/org.eclipse.jgit/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit -Bundle-Version: 3.7.1.qualifier +Bundle-Version: 3.7.1.201504261725-r Bundle-Localization: plugin Bundle-Vendor: %provider_name Export-Package: org.eclipse.jgit.api;version="3.7.1"; diff --git a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF index 3917506f8..72e2eeb23 100644 --- a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit - Sources Bundle-SymbolicName: org.eclipse.jgit.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 3.7.1.qualifier -Eclipse-SourceBundle: org.eclipse.jgit;version="3.7.1.qualifier";roots="." +Bundle-Version: 3.7.1.201504261725-r +Eclipse-SourceBundle: org.eclipse.jgit;version="3.7.1.201504261725-r";roots="." diff --git a/org.eclipse.jgit/pom.xml b/org.eclipse.jgit/pom.xml index 7a4932eb6..0b668d146 100644 --- a/org.eclipse.jgit/pom.xml +++ b/org.eclipse.jgit/pom.xml @@ -53,7 +53,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r org.eclipse.jgit diff --git a/pom.xml b/pom.xml index 4238b7d9b..41fc910a1 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ org.eclipse.jgit org.eclipse.jgit-parent pom - 3.7.1-SNAPSHOT + 3.7.1.201504261725-r JGit - Parent ${jgit-url} From 720adcebb5b880665aef6a5b0d22a58b33bff4d6 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Mon, 27 Apr 2015 00:33:14 +0200 Subject: [PATCH 63/68] Prepare 3.7.2-SNAPSHOT builds Change-Id: Ia42a665e76953b643a080b58d2cd4526575ddf2e Signed-off-by: Matthias Sohn --- .../META-INF/MANIFEST.MF | 12 +-- org.eclipse.jgit.ant.test/pom.xml | 2 +- org.eclipse.jgit.ant/META-INF/MANIFEST.MF | 6 +- org.eclipse.jgit.ant/pom.xml | 2 +- org.eclipse.jgit.archive/META-INF/MANIFEST.MF | 10 +-- .../META-INF/SOURCE-MANIFEST.MF | 4 +- org.eclipse.jgit.archive/pom.xml | 2 +- org.eclipse.jgit.console/META-INF/MANIFEST.MF | 12 +-- org.eclipse.jgit.console/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 10 +-- org.eclipse.jgit.http.apache/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 24 +++--- org.eclipse.jgit.http.server/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 36 ++++----- org.eclipse.jgit.http.test/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 24 +++--- org.eclipse.jgit.java7.test/pom.xml | 2 +- org.eclipse.jgit.java7/META-INF/MANIFEST.MF | 4 +- .../META-INF/SOURCE-MANIFEST.MF | 4 +- org.eclipse.jgit.java7/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 20 ++--- org.eclipse.jgit.junit.http/pom.xml | 2 +- org.eclipse.jgit.junit/META-INF/MANIFEST.MF | 30 +++---- org.eclipse.jgit.junit/pom.xml | 2 +- .../org.eclipse.jgit.feature/feature.xml | 2 +- .../org.eclipse.jgit.feature/pom.xml | 2 +- .../feature.xml | 2 +- .../pom.xml | 2 +- .../feature.xml | 2 +- .../org.eclipse.jgit.java7.feature/pom.xml | 2 +- .../feature.xml | 2 +- .../org.eclipse.jgit.junit.feature/pom.xml | 2 +- .../org.eclipse.jgit.pgm.feature/feature.xml | 2 +- .../org.eclipse.jgit.pgm.feature/pom.xml | 2 +- .../feature.xml | 2 +- .../pom.xml | 2 +- .../org.eclipse.jgit.repository/pom.xml | 2 +- .../feature.xml | 2 +- .../org.eclipse.jgit.source.feature/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 2 +- .../org.eclipse.jgit.target/pom.xml | 2 +- org.eclipse.jgit.packaging/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 34 ++++---- org.eclipse.jgit.pgm.test/pom.xml | 2 +- org.eclipse.jgit.pgm/META-INF/MANIFEST.MF | 62 +++++++-------- .../META-INF/SOURCE-MANIFEST.MF | 4 +- org.eclipse.jgit.pgm/pom.xml | 2 +- org.eclipse.jgit.test/META-INF/MANIFEST.MF | 78 +++++++++---------- org.eclipse.jgit.test/pom.xml | 2 +- org.eclipse.jgit.ui/META-INF/MANIFEST.MF | 18 ++--- org.eclipse.jgit.ui/pom.xml | 2 +- org.eclipse.jgit/META-INF/MANIFEST.MF | 72 ++++++++--------- org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF | 4 +- org.eclipse.jgit/pom.xml | 2 +- pom.xml | 2 +- 55 files changed, 269 insertions(+), 269 deletions(-) diff --git a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF index 66ff855f8..15da1a2f9 100644 --- a/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF @@ -3,14 +3,14 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.ant.test -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: J2SE-1.5 Import-Package: org.apache.tools.ant, - org.eclipse.jgit.ant.tasks;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.junit;version="[3.7.1,3.8.0)", - org.eclipse.jgit.lib;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util;version="[3.7.1,3.8.0)", + org.eclipse.jgit.ant.tasks;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.junit;version="[3.7.2,3.8.0)", + org.eclipse.jgit.lib;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util;version="[3.7.2,3.8.0)", org.hamcrest;version="[1.1.0,2.0.0)", org.junit;version="[4.0.0,5.0.0)" diff --git a/org.eclipse.jgit.ant.test/pom.xml b/org.eclipse.jgit.ant.test/pom.xml index 6171b61a1..602e49766 100644 --- a/org.eclipse.jgit.ant.test/pom.xml +++ b/org.eclipse.jgit.ant.test/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.ant.test diff --git a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF index d2ed6b471..ca7bbf03c 100644 --- a/org.eclipse.jgit.ant/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ant/META-INF/MANIFEST.MF @@ -2,11 +2,11 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.eclipse.jgit.ant -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-RequiredExecutionEnvironment: J2SE-1.5 Import-Package: org.apache.tools.ant, - org.eclipse.jgit.storage.file;version="[3.7.1,3.8.0)" + org.eclipse.jgit.storage.file;version="[3.7.2,3.8.0)" Bundle-Localization: plugin Bundle-Vendor: %Provider-Name -Export-Package: org.eclipse.jgit.ant.tasks;version="3.7.1"; +Export-Package: org.eclipse.jgit.ant.tasks;version="3.7.2"; uses:="org.apache.tools.ant.types,org.apache.tools.ant" diff --git a/org.eclipse.jgit.ant/pom.xml b/org.eclipse.jgit.ant/pom.xml index 030805efa..aad67cfa2 100644 --- a/org.eclipse.jgit.ant/pom.xml +++ b/org.eclipse.jgit.ant/pom.xml @@ -48,7 +48,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.ant diff --git a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF index cbecbd1ce..25f4f73b2 100644 --- a/org.eclipse.jgit.archive/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.archive/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.archive -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: J2SE-1.5 @@ -12,13 +12,13 @@ Import-Package: org.apache.commons.compress.archivers;version="[1.4,2.0)", org.apache.commons.compress.compressors.bzip2;version="[1.4,2.0)", org.apache.commons.compress.compressors.gzip;version="[1.4,2.0)", org.apache.commons.compress.compressors.xz;version="[1.4,2.0)", - org.eclipse.jgit.api;version="[3.7.1,3.8.0)", - org.eclipse.jgit.lib;version="[3.7.1,3.8.0)", - org.eclipse.jgit.nls;version="[3.7.1,3.8.0)", + org.eclipse.jgit.api;version="[3.7.2,3.8.0)", + org.eclipse.jgit.lib;version="[3.7.2,3.8.0)", + org.eclipse.jgit.nls;version="[3.7.2,3.8.0)", org.osgi.framework;version="[1.3.0,2.0.0)" Bundle-ActivationPolicy: lazy Bundle-Activator: org.eclipse.jgit.archive.FormatActivator -Export-Package: org.eclipse.jgit.archive;version="3.7.1"; +Export-Package: org.eclipse.jgit.archive;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.api, org.apache.commons.compress.archivers, diff --git a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF index c00e35aa8..cc1028c35 100644 --- a/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.archive - Sources Bundle-SymbolicName: org.eclipse.jgit.archive.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 3.7.1.201504261725-r -Eclipse-SourceBundle: org.eclipse.jgit.archive;version="3.7.1.201504261725-r";roots="." +Bundle-Version: 3.7.2.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.archive;version="3.7.2.qualifier";roots="." diff --git a/org.eclipse.jgit.archive/pom.xml b/org.eclipse.jgit.archive/pom.xml index c2d01b5f3..0e0f1652a 100644 --- a/org.eclipse.jgit.archive/pom.xml +++ b/org.eclipse.jgit.archive/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.archive diff --git a/org.eclipse.jgit.console/META-INF/MANIFEST.MF b/org.eclipse.jgit.console/META-INF/MANIFEST.MF index 25155d5b9..193e5006e 100644 --- a/org.eclipse.jgit.console/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.console/META-INF/MANIFEST.MF @@ -3,11 +3,11 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.console -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Vendor: %provider_name Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Export-Package: org.eclipse.jgit.console;version="3.7.1" -Import-Package: org.eclipse.jgit.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.nls;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util;version="[3.7.1,3.8.0)" +Export-Package: org.eclipse.jgit.console;version="3.7.2" +Import-Package: org.eclipse.jgit.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.nls;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util;version="[3.7.2,3.8.0)" diff --git a/org.eclipse.jgit.console/pom.xml b/org.eclipse.jgit.console/pom.xml index e542d25d9..bd5923b5b 100644 --- a/org.eclipse.jgit.console/pom.xml +++ b/org.eclipse.jgit.console/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.console diff --git a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF index cc1f543a3..96ac4de87 100644 --- a/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.http.apache/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.eclipse.jgit.http.apache -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-Localization: plugin Bundle-Vendor: %Provider-Name @@ -18,10 +18,10 @@ Import-Package: org.apache.http;version="[4.1.0,5.0.0)", org.apache.http.impl.client;version="[4.1.0,5.0.0)", org.apache.http.impl.client.cache;version="[4.1.0,5.0.0)", org.apache.http.params;version="[4.1.0,5.0.0)", - org.eclipse.jgit.nls;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport.http;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util;version="[3.7.1,3.8.0)" -Export-Package: org.eclipse.jgit.transport.http.apache;version="3.7.1"; + org.eclipse.jgit.nls;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport.http;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util;version="[3.7.2,3.8.0)" +Export-Package: org.eclipse.jgit.transport.http.apache;version="3.7.2"; uses:="org.eclipse.jgit.transport.http, javax.net.ssl, org.apache.http.client, diff --git a/org.eclipse.jgit.http.apache/pom.xml b/org.eclipse.jgit.http.apache/pom.xml index 01540711b..1203d02ff 100644 --- a/org.eclipse.jgit.http.apache/pom.xml +++ b/org.eclipse.jgit.http.apache/pom.xml @@ -48,7 +48,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.http.apache diff --git a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF index af45217be..9de181699 100644 --- a/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.http.server/META-INF/MANIFEST.MF @@ -2,13 +2,13 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.http.server -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name -Export-Package: org.eclipse.jgit.http.server;version="3.7.1", - org.eclipse.jgit.http.server.glue;version="3.7.1"; +Export-Package: org.eclipse.jgit.http.server;version="3.7.2", + org.eclipse.jgit.http.server.glue;version="3.7.2"; uses:="javax.servlet,javax.servlet.http", - org.eclipse.jgit.http.server.resolver;version="3.7.1"; + org.eclipse.jgit.http.server.resolver;version="3.7.2"; uses:="org.eclipse.jgit.transport.resolver, org.eclipse.jgit.lib, org.eclipse.jgit.transport, @@ -17,11 +17,11 @@ Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: J2SE-1.5 Import-Package: javax.servlet;version="[2.5.0,3.0.0)", javax.servlet.http;version="[2.5.0,3.0.0)", - org.eclipse.jgit.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.lib;version="[3.7.1,3.8.0)", - org.eclipse.jgit.nls;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revwalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport.resolver;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util;version="[3.7.1,3.8.0)" + org.eclipse.jgit.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.lib;version="[3.7.2,3.8.0)", + org.eclipse.jgit.nls;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revwalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport.resolver;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util;version="[3.7.2,3.8.0)" diff --git a/org.eclipse.jgit.http.server/pom.xml b/org.eclipse.jgit.http.server/pom.xml index 7df85ff19..b27ce6caf 100644 --- a/org.eclipse.jgit.http.server/pom.xml +++ b/org.eclipse.jgit.http.server/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.http.server diff --git a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF index bd98ed3c7..2d718bd28 100644 --- a/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.http.test/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.http.test -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: J2SE-1.5 @@ -22,23 +22,23 @@ Import-Package: javax.servlet;version="[2.5.0,3.0.0)", org.eclipse.jetty.util.log;version="[7.6.0,8.0.0)", org.eclipse.jetty.util.security;version="[7.6.0,8.0.0)", org.eclipse.jetty.util.thread;version="[7.6.0,8.0.0)", - org.eclipse.jgit.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.http.server;version="[3.7.1,3.8.0)", - org.eclipse.jgit.http.server.glue;version="[3.7.1,3.8.0)", - org.eclipse.jgit.http.server.resolver;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.junit;version="[3.7.1,3.8.0)", - org.eclipse.jgit.junit.http;version="[3.7.1,3.8.0)", - org.eclipse.jgit.lib;version="[3.7.1,3.8.0)", - org.eclipse.jgit.nls;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revwalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport.http;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport.http.apache;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport.resolver;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util;version="[3.7.1,3.8.0)", + org.eclipse.jgit.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.http.server;version="[3.7.2,3.8.0)", + org.eclipse.jgit.http.server.glue;version="[3.7.2,3.8.0)", + org.eclipse.jgit.http.server.resolver;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.junit;version="[3.7.2,3.8.0)", + org.eclipse.jgit.junit.http;version="[3.7.2,3.8.0)", + org.eclipse.jgit.lib;version="[3.7.2,3.8.0)", + org.eclipse.jgit.nls;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revwalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport.http;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport.http.apache;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport.resolver;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util;version="[3.7.2,3.8.0)", org.hamcrest.core;version="[1.1.0,2.0.0)", org.junit;version="[4.0.0,5.0.0)", org.junit.runner;version="[4.0.0,5.0.0)", diff --git a/org.eclipse.jgit.http.test/pom.xml b/org.eclipse.jgit.http.test/pom.xml index 5a03cc8e1..430c0c58c 100644 --- a/org.eclipse.jgit.http.test/pom.xml +++ b/org.eclipse.jgit.http.test/pom.xml @@ -51,7 +51,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.http.test diff --git a/org.eclipse.jgit.java7.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.java7.test/META-INF/MANIFEST.MF index cf1485589..5a0b2ff29 100644 --- a/org.eclipse.jgit.java7.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.java7.test/META-INF/MANIFEST.MF @@ -2,18 +2,18 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.java7.test -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Vendor: %provider_name Bundle-RequiredExecutionEnvironment: JavaSE-1.7 -Import-Package: org.eclipse.jgit.api;version="[3.7.1,3.8.0)", - org.eclipse.jgit.api.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.diff;version="[3.7.1,3.8.0)", - org.eclipse.jgit.dircache;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.file;version="3.7.1", - org.eclipse.jgit.junit;version="[3.7.1,3.8.0)", - org.eclipse.jgit.lib;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revwalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.treewalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util;version="[3.7.1,3.8.0)", +Import-Package: org.eclipse.jgit.api;version="[3.7.2,3.8.0)", + org.eclipse.jgit.api.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.diff;version="[3.7.2,3.8.0)", + org.eclipse.jgit.dircache;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.file;version="3.7.2", + org.eclipse.jgit.junit;version="[3.7.2,3.8.0)", + org.eclipse.jgit.lib;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revwalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.treewalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util;version="[3.7.2,3.8.0)", org.junit;version="[4.11.0,5.0.0)" diff --git a/org.eclipse.jgit.java7.test/pom.xml b/org.eclipse.jgit.java7.test/pom.xml index 33a0dd89d..ec55f7ecf 100644 --- a/org.eclipse.jgit.java7.test/pom.xml +++ b/org.eclipse.jgit.java7.test/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.java7.test diff --git a/org.eclipse.jgit.java7/META-INF/MANIFEST.MF b/org.eclipse.jgit.java7/META-INF/MANIFEST.MF index 88e910338..c22f74886 100644 --- a/org.eclipse.jgit.java7/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.java7/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Fragment-Host: org.eclipse.jgit;bundle-version="3.1.1" Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.java7 -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-RequiredExecutionEnvironment: JavaSE-1.7 -Export-Package: org.eclipse.jgit.util;version="3.7.1" +Export-Package: org.eclipse.jgit.util;version="3.7.2" diff --git a/org.eclipse.jgit.java7/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.java7/META-INF/SOURCE-MANIFEST.MF index 5dce9d4f7..1a61025c7 100644 --- a/org.eclipse.jgit.java7/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.java7/META-INF/SOURCE-MANIFEST.MF @@ -3,6 +3,6 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.java7 - Sources Bundle-SymbolicName: org.eclipse.jgit.java7.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 3.7.1.201504261725-r -Eclipse-SourceBundle: org.eclipse.jgit.java7;version="3.7.1.201504261725-r";roots="." +Bundle-Version: 3.7.2.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.java7;version="3.7.2.qualifier";roots="." diff --git a/org.eclipse.jgit.java7/pom.xml b/org.eclipse.jgit.java7/pom.xml index c71d1a4db..355032d2f 100644 --- a/org.eclipse.jgit.java7/pom.xml +++ b/org.eclipse.jgit.java7/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.java7 diff --git a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF index 0fab1f7f1..0ab8c095f 100644 --- a/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.junit.http/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.junit.http -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy @@ -20,13 +20,13 @@ Import-Package: javax.servlet;version="[2.5.0,3.0.0)", org.eclipse.jetty.util.component;version="[7.6.0,8.0.0)", org.eclipse.jetty.util.log;version="[7.6.0,8.0.0)", org.eclipse.jetty.util.security;version="[7.6.0,8.0.0)", - org.eclipse.jgit.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.http.server;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.junit;version="[3.7.1,3.8.0)", - org.eclipse.jgit.lib;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revwalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport.resolver;version="[3.7.1,3.8.0)", + org.eclipse.jgit.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.http.server;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.junit;version="[3.7.2,3.8.0)", + org.eclipse.jgit.lib;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revwalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport.resolver;version="[3.7.2,3.8.0)", org.junit;version="[4.0.0,5.0.0)" -Export-Package: org.eclipse.jgit.junit.http;version="3.7.1" +Export-Package: org.eclipse.jgit.junit.http;version="3.7.2" diff --git a/org.eclipse.jgit.junit.http/pom.xml b/org.eclipse.jgit.junit.http/pom.xml index 1cc96d768..2c1444bee 100644 --- a/org.eclipse.jgit.junit.http/pom.xml +++ b/org.eclipse.jgit.junit.http/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.junit.http diff --git a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF index 80bdae03f..45ae26111 100644 --- a/org.eclipse.jgit.junit/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.junit/META-INF/MANIFEST.MF @@ -2,23 +2,23 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.junit -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: J2SE-1.5 -Import-Package: org.eclipse.jgit.api;version="[3.7.1,3.8.0)", - org.eclipse.jgit.api.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.dircache;version="[3.7.1,3.8.0)", - org.eclipse.jgit.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.pack;version="[3.7.1,3.8.0)", - org.eclipse.jgit.lib;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revwalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.treewalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.treewalk.filter;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util.io;version="[3.7.1,3.8.0)", +Import-Package: org.eclipse.jgit.api;version="[3.7.2,3.8.0)", + org.eclipse.jgit.api.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.dircache;version="[3.7.2,3.8.0)", + org.eclipse.jgit.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.pack;version="[3.7.2,3.8.0)", + org.eclipse.jgit.lib;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revwalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.treewalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.treewalk.filter;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util.io;version="[3.7.2,3.8.0)", org.junit;version="[4.0.0,5.0.0)" -Export-Package: org.eclipse.jgit.junit;version="3.7.1" +Export-Package: org.eclipse.jgit.junit;version="3.7.2" diff --git a/org.eclipse.jgit.junit/pom.xml b/org.eclipse.jgit.junit/pom.xml index ee7101b95..80ce41f8b 100644 --- a/org.eclipse.jgit.junit/pom.xml +++ b/org.eclipse.jgit.junit/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.junit diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml index 209702eac..038c348ea 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml index 9e9156b47..c66cf23da 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml index def0ac0d3..2c9881720 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml index c7cb43117..dca656a15 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.http.apache.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/feature.xml index af3de057b..1137a84ae 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/pom.xml index 35f82434a..90f9552fd 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.java7.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml index 96475628f..cadd02b08 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml index 828154993..28b34927a 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.junit.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml index 0069f36c2..88b1de64a 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml index fc2415f07..13d7e28b6 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml index b69b0b00b..aeedebc5e 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml index e7ee3241d..b15fe829b 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.pgm.source.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml index 80c5bc5a6..103c6376d 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.repository diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml index b5698124a..6be0723c0 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml index 911122949..401659a41 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.source.feature/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.feature diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF index 5aa3c33f9..2e492329d 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/META-INF/MANIFEST.MF @@ -2,4 +2,4 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JGit Target Platform Bundle Bundle-SymbolicName: org.eclipse.jgit.target -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml index 64a2d31c6..a198ef7fe 100644 --- a/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml +++ b/org.eclipse.jgit.packaging/org.eclipse.jgit.target/pom.xml @@ -49,7 +49,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.target diff --git a/org.eclipse.jgit.packaging/pom.xml b/org.eclipse.jgit.packaging/pom.xml index 5b0c3b21f..b223be5f6 100644 --- a/org.eclipse.jgit.packaging/pom.xml +++ b/org.eclipse.jgit.packaging/pom.xml @@ -53,7 +53,7 @@ org.eclipse.jgit jgit.tycho.parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT pom JGit Tycho Parent diff --git a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF index 7624c09a6..22e90234d 100644 --- a/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.pgm.test/META-INF/MANIFEST.MF @@ -2,27 +2,27 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.pgm.test -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: J2SE-1.5 -Import-Package: org.eclipse.jgit.api;version="[3.7.1,3.8.0)", - org.eclipse.jgit.api.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.diff;version="[3.7.1,3.8.0)", - org.eclipse.jgit.dircache;version="[3.7.1,3.8.0)", - org.eclipse.jgit.junit;version="[3.7.1,3.8.0)", - org.eclipse.jgit.lib;version="[3.7.1,3.8.0)", - org.eclipse.jgit.merge;version="[3.7.1,3.8.0)", - org.eclipse.jgit.pgm;version="[3.7.1,3.8.0)", - org.eclipse.jgit.pgm.internal;version="[3.7.1,3.8.0)", - org.eclipse.jgit.pgm.opt;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revwalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport;version="[3.7.1,3.8.0)", - org.eclipse.jgit.treewalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util.io;version="[3.7.1,3.8.0)", +Import-Package: org.eclipse.jgit.api;version="[3.7.2,3.8.0)", + org.eclipse.jgit.api.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.diff;version="[3.7.2,3.8.0)", + org.eclipse.jgit.dircache;version="[3.7.2,3.8.0)", + org.eclipse.jgit.junit;version="[3.7.2,3.8.0)", + org.eclipse.jgit.lib;version="[3.7.2,3.8.0)", + org.eclipse.jgit.merge;version="[3.7.2,3.8.0)", + org.eclipse.jgit.pgm;version="[3.7.2,3.8.0)", + org.eclipse.jgit.pgm.internal;version="[3.7.2,3.8.0)", + org.eclipse.jgit.pgm.opt;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revwalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport;version="[3.7.2,3.8.0)", + org.eclipse.jgit.treewalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util.io;version="[3.7.2,3.8.0)", org.hamcrest.core;bundle-version="[1.1.0,2.0.0)", org.junit;version="[4.4.0,5.0.0)", org.kohsuke.args4j;version="[2.0.12,2.1.0)" diff --git a/org.eclipse.jgit.pgm.test/pom.xml b/org.eclipse.jgit.pgm.test/pom.xml index 891488e91..f2de973c2 100644 --- a/org.eclipse.jgit.pgm.test/pom.xml +++ b/org.eclipse.jgit.pgm.test/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.pgm.test diff --git a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF index 9ea4a0aff..38cb3205b 100644 --- a/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.pgm/META-INF/MANIFEST.MF @@ -2,43 +2,43 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.pgm -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Vendor: %provider_name Bundle-Localization: plugin Bundle-RequiredExecutionEnvironment: J2SE-1.5 Import-Package: org.apache.commons.compress.archivers;version="[1.3,2.0)", org.apache.commons.compress.archivers.tar;version="[1.3,2.0)", org.apache.commons.compress.archivers.zip;version="[1.3,2.0)", - org.eclipse.jgit.api;version="[3.7.1,3.8.0)", - org.eclipse.jgit.api.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.archive;version="[3.7.1,3.8.0)", - org.eclipse.jgit.awtui;version="[3.7.1,3.8.0)", - org.eclipse.jgit.blame;version="[3.7.1,3.8.0)", - org.eclipse.jgit.diff;version="[3.7.1,3.8.0)", - org.eclipse.jgit.dircache;version="[3.7.1,3.8.0)", - org.eclipse.jgit.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.gitrepo;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.pack;version="[3.7.1,3.8.0)", - org.eclipse.jgit.lib;version="[3.7.1,3.8.0)", - org.eclipse.jgit.merge;version="3.7.1", - org.eclipse.jgit.nls;version="[3.7.1,3.8.0)", - org.eclipse.jgit.notes;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revplot;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revwalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revwalk.filter;version="[3.7.1,3.8.0)", - org.eclipse.jgit.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.storage.pack;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport.resolver;version="[3.7.1,3.8.0)", - org.eclipse.jgit.treewalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.treewalk.filter;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util.io;version="[3.7.1,3.8.0)", + org.eclipse.jgit.api;version="[3.7.2,3.8.0)", + org.eclipse.jgit.api.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.archive;version="[3.7.2,3.8.0)", + org.eclipse.jgit.awtui;version="[3.7.2,3.8.0)", + org.eclipse.jgit.blame;version="[3.7.2,3.8.0)", + org.eclipse.jgit.diff;version="[3.7.2,3.8.0)", + org.eclipse.jgit.dircache;version="[3.7.2,3.8.0)", + org.eclipse.jgit.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.gitrepo;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.pack;version="[3.7.2,3.8.0)", + org.eclipse.jgit.lib;version="[3.7.2,3.8.0)", + org.eclipse.jgit.merge;version="3.7.2", + org.eclipse.jgit.nls;version="[3.7.2,3.8.0)", + org.eclipse.jgit.notes;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revplot;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revwalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revwalk.filter;version="[3.7.2,3.8.0)", + org.eclipse.jgit.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.storage.pack;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport.resolver;version="[3.7.2,3.8.0)", + org.eclipse.jgit.treewalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.treewalk.filter;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util.io;version="[3.7.2,3.8.0)", org.kohsuke.args4j;version="[2.0.12,2.1.0)", org.kohsuke.args4j.spi;version="[2.0.12,2.1.0)" Bundle-ActivationPolicy: lazy -Export-Package: org.eclipse.jgit.pgm;version="3.7.1"; +Export-Package: org.eclipse.jgit.pgm;version="3.7.2"; uses:="org.eclipse.jgit.revwalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.pgm.opt, @@ -49,10 +49,10 @@ Export-Package: org.eclipse.jgit.pgm;version="3.7.1"; org.eclipse.jgit.treewalk, javax.swing, org.eclipse.jgit.transport", - org.eclipse.jgit.pgm.debug;version="3.7.1"; + org.eclipse.jgit.pgm.debug;version="3.7.2"; uses:="org.eclipse.jgit.pgm", - org.eclipse.jgit.pgm.internal;version="3.7.1";x-friends:="org.eclipse.jgit.pgm.test,org.eclipse.jgit.test", - org.eclipse.jgit.pgm.opt;version="3.7.1"; + org.eclipse.jgit.pgm.internal;version="3.7.2";x-friends:="org.eclipse.jgit.pgm.test,org.eclipse.jgit.test", + org.eclipse.jgit.pgm.opt;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.revwalk, org.kohsuke.args4j.spi, diff --git a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF index 5a520a296..1bf2ed507 100644 --- a/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit.pgm/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit.pgm - Sources Bundle-SymbolicName: org.eclipse.jgit.pgm.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 3.7.1.201504261725-r -Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="3.7.1.201504261725-r";roots="." +Bundle-Version: 3.7.2.qualifier +Eclipse-SourceBundle: org.eclipse.jgit.pgm;version="3.7.2.qualifier";roots="." diff --git a/org.eclipse.jgit.pgm/pom.xml b/org.eclipse.jgit.pgm/pom.xml index 713f9f667..f5553249f 100644 --- a/org.eclipse.jgit.pgm/pom.xml +++ b/org.eclipse.jgit.pgm/pom.xml @@ -50,7 +50,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.pgm diff --git a/org.eclipse.jgit.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.test/META-INF/MANIFEST.MF index 1c67bab92..8997b4dd8 100644 --- a/org.eclipse.jgit.test/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.test/META-INF/MANIFEST.MF @@ -2,50 +2,50 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.test -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: J2SE-1.5 Import-Package: com.googlecode.javaewah;version="[0.7.9,0.8.0)", - org.eclipse.jgit.api;version="[3.7.1,3.8.0)", - org.eclipse.jgit.api.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.attributes;version="[3.7.1,3.8.0)", - org.eclipse.jgit.awtui;version="[3.7.1,3.8.0)", - org.eclipse.jgit.blame;version="[3.7.1,3.8.0)", - org.eclipse.jgit.console;version="[3.7.1,3.8.0)", - org.eclipse.jgit.diff;version="[3.7.1,3.8.0)", - org.eclipse.jgit.dircache;version="[3.7.1,3.8.0)", - org.eclipse.jgit.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.events;version="[3.7.1,3.8.0)", - org.eclipse.jgit.fnmatch;version="[3.7.1,3.8.0)", - org.eclipse.jgit.gitrepo;version="[3.7.1,3.8.0)", - org.eclipse.jgit.ignore;version="[3.7.1,3.8.0)", - org.eclipse.jgit.ignore.internal;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.dfs;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.internal.storage.pack;version="[3.7.1,3.8.0)", - org.eclipse.jgit.junit;version="[3.7.1,3.8.0)", - org.eclipse.jgit.lib;version="[3.7.1,3.8.0)", - org.eclipse.jgit.merge;version="[3.7.1,3.8.0)", - org.eclipse.jgit.nls;version="[3.7.1,3.8.0)", - org.eclipse.jgit.notes;version="[3.7.1,3.8.0)", - org.eclipse.jgit.patch;version="[3.7.1,3.8.0)", - org.eclipse.jgit.pgm;version="[3.7.1,3.8.0)", - org.eclipse.jgit.pgm.internal;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revplot;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revwalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revwalk.filter;version="[3.7.1,3.8.0)", - org.eclipse.jgit.storage.file;version="[3.7.1,3.8.0)", - org.eclipse.jgit.storage.pack;version="[3.7.1,3.8.0)", - org.eclipse.jgit.submodule;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport.http;version="[3.7.1,3.8.0)", - org.eclipse.jgit.treewalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.treewalk.filter;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util.io;version="[3.7.1,3.8.0)", + org.eclipse.jgit.api;version="[3.7.2,3.8.0)", + org.eclipse.jgit.api.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.attributes;version="[3.7.2,3.8.0)", + org.eclipse.jgit.awtui;version="[3.7.2,3.8.0)", + org.eclipse.jgit.blame;version="[3.7.2,3.8.0)", + org.eclipse.jgit.console;version="[3.7.2,3.8.0)", + org.eclipse.jgit.diff;version="[3.7.2,3.8.0)", + org.eclipse.jgit.dircache;version="[3.7.2,3.8.0)", + org.eclipse.jgit.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.events;version="[3.7.2,3.8.0)", + org.eclipse.jgit.fnmatch;version="[3.7.2,3.8.0)", + org.eclipse.jgit.gitrepo;version="[3.7.2,3.8.0)", + org.eclipse.jgit.ignore;version="[3.7.2,3.8.0)", + org.eclipse.jgit.ignore.internal;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.dfs;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.internal.storage.pack;version="[3.7.2,3.8.0)", + org.eclipse.jgit.junit;version="[3.7.2,3.8.0)", + org.eclipse.jgit.lib;version="[3.7.2,3.8.0)", + org.eclipse.jgit.merge;version="[3.7.2,3.8.0)", + org.eclipse.jgit.nls;version="[3.7.2,3.8.0)", + org.eclipse.jgit.notes;version="[3.7.2,3.8.0)", + org.eclipse.jgit.patch;version="[3.7.2,3.8.0)", + org.eclipse.jgit.pgm;version="[3.7.2,3.8.0)", + org.eclipse.jgit.pgm.internal;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revplot;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revwalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revwalk.filter;version="[3.7.2,3.8.0)", + org.eclipse.jgit.storage.file;version="[3.7.2,3.8.0)", + org.eclipse.jgit.storage.pack;version="[3.7.2,3.8.0)", + org.eclipse.jgit.submodule;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport.http;version="[3.7.2,3.8.0)", + org.eclipse.jgit.treewalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.treewalk.filter;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util.io;version="[3.7.2,3.8.0)", org.hamcrest;version="[1.1.0,2.0.0)", org.junit;version="[4.4.0,5.0.0)", org.junit.experimental.theories;version="[4.4.0,5.0.0)", diff --git a/org.eclipse.jgit.test/pom.xml b/org.eclipse.jgit.test/pom.xml index 7c72b6504..24863fec6 100644 --- a/org.eclipse.jgit.test/pom.xml +++ b/org.eclipse.jgit.test/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.test diff --git a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF index 6272f8581..e85c69181 100644 --- a/org.eclipse.jgit.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit.ui/META-INF/MANIFEST.MF @@ -3,14 +3,14 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit.ui -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Vendor: %provider_name Bundle-RequiredExecutionEnvironment: J2SE-1.5 -Export-Package: org.eclipse.jgit.awtui;version="3.7.1" -Import-Package: org.eclipse.jgit.errors;version="[3.7.1,3.8.0)", - org.eclipse.jgit.lib;version="[3.7.1,3.8.0)", - org.eclipse.jgit.nls;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revplot;version="[3.7.1,3.8.0)", - org.eclipse.jgit.revwalk;version="[3.7.1,3.8.0)", - org.eclipse.jgit.transport;version="[3.7.1,3.8.0)", - org.eclipse.jgit.util;version="[3.7.1,3.8.0)" +Export-Package: org.eclipse.jgit.awtui;version="3.7.2" +Import-Package: org.eclipse.jgit.errors;version="[3.7.2,3.8.0)", + org.eclipse.jgit.lib;version="[3.7.2,3.8.0)", + org.eclipse.jgit.nls;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revplot;version="[3.7.2,3.8.0)", + org.eclipse.jgit.revwalk;version="[3.7.2,3.8.0)", + org.eclipse.jgit.transport;version="[3.7.2,3.8.0)", + org.eclipse.jgit.util;version="[3.7.2,3.8.0)" diff --git a/org.eclipse.jgit.ui/pom.xml b/org.eclipse.jgit.ui/pom.xml index 8e92a1661..86f3d0355 100644 --- a/org.eclipse.jgit.ui/pom.xml +++ b/org.eclipse.jgit.ui/pom.xml @@ -52,7 +52,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit.ui diff --git a/org.eclipse.jgit/META-INF/MANIFEST.MF b/org.eclipse.jgit/META-INF/MANIFEST.MF index 4dc4b79e5..a90f4de31 100644 --- a/org.eclipse.jgit/META-INF/MANIFEST.MF +++ b/org.eclipse.jgit/META-INF/MANIFEST.MF @@ -2,10 +2,10 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin_name Bundle-SymbolicName: org.eclipse.jgit -Bundle-Version: 3.7.1.201504261725-r +Bundle-Version: 3.7.2.qualifier Bundle-Localization: plugin Bundle-Vendor: %provider_name -Export-Package: org.eclipse.jgit.api;version="3.7.1"; +Export-Package: org.eclipse.jgit.api;version="3.7.2"; uses:="org.eclipse.jgit.revwalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.diff, @@ -19,53 +19,53 @@ Export-Package: org.eclipse.jgit.api;version="3.7.1"; org.eclipse.jgit.submodule, org.eclipse.jgit.transport, org.eclipse.jgit.merge", - org.eclipse.jgit.api.errors;version="3.7.1"; + org.eclipse.jgit.api.errors;version="3.7.2"; uses:="org.eclipse.jgit.lib,org.eclipse.jgit.errors", - org.eclipse.jgit.attributes;version="3.7.1", - org.eclipse.jgit.blame;version="3.7.1"; + org.eclipse.jgit.attributes;version="3.7.2", + org.eclipse.jgit.blame;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.revwalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.diff", - org.eclipse.jgit.diff;version="3.7.1"; + org.eclipse.jgit.diff;version="3.7.2"; uses:="org.eclipse.jgit.patch, org.eclipse.jgit.lib, org.eclipse.jgit.treewalk, org.eclipse.jgit.revwalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.util", - org.eclipse.jgit.dircache;version="3.7.1"; + org.eclipse.jgit.dircache;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.treewalk, org.eclipse.jgit.util, org.eclipse.jgit.events, org.eclipse.jgit.attributes", - org.eclipse.jgit.errors;version="3.7.1"; + org.eclipse.jgit.errors;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.internal.storage.pack, org.eclipse.jgit.transport, org.eclipse.jgit.dircache", - org.eclipse.jgit.events;version="3.7.1"; + org.eclipse.jgit.events;version="3.7.2"; uses:="org.eclipse.jgit.lib", - org.eclipse.jgit.fnmatch;version="3.7.1", - org.eclipse.jgit.gitrepo;version="3.7.1"; + org.eclipse.jgit.fnmatch;version="3.7.2", + org.eclipse.jgit.gitrepo;version="3.7.2"; uses:="org.eclipse.jgit.api, org.eclipse.jgit.lib, org.eclipse.jgit.revwalk", - org.eclipse.jgit.gitrepo.internal;version="3.7.1";x-internal:=true, - org.eclipse.jgit.ignore;version="3.7.1", - org.eclipse.jgit.ignore.internal;version="3.7.1";x-friends:="org.eclipse.jgit.test", - org.eclipse.jgit.internal;version="3.7.1";x-friends:="org.eclipse.jgit.test,org.eclipse.jgit.http.test", - org.eclipse.jgit.internal.storage.dfs;version="3.7.1";x-friends:="org.eclipse.jgit.test", - org.eclipse.jgit.internal.storage.file;version="3.7.1"; + org.eclipse.jgit.gitrepo.internal;version="3.7.2";x-internal:=true, + org.eclipse.jgit.ignore;version="3.7.2", + org.eclipse.jgit.ignore.internal;version="3.7.2";x-friends:="org.eclipse.jgit.test", + org.eclipse.jgit.internal;version="3.7.2";x-friends:="org.eclipse.jgit.test,org.eclipse.jgit.http.test", + org.eclipse.jgit.internal.storage.dfs;version="3.7.2";x-friends:="org.eclipse.jgit.test", + org.eclipse.jgit.internal.storage.file;version="3.7.2"; x-friends:="org.eclipse.jgit.test, org.eclipse.jgit.junit, org.eclipse.jgit.junit.http, org.eclipse.jgit.http.server, org.eclipse.jgit.java7.test, org.eclipse.jgit.pgm", - org.eclipse.jgit.internal.storage.pack;version="3.7.1";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm", - org.eclipse.jgit.lib;version="3.7.1"; + org.eclipse.jgit.internal.storage.pack;version="3.7.2";x-friends:="org.eclipse.jgit.junit,org.eclipse.jgit.test,org.eclipse.jgit.pgm", + org.eclipse.jgit.lib;version="3.7.2"; uses:="org.eclipse.jgit.revwalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.util, @@ -75,41 +75,41 @@ Export-Package: org.eclipse.jgit.api;version="3.7.1"; org.eclipse.jgit.treewalk, org.eclipse.jgit.transport, org.eclipse.jgit.submodule", - org.eclipse.jgit.merge;version="3.7.1"; + org.eclipse.jgit.merge;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.treewalk, org.eclipse.jgit.revwalk, org.eclipse.jgit.diff, org.eclipse.jgit.dircache, org.eclipse.jgit.api", - org.eclipse.jgit.nls;version="3.7.1", - org.eclipse.jgit.notes;version="3.7.1"; + org.eclipse.jgit.nls;version="3.7.2", + org.eclipse.jgit.notes;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.treewalk, org.eclipse.jgit.revwalk, org.eclipse.jgit.merge", - org.eclipse.jgit.patch;version="3.7.1"; + org.eclipse.jgit.patch;version="3.7.2"; uses:="org.eclipse.jgit.lib,org.eclipse.jgit.diff", - org.eclipse.jgit.revplot;version="3.7.1"; + org.eclipse.jgit.revplot;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.revwalk", - org.eclipse.jgit.revwalk;version="3.7.1"; + org.eclipse.jgit.revwalk;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.treewalk, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.diff, org.eclipse.jgit.revwalk.filter", - org.eclipse.jgit.revwalk.filter;version="3.7.1"; + org.eclipse.jgit.revwalk.filter;version="3.7.2"; uses:="org.eclipse.jgit.revwalk,org.eclipse.jgit.util", - org.eclipse.jgit.storage.file;version="3.7.1"; + org.eclipse.jgit.storage.file;version="3.7.2"; uses:="org.eclipse.jgit.lib,org.eclipse.jgit.util", - org.eclipse.jgit.storage.pack;version="3.7.1"; + org.eclipse.jgit.storage.pack;version="3.7.2"; uses:="org.eclipse.jgit.lib", - org.eclipse.jgit.submodule;version="3.7.1"; + org.eclipse.jgit.submodule;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.treewalk", - org.eclipse.jgit.transport;version="3.7.1"; + org.eclipse.jgit.transport;version="3.7.2"; uses:="org.eclipse.jgit.transport.resolver, org.eclipse.jgit.revwalk, org.eclipse.jgit.internal.storage.pack, @@ -121,26 +121,26 @@ Export-Package: org.eclipse.jgit.api;version="3.7.1"; org.eclipse.jgit.transport.http, org.eclipse.jgit.errors, org.eclipse.jgit.storage.pack", - org.eclipse.jgit.transport.http;version="3.7.1"; + org.eclipse.jgit.transport.http;version="3.7.2"; uses:="javax.net.ssl", - org.eclipse.jgit.transport.resolver;version="3.7.1"; + org.eclipse.jgit.transport.resolver;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.transport", - org.eclipse.jgit.treewalk;version="3.7.1"; + org.eclipse.jgit.treewalk;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.revwalk, org.eclipse.jgit.attributes, org.eclipse.jgit.treewalk.filter, org.eclipse.jgit.util, org.eclipse.jgit.dircache", - org.eclipse.jgit.treewalk.filter;version="3.7.1"; + org.eclipse.jgit.treewalk.filter;version="3.7.2"; uses:="org.eclipse.jgit.treewalk", - org.eclipse.jgit.util;version="3.7.1"; + org.eclipse.jgit.util;version="3.7.2"; uses:="org.eclipse.jgit.lib, org.eclipse.jgit.transport.http, org.eclipse.jgit.storage.file, org.ietf.jgss", - org.eclipse.jgit.util.io;version="3.7.1" + org.eclipse.jgit.util.io;version="3.7.2" Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: J2SE-1.5 Require-Bundle: com.jcraft.jsch;bundle-version="[0.1.37,0.2.0)" diff --git a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF index 72e2eeb23..00ae94d55 100644 --- a/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF +++ b/org.eclipse.jgit/META-INF/SOURCE-MANIFEST.MF @@ -3,5 +3,5 @@ Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.jgit - Sources Bundle-SymbolicName: org.eclipse.jgit.source Bundle-Vendor: Eclipse.org - JGit -Bundle-Version: 3.7.1.201504261725-r -Eclipse-SourceBundle: org.eclipse.jgit;version="3.7.1.201504261725-r";roots="." +Bundle-Version: 3.7.2.qualifier +Eclipse-SourceBundle: org.eclipse.jgit;version="3.7.2.qualifier";roots="." diff --git a/org.eclipse.jgit/pom.xml b/org.eclipse.jgit/pom.xml index 0b668d146..8a30e6282 100644 --- a/org.eclipse.jgit/pom.xml +++ b/org.eclipse.jgit/pom.xml @@ -53,7 +53,7 @@ org.eclipse.jgit org.eclipse.jgit-parent - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT org.eclipse.jgit diff --git a/pom.xml b/pom.xml index 41fc910a1..6cda5144e 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ org.eclipse.jgit org.eclipse.jgit-parent pom - 3.7.1.201504261725-r + 3.7.2-SNAPSHOT JGit - Parent ${jgit-url} From d3a73c1407f8936cb45516da8d3a2d4dd43c6379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Ar=C3=A8s?= Date: Fri, 10 Apr 2015 09:08:07 -0400 Subject: [PATCH 64/68] Lower log level to warn for handled pack errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pack not found and pack corrupted/invalid are handled by the code (pack is removed from the list) so logging an error and the stacktrace is misleading because it implies that there is an action to take to fix the error. Lower the log level to warn and remove the stacktrace for those 2 types of errors and keep the error log statement for any other. Change-Id: I2400fe5fec07ac6d6c244b852cce615663774e6e Signed-off-by: Hugo Arès Signed-off-by: Matthias Sohn --- .../storage/file/ObjectDirectory.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java index 687408e19..9001dc349 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java @@ -554,22 +554,31 @@ void selectObjectRepresentation(PackWriter packer, ObjectToPack otp, } private void handlePackError(IOException e, PackFile p) { - String tmpl; + String warnTmpl = null; if ((e instanceof CorruptObjectException) || (e instanceof PackInvalidException)) { - tmpl = JGitText.get().corruptPack; + warnTmpl = JGitText.get().corruptPack; // Assume the pack is corrupted, and remove it from the list. removePack(p); } else if (e instanceof FileNotFoundException) { - tmpl = JGitText.get().packWasDeleted; + warnTmpl = JGitText.get().packWasDeleted; removePack(p); + } + if (warnTmpl != null) { + if (LOG.isDebugEnabled()) { + LOG.debug(MessageFormat.format(warnTmpl, + p.getPackFile().getAbsolutePath()), e); + } else { + LOG.warn(MessageFormat.format(warnTmpl, + p.getPackFile().getAbsolutePath())); + } } else { - tmpl = JGitText.get().exceptionWhileReadingPack; // Don't remove the pack from the list, as the error may be // transient. + LOG.error(MessageFormat.format( + JGitText.get().exceptionWhileReadingPack, p.getPackFile() + .getAbsolutePath()), e); } - LOG.error(MessageFormat.format(tmpl, - p.getPackFile().getAbsolutePath()), e); } @Override From ae4b72d50e84f9af7978075d4919ad4d2b1d018a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Ar=C3=A8s?= Date: Tue, 7 Apr 2015 11:17:06 -0400 Subject: [PATCH 65/68] Remove pack from list when file handle is stale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This error happens on nfs file system when you try to read a file that was deleted or replaced. When the error happens because the file was deleted, removing it from the list is the proper way to handle the error, same use case as FileNotFoundException. When the error happens because the file was replaced, removing the file from the list will cause the file to be re-read so it will get the latest version of the file. Bug: 462868 Change-Id: I368af61a6cf73706601a3e4df4ef24f0aa0465c5 Signed-off-by: Hugo Arès --- .../resources/org/eclipse/jgit/internal/JGitText.properties | 1 + .../src/org/eclipse/jgit/internal/JGitText.java | 1 + .../eclipse/jgit/internal/storage/file/ObjectDirectory.java | 6 ++++++ 3 files changed, 8 insertions(+) diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties index 10f5339ae..602861859 100644 --- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties +++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties @@ -394,6 +394,7 @@ packfileCorruptionDetected=Packfile corruption detected: {0} packFileInvalid=Pack file invalid: {0} packfileIsTruncated=Packfile {0} is truncated. packfileIsTruncatedNoParam=Packfile is truncated. +packHandleIsStale=Pack file {0} handle is stale, removing it from pack list packHasUnresolvedDeltas=pack has unresolved deltas packingCancelledDuringObjectsWriting=Packing cancelled during objects writing packObjectCountMismatch=Pack object count mismatch: pack {0} index {1}: {2} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java index 2448bf896..3077e18c1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java @@ -453,6 +453,7 @@ public static JGitText get() { /***/ public String packFileInvalid; /***/ public String packfileIsTruncated; /***/ public String packfileIsTruncatedNoParam; + /***/ public String packHandleIsStale; /***/ public String packHasUnresolvedDeltas; /***/ public String packingCancelledDuringObjectsWriting; /***/ public String packObjectCountMismatch; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java index 9001dc349..796109aee 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectory.java @@ -114,6 +114,8 @@ public class ObjectDirectory extends FileObjectDatabase { /** Maximum number of candidates offered as resolutions of abbreviation. */ private static final int RESOLVE_ABBREV_LIMIT = 256; + private static final String STALE_FILE_HANDLE_MSG = "stale file handle"; //$NON-NLS-1$ + private final Config config; private final File objects; @@ -563,6 +565,10 @@ private void handlePackError(IOException e, PackFile p) { } else if (e instanceof FileNotFoundException) { warnTmpl = JGitText.get().packWasDeleted; removePack(p); + } else if (e.getMessage() != null + && e.getMessage().toLowerCase().contains(STALE_FILE_HANDLE_MSG)) { + warnTmpl = JGitText.get().packHandleIsStale; + removePack(p); } if (warnTmpl != null) { if (LOG.isDebugEnabled()) { From 4feffb3bf58d9a42be13624ef8ecb1775a40eb8d Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Wed, 29 Apr 2015 21:56:28 -0700 Subject: [PATCH 66/68] Add fsck.allowInvalidPersonIdent to accept invalid author/committers A larger than expected number of real-world repositories found on the Internet contain invalid author, committer and tagger lines in their history. Many of these seem to be caused by users misusing the user.name and user.email fields, e.g.: [user] name = Au Thor email = author@example.com that some version of Git (or a reimplementation thereof) copied directly into the object header. These headers are not valid and are rejected by a strict fsck, making it impossible to transfer the repository with JGit/EGit. Another form is an invalid committer line with double negative for the time zone, e.g. committer Au Thor 1288373970 --700 The real world is messy. :( Allow callers and users to weaken the fsck settings to accept these sorts of breakages if they really want to work on a repo that has broken history. Most routines will still function fine, however commit timestamp sorting in RevWalk may become confused by a corrupt committer line and sort commits out of order. This is mostly fine if the corrupted chain is shorter than the slop window. Change-Id: I6d529542c765c131de590f4f7ef8e7c1c8cb9db9 --- .../eclipse/jgit/lib/ObjectCheckerTest.java | 41 ++++++++++++++++++- .../org/eclipse/jgit/lib/ObjectChecker.java | 21 ++++++++++ .../jgit/transport/BaseReceivePack.java | 4 ++ .../jgit/transport/TransferConfig.java | 4 ++ 4 files changed, 69 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java index c6578ccfa..274757d95 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java @@ -120,6 +120,42 @@ public void testValidCommitBlankAuthor() throws CorruptObjectException { checker.check(Constants.OBJ_COMMIT, data); } + @Test + public void testCommitCorruptAuthor() throws CorruptObjectException { + StringBuilder b = new StringBuilder(); + b.append("tree be9bfa841874ccc9f2ef7c48d0c76226f89b7189\n"); + b.append("author b 0 +0000\n"); + b.append("committer <> 0 +0000\n"); + + byte[] data = Constants.encodeASCII(b.toString()); + try { + checker.checkCommit(data); + fail("Did not catch corrupt object"); + } catch (CorruptObjectException e) { + assertEquals("invalid author", e.getMessage()); + } + checker.setAllowInvalidPersonIdent(true); + checker.checkCommit(data); + } + + @Test + public void testCommitCorruptCommitter() throws CorruptObjectException { + StringBuilder b = new StringBuilder(); + b.append("tree be9bfa841874ccc9f2ef7c48d0c76226f89b7189\n"); + b.append("author <> 0 +0000\n"); + b.append("committer b 0 +0000\n"); + + byte[] data = Constants.encodeASCII(b.toString()); + try { + checker.checkCommit(data); + fail("Did not catch corrupt object"); + } catch (CorruptObjectException e) { + assertEquals("invalid committer", e.getMessage()); + } + checker.setAllowInvalidPersonIdent(true); + checker.checkCommit(data); + } + @Test public void testValidCommit1Parent() throws CorruptObjectException { final StringBuilder b = new StringBuilder(); @@ -940,7 +976,8 @@ public void testValidTagHasNoTaggerHeader() throws CorruptObjectException { } @Test - public void testInvalidTagInvalidTaggerHeader1() { + public void testInvalidTagInvalidTaggerHeader1() + throws CorruptObjectException { final StringBuilder b = new StringBuilder(); b.append("object "); @@ -958,6 +995,8 @@ public void testInvalidTagInvalidTaggerHeader1() { } catch (CorruptObjectException e) { assertEquals("invalid tagger", e.getMessage()); } + checker.setAllowInvalidPersonIdent(true); + checker.checkTag(data); } @Test diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java index 8435c9a64..359b59295 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java @@ -104,6 +104,8 @@ public class ObjectChecker { private final MutableInteger ptrout = new MutableInteger(); private boolean allowZeroMode; + + private boolean allowInvalidPersonIdent; private boolean windows; private boolean macosx; @@ -124,6 +126,22 @@ public ObjectChecker setAllowLeadingZeroFileMode(boolean allow) { return this; } + /** + * Enable accepting invalid author, committer and tagger identities. + *

+ * Some broken Git versions/libraries allowed users to create commits and + * tags with invalid formatting between the name, email and timestamp. + * + * @param allow + * if true accept invalid person identity strings. + * @return {@code this}. + * @since 4.0 + */ + public ObjectChecker setAllowInvalidPersonIdent(boolean allow) { + allowInvalidPersonIdent = allow; + return this; + } + /** * Restrict trees to only names legal on Windows platforms. *

@@ -198,6 +216,9 @@ private int id(final byte[] raw, final int ptr) { } private int personIdent(final byte[] raw, int ptr) { + if (allowInvalidPersonIdent) + return nextLF(raw, ptr) - 1; + final int emailB = nextLF(raw, ptr, '<'); if (emailB == ptr || raw[emailB - 1] != '<') return -1; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java index b7a599bad..cf1d92e8e 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java @@ -289,6 +289,7 @@ public ReceiveConfig parse(final Config cfg) { final boolean checkReceivedObjects; final boolean allowLeadingZeroFileMode; + final boolean allowInvalidPersonIdent; final boolean safeForWindows; final boolean safeForMacOS; @@ -306,6 +307,8 @@ public ReceiveConfig parse(final Config cfg) { config.getBoolean("transfer", "fsckobjects", false)); //$NON-NLS-1$ //$NON-NLS-2$ allowLeadingZeroFileMode = checkReceivedObjects && config.getBoolean("fsck", "allowLeadingZeroFileMode", false); //$NON-NLS-1$ //$NON-NLS-2$ + allowInvalidPersonIdent = checkReceivedObjects + && config.getBoolean("fsck", "allowInvalidPersonIdent", false); //$NON-NLS-1$ //$NON-NLS-2$ safeForWindows = checkReceivedObjects && config.getBoolean("fsck", "safeForWindows", false); //$NON-NLS-1$ //$NON-NLS-2$ safeForMacOS = checkReceivedObjects @@ -326,6 +329,7 @@ ObjectChecker newObjectChecker() { return null; return new ObjectChecker() .setAllowLeadingZeroFileMode(allowLeadingZeroFileMode) + .setAllowInvalidPersonIdent(allowInvalidPersonIdent) .setSafeForWindows(safeForWindows) .setSafeForMacOS(safeForMacOS); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransferConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransferConfig.java index 1de91a57e..60043fff7 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransferConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransferConfig.java @@ -67,6 +67,7 @@ public TransferConfig parse(final Config cfg) { private final boolean checkReceivedObjects; private final boolean allowLeadingZeroFileMode; + private final boolean allowInvalidPersonIdent; private final boolean safeForWindows; private final boolean safeForMacOS; private final boolean allowTipSha1InWant; @@ -82,6 +83,8 @@ private TransferConfig(final Config rc) { rc.getBoolean("transfer", "fsckobjects", false)); //$NON-NLS-1$ //$NON-NLS-2$ allowLeadingZeroFileMode = checkReceivedObjects && rc.getBoolean("fsck", "allowLeadingZeroFileMode", false); //$NON-NLS-1$ //$NON-NLS-2$ + allowInvalidPersonIdent = checkReceivedObjects + && rc.getBoolean("fsck", "allowInvalidPersonIdent", false); //$NON-NLS-1$ //$NON-NLS-2$ safeForWindows = checkReceivedObjects && rc.getBoolean("fsck", "safeForWindows", //$NON-NLS-1$ //$NON-NLS-2$ SystemReader.getInstance().isWindows()); @@ -113,6 +116,7 @@ public ObjectChecker newObjectChecker() { return null; return new ObjectChecker() .setAllowLeadingZeroFileMode(allowLeadingZeroFileMode) + .setAllowInvalidPersonIdent(allowInvalidPersonIdent) .setSafeForWindows(safeForWindows) .setSafeForMacOS(safeForMacOS); } From 4a984e20332a765a81cadeaa4875b228ebf290fb Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Thu, 30 Apr 2015 12:43:46 -0700 Subject: [PATCH 67/68] Support agent= capability in wire protocol Since git-core ff5effd (v1.7.12.1) the native wire protocol transmits the server and client implementation and version strings using capability "agent=git/1.7.12.1" or similar. Support this in JGit and hang the implementation data off UploadPack and ReceivePack. On HTTP transports default to the User-Agent HTTP header until the client overrides this with the optional capability string in the first line. Extract the user agent string into a UserAgent class under transport where it can be specified to a different value if the application's build process has broken the Implementation-Version header in the JGit package. Change-Id: Icfc6524d84a787386d1786310b421b2f92ae9e65 --- .../jgit/http/server/ReceivePackServlet.java | 4 + .../jgit/http/server/UploadPackServlet.java | 4 + .../jgit/transport/BaseConnection.java | 24 +++ .../jgit/transport/BasePackConnection.java | 14 ++ .../transport/BasePackFetchConnection.java | 1 + .../transport/BasePackPushConnection.java | 1 + .../jgit/transport/BaseReceivePack.java | 22 +++ .../eclipse/jgit/transport/Connection.java | 9 ++ .../eclipse/jgit/transport/FetchProcess.java | 1 + .../jgit/transport/GitProtocolConstants.java | 7 + .../transport/InternalHttpServerGlue.java | 80 ++++++++++ .../jgit/transport/OperationResult.java | 13 ++ .../eclipse/jgit/transport/PushProcess.java | 1 + .../eclipse/jgit/transport/RefAdvertiser.java | 18 ++- .../eclipse/jgit/transport/TransportHttp.java | 40 +++-- .../eclipse/jgit/transport/UploadPack.java | 27 +++- .../org/eclipse/jgit/transport/UserAgent.java | 147 ++++++++++++++++++ .../org/eclipse/jgit/util/HttpSupport.java | 6 + 18 files changed, 392 insertions(+), 27 deletions(-) create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalHttpServerGlue.java create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/transport/UserAgent.java diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java index d1c258047..a8e312d3f 100644 --- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java +++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/ReceivePackServlet.java @@ -76,6 +76,7 @@ import org.eclipse.jgit.errors.UnpackException; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.transport.InternalHttpServerGlue; import org.eclipse.jgit.transport.ReceivePack; import org.eclipse.jgit.transport.RefAdvertiser.PacketLineOutRefAdvertiser; import org.eclipse.jgit.transport.resolver.ReceivePackFactory; @@ -100,6 +101,9 @@ protected void begin(HttpServletRequest req, Repository db) throws IOException, ServiceNotEnabledException, ServiceNotAuthorizedException { ReceivePack rp = receivePackFactory.create(req, db); + InternalHttpServerGlue.setPeerUserAgent( + rp, + req.getHeader(HDR_USER_AGENT)); req.setAttribute(ATTRIBUTE_HANDLER, rp); } diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java index c5272b55e..7aefcbd80 100644 --- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java +++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/UploadPackServlet.java @@ -74,6 +74,7 @@ import javax.servlet.http.HttpServletResponse; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.transport.InternalHttpServerGlue; import org.eclipse.jgit.transport.RefAdvertiser.PacketLineOutRefAdvertiser; import org.eclipse.jgit.transport.UploadPack; import org.eclipse.jgit.transport.UploadPackInternalServerErrorException; @@ -100,6 +101,9 @@ protected void begin(HttpServletRequest req, Repository db) throws IOException, ServiceNotEnabledException, ServiceNotAuthorizedException { UploadPack up = uploadPackFactory.create(req, db); + InternalHttpServerGlue.setPeerUserAgent( + up, + req.getHeader(HDR_USER_AGENT)); req.setAttribute(ATTRIBUTE_HANDLER, up); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseConnection.java index 1072d58ad..59ff1bd99 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseConnection.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseConnection.java @@ -65,6 +65,8 @@ public abstract class BaseConnection implements Connection { private Map advertisedRefs = Collections.emptyMap(); + private String peerUserAgent; + private boolean startedOperation; private Writer messageWriter; @@ -85,6 +87,28 @@ public String getMessages() { return messageWriter != null ? messageWriter.toString() : ""; //$NON-NLS-1$ } + /** + * User agent advertised by the remote server. + * + * @return agent (version of Git) running on the remote server. Null if the + * server does not advertise this version. + * @since 4.0 + */ + public String getPeerUserAgent() { + return peerUserAgent; + } + + /** + * Remember the remote peer's agent. + * + * @param agent + * remote peer agent string. + * @since 4.0 + */ + protected void setPeerUserAgent(String agent) { + peerUserAgent = agent; + } + public abstract void close(); /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java index 8f825ea14..7f9cec734 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackConnection.java @@ -46,6 +46,8 @@ package org.eclipse.jgit.transport; +import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_AGENT; + import java.io.EOFException; import java.io.IOException; import java.io.InputStream; @@ -275,6 +277,18 @@ protected boolean wantCapability(final StringBuilder b, final String option) { return true; } + protected void addUserAgentCapability(StringBuilder b) { + String a = UserAgent.get(); + if (a != null && UserAgent.hasAgent(remoteCapablities)) { + b.append(' ').append(OPTION_AGENT).append('=').append(a); + } + } + + @Override + public String getPeerUserAgent() { + return UserAgent.getAgent(remoteCapablities, super.getPeerUserAgent()); + } + private PackProtocolException duplicateAdvertisement(final String name) { return new PackProtocolException(uri, MessageFormat.format(JGitText.get().duplicateAdvertisementsOf, name)); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java index 4036c0028..a6fc63359 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java @@ -521,6 +521,7 @@ else if (wantCapability(line, OPTION_SIDE_BAND)) OPTION_MULTI_ACK_DETAILED)); } + addUserAgentCapability(line); return line.toString(); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java index 863934da1..1e5b8e8ad 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java @@ -268,6 +268,7 @@ private String enableCapabilities(final ProgressMonitor monitor, outputStream); pckIn = new PacketLineIn(in); } + addUserAgentCapability(line); if (line.length() > 0) line.setCharAt(0, '\0'); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java index cf1d92e8e..cf6b2fd3d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BaseReceivePack.java @@ -48,6 +48,7 @@ import static org.eclipse.jgit.transport.GitProtocolConstants.CAPABILITY_OFS_DELTA; import static org.eclipse.jgit.transport.GitProtocolConstants.CAPABILITY_REPORT_STATUS; import static org.eclipse.jgit.transport.GitProtocolConstants.CAPABILITY_SIDE_BAND_64K; +import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_AGENT; import static org.eclipse.jgit.transport.SideBandOutputStream.CH_DATA; import static org.eclipse.jgit.transport.SideBandOutputStream.CH_PROGRESS; import static org.eclipse.jgit.transport.SideBandOutputStream.MAX_BUF; @@ -224,6 +225,7 @@ public Set getCapabilities() { /** Capabilities requested by the client. */ private Set enabledCapabilities; + String userAgent; private Set clientShallowCommits; private List commands; @@ -738,6 +740,25 @@ public boolean isSideBand() throws RequestNotYetReadException { return enabledCapabilities.contains(CAPABILITY_SIDE_BAND_64K); } + /** + * Get the user agent of the client. + *

+ * If the client is new enough to use {@code agent=} capability that value + * will be returned. Older HTTP clients may also supply their version using + * the HTTP {@code User-Agent} header. The capability overrides the HTTP + * header if both are available. + *

+ * When an HTTP request has been received this method returns the HTTP + * {@code User-Agent} header value until capabilities have been parsed. + * + * @return user agent supplied by the client. Available only if the client + * is new enough to advertise its user agent. + * @since 4.0 + */ + public String getPeerUserAgent() { + return UserAgent.getAgent(enabledCapabilities, userAgent); + } + /** @return all of the command received by the current request. */ public List getAllCommands() { return Collections.unmodifiableList(commands); @@ -955,6 +976,7 @@ public void sendAdvertisedRefs(final RefAdvertiser adv) adv.advertiseCapability(CAPABILITY_ATOMIC); if (allowOfsDelta) adv.advertiseCapability(CAPABILITY_OFS_DELTA); + adv.advertiseCapability(OPTION_AGENT, UserAgent.get()); adv.send(getAdvertisedOrDefaultRefs()); for (ObjectId obj : advertisedHaves) adv.advertiseHave(obj); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/Connection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Connection.java index e386c26c1..0ff9fcea7 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/Connection.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Connection.java @@ -127,4 +127,13 @@ public interface Connection { * remote produced no additional messages. */ public String getMessages(); + + /** + * User agent advertised by the remote server. + * + * @return agent (version of Git) running on the remote server. Null if the + * server does not advertise this version. + * @since 4.0 + */ + public String getPeerUserAgent(); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java index d2902a35b..9aae1c37a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchProcess.java @@ -136,6 +136,7 @@ private void executeImp(final ProgressMonitor monitor, conn = transport.openFetch(); try { result.setAdvertisedRefs(transport.getURI(), conn.getRefsMap()); + result.peerUserAgent = conn.getPeerUserAgent(); final Set matched = new HashSet(); for (final RefSpec spec : toFetch) { if (spec.getSource() == null) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/GitProtocolConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/GitProtocolConstants.java index 27052db67..8d9d2b718 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/GitProtocolConstants.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/GitProtocolConstants.java @@ -186,6 +186,13 @@ public class GitProtocolConstants { */ public static final String CAPABILITY_PUSH_CERT = "push-cert"; //$NON-NLS-1$ + /** + * Implementation name and version of the client or server. + * + * @since 4.0 + */ + public static final String OPTION_AGENT = "agent"; //$NON-NLS-1$ + static enum MultiAck { OFF, CONTINUE, DETAILED; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalHttpServerGlue.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalHttpServerGlue.java new file mode 100644 index 000000000..fe7aaf769 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/InternalHttpServerGlue.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2015, Google Inc. + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.eclipse.jgit.transport; + +/** + * Internal API to to assist {@code org.eclipse.jgit.http.server}. + *

+ * Do not call. + * + * @since 4.0 + */ +public class InternalHttpServerGlue { + /** + * Apply a default user agent for a request. + * + * @param up + * current UploadPack instance. + * @param agent + * user agent string from the HTTP headers. + */ + public static void setPeerUserAgent(UploadPack up, String agent) { + up.userAgent = agent; + } + + /** + * Apply a default user agent for a request. + * + * @param rp + * current ReceivePack instance. + * @param agent + * user agent string from the HTTP headers. + */ + public static void setPeerUserAgent(ReceivePack rp, String agent) { + rp.userAgent = agent; + } + + private InternalHttpServerGlue() { + } +} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/OperationResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/OperationResult.java index b4a48b016..ad51f3e70 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/OperationResult.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/OperationResult.java @@ -68,6 +68,8 @@ public abstract class OperationResult { StringBuilder messageBuffer; + String peerUserAgent; + /** * Get the URI this result came from. *

@@ -165,4 +167,15 @@ void addMessages(final String msg) { messageBuffer.append('\n'); } } + + /** + * Get the user agent advertised by the peer server, if available. + * + * @return advertised user agent, e.g. {@code "JGit/4.0"}. Null if the peer + * did not advertise version information. + * @since 4.0 + */ + public String getPeerUserAgent() { + return peerUserAgent; + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushProcess.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushProcess.java index 53fba5557..00f84f70e 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushProcess.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/PushProcess.java @@ -155,6 +155,7 @@ PushResult execute(final ProgressMonitor monitor) try { res.setAdvertisedRefs(transport.getURI(), connection .getRefsMap()); + res.peerUserAgent = connection.getPeerUserAgent(); res.setRemoteUpdates(toPush); monitor.endTask(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java index 76547a628..f72a4b2b3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java @@ -147,6 +147,21 @@ public void advertiseCapability(String name) { capablities.add(name); } + /** + * Add one protocol capability with a value ({@code "name=value"}). + * + * @param name + * name of the capability. + * @param value + * value. If null the capability will not be added. + * @since 4.0 + */ + public void advertiseCapability(String name, String value) { + if (value != null) { + capablities.add(name + '=' + value); + } + } + /** * Add a symbolic ref to capabilities. *

@@ -164,8 +179,7 @@ public void advertiseCapability(String name) { * @since 3.6 */ public void addSymref(String from, String to) { - String symref = String.format("%s=%s:%s", OPTION_SYMREF, from, to); //$NON-NLS-1$ - advertiseCapability(symref); + advertiseCapability(OPTION_SYMREF, from + ':' + to); } /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java index 82d1737b9..b23771e95 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java @@ -134,8 +134,6 @@ public class TransportHttp extends HttpTransport implements WalkTransport, private static final String SVC_RECEIVE_PACK = "git-receive-pack"; //$NON-NLS-1$ - private static final String userAgent = computeUserAgent(); - static final TransportProtocol PROTO_HTTP = new TransportProtocol() { private final String[] schemeNames = { "http", "https" }; //$NON-NLS-1$ //$NON-NLS-2$ @@ -204,17 +202,6 @@ public Transport open(URIish uri, Repository local, String remoteName) } }; - private static String computeUserAgent() { - String version; - final Package pkg = TransportHttp.class.getPackage(); - if (pkg != null && pkg.getImplementationVersion() != null) { - version = pkg.getImplementationVersion(); - } else { - version = "unknown"; //$NON-NLS-1$ - } - return "JGit/" + version; //$NON-NLS-1$ - } - private static final Config.SectionParser HTTP_KEY = new SectionParser() { public HttpConfig parse(final Config cfg) { return new HttpConfig(cfg); @@ -309,16 +296,17 @@ public FetchConnection openFetch() throws TransportException, final HttpConnection c = connect(service); final InputStream in = openInputStream(c); try { + BaseConnection f; if (isSmartHttp(c, service)) { readSmartHeaders(in, service); - return new SmartHttpFetchConnection(in); - + f = new SmartHttpFetchConnection(in); } else { // Assume this server doesn't support smart HTTP fetch // and fall back on dumb object walking. - // - return newDumbConnection(in); + f = newDumbConnection(in); } + f.setPeerUserAgent(c.getHeaderField(HttpSupport.HDR_SERVER)); + return (FetchConnection) f; } finally { in.close(); } @@ -331,7 +319,7 @@ public FetchConnection openFetch() throws TransportException, } } - private FetchConnection newDumbConnection(InputStream in) + private WalkFetchConnection newDumbConnection(InputStream in) throws IOException, PackProtocolException { HttpObjectDB d = new HttpObjectDB(objectsUrl); BufferedReader br = toBufferedReader(in); @@ -400,9 +388,7 @@ public PushConnection openPush() throws NotSupportedException, final InputStream in = openInputStream(c); try { if (isSmartHttp(c, service)) { - readSmartHeaders(in, service); - return new SmartHttpPushConnection(in); - + return smartPush(service, c, in); } else if (!useSmartHttp) { final String msg = JGitText.get().smartHTTPPushDisabled; throw new NotSupportedException(msg); @@ -423,6 +409,14 @@ public PushConnection openPush() throws NotSupportedException, } } + private PushConnection smartPush(String service, HttpConnection c, + InputStream in) throws IOException, TransportException { + readSmartHeaders(in, service); + SmartHttpPushConnection p = new SmartHttpPushConnection(in); + p.setPeerUserAgent(c.getHeaderField(HttpSupport.HDR_SERVER)); + return p; + } + @Override public void close() { // No explicit connections are maintained. @@ -551,7 +545,9 @@ protected HttpConnection httpOpen(String method, URL u) conn.setUseCaches(false); conn.setRequestProperty(HDR_ACCEPT_ENCODING, ENCODING_GZIP); conn.setRequestProperty(HDR_PRAGMA, "no-cache"); //$NON-NLS-1$ - conn.setRequestProperty(HDR_USER_AGENT, userAgent); + if (UserAgent.get() != null) { + conn.setRequestProperty(HDR_USER_AGENT, UserAgent.get()); + } int timeOut = getTimeout(); if (timeOut != -1) { int effTimeOut = timeOut * 1000; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java index 51718c027..3afdb6114 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -44,6 +44,7 @@ package org.eclipse.jgit.transport; import static org.eclipse.jgit.lib.RefDatabase.ALL; +import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_AGENT; import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_ALLOW_TIP_SHA1_IN_WANT; import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_INCLUDE_TAG; import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_MULTI_ACK; @@ -253,6 +254,7 @@ public Set getOptions() { /** Capabilities requested by the client. */ private Set options; + String userAgent; /** Raw ObjectIds the client has asked for, before validating them. */ private final Set wantIds = new HashSet(); @@ -806,6 +808,7 @@ public void sendAdvertisedRefs(final RefAdvertiser adv) throws IOException, || policy == RequestPolicy.REACHABLE_COMMIT_TIP || policy == null) adv.advertiseCapability(OPTION_ALLOW_TIP_SHA1_IN_WANT); + adv.advertiseCapability(OPTION_AGENT, UserAgent.get()); adv.setDerefTags(true); Map refs = getAdvertisedOrDefaultRefs(); findSymrefs(adv, refs); @@ -891,12 +894,30 @@ private void recvWants() throws IOException { * @since 4.0 */ public int getDepth() { - if (options == null) { - throw new IllegalStateException("do not call getDepth() before recvWants()"); - } + if (options == null) + throw new RequestNotYetReadException(); return depth; } + /** + * Get the user agent of the client. + *

+ * If the client is new enough to use {@code agent=} capability that value + * will be returned. Older HTTP clients may also supply their version using + * the HTTP {@code User-Agent} header. The capability overrides the HTTP + * header if both are available. + *

+ * When an HTTP request has been received this method returns the HTTP + * {@code User-Agent} header value until capabilities have been parsed. + * + * @return user agent supplied by the client. Available only if the client + * is new enough to advertise its user agent. + * @since 4.0 + */ + public String getPeerUserAgent() { + return UserAgent.getAgent(options, userAgent); + } + private boolean negotiate() throws IOException { okToGiveUp = Boolean.FALSE; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UserAgent.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UserAgent.java new file mode 100644 index 000000000..eadb92dd5 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UserAgent.java @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2015, Google Inc. + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.eclipse.jgit.transport; + +import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_AGENT; + +import java.util.Set; + +import org.eclipse.jgit.util.StringUtils; + +/** + * User agent to be reported by this JGit client and server on the network. + *

+ * On HTTP transports this user agent string is always supplied by the JGit + * client in the {@code User-Agent} HTTP header. + *

+ * On native transports this user agent string is always sent when JGit is a + * server. When JGit is a client the user agent string will be supplied to the + * remote server only if the remote server advertises its own agent identity. + * + * @since 4.0 + */ +public class UserAgent { + private static volatile String userAgent = computeUserAgent(); + + private static String computeUserAgent() { + return clean("JGit/" + computeVersion()); //$NON-NLS-1$ + } + + private static String computeVersion() { + Package pkg = UserAgent.class.getPackage(); + if (pkg != null) { + String ver = pkg.getImplementationVersion(); + if (!StringUtils.isEmptyOrNull(ver)) { + return ver; + } + } + return "unknown"; //$NON-NLS-1$ + } + + private static String clean(String s) { + s = s.trim(); + StringBuilder b = new StringBuilder(s.length()); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c <= 32 || c >= 127) { + if (b.length() > 0 && b.charAt(b.length() - 1) == '.') + continue; + c = '.'; + } + b.append(c); + } + return b.length() > 0 ? b.toString() : null; + } + + /** + * Get the user agent string advertised by JGit. + * + * @return a string similar to {@code "JGit/4.0"}; null if the agent has + * been cleared and should not be shared with a peer. + */ + public static String get() { + return userAgent; + } + + /** + * Change the user agent string advertised by JGit. + *

+ * The new string should start with {@code "JGit/"} (for example + * {@code "JGit/4.0"}) to advertise the implementation as JGit based. + *

+ * Spaces and other whitespace should be avoided as these will be + * automatically converted to {@code "."}. + *

+ * User agent strings are restricted to printable ASCII. + * + * @param agent + * new user agent string for this running JGit library. Setting + * to null or empty string will avoid sending any identification + * to the peer. + */ + public static void set(String agent) { + userAgent = StringUtils.isEmptyOrNull(agent) ? null : clean(agent); + } + + static String getAgent(Set options, String transportAgent) { + if (options == null || options.isEmpty()) { + return transportAgent; + } + for (String o : options) { + if (o.startsWith(OPTION_AGENT) + && o.length() > OPTION_AGENT.length() + && o.charAt(OPTION_AGENT.length()) == '=') { + return o.substring(OPTION_AGENT.length() + 1); + } + } + return transportAgent; + } + + static boolean hasAgent(Set options) { + return getAgent(options, null) != null; + } + + private UserAgent() { + } +} 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 37c9f7b8a..8b4ad0aa2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/HttpSupport.java @@ -74,6 +74,12 @@ public class HttpSupport { /** The {@code User-Agent} header. */ public static final String HDR_USER_AGENT = "User-Agent"; //$NON-NLS-1$ + /** + * The {@code Server} header. + * @since 4.0 + */ + public static final String HDR_SERVER = "Server"; //$NON-NLS-1$ + /** The {@code Date} header. */ public static final String HDR_DATE = "Date"; //$NON-NLS-1$ From 4f9bdc8b8478480ffceb652aab331a3a4fa99c71 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Mon, 4 May 2015 08:56:28 +0200 Subject: [PATCH 68/68] Use CBI eclipse-jarsigner-plugin 1.1.2-SNAPSHOT CBI recently fixed a couple of resource leaks which probably caused jar signing failures on Hudson (bug 464947). JGit builds were also affected. Hence use version 1.1.2-SNAPSHOT until a new release is available. Bug:464947 Change-Id: I7fb4a65f888194f7209c866cd58551891c89fb7a Signed-off-by: Matthias Sohn --- org.eclipse.jgit.packaging/pom.xml | 6 +++++- pom.xml | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit.packaging/pom.xml b/org.eclipse.jgit.packaging/pom.xml index 3f552b666..5c6d51a4d 100644 --- a/org.eclipse.jgit.packaging/pom.xml +++ b/org.eclipse.jgit.packaging/pom.xml @@ -68,6 +68,10 @@ repo.eclipse.org.cbi-releases https://repo.eclipse.org/content/repositories/cbi-releases/ + + repo.eclipse.org.cbi-snapshots + https://repo.eclipse.org/content/repositories/cbi-snapshots/ + @@ -210,7 +214,7 @@ org.eclipse.cbi.maven.plugins eclipse-jarsigner-plugin - 1.1.1 + 1.1.2-SNAPSHOT org.codehaus.mojo diff --git a/pom.xml b/pom.xml index 4b8ac43eb..1e00f2457 100644 --- a/pom.xml +++ b/pom.xml @@ -210,6 +210,10 @@ repo.eclipse.org.cbi-releases https://repo.eclipse.org/content/repositories/cbi-releases/ + + repo.eclipse.org.cbi-snapshots + https://repo.eclipse.org/content/repositories/cbi-snapshots/ + @@ -346,7 +350,7 @@ org.eclipse.cbi.maven.plugins eclipse-jarsigner-plugin - 1.1.1 + 1.1.2-SNAPSHOT org.eclipse.tycho.extras