* stable-4.9: Ignore API warnings Fix photon target platform to use photon version of org.eclipse.osgi Update Photon orbit repository to R20180606145124 Suppress warning for trying to delete non-empty directory Fix fetching with duplicate ref updates Fetch(Process): should tolerate duplicate refspecs FetchCommandTest: test add/update/delete fetch Change-Id: I2a83c059b7014c2a9e6267c963422c7785b23f17 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>tags/v5.1.0.201808281540-m3
@@ -1,7 +1,7 @@ | |||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> | |||
<?pde?> | |||
<!-- generated with https://github.com/mbarbero/fr.obeo.releng.targetplatform --> | |||
<target name="jgit-4.8" sequenceNumber="1512295246"> | |||
<target name="jgit-4.8" sequenceNumber="1535124646"> | |||
<locations> | |||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit"> | |||
<unit id="org.eclipse.jetty.client" version="9.4.8.v20171121"/> | |||
@@ -33,16 +33,16 @@ | |||
<unit id="org.apache.commons.logging.source" version="1.1.1.v201101211721"/> | |||
<unit id="org.apache.httpcomponents.httpcore" version="4.4.6.v20170210-0925"/> | |||
<unit id="org.apache.httpcomponents.httpcore.source" version="4.4.6.v20170210-0925"/> | |||
<unit id="org.apache.httpcomponents.httpclient" version="4.5.2.v20170210-0925"/> | |||
<unit id="org.apache.httpcomponents.httpclient.source" version="4.5.2.v20170210-0925"/> | |||
<unit id="org.apache.httpcomponents.httpclient" version="4.5.2.v20180410-1551"/> | |||
<unit id="org.apache.httpcomponents.httpclient.source" version="4.5.2.v20180410-1551"/> | |||
<unit id="org.apache.log4j" version="1.2.15.v201012070815"/> | |||
<unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/> | |||
<unit id="org.kohsuke.args4j" version="2.33.0.v20160323-2218"/> | |||
<unit id="org.kohsuke.args4j.source" version="2.33.0.v20160323-2218"/> | |||
<unit id="org.hamcrest.core" version="1.3.0.v201303031735"/> | |||
<unit id="org.hamcrest.core.source" version="1.3.0.v201303031735"/> | |||
<unit id="org.hamcrest.library" version="1.3.0.v201505072020"/> | |||
<unit id="org.hamcrest.library.source" version="1.3.0.v201505072020"/> | |||
<unit id="org.hamcrest.core" version="1.3.0.v20180420-1519"/> | |||
<unit id="org.hamcrest.core.source" version="1.3.0.v20180420-1519"/> | |||
<unit id="org.hamcrest.library" version="1.3.0.v20180524-2246"/> | |||
<unit id="org.hamcrest.library.source" version="1.3.0.v20180524-2246"/> | |||
<unit id="javaewah" version="1.1.6.v20160919-1400"/> | |||
<unit id="javaewah.source" version="1.1.6.v20160919-1400"/> | |||
<unit id="org.objenesis" version="1.0.0.v201505121915"/> | |||
@@ -62,11 +62,11 @@ | |||
<unit id="org.slf4j.api.source" version="1.7.2.v20121108-1250"/> | |||
<unit id="org.slf4j.impl.log4j12" version="1.7.2.v20131105-2200"/> | |||
<unit id="org.slf4j.impl.log4j12.source" version="1.7.2.v20131105-2200"/> | |||
<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/S20170912163609/repository"/> | |||
<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20180606145124/repository"/> | |||
</location> | |||
<location includeMode="slicer" includeAllPlatforms="false" includeSource="true" includeConfigurePhase="true" type="InstallableUnit"> | |||
<unit id="org.eclipse.osgi" version="0.0.0"/> | |||
<repository location="http://download.eclipse.org/releases/oxygen/"/> | |||
<repository location="http://download.eclipse.org/releases/photon/"/> | |||
</location> | |||
</locations> | |||
</target> |
@@ -1,8 +1,8 @@ | |||
target "jgit-4.8" with source configurePhase | |||
include "projects/jetty-9.4.8.tpd" | |||
include "orbit/S20170912163609-Photon.tpd" | |||
include "orbit/R20180606145124-Photon.tpd" | |||
location "http://download.eclipse.org/releases/oxygen/" { | |||
location "http://download.eclipse.org/releases/photon/" { | |||
org.eclipse.osgi lazy | |||
} |
@@ -1,7 +1,7 @@ | |||
target "S20170912163609-Photon" with source configurePhase | |||
target "R20180606145124-Photon" with source configurePhase | |||
// see http://download.eclipse.org/tools/orbit/downloads/ | |||
location "http://download.eclipse.org/tools/orbit/downloads/drops/S20170912163609/repository" { | |||
location "http://download.eclipse.org/tools/orbit/downloads/drops/R20180606145124/repository" { | |||
org.apache.ant [1.9.6.v201510161327,1.9.6.v201510161327] | |||
org.apache.ant.source [1.9.6.v201510161327,1.9.6.v201510161327] | |||
org.apache.commons.codec [1.9.0.v20170208-1614,1.9.0.v20170208-1614] | |||
@@ -12,16 +12,16 @@ location "http://download.eclipse.org/tools/orbit/downloads/drops/S2017091216360 | |||
org.apache.commons.logging.source [1.1.1.v201101211721,1.1.1.v201101211721] | |||
org.apache.httpcomponents.httpcore [4.4.6.v20170210-0925,4.4.6.v20170210-0925] | |||
org.apache.httpcomponents.httpcore.source [4.4.6.v20170210-0925,4.4.6.v20170210-0925] | |||
org.apache.httpcomponents.httpclient [4.5.2.v20170210-0925,4.5.2.v20170210-0925] | |||
org.apache.httpcomponents.httpclient.source [4.5.2.v20170210-0925,4.5.2.v20170210-0925] | |||
org.apache.httpcomponents.httpclient [4.5.2.v20180410-1551,4.5.2.v20180410-1551] | |||
org.apache.httpcomponents.httpclient.source [4.5.2.v20180410-1551,4.5.2.v20180410-1551] | |||
org.apache.log4j [1.2.15.v201012070815,1.2.15.v201012070815] | |||
org.apache.log4j.source [1.2.15.v201012070815,1.2.15.v201012070815] | |||
org.kohsuke.args4j [2.33.0.v20160323-2218,2.33.0.v20160323-2218] | |||
org.kohsuke.args4j.source [2.33.0.v20160323-2218,2.33.0.v20160323-2218] | |||
org.hamcrest.core [1.3.0.v201303031735,1.3.0.v201303031735] | |||
org.hamcrest.core.source [1.3.0.v201303031735,1.3.0.v201303031735] | |||
org.hamcrest.library [1.3.0.v201505072020,1.3.0.v201505072020] | |||
org.hamcrest.library.source [1.3.0.v201505072020,1.3.0.v201505072020] | |||
org.hamcrest.core [1.3.0.v20180420-1519,1.3.0.v20180420-1519] | |||
org.hamcrest.core.source [1.3.0.v20180420-1519,1.3.0.v20180420-1519] | |||
org.hamcrest.library [1.3.0.v20180524-2246,1.3.0.v20180524-2246] | |||
org.hamcrest.library.source [1.3.0.v20180524-2246,1.3.0.v20180524-2246] | |||
javaewah [1.1.6.v20160919-1400,1.1.6.v20160919-1400] | |||
javaewah.source [1.1.6.v20160919-1400,1.1.6.v20160919-1400] | |||
org.objenesis [1.0.0.v201505121915,1.0.0.v201505121915] |
@@ -45,7 +45,9 @@ package org.eclipse.jgit.api; | |||
import static org.junit.Assert.assertEquals; | |||
import static org.junit.Assert.assertNull; | |||
import java.util.ArrayList; | |||
import java.util.Collection; | |||
import java.util.List; | |||
import org.eclipse.jgit.junit.RepositoryTestCase; | |||
import org.eclipse.jgit.lib.Constants; | |||
@@ -56,6 +58,7 @@ import org.eclipse.jgit.lib.Repository; | |||
import org.eclipse.jgit.lib.StoredConfig; | |||
import org.eclipse.jgit.revwalk.RevCommit; | |||
import org.eclipse.jgit.transport.FetchResult; | |||
import org.eclipse.jgit.transport.RefSpec; | |||
import org.eclipse.jgit.transport.RemoteConfig; | |||
import org.eclipse.jgit.transport.TagOpt; | |||
import org.eclipse.jgit.transport.TrackingRefUpdate; | |||
@@ -101,6 +104,91 @@ public class FetchCommandTest extends RepositoryTestCase { | |||
db.resolve(tagRef.getObjectId().getName())); | |||
} | |||
@Test | |||
public void fetchAddsBranches() throws Exception { | |||
final String branch1 = "b1"; | |||
final String branch2 = "b2"; | |||
final String remoteBranch1 = "test/" + branch1; | |||
final String remoteBranch2 = "test/" + branch2; | |||
remoteGit.commit().setMessage("commit").call(); | |||
Ref branchRef1 = remoteGit.branchCreate().setName(branch1).call(); | |||
remoteGit.commit().setMessage("commit").call(); | |||
Ref branchRef2 = remoteGit.branchCreate().setName(branch2).call(); | |||
String spec = "refs/heads/*:refs/remotes/test/*"; | |||
git.fetch().setRemote("test").setRefSpecs(spec).call(); | |||
assertEquals(branchRef1.getObjectId(), db.resolve(remoteBranch1)); | |||
assertEquals(branchRef2.getObjectId(), db.resolve(remoteBranch2)); | |||
} | |||
@Test | |||
public void fetchDoesntDeleteBranches() throws Exception { | |||
final String branch1 = "b1"; | |||
final String branch2 = "b2"; | |||
final String remoteBranch1 = "test/" + branch1; | |||
final String remoteBranch2 = "test/" + branch2; | |||
remoteGit.commit().setMessage("commit").call(); | |||
Ref branchRef1 = remoteGit.branchCreate().setName(branch1).call(); | |||
remoteGit.commit().setMessage("commit").call(); | |||
Ref branchRef2 = remoteGit.branchCreate().setName(branch2).call(); | |||
String spec = "refs/heads/*:refs/remotes/test/*"; | |||
git.fetch().setRemote("test").setRefSpecs(spec).call(); | |||
assertEquals(branchRef1.getObjectId(), db.resolve(remoteBranch1)); | |||
assertEquals(branchRef2.getObjectId(), db.resolve(remoteBranch2)); | |||
remoteGit.branchDelete().setBranchNames(branch1).call(); | |||
git.fetch().setRemote("test").setRefSpecs(spec).call(); | |||
assertEquals(branchRef1.getObjectId(), db.resolve(remoteBranch1)); | |||
assertEquals(branchRef2.getObjectId(), db.resolve(remoteBranch2)); | |||
} | |||
@Test | |||
public void fetchUpdatesBranches() throws Exception { | |||
final String branch1 = "b1"; | |||
final String branch2 = "b2"; | |||
final String remoteBranch1 = "test/" + branch1; | |||
final String remoteBranch2 = "test/" + branch2; | |||
remoteGit.commit().setMessage("commit").call(); | |||
Ref branchRef1 = remoteGit.branchCreate().setName(branch1).call(); | |||
remoteGit.commit().setMessage("commit").call(); | |||
Ref branchRef2 = remoteGit.branchCreate().setName(branch2).call(); | |||
String spec = "refs/heads/*:refs/remotes/test/*"; | |||
git.fetch().setRemote("test").setRefSpecs(spec).call(); | |||
assertEquals(branchRef1.getObjectId(), db.resolve(remoteBranch1)); | |||
assertEquals(branchRef2.getObjectId(), db.resolve(remoteBranch2)); | |||
remoteGit.commit().setMessage("commit").call(); | |||
branchRef2 = remoteGit.branchCreate().setName(branch2).setForce(true).call(); | |||
git.fetch().setRemote("test").setRefSpecs(spec).call(); | |||
assertEquals(branchRef1.getObjectId(), db.resolve(remoteBranch1)); | |||
assertEquals(branchRef2.getObjectId(), db.resolve(remoteBranch2)); | |||
} | |||
@Test | |||
public void fetchPrunesBranches() throws Exception { | |||
final String branch1 = "b1"; | |||
final String branch2 = "b2"; | |||
final String remoteBranch1 = "test/" + branch1; | |||
final String remoteBranch2 = "test/" + branch2; | |||
remoteGit.commit().setMessage("commit").call(); | |||
Ref branchRef1 = remoteGit.branchCreate().setName(branch1).call(); | |||
remoteGit.commit().setMessage("commit").call(); | |||
Ref branchRef2 = remoteGit.branchCreate().setName(branch2).call(); | |||
String spec = "refs/heads/*:refs/remotes/test/*"; | |||
git.fetch().setRemote("test").setRefSpecs(spec).call(); | |||
assertEquals(branchRef1.getObjectId(), db.resolve(remoteBranch1)); | |||
assertEquals(branchRef2.getObjectId(), db.resolve(remoteBranch2)); | |||
remoteGit.branchDelete().setBranchNames(branch1).call(); | |||
git.fetch().setRemote("test").setRefSpecs(spec) | |||
.setRemoveDeletedRefs(true).call(); | |||
assertNull(db.resolve(remoteBranch1)); | |||
assertEquals(branchRef2.getObjectId(), db.resolve(remoteBranch2)); | |||
} | |||
@Test | |||
public void fetchShouldAutoFollowTag() throws Exception { | |||
remoteGit.commit().setMessage("commit").call(); | |||
@@ -185,4 +273,75 @@ public class FetchCommandTest extends RepositoryTestCase { | |||
assertEquals(RefUpdate.Result.FORCED, update.getResult()); | |||
assertEquals(tagRef2.getObjectId(), db.resolve(tagName)); | |||
} | |||
@Test | |||
public void fetchAddRefsWithDuplicateRefspec() throws Exception { | |||
final String branchName = "branch"; | |||
final String remoteBranchName = "test/" + branchName; | |||
remoteGit.commit().setMessage("commit").call(); | |||
Ref branchRef = remoteGit.branchCreate().setName(branchName).call(); | |||
final String spec1 = "+refs/heads/*:refs/remotes/test/*"; | |||
final String spec2 = "refs/heads/*:refs/remotes/test/*"; | |||
final StoredConfig config = db.getConfig(); | |||
RemoteConfig remoteConfig = new RemoteConfig(config, "test"); | |||
remoteConfig.addFetchRefSpec(new RefSpec(spec1)); | |||
remoteConfig.addFetchRefSpec(new RefSpec(spec2)); | |||
remoteConfig.update(config); | |||
git.fetch().setRemote("test").setRefSpecs(spec1).call(); | |||
assertEquals(branchRef.getObjectId(), db.resolve(remoteBranchName)); | |||
} | |||
@Test | |||
public void fetchPruneRefsWithDuplicateRefspec() | |||
throws Exception { | |||
final String branchName = "branch"; | |||
final String remoteBranchName = "test/" + branchName; | |||
remoteGit.commit().setMessage("commit").call(); | |||
Ref branchRef = remoteGit.branchCreate().setName(branchName).call(); | |||
final String spec1 = "+refs/heads/*:refs/remotes/test/*"; | |||
final String spec2 = "refs/heads/*:refs/remotes/test/*"; | |||
final StoredConfig config = db.getConfig(); | |||
RemoteConfig remoteConfig = new RemoteConfig(config, "test"); | |||
remoteConfig.addFetchRefSpec(new RefSpec(spec1)); | |||
remoteConfig.addFetchRefSpec(new RefSpec(spec2)); | |||
remoteConfig.update(config); | |||
git.fetch().setRemote("test").setRefSpecs(spec1).call(); | |||
assertEquals(branchRef.getObjectId(), db.resolve(remoteBranchName)); | |||
remoteGit.branchDelete().setBranchNames(branchName).call(); | |||
git.fetch().setRemote("test").setRefSpecs(spec1) | |||
.setRemoveDeletedRefs(true).call(); | |||
assertNull(db.resolve(remoteBranchName)); | |||
} | |||
@Test | |||
public void fetchUpdateRefsWithDuplicateRefspec() throws Exception { | |||
final String tagName = "foo"; | |||
remoteGit.commit().setMessage("commit").call(); | |||
Ref tagRef1 = remoteGit.tag().setName(tagName).call(); | |||
List<RefSpec> refSpecs = new ArrayList<>(); | |||
refSpecs.add(new RefSpec("+refs/heads/*:refs/remotes/origin/*")); | |||
refSpecs.add(new RefSpec("+refs/tags/*:refs/tags/*")); | |||
// Updating tags via the RefSpecs and setting TagOpt.FETCH_TAGS (or | |||
// AUTO_FOLLOW) will result internally in *two* updates for the same | |||
// ref. | |||
git.fetch().setRemote("test").setRefSpecs(refSpecs) | |||
.setTagOpt(TagOpt.AUTO_FOLLOW).call(); | |||
assertEquals(tagRef1.getObjectId(), db.resolve(tagName)); | |||
remoteGit.commit().setMessage("commit 2").call(); | |||
Ref tagRef2 = remoteGit.tag().setName(tagName).setForceUpdate(true) | |||
.call(); | |||
FetchResult result = git.fetch().setRemote("test").setRefSpecs(refSpecs) | |||
.setTagOpt(TagOpt.FETCH_TAGS).call(); | |||
assertEquals(2, result.getTrackingRefUpdates().size()); | |||
TrackingRefUpdate update = result | |||
.getTrackingRefUpdate(Constants.R_TAGS + tagName); | |||
assertEquals(RefUpdate.Result.FORCED, update.getResult()); | |||
assertEquals(tagRef2.getObjectId(), db.resolve(tagName)); | |||
} | |||
} |
@@ -65,6 +65,7 @@ import java.io.FileNotFoundException; | |||
import java.io.IOException; | |||
import java.io.InputStreamReader; | |||
import java.io.InterruptedIOException; | |||
import java.nio.file.DirectoryNotEmptyException; | |||
import java.nio.file.Files; | |||
import java.security.DigestInputStream; | |||
import java.security.MessageDigest; | |||
@@ -1286,6 +1287,10 @@ public class RefDirectory extends RefDatabase { | |||
for (int i = 0; i < depth; ++i) { | |||
try { | |||
Files.delete(dir.toPath()); | |||
} catch (DirectoryNotEmptyException e) { | |||
// Don't log; normal case when there are other refs with the | |||
// same prefix | |||
break; | |||
} catch (IOException e) { | |||
LOG.warn("Unable to remove path {}", dir, e); | |||
break; |
@@ -203,12 +203,10 @@ class FetchProcess { | |||
((BatchingProgressMonitor) monitor).setDelayStart( | |||
250, TimeUnit.MILLISECONDS); | |||
} | |||
if (transport.isRemoveDeletedRefs()) | |||
if (transport.isRemoveDeletedRefs()) { | |||
deleteStaleTrackingRefs(result, batch); | |||
for (TrackingRefUpdate u : localUpdates) { | |||
result.add(u); | |||
batch.addCommand(u.asReceiveCommand()); | |||
} | |||
addUpdateBatchCommands(result, batch); | |||
for (ReceiveCommand cmd : batch.getCommands()) { | |||
cmd.updateType(walk); | |||
if (cmd.getType() == UPDATE_NONFASTFORWARD | |||
@@ -221,8 +219,11 @@ class FetchProcess { | |||
if (cmd.getResult() == NOT_ATTEMPTED) | |||
cmd.setResult(OK); | |||
} | |||
} else | |||
} else { | |||
batch.execute(walk, monitor); | |||
} | |||
} catch (TransportException e) { | |||
throw e; | |||
} catch (IOException err) { | |||
throw new TransportException(MessageFormat.format( | |||
JGitText.get().failureUpdatingTrackingRef, | |||
@@ -239,6 +240,23 @@ class FetchProcess { | |||
} | |||
} | |||
private void addUpdateBatchCommands(FetchResult result, | |||
BatchRefUpdate batch) throws TransportException { | |||
Map<String, ObjectId> refs = new HashMap<>(); | |||
for (TrackingRefUpdate u : localUpdates) { | |||
// Try to skip duplicates if they'd update to the same object ID | |||
ObjectId existing = refs.get(u.getLocalName()); | |||
if (existing == null) { | |||
refs.put(u.getLocalName(), u.getNewObjectId()); | |||
result.add(u); | |||
batch.addCommand(u.asReceiveCommand()); | |||
} else if (!existing.equals(u.getNewObjectId())) { | |||
throw new TransportException(MessageFormat | |||
.format(JGitText.get().duplicateRef, u.getLocalName())); | |||
} | |||
} | |||
} | |||
private void fetchObjects(final ProgressMonitor monitor) | |||
throws TransportException { | |||
try { | |||
@@ -481,12 +499,14 @@ class FetchProcess { | |||
private void deleteStaleTrackingRefs(FetchResult result, | |||
BatchRefUpdate batch) throws IOException { | |||
final Set<Ref> processed = new HashSet<>(); | |||
for (final Ref ref : localRefs().values()) { | |||
final String refname = ref.getName(); | |||
for (final RefSpec spec : toFetch) { | |||
if (spec.matchDestination(refname)) { | |||
final RefSpec s = spec.expandFromDestination(refname); | |||
if (result.getAdvertisedRef(s.getSource()) == null) { | |||
if (result.getAdvertisedRef(s.getSource()) == null | |||
&& processed.add(ref)) { | |||
deleteTrackingRef(result, batch, s, ref); | |||
} | |||
} |