Merge branch 'stable-4.9' into stable-4.10
* 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>
This commit is contained in:
commit
db6c2c2aa5
|
@ -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 @@
|
|||
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.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 void testFetch() throws Exception {
|
|||
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 void fetchWithExplicitTagsShouldUpdateLocal() throws Exception {
|
|||
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.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 @@ private static void delete(final File file, final int depth, LockFile rLck)
|
|||
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 @@ else if (tagopt == TagOpt.FETCH_TAGS)
|
|||
((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 @@ else if (tagopt == TagOpt.FETCH_TAGS)
|
|||
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 @@ else if (tagopt == TagOpt.FETCH_TAGS)
|
|||
}
|
||||
}
|
||||
|
||||
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 @@ private Map<String, Ref> localRefs() throws TransportException {
|
|||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue