Narrow exceptions declared by LsRemoteCommand

API commands either throw GitAPIException or JGitInternalException.

Also add missing javadoc and reduce nesting of catch blocks.

Change-Id: I9a3b302e1b3f373ee11a977a0e3d6213bfbd3cdf
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Signed-off-by: Kevin Sawicki <kevin@github.com>
This commit is contained in:
Matthias Sohn 2012-01-08 13:08:08 -08:00 committed by Kevin Sawicki
parent 0806c803a9
commit 0f15d656f2
1 changed files with 47 additions and 40 deletions

View File

@ -42,6 +42,7 @@
*/
package org.eclipse.jgit.api;
import java.io.IOException;
import java.net.URISyntaxException;
import java.text.MessageFormat;
import java.util.ArrayList;
@ -50,10 +51,9 @@
import java.util.Map;
import org.eclipse.jgit.JGitText;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRemoteException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.NotSupportedException;
import org.eclipse.jgit.errors.TransportException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
@ -128,56 +128,63 @@ public void setUploadPack(String uploadPack) {
this.uploadPack = uploadPack;
}
public Collection<Ref> call() throws Exception {
/**
* Executes the {@code LsRemote} command with all the options and parameters
* collected by the setter methods (e.g. {@link #setHeads(boolean)}) of this
* class. Each instance of this class should only be used for one invocation
* of the command. Don't call this method twice on an instance.
*
* @return a collection of references in the remote repository
* @throws InvalidRemoteException
* when called with an invalid remote uri
* @throws JGitInternalException
* a low-level exception of JGit has occurred. The original
* exception can be retrieved by calling
* {@link Exception#getCause()}.
*/
public Collection<Ref> call() throws GitAPIException,
JGitInternalException {
checkCallable();
Transport transport = null;
FetchConnection fc = null;
try {
Transport transport = Transport.open(repo, remote);
transport = Transport.open(repo, remote);
transport.setOptionUploadPack(uploadPack);
configure(transport);
try {
Collection<RefSpec> refSpecs = new ArrayList<RefSpec>(1);
if (tags)
refSpecs.add(new RefSpec(
"refs/tags/*:refs/remotes/origin/tags/*"));
if (heads)
refSpecs.add(new RefSpec(
"refs/heads/*:refs/remotes/origin/*"));
Collection<Ref> refs;
Map<String, Ref> refmap = new HashMap<String, Ref>();
FetchConnection fc = transport.openFetch();
try {
refs = fc.getRefs();
if (refSpecs.isEmpty())
for (Ref r : refs)
Collection<RefSpec> refSpecs = new ArrayList<RefSpec>(1);
if (tags)
refSpecs.add(new RefSpec(
"refs/tags/*:refs/remotes/origin/tags/*"));
if (heads)
refSpecs.add(new RefSpec("refs/heads/*:refs/remotes/origin/*"));
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);
else
for (Ref r : refs)
for (RefSpec rs : refSpecs)
if (rs.matchSource(r)) {
refmap.put(r.getName(), r);
break;
}
} finally {
fc.close();
}
return refmap.values();
} catch (TransportException e) {
throw new JGitInternalException(
JGitText.get().exceptionCaughtDuringExecutionOfLsRemoteCommand,
e);
} finally {
transport.close();
}
break;
}
return refmap.values();
} catch (URISyntaxException e) {
throw new InvalidRemoteException(MessageFormat.format(
JGitText.get().invalidRemote, remote));
} catch (NotSupportedException e) {
} catch (IOException e) {
throw new JGitInternalException(
JGitText.get().exceptionCaughtDuringExecutionOfLsRemoteCommand,
e);
} finally {
if (fc != null)
fc.close();
if (transport != null)
transport.close();
}
}