/*******************************************************************************
* Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.egit.core.op;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.egit.core.internal.CoreText;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.LsRemoteCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.jgit.transport.URIish;
/**
* Operation of listing remote repository advertised refs.
*/
public class ListRemoteOperation {
private final LsRemoteCommand rc;
private Collection<Ref> remoteRefs;
/**
* Create listing operation for specified local repository (needed by
* transport) and remote repository URI.
*
* @param localDb
* local repository (needed for transport) where fetch would
* occur.
* @param uri
* URI of remote repository to list.
* @param timeout
* timeout is seconds; 0 means no timeout
*/
public ListRemoteOperation(final Repository localDb, final URIish uri,
int timeout) {
Git git = new Git(localDb);
rc = git.lsRemote();
rc.setRemote(uri.toString()).setTimeout(timeout);
}
/**
* @return collection of refs advertised by remote side.
* @throws IllegalStateException
* if error occurred during earlier remote refs listing.
*/
public Collection<Ref> getRemoteRefs() {
checkState();
return remoteRefs;
}
/**
* @param refName
* remote ref name to search for.
* @return ref with specified refName or null if not found.
* @throws IllegalStateException
* if error occurred during earlier remote refs listing.
*/
public Ref getRemoteRef(final String refName) {
checkState();
for (Ref r: remoteRefs)
if (r.getName().equals(refName))
return r;
return null;
}
/**
* Sets a credentials provider
* @param credentialsProvider
*/
public void setCredentialsProvider(CredentialsProvider credentialsProvider) {
rc.setCredentialsProvider(credentialsProvider);
}
/**
* @param pm
* the monitor to be used for reporting progress and responding
* to cancellation. The monitor is never <code>null</code>
* @throws InvocationTargetException
* @throws InterruptedException
*/
public void run(IProgressMonitor pm) throws InvocationTargetException,
InterruptedException {
if (pm != null)
pm.beginTask(CoreText.ListRemoteOperation_title,
IProgressMonitor.UNKNOWN);
try {
remoteRefs = rc.call();
} catch (JGitInternalException e) {
throw new InvocationTargetException(e);
} catch (GitAPIException e) {
throw new InvocationTargetException(e);
}
if (pm != null)
pm.done();
}
private void checkState() {
if (remoteRefs == null)
throw new IllegalStateException(
"Error occurred during remote repo " + //$NON-NLS-1$
"listing, no refs available"); //$NON-NLS-1$
}
}