From 527f0772780d3cb908e09c42a55ea16c12f48170 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Fri, 27 Sep 2013 16:12:15 +0400 Subject: [PATCH] [log] Refactor VcsCommitDetails * Rename to VcsShortCommitDetails & VcsFullCommitDetails. * Separate interface from implementation. * Don't extend CommitParents: details are not commits. Just hold the instance of the CommitParents in Vcs*CommitDetails. * Introduce VcsLogObjectsFactory to provide create*() methods to create standard instances of the Hash and Details objects. --- .../vcs/log/VcsCommitMiniDetails.java | 34 ------------ .../vcs/log/VcsFullCommitDetails.java | 39 +++++++++++++ .../vcs/log/VcsLogObjectsFactory.java | 27 +++++++++ .../com/intellij/vcs/log/VcsLogProvider.java | 6 +- .../vcs/log/VcsShortCommitDetails.java | 34 ++++++++++++ .../vcs/log/parser/CommitDataParserTest.java | 8 +-- .../intellij/vcs/log/parser/CommitParser.java | 16 ++++-- .../intellij/vcs/log/parser/SimpleHash.java | 43 --------------- .../vcs-log/impl/src/META-INF/vcs-log.xml | 1 + .../vcs/log/data/CommitDetailsGetter.java | 12 ++-- .../com/intellij/vcs/log/data/DataGetter.java | 4 +- .../intellij/vcs/log/data/LoadingDetails.java | 6 +- .../vcs/log/data/MiniDetailsGetter.java | 10 ++-- .../intellij/vcs/log/data/VcsCommitCache.java | 4 +- .../vcs/log/data/VcsLogDataHolder.java | 22 +++++--- .../log/impl/VcsFullCommitDetailsImpl.java} | 21 ++++--- .../log/impl/VcsLogObjectsFactoryImpl.java | 39 +++++++++++++ .../log/impl/VcsShortCommitDetailsImpl.java | 55 +++++++++++++++++++ .../vcs/log/ui/frame/ActiveSurface.java | 4 +- .../vcs/log/ui/frame/DetailsPanel.java | 6 +- .../vcs/log/ui/tables/GraphTableModel.java | 4 +- plugins/git4idea/src/git4idea/GitCommit.java | 4 +- .../src/git4idea/history/GitHistoryUtils.java | 19 ++++--- .../src/git4idea/log/GitLogProvider.java | 6 +- plugins/github/github.iml | 1 + 25 files changed, 284 insertions(+), 141 deletions(-) delete mode 100644 platform/vcs-log/api/src/com/intellij/vcs/log/VcsCommitMiniDetails.java create mode 100644 platform/vcs-log/api/src/com/intellij/vcs/log/VcsFullCommitDetails.java create mode 100644 platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogObjectsFactory.java create mode 100644 platform/vcs-log/api/src/com/intellij/vcs/log/VcsShortCommitDetails.java delete mode 100644 platform/vcs-log/graph/test/com/intellij/vcs/log/parser/SimpleHash.java rename platform/vcs-log/{api/src/com/intellij/vcs/log/VcsCommitDetails.java => impl/src/com/intellij/vcs/log/impl/VcsFullCommitDetailsImpl.java} (62%) create mode 100644 platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogObjectsFactoryImpl.java create mode 100644 platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsShortCommitDetailsImpl.java diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsCommitMiniDetails.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsCommitMiniDetails.java deleted file mode 100644 index 8e2f6c3086a8..000000000000 --- a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsCommitMiniDetails.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.intellij.vcs.log; - -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -/** - * Provides so called "mini-details" of a commit, that are needed to display information in the log table. - * - * @author Kirill Likhodedov - * @see VcsCommitDetails - */ -public class VcsCommitMiniDetails extends TimeCommitParents { - - @NotNull private final String mySubject; - @NotNull private final String myAuthorName; - - public VcsCommitMiniDetails(@NotNull Hash hash, @NotNull List parents, long timeStamp, - @NotNull String subject, @NotNull String authorName) { - super(hash, parents, timeStamp); - mySubject = subject; - myAuthorName = authorName; - } - - @NotNull - public final String getSubject() { - return mySubject; - } - - @NotNull - public final String getAuthorName() { - return myAuthorName; - } -} diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsFullCommitDetails.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsFullCommitDetails.java new file mode 100644 index 000000000000..f0b9805f03ad --- /dev/null +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsFullCommitDetails.java @@ -0,0 +1,39 @@ +package com.intellij.vcs.log; + +import com.intellij.openapi.vcs.changes.Change; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.List; + +/** + *

Full details of a commit: all metadata (commit message, author, committer, etc.) and the changes.

