diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLog.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLog.java index 511854deaddc..29f63e6cdeb3 100644 --- a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLog.java +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLog.java @@ -40,15 +40,6 @@ public interface VcsLog { @NotNull List getSelectedDetails(); - /** - * Returns details of the given commit, if they have been already loaded. - * In most cases they are already in the cache, and will be returned. - * Otherwise null is returned. - * Asynchronous loading of the details which are not yet available is done automatically from the log table component. - */ - @Nullable - VcsFullCommitDetails getDetailsIfAvailable(@NotNull Hash hash); - /** * Returns names of branches which contain the given commit, or null if this information is unavailable. */ diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/CommitDetailsGetter.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/CommitDetailsGetter.java index 9907051c5a48..ace5f30a3dda 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/CommitDetailsGetter.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/CommitDetailsGetter.java @@ -2,7 +2,6 @@ package com.intellij.vcs.log.data; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.VcsFullCommitDetails; import com.intellij.vcs.log.VcsLogProvider; import org.jetbrains.annotations.NotNull; @@ -17,12 +16,12 @@ import java.util.Map; public class CommitDetailsGetter extends DataGetter { CommitDetailsGetter(VcsLogDataHolder dataHolder, @NotNull Map logProviders) { - super(dataHolder, logProviders, new VcsCommitCache()); + super(dataHolder, logProviders, new VcsCommitCache()); } @Nullable @Override - protected VcsFullCommitDetails getFromAdditionalCache(@NotNull Hash hash) { + protected VcsFullCommitDetails getFromAdditionalCache(int commitId) { return null; } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/DataGetter.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/DataGetter.java index 532073437f28..1c55e1a285b6 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/DataGetter.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/DataGetter.java @@ -9,7 +9,6 @@ import com.intellij.util.ThrowableConsumer; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import com.intellij.util.ui.UIUtil; -import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.VcsLogProvider; import com.intellij.vcs.log.VcsShortCommitDetails; import com.intellij.vcs.log.ui.tables.GraphTableModel; @@ -42,7 +41,7 @@ public abstract class DataGetter implements Dis @NotNull protected final VcsLogDataHolder myDataHolder; @NotNull private final Map myLogProviders; - @NotNull private final VcsCommitCache myCache; + @NotNull private final VcsCommitCache myCache; @NotNull private final SequentialLimitedLifoExecutor myLoader; /** @@ -53,7 +52,7 @@ public abstract class DataGetter implements Dis @NotNull private final Collection myLoadingFinishedListeners = new ArrayList(); DataGetter(@NotNull VcsLogDataHolder dataHolder, @NotNull Map logProviders, - @NotNull VcsCommitCache cache) { + @NotNull VcsCommitCache cache) { myDataHolder = dataHolder; myLogProviders = logProviders; myCache = cache; @@ -83,10 +82,7 @@ public abstract class DataGetter implements Dis @Nullable public T getCommitData(int row, @NotNull GraphTableModel tableModel) { assert EventQueue.isDispatchThread(); - Hash hash = tableModel.getHashAtRow(row); - if (hash == null) { - return null; - } + Integer hash = tableModel.getCommitIdAtRow(row); T details = getFromCache(hash); if (details != null) { return details; @@ -96,44 +92,44 @@ public abstract class DataGetter implements Dis } @Nullable - public T getCommitDataIfAvailable(@NotNull Hash hash) { + public T getCommitDataIfAvailable(int hash) { return getFromCache(hash); } @Nullable - private T getFromCache(@NotNull Hash hash) { - T details = myCache.get(hash); + private T getFromCache(@NotNull Integer commitId) { + T details = myCache.get(commitId); if (details != null) { if (details instanceof LoadingDetails) { if (((LoadingDetails)details).getLoadingTaskIndex() <= myCurrentTaskIndex - MAX_LOADING_TASKS) { // don't let old "loading" requests stay in the cache forever - myCache.remove(hash); + myCache.remove(commitId); return null; } } return details; } - return getFromAdditionalCache(hash); + return getFromAdditionalCache(commitId); } /** * Lookup somewhere else but the standard cache. */ @Nullable - protected abstract T getFromAdditionalCache(@NotNull Hash hash); + protected abstract T getFromAdditionalCache(int commitId); private void runLoadAroundCommitData(int row, @NotNull GraphTableModel tableModel) { long taskNumber = myCurrentTaskIndex++; - MultiMap commits = getCommitsAround(row, tableModel, UP_PRELOAD_COUNT, DOWN_PRELOAD_COUNT); - for (Map.Entry> hashesByRoots : commits.entrySet()) { + MultiMap commits = getCommitsAround(row, tableModel, UP_PRELOAD_COUNT, DOWN_PRELOAD_COUNT); + for (Map.Entry> hashesByRoots : commits.entrySet()) { VirtualFile root = hashesByRoots.getKey(); - Collection hashes = hashesByRoots.getValue(); + Collection hashes = hashesByRoots.getValue(); // fill the cache with temporary "Loading" values to avoid producing queries for each commit that has not been cached yet, // even if it will be loaded within a previous query - for (Hash hash : hashes) { - if (!myCache.isKeyCached(hash)) { - myCache.put(hash, (T)new LoadingDetails(hash, taskNumber, root)); + for (int commitId : hashes) { + if (!myCache.isKeyCached(commitId)) { + myCache.put(commitId, (T)new LoadingDetails(myDataHolder.getHash(commitId), taskNumber, root)); } } } @@ -143,25 +139,25 @@ public abstract class DataGetter implements Dis } @NotNull - private static MultiMap getCommitsAround(int selectedRow, @NotNull GraphTableModel model, - int above, int below) { - MultiMap commits = MultiMap.create(); + private static MultiMap getCommitsAround(int selectedRow, + @NotNull GraphTableModel model, + int above, + int below) { + MultiMap commits = MultiMap.create(); for (int row = Math.max(0, selectedRow - above); row < selectedRow + below && row < model.getRowCount(); row++) { - Hash hash = model.getHashAtRow(row); - if (hash != null) { - VirtualFile root = model.getRoot(row); - commits.putValue(root, hash); - } + Integer hash = model.getCommitIdAtRow(row); + VirtualFile root = model.getRoot(row); + commits.putValue(root, hash); } return commits; } - private void preLoadCommitData(@NotNull MultiMap commits) throws VcsException { - for (Map.Entry> entry : commits.entrySet()) { - List hashStrings = ContainerUtil.map(entry.getValue(), new Function() { + private void preLoadCommitData(@NotNull MultiMap commits) throws VcsException { + for (Map.Entry> entry : commits.entrySet()) { + List hashStrings = ContainerUtil.map(entry.getValue(), new Function() { @Override - public String fun(Hash hash) { - return hash.asString(); + public String fun(Integer commitId) { + return myDataHolder.getHash(commitId).asString(); } }); List details = readDetails(myLogProviders.get(entry.getKey()), entry.getKey(), hashStrings); @@ -174,7 +170,7 @@ public abstract class DataGetter implements Dis @Override public void run() { for (T data : details) { - myCache.put(data.getId(), data); + myCache.put(myDataHolder.getCommitIndex(data.getId()), data); } } }); @@ -193,9 +189,9 @@ public abstract class DataGetter implements Dis } private static class TaskDescriptor { - private final MultiMap myCommits; + private final MultiMap myCommits; - private TaskDescriptor(MultiMap commits) { + private TaskDescriptor(MultiMap commits) { myCommits = commits; } } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/MiniDetailsGetter.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/MiniDetailsGetter.java index 0dceb75b6a6c..cdacebd74624 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/MiniDetailsGetter.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/MiniDetailsGetter.java @@ -2,7 +2,6 @@ package com.intellij.vcs.log.data; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.VcsLogProvider; import com.intellij.vcs.log.VcsShortCommitDetails; import org.jetbrains.annotations.NotNull; @@ -14,13 +13,13 @@ import java.util.Map; public class MiniDetailsGetter extends DataGetter { MiniDetailsGetter(@NotNull VcsLogDataHolder dataHolder, @NotNull Map logProviders) { - super(dataHolder, logProviders, new VcsCommitCache()); + super(dataHolder, logProviders, new VcsCommitCache()); } @Nullable @Override - protected VcsShortCommitDetails getFromAdditionalCache(@NotNull Hash hash) { - return myDataHolder.getTopCommitDetails(hash); + protected VcsShortCommitDetails getFromAdditionalCache(int commitId) { + return myDataHolder.getTopCommitDetails(commitId); } @NotNull diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsCommitCache.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsCommitCache.java index 92a6760c6f65..39fc3f338523 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsCommitCache.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsCommitCache.java @@ -16,7 +16,6 @@ package com.intellij.vcs.log.data; import com.intellij.util.containers.SLRUMap; -import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.VcsShortCommitDetails; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,27 +31,27 @@ import java.awt.*; * * @author Kirill Likhodedov */ -class VcsCommitCache { +class VcsCommitCache { - private final SLRUMap myCache = new SLRUMap(5000, 5000); + private final SLRUMap myCache = new SLRUMap(5000, 5000); - public void put(@NotNull Hash hash, @NotNull T commit) { + public void put(@NotNull CommitId hash, @NotNull T commit) { assert EventQueue.isDispatchThread(); myCache.put(hash, commit); } - public boolean isKeyCached(@NotNull Hash hash) { + public boolean isKeyCached(@NotNull CommitId hash) { assert EventQueue.isDispatchThread(); return myCache.get(hash) != null; } @Nullable - public T get(@NotNull Hash hash) { + public T get(@NotNull CommitId hash) { assert EventQueue.isDispatchThread(); return myCache.get(hash); } - public void remove(@NotNull Hash hash) { + public void remove(@NotNull CommitId hash) { myCache.remove(hash); } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogDataHolder.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogDataHolder.java index 83638e2aa70e..90d84bcab727 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogDataHolder.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogDataHolder.java @@ -64,7 +64,7 @@ public class VcsLogDataHolder implements Disposable, VcsLogDataProvider { * which is important because these details will be constantly visible to the user, * thus it would be annoying to re-load them from VCS if the cache overflows. */ - @NotNull private final Map myTopCommitsDetailsCache = ContainerUtil.newConcurrentMap(); + @NotNull private final Map myTopCommitsDetailsCache = ContainerUtil.newConcurrentMap(); private final VcsUserRegistryImpl myUserRegistry; @@ -249,8 +249,8 @@ public class VcsLogDataHolder implements Disposable, VcsLogDataProvider { } @Nullable - public VcsCommitMetadata getTopCommitDetails(@NotNull Hash hash) { - return myTopCommitsDetailsCache.get(hash); + public VcsCommitMetadata getTopCommitDetails(@NotNull Integer commitId) { + return myTopCommitsDetailsCache.get(commitId); } public CommitDetailsGetter getCommitDetailsGetter() { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogFiltererImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogFiltererImpl.java index 1f106c001754..2efa37d33c67 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogFiltererImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogFiltererImpl.java @@ -50,7 +50,7 @@ public class VcsLogFiltererImpl implements VcsLogFilterer { VcsLogFiltererImpl(@NotNull final Project project, @NotNull Map providers, @NotNull VcsLogHashMap hashMap, - @NotNull Map topCommitsDetailsCache, + @NotNull Map topCommitsDetailsCache, @NotNull CommitDetailsGetter detailsGetter, @NotNull final PermanentGraph.SortType initialSortType, @NotNull final Consumer visiblePackConsumer) { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogRefresherImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogRefresherImpl.java index d578a9241204..3145ece96ca4 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogRefresherImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VcsLogRefresherImpl.java @@ -46,7 +46,7 @@ public class VcsLogRefresherImpl implements VcsLogRefresher { @NotNull private final VcsLogHashMap myHashMap; @NotNull private final Map myProviders; @NotNull private final VcsUserRegistryImpl myUserRegistry; - @NotNull private final Map myTopCommitsDetailsCache; + @NotNull private final Map myTopCommitsDetailsCache; @NotNull private final Consumer myExceptionHandler; private final int myRecentCommitCount; @@ -58,7 +58,7 @@ public class VcsLogRefresherImpl implements VcsLogRefresher { @NotNull VcsLogHashMap hashMap, @NotNull Map providers, @NotNull final VcsUserRegistryImpl userRegistry, - @NotNull Map topCommitsDetailsCache, + @NotNull Map topCommitsDetailsCache, @NotNull final Consumer dataPackUpdateHandler, @NotNull Consumer exceptionHandler, int recentCommitsCount) { @@ -179,7 +179,7 @@ public class VcsLogRefresherImpl implements VcsLogRefresher { for (VcsCommitMetadata detail : metadatas) { myUserRegistry.addUser(detail.getAuthor()); myUserRegistry.addUser(detail.getCommitter()); - myTopCommitsDetailsCache.put(detail.getId(), detail); + myTopCommitsDetailsCache.put(myHashMap.getCommitIndex(detail.getId()), detail); } } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java index 07c46d6d7e06..998cb9b2c21c 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/VisiblePackBuilder.java @@ -40,13 +40,13 @@ class VisiblePackBuilder { private static final Logger LOG = Logger.getInstance(VisiblePackBuilder.class); @NotNull private final VcsLogHashMap myHashMap; - @NotNull private final Map myTopCommitsDetailsCache; + @NotNull private final Map myTopCommitsDetailsCache; @NotNull private final CommitDetailsGetter myCommitDetailsGetter; @NotNull private final Map myLogProviders; VisiblePackBuilder(@NotNull Map providers, @NotNull VcsLogHashMap hashMap, - @NotNull Map topCommitsDetailsCache, + @NotNull Map topCommitsDetailsCache, @NotNull CommitDetailsGetter detailsGetter) { myHashMap = hashMap; myTopCommitsDetailsCache = topCommitsDetailsCache; @@ -213,15 +213,14 @@ class VisiblePackBuilder { @Nullable private VcsCommitMetadata getDetailsFromCache(final int commitIndex) { - final Hash hash = myHashMap.getHash(commitIndex); - VcsCommitMetadata details = myTopCommitsDetailsCache.get(hash); + VcsCommitMetadata details = myTopCommitsDetailsCache.get(commitIndex); if (details != null) { return details; } return UIUtil.invokeAndWaitIfNeeded(new Computable() { @Override public VcsCommitMetadata compute() { - return myCommitDetailsGetter.getCommitDataIfAvailable(hash); + return myCommitDetailsGetter.getCommitDataIfAvailable(commitIndex); } }); } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogImpl.java index 7219749676b2..e80032bbd9ba 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogImpl.java @@ -72,12 +72,6 @@ public class VcsLogImpl implements VcsLog { return details; } - @Override - @Nullable - public VcsFullCommitDetails getDetailsIfAvailable(@NotNull final Hash hash) { - return myDataHolder.getCommitDetailsGetter().getCommitDataIfAvailable(hash); - } - @Nullable @Override public Collection getContainingBranches(@NotNull Hash commitHash) { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java index 69be8a31c89b..e046102fe04b 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java @@ -165,9 +165,8 @@ class DetailsPanel extends JPanel implements ListSelectionListener { ((CardLayout)getLayout()).show(this, STANDARD_LAYER); int row = rows[0]; GraphTableModel tableModel = (GraphTableModel)myGraphTable.getModel(); - Hash hash = tableModel.getHashAtRow(row); VcsFullCommitDetails commitData = myLogDataHolder.getCommitDetailsGetter().getCommitData(row, tableModel); - if (commitData == null || hash == null) { + if (commitData == null) { showMessage("No commits selected"); return; } @@ -180,14 +179,14 @@ class DetailsPanel extends JPanel implements ListSelectionListener { else { myLoadingPanel.stopLoading(); myCommitDetailsPanel.setData(commitData); - myRefsPanel.setRefs(sortRefs(hash, commitData.getRoot())); + myRefsPanel.setRefs(sortRefs(commitData.getId(), commitData.getRoot())); updateDetailsBorder(commitData); newCommitDetails = commitData; } List branches = null; if (!(commitData instanceof LoadingDetails)) { - branches = myLogDataHolder.getContainingBranchesGetter().requestContainingBranches(commitData.getRoot(), hash); + branches = myLogDataHolder.getContainingBranchesGetter().requestContainingBranches(commitData.getRoot(), commitData.getId()); } myCommitDetailsPanel.setBranches(branches); diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/tables/GraphTableModel.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/tables/GraphTableModel.java index 5abaaf2da696..468feac8243c 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/tables/GraphTableModel.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/tables/GraphTableModel.java @@ -114,9 +114,14 @@ public class GraphTableModel extends AbstractTableModel { return new GraphCommitCell(message, refs); } + @NotNull + public Integer getCommitIdAtRow(int row) { + return myDataPack.getVisibleGraph().getRowInfo(row).getCommit(); + } + @Nullable public Hash getHashAtRow(int row) { - return myDataHolder.getHash(myDataPack.getVisibleGraph().getRowInfo(row).getCommit()); + return myDataHolder.getHash(getCommitIdAtRow(row)); } public int getRowOfCommit(@NotNull final Hash hash) { diff --git a/platform/vcs-log/impl/test/com/intellij/vcs/log/data/VcsLogRefresherTest.java b/platform/vcs-log/impl/test/com/intellij/vcs/log/data/VcsLogRefresherTest.java index 2e18a39cd69a..9a052b2abe80 100644 --- a/platform/vcs-log/impl/test/com/intellij/vcs/log/data/VcsLogRefresherTest.java +++ b/platform/vcs-log/impl/test/com/intellij/vcs/log/data/VcsLogRefresherTest.java @@ -21,7 +21,6 @@ import com.intellij.util.Consumer; import com.intellij.util.Function; import com.intellij.util.concurrency.FutureResult; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.HashMap; import com.intellij.vcs.log.*; import com.intellij.vcs.log.graph.GraphCommit; import com.intellij.vcs.log.impl.*; @@ -48,7 +47,7 @@ public class VcsLogRefresherTest extends VcsLogPlatformTest { }; private TestVcsLogProvider myLogProvider; private VcsLogDataHolder myDataHolder; - private Map myTopDetailsCache; + private Map myTopDetailsCache; private Map myLogProviders; private List myCommits; @@ -58,7 +57,7 @@ public class VcsLogRefresherTest extends VcsLogPlatformTest { myLogProvider = new TestVcsLogProvider(myProjectRoot); myLogProviders = Collections.singletonMap(myProjectRoot, myLogProvider); - myTopDetailsCache = new HashMap(); + myTopDetailsCache = ContainerUtil.newHashMap(); myCommits = Arrays.asList("3|-a2|-a1", "2|-a1|-a", "1|-a|-"); myLogProvider.appendHistory(log(myCommits));