package zielu.gittoolbox.fetch;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.DumbProgressIndicator;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.vcsUtil.VcsImplUtil;
import git4idea.GitUtil;
import git4idea.repo.GitRepository;
import git4idea.repo.GitRepositoryManager;
import git4idea.update.GitFetchResult;
import git4idea.update.GitFetcher;
import java.util.Collection;
import java.util.Map;
import org.jetbrains.annotations.NotNull;
import zielu.gittoolbox.compat.Notifier;
import zielu.gittoolbox.util.FetchResult;
import zielu.gittoolbox.util.FetchResultsPerRoot;
public class GtFetcher {
private final Logger LOG = Logger.getInstance(getClass());
private final Project myProject;
private final ProgressIndicator myProgress;
private final GitFetcher myFetcher;
private final GitRepositoryManager myRepositoryManager;
private GtFetcher(@NotNull Project project, @NotNull ProgressIndicator progress, Builder builder) {
myProject = Preconditions.checkNotNull(project, "Null Project");
myProgress = progress;
myFetcher = new GitFetcher(myProject, DumbProgressIndicator.INSTANCE, builder.fetchAll);
myRepositoryManager = GitUtil.getRepositoryManager(myProject);
}
@NotNull
private String makeAdditionalInfoByRoot(@NotNull Map<VirtualFile, String> additionalInfo) {
if (additionalInfo.isEmpty()) {
return "";
}
StringBuilder info = new StringBuilder();
if (myRepositoryManager.moreThanOneRoot()) {
for (Map.Entry<VirtualFile, String> entry : additionalInfo.entrySet()) {
info.append(entry.getValue()).append(" in ").append(VcsImplUtil.getShortVcsRootName(myProject, entry.getKey())).append("<br/>");
}
} else {
info.append(additionalInfo.values().iterator().next());
}
return info.toString();
}
public ImmutableCollection<GitRepository> fetchRoots(@NotNull Collection<GitRepository> repositories) {
Map<VirtualFile, String> additionalInfos = Maps.newHashMapWithExpectedSize(repositories.size());
FetchResultsPerRoot errorsPerRoot = new FetchResultsPerRoot();
ImmutableList.Builder<GitRepository> resultBuilder = ImmutableList.builder();
final boolean debug = LOG.isDebugEnabled();
for (GitRepository repository : repositories) {
if (debug) {
LOG.debug("Fetching " + repository);
}
GitFetchResult result = myFetcher.fetch(repository);
if (debug) {
LOG.debug("Fetched " + repository + ": success=" + result.isSuccess() + ", error=" + result.isError());
}
String ai = result.getAdditionalInfo();
if (!StringUtil.isEmptyOrSpaces(ai)) {
additionalInfos.put(repository.getRoot(), ai);
}
if (result.isSuccess()) {
resultBuilder.add(repository);
} else {
errorsPerRoot.add(repository, new FetchResult(result, myFetcher.getErrors()));
}
}
errorsPerRoot.showProblems(Notifier.getInstance(myProject));
showAdditionalInfos(additionalInfos);
return resultBuilder.build();
}
private void showAdditionalInfos(Map<VirtualFile, String> additionalInfos) {
String additionalInfo = makeAdditionalInfoByRoot(additionalInfos);
if (!StringUtil.isEmptyOrSpaces(additionalInfo)) {
Notifier.getInstance(myProject).notifyMinorInfo("Fetch details", additionalInfo);
}
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private boolean fetchAll = false;
private Builder() {
}
public Builder fetchAll() {
fetchAll = true;
return this;
}
public GtFetcher build(@NotNull Project project, @NotNull ProgressIndicator progress) {
return new GtFetcher(project, progress, this);
}
}
}