+ *

+ *

These details will be shown in dedicated panels displayed near the log.

+ *

+ *

An instance of this object can be obtained via + * {@link VcsLogObjectsFactory#createFullDetails(Hash, List, long, String, String, String, String, String, String, long, List) + * VcsLogObjectsFactory#createFullDetails}

+ * + * @author Kirill Likhodedov + */ +public interface VcsFullCommitDetails extends VcsShortCommitDetails { + + @NotNull + String getFullMessage(); + + @NotNull + Collection getChanges(); + + @NotNull + String getAuthorEmail(); + + @NotNull + String getCommitterName(); + + @NotNull + String getCommitterEmail(); + + long getCommitTime(); + +} diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogObjectsFactory.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogObjectsFactory.java new file mode 100644 index 000000000000..735c894ec3e5 --- /dev/null +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogObjectsFactory.java @@ -0,0 +1,27 @@ +package com.intellij.vcs.log; + +import com.intellij.openapi.vcs.changes.Change; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * Use this factory to create correct instances of such commonly used vcs-log-api objects as {@link Hash} or {@link VcsShortCommitDetails}. + * + * @author Kirill Likhodedov + */ +public interface VcsLogObjectsFactory { + + @NotNull + Hash createHash(@NotNull String stringHash); + + @NotNull + VcsShortCommitDetails createShortDetails(@NotNull Hash hash, @NotNull List parents, long timeStamp, + @NotNull String subject, @NotNull String authorName); + + @NotNull + VcsFullCommitDetails createFullDetails(@NotNull Hash hash, @NotNull List parents, long authorTime, @NotNull String subject, + @NotNull String authorName, @NotNull String authorEmail, @NotNull String message, + @NotNull String committerName, + @NotNull String committerEmail, long commitTime, @NotNull List changes); +} diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogProvider.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogProvider.java index 55cb42ba012f..bfe4ede4c05b 100644 --- a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogProvider.java +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogProvider.java @@ -22,7 +22,7 @@ public interface VcsLogProvider { * Reads {@link #COMMIT_BLOCK_SIZE the first part} of the log. */ @NotNull - List readFirstBlock(@NotNull VirtualFile root, boolean ordered) throws VcsException; + List readFirstBlock(@NotNull VirtualFile root, boolean ordered) throws VcsException; /** * Reads the whole history, but only hashes & parents. @@ -34,13 +34,13 @@ public interface VcsLogProvider { * Reads those details of the given commits, which are necessary to be shown in the log table. */ @NotNull - List readMiniDetails(@NotNull VirtualFile root, @NotNull List hashes) throws VcsException; + List readShortDetails(@NotNull VirtualFile root, @NotNull List hashes) throws VcsException; /** * Read full details of the given commits from the VCS. */ @NotNull - List readDetails(@NotNull VirtualFile root, @NotNull List hashes) throws VcsException; + List readFullDetails(@NotNull VirtualFile root, @NotNull List hashes) throws VcsException; /** * Read all references (branches, tags, etc.) for the given roots. diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsShortCommitDetails.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsShortCommitDetails.java new file mode 100644 index 000000000000..4921be89af59 --- /dev/null +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsShortCommitDetails.java @@ -0,0 +1,34 @@ +package com.intellij.vcs.log; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + *

Returns the basic level of commit meta-data: author, time, subject.

+ * + *

These details will be displayed in the log table.

+ * + *

An instance of this object can be obtained via + * {@link VcsLogObjectsFactory#createShortDetails(Hash, List, long, String, String) VcsLogObjectsFactory#createShortDetails}

+ * + * @see VcsFullCommitDetails + * @author Kirill Likhodedov + */ +public interface VcsShortCommitDetails { + + @NotNull + Hash getHash(); + + @NotNull + List getParents(); + + long getAuthorTime(); + + @NotNull + String getSubject(); + + @NotNull + String getAuthorName(); + +} diff --git a/platform/vcs-log/graph/test/com/intellij/vcs/log/parser/CommitDataParserTest.java b/platform/vcs-log/graph/test/com/intellij/vcs/log/parser/CommitDataParserTest.java index af71fea77719..e052f11e2096 100644 --- a/platform/vcs-log/graph/test/com/intellij/vcs/log/parser/CommitDataParserTest.java +++ b/platform/vcs-log/graph/test/com/intellij/vcs/log/parser/CommitDataParserTest.java @@ -1,6 +1,6 @@ package com.intellij.vcs.log.parser; -import com.intellij.vcs.log.VcsCommitMiniDetails; +import com.intellij.vcs.log.VcsShortCommitDetails; import junit.framework.Assert; import org.jetbrains.annotations.NotNull; import org.junit.Test; @@ -12,7 +12,7 @@ import static junit.framework.Assert.assertEquals; */ public class CommitDataParserTest { - private static String toStr(@NotNull VcsCommitMiniDetails commitData) { + private static String toStr(@NotNull VcsShortCommitDetails commitData) { StringBuilder s = new StringBuilder(); s.append(commitData.getHash()).append("|-"); s.append(commitData.getAuthorName()).append("|-"); @@ -22,7 +22,7 @@ public class CommitDataParserTest { } private void runTest(@NotNull String inputStr) { - VcsCommitMiniDetails commitData = CommitParser.parseCommitData(inputStr); + VcsShortCommitDetails commitData = CommitParser.parseCommitData(inputStr); assertEquals(inputStr, toStr(commitData)); } @@ -58,7 +58,7 @@ public class CommitDataParserTest { @Test public void emptyTimestamp() { - VcsCommitMiniDetails commitData = CommitParser.parseCommitData("af56|-author |-|-message"); + VcsShortCommitDetails commitData = CommitParser.parseCommitData("af56|-author |-|-message"); Assert.assertEquals("author ", commitData.getAuthorName()); Assert.assertEquals(0, commitData.getAuthorTime()); Assert.assertEquals("message", commitData.getSubject()); diff --git a/platform/vcs-log/graph/test/com/intellij/vcs/log/parser/CommitParser.java b/platform/vcs-log/graph/test/com/intellij/vcs/log/parser/CommitParser.java index ac688102de63..3a4f3df4c5ec 100644 --- a/platform/vcs-log/graph/test/com/intellij/vcs/log/parser/CommitParser.java +++ b/platform/vcs-log/graph/test/com/intellij/vcs/log/parser/CommitParser.java @@ -1,5 +1,6 @@ package com.intellij.vcs.log.parser; +import com.intellij.openapi.components.ServiceManager; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.vcs.log.*; @@ -33,14 +34,14 @@ public class CommitParser { public static CommitParents parseCommitParents(@NotNull String line) { int separatorIndex = nextSeparatorIndex(line, 0); String commitHashStr = line.substring(0, separatorIndex); - Hash commitHash = new SimpleHash(commitHashStr); + Hash commitHash = createHash(commitHashStr); String parentHashStr = line.substring(separatorIndex + 2, line.length()); String[] parentsHashes = parentHashStr.split("\\s"); List hashes = new ArrayList(parentsHashes.length); for (String aParentsStr : parentsHashes) { if (aParentsStr.length() > 0) { - hashes.add(new SimpleHash(aParentsStr)); + hashes.add(createHash(aParentsStr)); } } return new SimpleCommitParents(commitHash, hashes); @@ -76,7 +77,7 @@ public class CommitParser { * hash|-author name|-123124|-commit message */ @NotNull - public static VcsCommitMiniDetails parseCommitData(@NotNull String line) { + public static VcsShortCommitDetails parseCommitData(@NotNull String line) { int prevIndex = 0; int nextIndex = nextSeparatorIndex(line, 0); final String hashStr = line.substring(0, nextIndex); @@ -104,7 +105,8 @@ public class CommitParser { final String commitMessage = line.substring(nextIndex + 2); - return new VcsCommitMiniDetails(new SimpleHash(hashStr), Collections.emptyList(), timestamp, commitMessage, authorName); + VcsLogObjectsFactory factory = ServiceManager.getService(VcsLogObjectsFactory.class); + return factory.createShortDetails(factory.createHash(hashStr), Collections.emptyList(), timestamp, commitMessage, authorName); } @@ -117,4 +119,10 @@ public class CommitParser { } }); } + + @NotNull + private static Hash createHash(@NotNull String s) { + return ServiceManager.getService(VcsLogObjectsFactory.class).createHash(s); + } + } diff --git a/platform/vcs-log/graph/test/com/intellij/vcs/log/parser/SimpleHash.java b/platform/vcs-log/graph/test/com/intellij/vcs/log/parser/SimpleHash.java deleted file mode 100644 index 92ad9e7a67f1..000000000000 --- a/platform/vcs-log/graph/test/com/intellij/vcs/log/parser/SimpleHash.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2000-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.vcs.log.parser; - -import com.intellij.vcs.log.Hash; -import org.jetbrains.annotations.NotNull; - -/** - * @author Kirill Likhodedov - */ -class SimpleHash implements Hash { - - private final String myHash; - - public SimpleHash(String hash) { - myHash = hash; - } - - @NotNull - @Override - public String asString() { - return myHash; - } - - @NotNull - @Override - public String toShortString() { - return myHash.substring(0, 7); - } -} diff --git a/platform/vcs-log/impl/src/META-INF/vcs-log.xml b/platform/vcs-log/impl/src/META-INF/vcs-log.xml index 89c7424b1fb3..547a60faa4db 100644 --- a/platform/vcs-log/impl/src/META-INF/vcs-log.xml +++ b/platform/vcs-log/impl/src/META-INF/vcs-log.xml @@ -8,6 +8,7 @@ + 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 c2b582d628b0..92dca3e276b2 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,7 @@ package com.intellij.vcs.log.data; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.vcs.log.VcsCommitDetails; +import com.intellij.vcs.log.VcsFullCommitDetails; import com.intellij.vcs.log.VcsLogProvider; import org.jetbrains.annotations.NotNull; @@ -10,21 +10,21 @@ import java.util.List; import java.util.Map; /** - * The CommitDetailsGetter is responsible for getting {@link VcsCommitDetails complete commit details} from the cache or from the VCS. + * The CommitDetailsGetter is responsible for getting {@link VcsFullCommitDetails complete commit details} from the cache or from the VCS. * * @author Kirill Likhodedov */ -public class CommitDetailsGetter extends DataGetter { +public class CommitDetailsGetter extends DataGetter { CommitDetailsGetter(VcsLogDataHolder dataHolder, @NotNull Map logProviders) { - super(dataHolder, logProviders, new VcsCommitCache()); + super(dataHolder, logProviders, new VcsCommitCache()); } @NotNull @Override - protected List readDetails(@NotNull VcsLogProvider logProvider, @NotNull VirtualFile root, + protected List readDetails(@NotNull VcsLogProvider logProvider, @NotNull VirtualFile root, @NotNull List hashes) throws VcsException { - return logProvider.readDetails(root, hashes); + return logProvider.readFullDetails(root, hashes); } } 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 af1695d2761d..a588586ed2c0 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 @@ -8,9 +8,9 @@ import com.intellij.util.Consumer; import com.intellij.util.concurrency.QueueProcessor; import com.intellij.util.containers.MultiMap; import com.intellij.util.ui.UIUtil; -import com.intellij.vcs.log.CommitParents; import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.VcsLogProvider; +import com.intellij.vcs.log.VcsShortCommitDetails; import com.intellij.vcs.log.graph.Graph; import com.intellij.vcs.log.graph.elements.Node; import com.intellij.vcs.log.graph.elements.NodeRow; @@ -34,7 +34,7 @@ import java.util.Map; * * @author Kirill Likhodedov */ -public abstract class DataGetter implements Disposable { +public abstract class DataGetter implements Disposable { private static final int UP_PRELOAD_COUNT = 20; private static final int DOWN_PRELOAD_COUNT = 40; diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/LoadingDetails.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/LoadingDetails.java index d7426a41ac80..797ef0045a7e 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/data/LoadingDetails.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/data/LoadingDetails.java @@ -2,18 +2,18 @@ package com.intellij.vcs.log.data; import com.intellij.openapi.vcs.changes.Change; import com.intellij.vcs.log.Hash; -import com.intellij.vcs.log.VcsCommitDetails; +import com.intellij.vcs.log.impl.VcsFullCommitDetailsImpl; import org.jetbrains.annotations.NotNull; import java.util.Collections; /** - * Fake {@link VcsCommitDetails} implementation that is used to indicate that details are not ready for the moment, + * Fake {@link VcsFullCommitDetailsImpl} implementation that is used to indicate that details are not ready for the moment, * they are being retrieved from the VCS. * * @author Kirill Likhodedov */ -public class LoadingDetails extends VcsCommitDetails { +public class LoadingDetails extends VcsFullCommitDetailsImpl { public LoadingDetails(@NotNull Hash hash) { super(hash, Collections.emptyList(), -1, "Loading...", "", "", "", "", "", -1, Collections.emptyList()); 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 f8cd3ec7ad5f..2ca21ef36770 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,8 +2,8 @@ package com.intellij.vcs.log.data; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.vcs.log.VcsCommitMiniDetails; import com.intellij.vcs.log.VcsLogProvider; +import com.intellij.vcs.log.VcsShortCommitDetails; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -12,17 +12,17 @@ import java.util.Map; /** * @author Kirill Likhodedov */ -public class MiniDetailsGetter extends DataGetter { +public class MiniDetailsGetter extends DataGetter { MiniDetailsGetter(@NotNull VcsLogDataHolder dataHolder, @NotNull Map logProviders) { - super(dataHolder, logProviders, new VcsCommitCache()); + super(dataHolder, logProviders, new VcsCommitCache()); } @NotNull @Override - protected List readDetails(@NotNull VcsLogProvider logProvider, @NotNull VirtualFile root, + protected List readDetails(@NotNull VcsLogProvider logProvider, @NotNull VirtualFile root, @NotNull List hashes) throws VcsException { - return logProvider.readMiniDetails(root, hashes); + return logProvider.readShortDetails(root, hashes); } } 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 75a38b744d15..888887ba12cb 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,8 +16,8 @@ package com.intellij.vcs.log.data; import com.intellij.util.containers.SLRUMap; -import com.intellij.vcs.log.CommitParents; import com.intellij.vcs.log.Hash; +import com.intellij.vcs.log.VcsShortCommitDetails; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,7 +32,7 @@ import java.awt.*; * * @author Kirill Likhodedov */ -class VcsCommitCache { +class VcsCommitCache { private final SLRUMap myCache = new SLRUMap(5000, 5000); 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 0b857004f481..b9b08db4d17d 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 @@ -24,6 +24,7 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; +import com.intellij.util.Function; import com.intellij.util.ThrowableConsumer; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashSet; @@ -177,7 +178,7 @@ public class VcsLogDataHolder implements Disposable { /** * Loads the top part of the log and rebuilds the graph & log table. * - * @param onSuccess this task is called {@link UIUtil.invokeAndWaitIfNeeded(Runnable) on the EDT} after loading and graph + * @param onSuccess this task is called {@link UIUtil#invokeAndWaitIfNeeded(Runnable) on the EDT} after loading and graph * building completes. * @param invalidateWholeLog if the whole log data should be invalidated and will be retrieved in onSuccess. */ @@ -196,22 +197,29 @@ public class VcsLogDataHolder implements Disposable { for (Map.Entry entry : myLogProviders.entrySet()) { VirtualFile root = entry.getKey(); VcsLogProvider logProvider = entry.getValue(); - List firstBlock = logProvider.readFirstBlock(root, ordered); + List firstBlockDetails = logProvider.readFirstBlock(root, ordered); Collection newRefs = logProvider.readAllRefs(root); - myDetailsGetter.saveInCache(firstBlock); - myMiniDetailsGetter.saveInCache(firstBlock); + myDetailsGetter.saveInCache(firstBlockDetails); + myMiniDetailsGetter.saveInCache(firstBlockDetails); + + List firstBlockCommits = ContainerUtil.map(firstBlockDetails, new Function() { + @Override + public TimeCommitParents fun(VcsFullCommitDetails details) { + return new TimeCommitParents(details.getHash(), details.getParents(), details.getAuthorTime()); + } + }); List refreshedLog; int newCommitsCount; if (ordered) { // the whole log is not loaded before the first refresh - refreshedLog = new ArrayList(firstBlock); + refreshedLog = new ArrayList(firstBlockCommits); newCommitsCount = 0; } else { Pair, Integer> joinResult = myLogJoiner.addCommits(myLogData.getLog(root), myLogData.getRefs(root), - firstBlock, newRefs); + firstBlockCommits, newRefs); refreshedLog = joinResult.getFirst(); newCommitsCount = joinResult.getSecond(); } @@ -225,7 +233,7 @@ public class VcsLogDataHolder implements Disposable { commitsToShow = myDataPack.getGraphModel().getGraph().getNodeRows().size() + newCommitsCount; } else { - commitsToShow = firstBlock.size(); + commitsToShow = firstBlockDetails.size(); } logsToBuild.put(root, refreshedLog.subList(0, Math.min(commitsToShow, refreshedLog.size()))); } diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsCommitDetails.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsFullCommitDetailsImpl.java similarity index 62% rename from platform/vcs-log/api/src/com/intellij/vcs/log/VcsCommitDetails.java rename to platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsFullCommitDetailsImpl.java index 17f4d8412a0c..38467418ce19 100644 --- a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsCommitDetails.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsFullCommitDetailsImpl.java @@ -1,17 +1,17 @@ -package com.intellij.vcs.log; +package com.intellij.vcs.log.impl; import com.intellij.openapi.vcs.changes.Change; +import com.intellij.vcs.log.Hash; +import com.intellij.vcs.log.VcsFullCommitDetails; import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.List; /** - * Full details of a commit: all metadata (commit message, author, committer, etc.) and the changes. - * * @author Kirill Likhodedov */ -public class VcsCommitDetails extends VcsCommitMiniDetails { +public class VcsFullCommitDetailsImpl extends VcsShortCommitDetailsImpl implements VcsFullCommitDetails { @NotNull private final String myFullMessage; @@ -22,9 +22,10 @@ public class VcsCommitDetails extends VcsCommitMiniDetails { @NotNull private final Collection myChanges; - public VcsCommitDetails(@NotNull Hash hash, @NotNull List parents, long authorTime, @NotNull String subject, - @NotNull String authorName, @NotNull String authorEmail, @NotNull String message, @NotNull String committerName, - @NotNull String committerEmail, long commitTime, @NotNull List changes) { + public VcsFullCommitDetailsImpl(@NotNull Hash hash, @NotNull List parents, long authorTime, @NotNull String subject, + @NotNull String authorName, @NotNull String authorEmail, @NotNull String message, + @NotNull String committerName, + @NotNull String committerEmail, long commitTime, @NotNull List changes) { super(hash, parents, authorTime, subject, authorName); myAuthorEmail = authorEmail; myCommitterName = committerName; @@ -34,31 +35,37 @@ public class VcsCommitDetails extends VcsCommitMiniDetails { myChanges = changes; } + @Override @NotNull public final String getFullMessage() { return myFullMessage; } + @Override @NotNull public final Collection getChanges() { return myChanges; } + @Override @NotNull public String getAuthorEmail() { return myAuthorEmail; } + @Override @NotNull public String getCommitterName() { return myCommitterName; } + @Override @NotNull public String getCommitterEmail() { return myCommitterEmail; } + @Override public long getCommitTime() { return myCommitTime; } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogObjectsFactoryImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogObjectsFactoryImpl.java new file mode 100644 index 000000000000..ce494234d5fd --- /dev/null +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogObjectsFactoryImpl.java @@ -0,0 +1,39 @@ +package com.intellij.vcs.log.impl; + +import com.intellij.openapi.vcs.changes.Change; +import com.intellij.vcs.log.Hash; +import com.intellij.vcs.log.VcsFullCommitDetails; +import com.intellij.vcs.log.VcsLogObjectsFactory; +import com.intellij.vcs.log.VcsShortCommitDetails; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * @author Kirill Likhodedov + */ +public class VcsLogObjectsFactoryImpl implements VcsLogObjectsFactory { + + @NotNull + @Override + public Hash createHash(@NotNull String stringHash) { + return HashImpl.build(stringHash); + } + + @NotNull + @Override + public VcsShortCommitDetails createShortDetails(@NotNull Hash hash, @NotNull List parents, long timeStamp, + @NotNull String subject, @NotNull String authorName) { + return new VcsShortCommitDetailsImpl(hash, parents, timeStamp, subject, authorName); + } + + @NotNull + @Override + public VcsFullCommitDetails createFullDetails(@NotNull Hash hash, @NotNull List parents, long authorTime, @NotNull String subject, + @NotNull String authorName, @NotNull String authorEmail, @NotNull String message, + @NotNull String committerName, + @NotNull String committerEmail, long commitTime, @NotNull List changes) { + return new VcsFullCommitDetailsImpl(hash, parents, authorTime, subject, authorName, authorEmail, message, committerName, committerEmail, + commitTime, changes); + } +} diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsShortCommitDetailsImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsShortCommitDetailsImpl.java new file mode 100644 index 000000000000..790fe12dae38 --- /dev/null +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsShortCommitDetailsImpl.java @@ -0,0 +1,55 @@ +package com.intellij.vcs.log.impl; + +import com.intellij.vcs.log.Hash; +import com.intellij.vcs.log.TimeCommitParents; +import com.intellij.vcs.log.VcsShortCommitDetails; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * @author Kirill Likhodedov + */ +public class VcsShortCommitDetailsImpl implements VcsShortCommitDetails { + + @NotNull private final TimeCommitParents myTimeCommitParents; + @NotNull private final String mySubject; + @NotNull private final String myAuthorName; + + public VcsShortCommitDetailsImpl(@NotNull Hash hash, @NotNull List parents, long timeStamp, + @NotNull String subject, @NotNull String authorName) { + myTimeCommitParents = new TimeCommitParents(hash, parents, timeStamp); + mySubject = subject; + myAuthorName = authorName; + } + + @NotNull + @Override + public Hash getHash() { + return myTimeCommitParents.getHash(); + } + + @NotNull + @Override + public List getParents() { + return myTimeCommitParents.getParents(); + } + + @Override + public long getAuthorTime() { + return myTimeCommitParents.getAuthorTime(); + } + + @Override + @NotNull + public final String getSubject() { + return mySubject; + } + + @Override + @NotNull + public final String getAuthorName() { + return myAuthorName; + } + +} diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/ActiveSurface.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/ActiveSurface.java index 60bb112a3ea8..7e36634f2251 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/ActiveSurface.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/ActiveSurface.java @@ -14,7 +14,7 @@ import com.intellij.openapi.vcs.changes.ui.ChangesBrowser; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.components.JBLoadingPanel; import com.intellij.util.ArrayUtil; -import com.intellij.vcs.log.VcsCommitDetails; +import com.intellij.vcs.log.VcsFullCommitDetails; import com.intellij.vcs.log.data.LoadingDetails; import com.intellij.vcs.log.data.VcsLogDataHolder; import com.intellij.vcs.log.graph.elements.Node; @@ -124,7 +124,7 @@ public class ActiveSurface extends JPanel implements TypeSafeDataProvider { public List getSelectedChanges() { List changes = new ArrayList(); for (Node node : myGraphTable.getSelectedNodes()) { - VcsCommitDetails commitData = myLogDataHolder.getCommitDetailsGetter().getCommitData(node); + VcsFullCommitDetails commitData = myLogDataHolder.getCommitDetailsGetter().getCommitData(node); if (commitData instanceof LoadingDetails) { return null; } 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 46683cafde5e..cd36960c5da3 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 @@ -11,8 +11,8 @@ import com.intellij.ui.components.labels.LinkListener; import com.intellij.util.ui.GridBag; import com.intellij.util.ui.UIUtil; import com.intellij.vcs.log.Hash; +import com.intellij.vcs.log.VcsFullCommitDetails; import com.intellij.vcs.log.VcsRef; -import com.intellij.vcs.log.VcsCommitDetails; import com.intellij.vcs.log.data.LoadingDetails; import com.intellij.vcs.log.data.VcsLogDataHolder; import com.intellij.vcs.log.graph.elements.Node; @@ -92,7 +92,7 @@ class DetailsPanel extends JPanel implements ListSelectionListener { return; } Hash hash = node.getCommitHash(); - VcsCommitDetails commitData = myLogDataHolder.getCommitDetailsGetter().getCommitData(node); + VcsFullCommitDetails commitData = myLogDataHolder.getCommitDetailsGetter().getCommitData(node); if (commitData instanceof LoadingDetails) { myLoadingPanel.startLoading(); myDataPanel.setData(null); @@ -148,7 +148,7 @@ class DetailsPanel extends JPanel implements ListSelectionListener { setOpaque(false); } - void setData(@Nullable VcsCommitDetails commit) { + void setData(@Nullable VcsFullCommitDetails commit) { if (commit == null) { myHashLabel.setText(""); myCommitMessage.setText(""); 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 17d8b0e7eedb..6c5537f553c2 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 @@ -3,7 +3,7 @@ package com.intellij.vcs.log.ui.tables; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.text.DateFormatUtil; import com.intellij.vcs.log.Hash; -import com.intellij.vcs.log.VcsCommitMiniDetails; +import com.intellij.vcs.log.VcsShortCommitDetails; import com.intellij.vcs.log.VcsRef; import com.intellij.vcs.log.data.DataPack; import com.intellij.vcs.log.data.VcsLogDataHolder; @@ -53,7 +53,7 @@ public class GraphTableModel extends AbstractTableModel { @Override public Object getValueAt(int rowIndex, int columnIndex) { Node commitNode = dataPack.getGraphModel().getGraph().getCommitNodeInRow(rowIndex); - VcsCommitMiniDetails data; + VcsShortCommitDetails data; if (commitNode == null) { data = null; } diff --git a/plugins/git4idea/src/git4idea/GitCommit.java b/plugins/git4idea/src/git4idea/GitCommit.java index 116175a42ef7..fef4cb739e1c 100644 --- a/plugins/git4idea/src/git4idea/GitCommit.java +++ b/plugins/git4idea/src/git4idea/GitCommit.java @@ -17,7 +17,7 @@ package git4idea; import com.intellij.openapi.vcs.changes.Change; import com.intellij.vcs.log.Hash; -import com.intellij.vcs.log.VcsCommitDetails; +import com.intellij.vcs.log.impl.VcsFullCommitDetailsImpl; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -27,7 +27,7 @@ import java.util.List; * * @author Kirill Likhodedov */ -public final class GitCommit extends VcsCommitDetails { +public final class GitCommit extends VcsFullCommitDetailsImpl { public GitCommit(@NotNull Hash hash, @NotNull List parents, long authorTime, @NotNull String subject, @NotNull String authorName, @NotNull String authorEmail, @NotNull String message, @NotNull String committerName, @NotNull String committerEmail, diff --git a/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java b/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java index a3dd2d9da49f..645efae9d377 100644 --- a/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java +++ b/plugins/git4idea/src/git4idea/history/GitHistoryUtils.java @@ -41,7 +41,8 @@ import com.intellij.util.concurrency.Semaphore; import com.intellij.util.containers.ContainerUtil; import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.TimeCommitParents; -import com.intellij.vcs.log.VcsCommitMiniDetails; +import com.intellij.vcs.log.VcsShortCommitDetails; +import com.intellij.vcs.log.impl.VcsShortCommitDetailsImpl; import com.intellij.vcs.log.impl.HashImpl; import git4idea.*; import git4idea.branch.GitBranchUtil; @@ -479,7 +480,7 @@ public class GitHistoryUtils { return null; } - public static List readAllMiniDetails(Project project, VirtualFile root) throws VcsException { + public static List readAllMiniDetails(Project project, VirtualFile root) throws VcsException { GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.LOG); GitLogParser parser = new GitLogParser(project, GitLogParser.NameStatus.NONE, HASH, PARENTS, AUTHOR_NAME, AUTHOR_TIME, SUBJECT); h.setStdoutSuppressed(true); @@ -492,20 +493,20 @@ public class GitHistoryUtils { List records = parser.parse(output); - return ContainerUtil.mapNotNull(records, new Function() { + return ContainerUtil.mapNotNull(records, new Function() { @Override - public VcsCommitMiniDetails fun(GitLogRecord record) { + public VcsShortCommitDetails fun(GitLogRecord record) { List parents = new SmartList(); for (String parent : record.getParentsHashes()) { parents.add(HashImpl.build(parent)); } - return new VcsCommitMiniDetails(HashImpl.build(record.getHash()), parents, record.getAuthorTimeStamp(), + return new VcsShortCommitDetailsImpl(HashImpl.build(record.getHash()), parents, record.getAuthorTimeStamp(), record.getSubject(), record.getAuthorName()); } }); } - public static List readMiniDetails(Project project, VirtualFile root, List hashes) throws VcsException { + public static List readMiniDetails(Project project, VirtualFile root, List hashes) throws VcsException { GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.LOG); GitLogParser parser = new GitLogParser(project, GitLogParser.NameStatus.NONE, HASH, PARENTS, AUTHOR_NAME, AUTHOR_TIME, SUBJECT); h.setStdoutSuppressed(true); @@ -517,14 +518,14 @@ public class GitHistoryUtils { String output = h.run(); List records = parser.parse(output); - return ContainerUtil.map(records, new Function() { + return ContainerUtil.map(records, new Function() { @Override - public VcsCommitMiniDetails fun(GitLogRecord record) { + public VcsShortCommitDetails fun(GitLogRecord record) { List parents = new SmartList(); for (String parent : record.getParentsHashes()) { parents.add(HashImpl.build(parent)); } - return new VcsCommitMiniDetails(HashImpl.build(record.getHash()), parents, record.getAuthorTimeStamp(), + return new VcsShortCommitDetailsImpl(HashImpl.build(record.getHash()), parents, record.getAuthorTimeStamp(), record.getSubject(), record.getAuthorName()); } }); diff --git a/plugins/git4idea/src/git4idea/log/GitLogProvider.java b/plugins/git4idea/src/git4idea/log/GitLogProvider.java index d02318ae010d..99fabbfcc7db 100644 --- a/plugins/git4idea/src/git4idea/log/GitLogProvider.java +++ b/plugins/git4idea/src/git4idea/log/GitLogProvider.java @@ -60,7 +60,7 @@ public class GitLogProvider implements VcsLogProvider { @NotNull @Override - public List readFirstBlock(@NotNull VirtualFile root, boolean ordered) throws VcsException { + public List readFirstBlock(@NotNull VirtualFile root, boolean ordered) throws VcsException { String[] params = { "HEAD", "--branches", "--remotes", "--tags", "--encoding=UTF-8", "--full-history", "--sparse", "--max-count=" + VcsLogProvider.COMMIT_BLOCK_SIZE}; if (ordered) { @@ -77,13 +77,13 @@ public class GitLogProvider implements VcsLogProvider { @NotNull @Override - public List readMiniDetails(@NotNull VirtualFile root, @NotNull List hashes) throws VcsException { + public List readShortDetails(@NotNull VirtualFile root, @NotNull List hashes) throws VcsException { return GitHistoryUtils.readMiniDetails(myProject, root, hashes); } @NotNull @Override - public List readDetails(@NotNull VirtualFile root, @NotNull List hashes) throws VcsException { + public List readFullDetails(@NotNull VirtualFile root, @NotNull List hashes) throws VcsException { return GitHistoryUtils.commitsDetails(myProject, root, hashes); } diff --git a/plugins/github/github.iml b/plugins/github/github.iml index 5dd811a50bde..4a9a26bd3323 100644 --- a/plugins/github/github.iml +++ b/plugins/github/github.iml @@ -23,6 +23,7 @@ +