blob: 975808611ed46635ce3a2865e7f1f34b20b67a78 [file] [log] [blame]
package com.intellij.vcs.log.data;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.NotNullFunction;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.vcs.log.*;
import com.intellij.vcs.log.graph.GraphColorManagerImpl;
import com.intellij.vcs.log.graph.GraphCommit;
import com.intellij.vcs.log.graph.GraphFacade;
import com.intellij.vcs.log.graph.PermanentGraph;
import com.intellij.vcs.log.graph.impl.facade.PermanentGraphImpl;
import com.intellij.vcs.log.printer.idea.ColorGenerator;
import com.intellij.vcs.log.util.StopWatch;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
import java.util.*;
import java.util.List;
public class DataPack implements VcsLogDataPack {
@NotNull private final RefsModel myRefsModel;
@NotNull private final PermanentGraph<Integer> myPermanentGraph;
@NotNull private final GraphFacade myGraphFacade;
@NotNull private final Map<VirtualFile, VcsLogProvider> myLogProviders;
private boolean myFull;
@NotNull
static DataPack build(@NotNull List<? extends GraphCommit<Integer>> commits,
@NotNull Map<VirtualFile, Set<VcsRef>> refs,
@NotNull Map<VirtualFile, VcsLogProvider> providers,
@NotNull VcsLogHashMap hashMap,
boolean full) {
RefsModel refsModel = new RefsModel(refs, hashMap.asIndexGetter());
PermanentGraph<Integer> graph = buildPermanentGraph(commits, refsModel, hashMap.asIndexGetter(), hashMap.asHashGetter(), providers);
return new DataPack(refsModel, graph, createGraphFacade(graph), providers, full);
}
@NotNull
private static GraphFacade createGraphFacade(@NotNull PermanentGraph<Integer> permanentGraph) {
GraphFacade facade;
if (!permanentGraph.getAllCommits().isEmpty()) {
ColorGenerator colorGenerator = new ColorGenerator() {
@Override
public Color getColor(int colorId) {
return com.intellij.vcs.log.graph.ColorGenerator.getColor(colorId);
}
};
facade = new DelegateGraphFacade(permanentGraph, colorGenerator);
}
else {
facade = new EmptyGraphFacade();
}
return facade;
}
@NotNull
private static PermanentGraph<Integer> buildPermanentGraph(@NotNull List<? extends GraphCommit<Integer>> commits,
@NotNull RefsModel refsModel,
@NotNull NotNullFunction<Hash, Integer> indexGetter,
@NotNull NotNullFunction<Integer, Hash> hashGetter,
@NotNull Map<VirtualFile, VcsLogProvider> providers) {
if (commits.isEmpty()) {
return EmptyPermanentGraph.getInstance();
}
GraphColorManagerImpl colorManager = new GraphColorManagerImpl(refsModel, hashGetter, getRefManagerMap(providers));
Set<Integer> branches = getBranchCommitHashIndexes(refsModel.getAllRefs(), indexGetter);
StopWatch sw = StopWatch.start("building graph");
PermanentGraphImpl<Integer> permanentGraph = PermanentGraphImpl.newInstance(commits, colorManager, branches);
sw.report();
return permanentGraph;
}
@NotNull
private static Set<Integer> getBranchCommitHashIndexes(@NotNull Collection<VcsRef> allRefs,
@NotNull NotNullFunction<Hash, Integer> indexGetter) {
Set<Integer> result = new HashSet<Integer>();
for (VcsRef vcsRef : allRefs) {
if (vcsRef.getType().isBranch())
result.add(indexGetter.fun(vcsRef.getCommitHash()));
}
return result;
}
@NotNull
private static Map<VirtualFile, VcsLogRefManager> getRefManagerMap(@NotNull Map<VirtualFile, VcsLogProvider> logProviders) {
Map<VirtualFile, VcsLogRefManager> map = ContainerUtil.newHashMap();
for (Map.Entry<VirtualFile, VcsLogProvider> entry : logProviders.entrySet()) {
map.put(entry.getKey(), entry.getValue().getReferenceManager());
}
return map;
}
DataPack(@NotNull RefsModel refsModel, @NotNull PermanentGraph<Integer> permanentGraph, @NotNull GraphFacade graphFacade,
@NotNull Map<VirtualFile, VcsLogProvider> providers, boolean full) {
myRefsModel = refsModel;
myPermanentGraph = permanentGraph;
myGraphFacade = graphFacade;
myLogProviders = providers;
myFull = full;
}
@NotNull
public GraphFacade getGraphFacade() {
return myGraphFacade;
}
@NotNull
@Override
public VcsLogRefs getRefs() {
return myRefsModel;
}
@NotNull
public RefsModel getRefsModel() {
return myRefsModel;
}
@NotNull
@Override
public Map<VirtualFile, VcsLogProvider> getLogProviders() {
return myLogProviders;
}
@NotNull
public PermanentGraph<Integer> getPermanentGraph() {
return myPermanentGraph;
}
public boolean isFull() {
return myFull;
}
}