package zielu.gittoolbox.fetch;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import git4idea.repo.GitRepository;
import java.util.List;
import zielu.gittoolbox.GitToolBoxProject;
import zielu.gittoolbox.cache.PerRepoInfoCache;
import zielu.gittoolbox.cache.RepoInfo;
import zielu.gittoolbox.util.GtUtil;
public enum AutoFetchStrategy {
RepoWithRemotes("repoWithRemotes") {
private final Logger LOG = Logger.getInstance(getClass());
@Override
public List<GitRepository> fetchableRepositories(List<GitRepository> repositories, Project project) {
List<GitRepository> fetchable = Lists.newArrayListWithCapacity(repositories.size());
for (GitRepository repository : repositories) {
if (GtUtil.hasRemotes(repository)) {
fetchable.add(repository);
} else {
if (LOG.isDebugEnabled()) {
LOG.debug("Skip repo " + GtUtil.name(repository) + " - no remotes");
}
}
}
return fetchable;
}
},
CurrentBranchWithRemote("currentBranchWithRemote") {
private final Logger LOG = Logger.getInstance(getClass());
@Override
public List<GitRepository> fetchableRepositories(List<GitRepository> repositories, Project project) {
PerRepoInfoCache cache = GitToolBoxProject.getInstance(project).perRepoStatusCache();
List<GitRepository> fetchable = Lists.newArrayListWithCapacity(repositories.size());
for (GitRepository repository : repositories) {
RepoInfo info = cache.getInfo(repository);
if (info.status.hasRemoteBranch()) {
fetchable.add(repository);
} else {
if (LOG.isDebugEnabled()) {
LOG.debug("Skip repo " + GtUtil.name(repository) + " - no remote branch");
}
}
}
return fetchable;
}
};
private static final ImmutableMap<String, AutoFetchStrategy> strategies;
static {
ImmutableMap.Builder<String, AutoFetchStrategy> builder = ImmutableMap.builder();
for (AutoFetchStrategy strategy : AutoFetchStrategy.values()) {
builder.put(strategy.key(), strategy);
}
strategies = builder.build();
}
private final String myKey;
AutoFetchStrategy(String key) {
myKey = key;
}
public String key() {
return myKey;
}
public static AutoFetchStrategy forKey(String key) {
return strategies.get(key);
}
public abstract List<GitRepository> fetchableRepositories(List<GitRepository> repositories, Project project);
}