Adds a callAsMap() function to LsRemoteCommand.

The call() function of LsRemoteCommand returns Collection<Ref>, while its
internal is using Map<String, Ref> all the time. Sometimes the map is much more
useful to the caller so add a callAsMap() function to keep the API
compatibility.

Change-Id: Icb96b71277d5e2de59872aa777352dedc048c4e3
Signed-off-by: Yuxuan 'fishy' Wang <fishywang@google.com>
This commit is contained in:
Yuxuan 'fishy' Wang 2014-05-22 14:04:16 -07:00
parent 44f81d956b
commit 30cd891a48
2 changed files with 26 additions and 9 deletions

View File

@ -46,6 +46,7 @@
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -153,6 +154,28 @@ public LsRemoteCommand setUploadPack(String uploadPack) {
public Collection<Ref> call() throws GitAPIException, public Collection<Ref> call() throws GitAPIException,
InvalidRemoteException, InvalidRemoteException,
org.eclipse.jgit.api.errors.TransportException { org.eclipse.jgit.api.errors.TransportException {
return execute().values();
}
/**
* Same as {@link #call()}, but return Map instead of Collection.
*
* @return a map from names to references in the remote repository
* @throws InvalidRemoteException
* when called with an invalid remote uri
* @throws org.eclipse.jgit.api.errors.TransportException
* for errors that occurs during transport
* @since 3.5
*/
public Map<String, Ref> callAsMap() throws GitAPIException,
InvalidRemoteException,
org.eclipse.jgit.api.errors.TransportException {
return Collections.unmodifiableMap(execute());
}
protected Map<String, Ref> execute() throws GitAPIException,
InvalidRemoteException,
org.eclipse.jgit.api.errors.TransportException {
checkCallable(); checkCallable();
Transport transport = null; Transport transport = null;
@ -184,7 +207,7 @@ public Collection<Ref> call() throws GitAPIException,
refmap.put(r.getName(), r); refmap.put(r.getName(), r);
break; break;
} }
return refmap.values(); return refmap;
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
throw new InvalidRemoteException(MessageFormat.format( throw new InvalidRemoteException(MessageFormat.format(
JGitText.get().invalidRemote, remote)); JGitText.get().invalidRemote, remote));

View File

@ -160,16 +160,10 @@ public byte[] readFile(String uri, String ref, String path)
/** A default implementation of {@link RemoteReader} callback. */ /** A default implementation of {@link RemoteReader} callback. */
public static class DefaultRemoteReader implements RemoteReader { public static class DefaultRemoteReader implements RemoteReader {
public ObjectId sha1(String uri, String ref) throws GitAPIException { public ObjectId sha1(String uri, String ref) throws GitAPIException {
Collection<Ref> refs = Git Map<String, Ref> map = Git
.lsRemoteRepository() .lsRemoteRepository()
.setRemote(uri) .setRemote(uri)
.call(); .callAsMap();
// Since LsRemoteCommand.call() only returned Map.values() to us, we
// have to rebuild the map here.
Map<String, Ref> map = new HashMap<String, Ref>(refs.size());
for (Ref r : refs)
map.put(r.getName(), r);
Ref r = RefDatabase.findRef(map, ref); Ref r = RefDatabase.findRef(map, ref);
return r != null ? r.getObjectId() : null; return r != null ? r.getObjectId() : null;
} }