Transport: Implement AutoCloseable

After creating a Transport instance callers should always call
its close() method. Use AutoCloseable to document this idiom
and allow use of try-with-resources.

Change-Id: I0c6ff3e39ebecdd7a028dbcae1856a818937b186
This commit is contained in:
Shawn Pearce 2016-01-19 13:08:38 -08:00
parent eadfcd3ec1
commit 6b662af76e
11 changed files with 131 additions and 262 deletions

View File

@ -140,8 +140,7 @@ public void testListRemote() throws IOException {
assertEquals("http", remoteURI.getScheme());
Map<String, Ref> map;
Transport t = Transport.open(dst, remoteURI);
try {
try (Transport t = Transport.open(dst, remoteURI)) {
// I didn't make up these public interface names, I just
// approved them for inclusion into the code base. Sorry.
// --spearce
@ -149,14 +148,9 @@ public void testListRemote() throws IOException {
assertTrue("isa TransportHttp", t instanceof TransportHttp);
assertTrue("isa HttpTransport", t instanceof HttpTransport);
FetchConnection c = t.openFetch();
try {
try (FetchConnection c = t.openFetch()) {
map = c.getRefsMap();
} finally {
c.close();
}
} finally {
t.close();
}
assertNotNull("have map of refs", map);
@ -201,11 +195,8 @@ public void testInitialClone_Loose() throws Exception {
Repository dst = createBareRepository();
assertFalse(dst.hasObject(A_txt));
Transport t = Transport.open(dst, remoteURI);
try {
try (Transport t = Transport.open(dst, remoteURI)) {
t.fetch(NullProgressMonitor.INSTANCE, mirror(master));
} finally {
t.close();
}
assertTrue(dst.hasObject(A_txt));
@ -226,11 +217,8 @@ public void testInitialClone_Packed() throws Exception {
Repository dst = createBareRepository();
assertFalse(dst.hasObject(A_txt));
Transport t = Transport.open(dst, remoteURI);
try {
try (Transport t = Transport.open(dst, remoteURI)) {
t.fetch(NullProgressMonitor.INSTANCE, mirror(master));
} finally {
t.close();
}
assertTrue(dst.hasObject(A_txt));
@ -265,8 +253,7 @@ public void testPushNotSupported() throws Exception {
final RevCommit Q = src.commit().create();
final Repository db = src.getRepository();
Transport t = Transport.open(db, remoteURI);
try {
try (Transport t = Transport.open(db, remoteURI)) {
try {
t.push(NullProgressMonitor.INSTANCE, push(src, Q));
fail("push incorrectly completed against a dumb server");
@ -274,8 +261,6 @@ public void testPushNotSupported() throws Exception {
String exp = "remote does not support smart HTTP push";
assertEquals(exp, nse.getMessage());
}
} finally {
t.close();
}
}
}

View File

@ -157,8 +157,7 @@ private static String nameOf(final Repository db) {
public void testRepositoryNotFound_Dumb() throws Exception {
URIish uri = toURIish("/dumb.none/not-found");
Repository dst = createBareRepository();
Transport t = Transport.open(dst, uri);
try {
try (Transport t = Transport.open(dst, uri)) {
try {
t.openFetch();
fail("connection opened to not found repository");
@ -167,8 +166,6 @@ public void testRepositoryNotFound_Dumb() throws Exception {
+ "/info/refs?service=git-upload-pack not found";
assertEquals(exp, err.getMessage());
}
} finally {
t.close();
}
}
@ -176,8 +173,7 @@ public void testRepositoryNotFound_Dumb() throws Exception {
public void testRepositoryNotFound_Smart() throws Exception {
URIish uri = toURIish("/smart.none/not-found");
Repository dst = createBareRepository();
Transport t = Transport.open(dst, uri);
try {
try (Transport t = Transport.open(dst, uri)) {
try {
t.openFetch();
fail("connection opened to not found repository");
@ -186,8 +182,6 @@ public void testRepositoryNotFound_Smart() throws Exception {
+ "/info/refs?service=git-upload-pack not found";
assertEquals(exp, err.getMessage());
}
} finally {
t.close();
}
}
@ -201,16 +195,9 @@ public void testListRemote_Dumb_DetachedHEAD() throws Exception {
Repository dst = createBareRepository();
Ref head;
Transport t = Transport.open(dst, dumbAuthNoneURI);
try {
FetchConnection c = t.openFetch();
try {
head = c.getRef(Constants.HEAD);
} finally {
c.close();
}
} finally {
t.close();
try (Transport t = Transport.open(dst, dumbAuthNoneURI);
FetchConnection c = t.openFetch()) {
head = c.getRef(Constants.HEAD);
}
assertNotNull("has " + Constants.HEAD, head);
assertEquals(Q, head.getObjectId());
@ -225,16 +212,9 @@ public void testListRemote_Dumb_NoHEAD() throws Exception {
Repository dst = createBareRepository();
Ref head;
Transport t = Transport.open(dst, dumbAuthNoneURI);
try {
FetchConnection c = t.openFetch();
try {
head = c.getRef(Constants.HEAD);
} finally {
c.close();
}
} finally {
t.close();
try (Transport t = Transport.open(dst, dumbAuthNoneURI);
FetchConnection c = t.openFetch()) {
head = c.getRef(Constants.HEAD);
}
assertNull("has no " + Constants.HEAD, head);
}
@ -249,16 +229,9 @@ public void testListRemote_Smart_DetachedHEAD() throws Exception {
Repository dst = createBareRepository();
Ref head;
Transport t = Transport.open(dst, smartAuthNoneURI);
try {
FetchConnection c = t.openFetch();
try {
head = c.getRef(Constants.HEAD);
} finally {
c.close();
}
} finally {
t.close();
try (Transport t = Transport.open(dst, smartAuthNoneURI);
FetchConnection c = t.openFetch()) {
head = c.getRef(Constants.HEAD);
}
assertNotNull("has " + Constants.HEAD, head);
assertEquals(Q, head.getObjectId());
@ -268,16 +241,13 @@ public void testListRemote_Smart_DetachedHEAD() throws Exception {
public void testListRemote_Smart_WithQueryParameters() throws Exception {
URIish myURI = toURIish("/snone/do?r=1&p=test.git");
Repository dst = createBareRepository();
Transport t = Transport.open(dst, myURI);
try {
try (Transport t = Transport.open(dst, myURI)) {
try {
t.openFetch();
fail("test did not fail to find repository as expected");
} catch (NoRemoteRepositoryException err) {
// expected
}
} finally {
t.close();
}
List<AccessEvent> requests = getRequests();
@ -296,8 +266,7 @@ public void testListRemote_Smart_WithQueryParameters() throws Exception {
@Test
public void testListRemote_Dumb_NeedsAuth() throws Exception {
Repository dst = createBareRepository();
Transport t = Transport.open(dst, dumbAuthBasicURI);
try {
try (Transport t = Transport.open(dst, dumbAuthBasicURI)) {
try {
t.openFetch();
fail("connection opened even info/refs needs auth basic");
@ -306,42 +275,35 @@ public void testListRemote_Dumb_NeedsAuth() throws Exception {
+ JGitText.get().noCredentialsProvider;
assertEquals(exp, err.getMessage());
}
} finally {
t.close();
}
}
@Test
public void testListRemote_Dumb_Auth() throws Exception {
Repository dst = createBareRepository();
Transport t = Transport.open(dst, dumbAuthBasicURI);
t.setCredentialsProvider(new UsernamePasswordCredentialsProvider(
AppServer.username, AppServer.password));
try {
t.openFetch();
} finally {
t.close();
try (Transport t = Transport.open(dst, dumbAuthBasicURI)) {
t.setCredentialsProvider(new UsernamePasswordCredentialsProvider(
AppServer.username, AppServer.password));
t.openFetch().close();
}
t = Transport.open(dst, dumbAuthBasicURI);
t.setCredentialsProvider(new UsernamePasswordCredentialsProvider(
AppServer.username, ""));
try {
t.openFetch();
fail("connection opened even info/refs needs auth basic and we provide wrong password");
} catch (TransportException err) {
String exp = dumbAuthBasicURI + ": "
+ JGitText.get().notAuthorized;
assertEquals(exp, err.getMessage());
} finally {
t.close();
try (Transport t = Transport.open(dst, dumbAuthBasicURI)) {
t.setCredentialsProvider(new UsernamePasswordCredentialsProvider(
AppServer.username, ""));
try {
t.openFetch();
fail("connection opened even info/refs needs auth basic and we provide wrong password");
} catch (TransportException err) {
String exp = dumbAuthBasicURI + ": "
+ JGitText.get().notAuthorized;
assertEquals(exp, err.getMessage());
}
}
}
@Test
public void testListRemote_Smart_UploadPackNeedsAuth() throws Exception {
Repository dst = createBareRepository();
Transport t = Transport.open(dst, smartAuthBasicURI);
try {
try (Transport t = Transport.open(dst, smartAuthBasicURI)) {
try {
t.openFetch();
fail("connection opened even though service disabled");
@ -350,8 +312,6 @@ public void testListRemote_Smart_UploadPackNeedsAuth() throws Exception {
+ JGitText.get().noCredentialsProvider;
assertEquals(exp, err.getMessage());
}
} finally {
t.close();
}
}
@ -363,8 +323,7 @@ public void testListRemote_Smart_UploadPackDisabled() throws Exception {
cfg.save();
Repository dst = createBareRepository();
Transport t = Transport.open(dst, smartAuthNoneURI);
try {
try (Transport t = Transport.open(dst, smartAuthNoneURI)) {
try {
t.openFetch();
fail("connection opened even though service disabled");
@ -373,24 +332,15 @@ public void testListRemote_Smart_UploadPackDisabled() throws Exception {
+ JGitText.get().serviceNotEnabledNoName;
assertEquals(exp, err.getMessage());
}
} finally {
t.close();
}
}
@Test
public void testListRemoteWithoutLocalRepository() throws Exception {
Transport t = Transport.open(smartAuthNoneURI);
try {
FetchConnection c = t.openFetch();
try {
Ref head = c.getRef(Constants.HEAD);
assertNotNull(head);
} finally {
c.close();
}
} finally {
t.close();
try (Transport t = Transport.open(smartAuthNoneURI);
FetchConnection c = t.openFetch()) {
Ref head = c.getRef(Constants.HEAD);
assertNotNull(head);
}
}
}

View File

@ -211,8 +211,7 @@ public void testListRemote() throws IOException {
assertEquals("http", remoteURI.getScheme());
Map<String, Ref> map;
Transport t = Transport.open(dst, remoteURI);
try {
try (Transport t = Transport.open(dst, remoteURI)) {
// I didn't make up these public interface names, I just
// approved them for inclusion into the code base. Sorry.
// --spearce
@ -226,8 +225,6 @@ public void testListRemote() throws IOException {
} finally {
c.close();
}
} finally {
t.close();
}
assertNotNull("have map of refs", map);
@ -257,8 +254,7 @@ public void testListRemote() throws IOException {
public void testListRemote_BadName() throws IOException, URISyntaxException {
Repository dst = createBareRepository();
URIish uri = new URIish(this.remoteURI.toString() + ".invalid");
Transport t = Transport.open(dst, uri);
try {
try (Transport t = Transport.open(dst, uri)) {
try {
t.openFetch();
fail("fetch connection opened");
@ -266,8 +262,6 @@ public void testListRemote_BadName() throws IOException, URISyntaxException {
assertEquals(uri + ": Git repository not found",
notFound.getMessage());
}
} finally {
t.close();
}
List<AccessEvent> requests = getRequests();
@ -288,11 +282,8 @@ public void testInitialClone_Small() throws Exception {
Repository dst = createBareRepository();
assertFalse(dst.hasObject(A_txt));
Transport t = Transport.open(dst, remoteURI);
try {
try (Transport t = Transport.open(dst, remoteURI)) {
t.fetch(NullProgressMonitor.INSTANCE, mirror(master));
} finally {
t.close();
}
assertTrue(dst.hasObject(A_txt));
@ -331,11 +322,8 @@ public void testFetch_FewLocalCommits() throws Exception {
// Bootstrap by doing the clone.
//
TestRepository dst = createTestRepository();
Transport t = Transport.open(dst.getRepository(), remoteURI);
try {
try (Transport t = Transport.open(dst.getRepository(), remoteURI)) {
t.fetch(NullProgressMonitor.INSTANCE, mirror(master));
} finally {
t.close();
}
assertEquals(B, dst.getRepository().exactRef(master).getObjectId());
List<AccessEvent> cloneRequests = getRequests();
@ -352,11 +340,8 @@ public void testFetch_FewLocalCommits() throws Exception {
// Now incrementally update.
//
t = Transport.open(dst.getRepository(), remoteURI);
try {
try (Transport t = Transport.open(dst.getRepository(), remoteURI)) {
t.fetch(NullProgressMonitor.INSTANCE, mirror(master));
} finally {
t.close();
}
assertEquals(Z, dst.getRepository().exactRef(master).getObjectId());
@ -394,11 +379,8 @@ public void testFetch_TooManyLocalCommits() throws Exception {
// Bootstrap by doing the clone.
//
TestRepository dst = createTestRepository();
Transport t = Transport.open(dst.getRepository(), remoteURI);
try {
try (Transport t = Transport.open(dst.getRepository(), remoteURI)) {
t.fetch(NullProgressMonitor.INSTANCE, mirror(master));
} finally {
t.close();
}
assertEquals(B, dst.getRepository().exactRef(master).getObjectId());
List<AccessEvent> cloneRequests = getRequests();
@ -418,11 +400,8 @@ public void testFetch_TooManyLocalCommits() throws Exception {
// Now incrementally update.
//
t = Transport.open(dst.getRepository(), remoteURI);
try {
try (Transport t = Transport.open(dst.getRepository(), remoteURI)) {
t.fetch(NullProgressMonitor.INSTANCE, mirror(master));
} finally {
t.close();
}
assertEquals(Z, dst.getRepository().exactRef(master).getObjectId());
@ -474,8 +453,7 @@ public void testInitialClone_BrokenServer() throws Exception {
Repository dst = createBareRepository();
assertFalse(dst.hasObject(A_txt));
Transport t = Transport.open(dst, brokenURI);
try {
try (Transport t = Transport.open(dst, brokenURI)) {
try {
t.fetch(NullProgressMonitor.INSTANCE, mirror(master));
fail("fetch completed despite upload-pack being broken");
@ -485,8 +463,6 @@ public void testInitialClone_BrokenServer() throws Exception {
+ " received Content-Type text/plain; charset=UTF-8";
assertEquals(exp, err.getMessage());
}
} finally {
t.close();
}
List<AccessEvent> requests = getRequests();
@ -517,12 +493,10 @@ public void testPush_NotAuthorized() throws Exception {
final RevCommit Q = src.commit().add("Q", Q_txt).create();
final Repository db = src.getRepository();
final String dstName = Constants.R_HEADS + "new.branch";
Transport t;
// push anonymous shouldn't be allowed.
//
t = Transport.open(db, remoteURI);
try {
try (Transport t = Transport.open(db, remoteURI)) {
final String srcExpr = Q.name();
final boolean forceUpdate = false;
final String localName = null;
@ -538,8 +512,6 @@ public void testPush_NotAuthorized() throws Exception {
+ JGitText.get().authenticationNotSupported;
assertEquals(exp, e.getMessage());
}
} finally {
t.close();
}
List<AccessEvent> requests = getRequests();
@ -560,12 +532,10 @@ public void testPush_CreateBranch() throws Exception {
final RevCommit Q = src.commit().add("Q", Q_txt).create();
final Repository db = src.getRepository();
final String dstName = Constants.R_HEADS + "new.branch";
Transport t;
enableReceivePack();
t = Transport.open(db, remoteURI);
try {
try (Transport t = Transport.open(db, remoteURI)) {
final String srcExpr = Q.name();
final boolean forceUpdate = false;
final String localName = null;
@ -574,8 +544,6 @@ public void testPush_CreateBranch() throws Exception {
RemoteRefUpdate u = new RemoteRefUpdate(src.getRepository(),
srcExpr, dstName, forceUpdate, localName, oldId);
t.push(NullProgressMonitor.INSTANCE, Collections.singleton(u));
} finally {
t.close();
}
assertTrue(remoteRepository.hasObject(Q_txt));
@ -633,7 +601,6 @@ public void testPush_ChunkedEncoding() throws Exception {
final RevCommit Q = src.commit().add("Q", Q_bin).create();
final Repository db = src.getRepository();
final String dstName = Constants.R_HEADS + "new.branch";
Transport t;
enableReceivePack();
@ -642,8 +609,7 @@ public void testPush_ChunkedEncoding() throws Exception {
cfg.setInt("http", null, "postbuffer", 8 * 1024);
cfg.save();
t = Transport.open(db, remoteURI);
try {
try (Transport t = Transport.open(db, remoteURI)) {
final String srcExpr = Q.name();
final boolean forceUpdate = false;
final String localName = null;
@ -652,8 +618,6 @@ public void testPush_ChunkedEncoding() throws Exception {
RemoteRefUpdate u = new RemoteRefUpdate(src.getRepository(),
srcExpr, dstName, forceUpdate, localName, oldId);
t.push(NullProgressMonitor.INSTANCE, Collections.singleton(u));
} finally {
t.close();
}
assertTrue(remoteRepository.hasObject(Q_bin));

View File

@ -112,12 +112,9 @@ private static InMemoryRepository newRepo(String name) {
public void pushNonAtomic() throws Exception {
PushResult r;
server.setPerformsAtomicTransactions(false);
Transport tn = testProtocol.open(uri, client, "server");
try {
try (Transport tn = testProtocol.open(uri, client, "server")) {
tn.setPushAtomic(false);
r = tn.push(NullProgressMonitor.INSTANCE, commands());
} finally {
tn.close();
}
RemoteRefUpdate one = r.getRemoteUpdate("refs/heads/one");
@ -131,12 +128,9 @@ public void pushNonAtomic() throws Exception {
@Test
public void pushAtomicClientGivesUpEarly() throws Exception {
PushResult r;
Transport tn = testProtocol.open(uri, client, "server");
try {
try (Transport tn = testProtocol.open(uri, client, "server")) {
tn.setPushAtomic(true);
r = tn.push(NullProgressMonitor.INSTANCE, commands());
} finally {
tn.close();
}
RemoteRefUpdate one = r.getRemoteUpdate("refs/heads/one");
@ -167,8 +161,7 @@ public void pushAtomicDisabled() throws Exception {
ObjectId.zeroId()));
server.setPerformsAtomicTransactions(false);
Transport tn = testProtocol.open(uri, client, "server");
try {
try (Transport tn = testProtocol.open(uri, client, "server")) {
tn.setPushAtomic(true);
tn.push(NullProgressMonitor.INSTANCE, cmds);
fail("did not throw TransportException");
@ -176,8 +169,6 @@ public void pushAtomicDisabled() throws Exception {
assertEquals(
uri + ": " + JGitText.get().atomicPushNotSupported,
e.getMessage());
} finally {
tn.close();
}
}

View File

@ -166,8 +166,10 @@ private static FetchResult fetchFromBundle(final Repository newRepo,
final ByteArrayInputStream in = new ByteArrayInputStream(bundle);
final RefSpec rs = new RefSpec("refs/heads/*:refs/heads/*");
final Set<RefSpec> refs = Collections.singleton(rs);
return new TransportBundleStream(newRepo, uri, in).fetch(
NullProgressMonitor.INSTANCE, refs);
try (TransportBundleStream transport = new TransportBundleStream(
newRepo, uri, in)) {
return transport.fetch(NullProgressMonitor.INSTANCE, refs);
}
}
private byte[] makeBundle(final String name,

View File

@ -116,12 +116,9 @@ public void setUp() throws Exception {
// Clone from dst into src
//
Transport t = Transport.open(src, uriOf(dst));
try {
try (Transport t = Transport.open(src, uriOf(dst))) {
t.fetch(PM, Collections.singleton(new RefSpec("+refs/*:refs/*")));
assertEquals(B, src.resolve(R_MASTER));
} finally {
t.close();
}
// Now put private stuff into dst.
@ -144,7 +141,8 @@ public void tearDown() throws Exception {
@Test
public void testFilterHidesPrivate() throws Exception {
Map<String, Ref> refs;
TransportLocal t = new TransportLocal(src, uriOf(dst), dst.getDirectory()) {
try (TransportLocal t = new TransportLocal(src, uriOf(dst),
dst.getDirectory()) {
@Override
ReceivePack createReceivePack(final Repository db) {
db.close();
@ -154,16 +152,10 @@ ReceivePack createReceivePack(final Repository db) {
rp.setAdvertiseRefsHook(new HidePrivateHook());
return rp;
}
};
try {
PushConnection c = t.openPush();
try {
}) {
try (PushConnection c = t.openPush()) {
refs = c.getRefsMap();
} finally {
c.close();
}
} finally {
t.close();
}
assertNotNull(refs);

View File

@ -61,13 +61,10 @@
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TransportTest extends SampleDataRepositoryTestCase {
private Transport transport;
private RemoteConfig remoteConfig;
@Override
@ -77,17 +74,6 @@ public void setUp() throws Exception {
final Config config = db.getConfig();
remoteConfig = new RemoteConfig(config, "test");
remoteConfig.addURI(new URIish("http://everyones.loves.git/u/2"));
transport = null;
}
@Override
@After
public void tearDown() throws Exception {
if (transport != null) {
transport.close();
transport = null;
}
super.tearDown();
}
/**
@ -99,10 +85,11 @@ public void tearDown() throws Exception {
@Test
public void testFindRemoteRefUpdatesNoWildcardNoTracking()
throws IOException {
transport = Transport.open(db, remoteConfig);
final Collection<RemoteRefUpdate> result = transport
.findRemoteRefUpdatesFor(Collections.nCopies(1, new RefSpec(
"refs/heads/master:refs/heads/x")));
Collection<RemoteRefUpdate> result;
try (Transport transport = Transport.open(db, remoteConfig)) {
result = transport.findRemoteRefUpdatesFor(Collections.nCopies(1,
new RefSpec("refs/heads/master:refs/heads/x")));
}
assertEquals(1, result.size());
final RemoteRefUpdate rru = result.iterator().next();
@ -122,10 +109,11 @@ public void testFindRemoteRefUpdatesNoWildcardNoTracking()
@Test
public void testFindRemoteRefUpdatesNoWildcardNoDestination()
throws IOException {
transport = Transport.open(db, remoteConfig);
final Collection<RemoteRefUpdate> result = transport
.findRemoteRefUpdatesFor(Collections.nCopies(1, new RefSpec(
"+refs/heads/master")));
Collection<RemoteRefUpdate> result;
try (Transport transport = Transport.open(db, remoteConfig)) {
result = transport.findRemoteRefUpdatesFor(
Collections.nCopies(1, new RefSpec("+refs/heads/master")));
}
assertEquals(1, result.size());
final RemoteRefUpdate rru = result.iterator().next();
@ -143,10 +131,11 @@ public void testFindRemoteRefUpdatesNoWildcardNoDestination()
*/
@Test
public void testFindRemoteRefUpdatesWildcardNoTracking() throws IOException {
transport = Transport.open(db, remoteConfig);
final Collection<RemoteRefUpdate> result = transport
.findRemoteRefUpdatesFor(Collections.nCopies(1, new RefSpec(
"+refs/heads/*:refs/heads/test/*")));
Collection<RemoteRefUpdate> result;
try (Transport transport = Transport.open(db, remoteConfig)) {
result = transport.findRemoteRefUpdatesFor(Collections.nCopies(1,
new RefSpec("+refs/heads/*:refs/heads/test/*")));
}
assertEquals(12, result.size());
boolean foundA = false;
@ -171,12 +160,14 @@ public void testFindRemoteRefUpdatesWildcardNoTracking() throws IOException {
*/
@Test
public void testFindRemoteRefUpdatesTwoRefSpecs() throws IOException {
transport = Transport.open(db, remoteConfig);
final RefSpec specA = new RefSpec("+refs/heads/a:refs/heads/b");
final RefSpec specC = new RefSpec("+refs/heads/c:refs/heads/d");
final Collection<RefSpec> specs = Arrays.asList(specA, specC);
final Collection<RemoteRefUpdate> result = transport
.findRemoteRefUpdatesFor(specs);
Collection<RemoteRefUpdate> result;
try (Transport transport = Transport.open(db, remoteConfig)) {
result = transport.findRemoteRefUpdatesFor(specs);
}
assertEquals(2, result.size());
boolean foundA = false;
@ -202,10 +193,12 @@ public void testFindRemoteRefUpdatesTwoRefSpecs() throws IOException {
public void testFindRemoteRefUpdatesTrackingRef() throws IOException {
remoteConfig.addFetchRefSpec(new RefSpec(
"refs/heads/*:refs/remotes/test/*"));
transport = Transport.open(db, remoteConfig);
final Collection<RemoteRefUpdate> result = transport
.findRemoteRefUpdatesFor(Collections.nCopies(1, new RefSpec(
"+refs/heads/a:refs/heads/a")));
Collection<RemoteRefUpdate> result;
try (Transport transport = Transport.open(db, remoteConfig)) {
result = transport.findRemoteRefUpdatesFor(Collections.nCopies(1,
new RefSpec("+refs/heads/a:refs/heads/a")));
}
assertEquals(1, result.size());
final TrackingRefUpdate tru = result.iterator().next()
@ -225,20 +218,18 @@ public void testLocalTransportWithRelativePath() throws Exception {
config.addURI(new URIish("../" + otherDir));
// Should not throw NoRemoteRepositoryException
transport = Transport.open(db, config);
Transport.open(db, config).close();
}
@Test
public void testLocalTransportFetchWithoutLocalRepository()
throws Exception {
URIish uri = new URIish("file://" + db.getWorkTree().getAbsolutePath());
transport = Transport.open(uri);
FetchConnection fetchConnection = transport.openFetch();
try {
Ref head = fetchConnection.getRef(Constants.HEAD);
assertNotNull(head);
} finally {
fetchConnection.close();
try (Transport transport = Transport.open(uri)) {
try (FetchConnection fetchConnection = transport.openFetch()) {
Ref head = fetchConnection.getRef(Constants.HEAD);
assertNotNull(head);
}
}
}

View File

@ -116,22 +116,17 @@ public FetchResult call() throws GitAPIException, InvalidRemoteException,
org.eclipse.jgit.api.errors.TransportException {
checkCallable();
try {
Transport transport = Transport.open(repo, remote);
try {
transport.setCheckFetchedObjects(checkFetchedObjects);
transport.setRemoveDeletedRefs(isRemoveDeletedRefs());
transport.setDryRun(dryRun);
if (tagOption != null)
transport.setTagOpt(tagOption);
transport.setFetchThin(thin);
configure(transport);
try (Transport transport = Transport.open(repo, remote)) {
transport.setCheckFetchedObjects(checkFetchedObjects);
transport.setRemoveDeletedRefs(isRemoveDeletedRefs());
transport.setDryRun(dryRun);
if (tagOption != null)
transport.setTagOpt(tagOption);
transport.setFetchThin(thin);
configure(transport);
FetchResult result = transport.fetch(monitor, refSpecs);
return result;
} finally {
transport.close();
}
FetchResult result = transport.fetch(monitor, refSpecs);
return result;
} catch (NoRemoteRepositoryException e) {
throw new InvalidRemoteException(MessageFormat.format(
JGitText.get().invalidRemote, remote), e);

View File

@ -182,13 +182,9 @@ private Map<String, Ref> execute() throws GitAPIException,
org.eclipse.jgit.api.errors.TransportException {
checkCallable();
Transport transport = null;
FetchConnection fc = null;
try {
if (repo != null)
transport = Transport.open(repo, remote);
else
transport = Transport.open(new URIish(remote));
try (Transport transport = repo != null
? Transport.open(repo, remote)
: Transport.open(new URIish(remote))) {
transport.setOptionUploadPack(uploadPack);
configure(transport);
Collection<RefSpec> refSpecs = new ArrayList<RefSpec>(1);
@ -199,19 +195,20 @@ private Map<String, Ref> execute() throws GitAPIException,
refSpecs.add(new RefSpec("refs/heads/*:refs/remotes/origin/*")); //$NON-NLS-1$
Collection<Ref> refs;
Map<String, Ref> refmap = new HashMap<String, Ref>();
fc = transport.openFetch();
refs = fc.getRefs();
if (refSpecs.isEmpty())
for (Ref r : refs)
refmap.put(r.getName(), r);
else
for (Ref r : refs)
for (RefSpec rs : refSpecs)
if (rs.matchSource(r)) {
refmap.put(r.getName(), r);
break;
}
return refmap;
try (FetchConnection fc = transport.openFetch()) {
refs = fc.getRefs();
if (refSpecs.isEmpty())
for (Ref r : refs)
refmap.put(r.getName(), r);
else
for (Ref r : refs)
for (RefSpec rs : refSpecs)
if (rs.matchSource(r)) {
refmap.put(r.getName(), r);
break;
}
return refmap;
}
} catch (URISyntaxException e) {
throw new InvalidRemoteException(MessageFormat.format(
JGitText.get().invalidRemote, remote));
@ -223,11 +220,6 @@ private Map<String, Ref> execute() throws GitAPIException,
throw new org.eclipse.jgit.api.errors.TransportException(
e.getMessage(),
e);
} finally {
if (fc != null)
fc.close();
if (transport != null)
transport.close();
}
}

View File

@ -59,8 +59,7 @@
*
* @see Transport
*/
public interface Connection {
public interface Connection extends AutoCloseable {
/**
* Get the complete map of refs advertised as available for fetching or
* pushing.
@ -108,6 +107,10 @@ public interface Connection {
* <p>
* If additional messages were produced by the remote peer, these should
* still be retained in the connection instance for {@link #getMessages()}.
* <p>
* {@code AutoClosable.close()} declares that it throws {@link Exception}.
* Implementers shouldn't throw checked exceptions. This override narrows
* the signature to prevent them from doing so.
*/
public void close();

View File

@ -98,7 +98,7 @@
* Transport instances and the connections they create are not thread-safe.
* Callers must ensure a transport is accessed by only one thread at a time.
*/
public abstract class Transport {
public abstract class Transport implements AutoCloseable {
/** Type of operation a Transport is being opened for. */
public enum Operation {
/** Transport is to fetch objects locally. */
@ -1353,6 +1353,10 @@ public abstract PushConnection openPush() throws NotSupportedException,
* must close that network socket, disconnecting the two peers. If the
* remote repository is actually local (same system) this method must close
* any open file handles used to read the "remote" repository.
* <p>
* {@code AutoClosable.close()} declares that it throws {@link Exception}.
* Implementers shouldn't throw checked exceptions. This override narrows
* the signature to prevent them from doing so.
*/
public abstract void close();
}