From 136a3efde0015d4a858f69f5459e02a9079e7527 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Mon, 21 Oct 2013 19:07:26 +0400 Subject: [PATCH 1/2] [log] Store the number of recent commits to load in the settings * Instead of hardcoding 1000, store the number in the VcsLogSettings. Maybe it will be exposed in the UI to let users customize this value. * Make VcsLogProvider.readFirstBlock() accept the number of commits as a parameter instead of taking the stored value: sometimes we will need to load more than defined in the settings. --- .../src/com/intellij/vcs/log/VcsLogProvider.java | 6 ++---- .../src/com/intellij/vcs/log/VcsLogSettings.java | 13 +++++++++++++ .../com/intellij/vcs/log/data/VcsLogDataHolder.java | 13 ++++++++----- .../com/intellij/vcs/log/impl/VcsLogManager.java | 11 ++++++++--- .../intellij/vcs/log/impl/VcsLogSettingsImpl.java | 11 +++++++++++ .../impl/src/com/intellij/vcs/log/ui/VcsLogUI.java | 6 ++++-- .../com/intellij/vcs/log/ui/frame/MainFrame.java | 8 ++++---- .../git4idea/src/git4idea/log/GitLogProvider.java | 5 +++-- 8 files changed, 53 insertions(+), 20 deletions(-) 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 3cd3b0ec18de..05d19d60e0f1 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 @@ -16,13 +16,11 @@ import java.util.List; */ public interface VcsLogProvider { - int COMMIT_BLOCK_SIZE = 1000; - /** - * Reads {@link #COMMIT_BLOCK_SIZE the first part} of the log. + * Reads the given number of the most recent commits from the log. */ @NotNull - List readFirstBlock(@NotNull VirtualFile root, boolean ordered) throws VcsException; + List readFirstBlock(@NotNull VirtualFile root, boolean ordered, int commitCount) throws VcsException; /** * Reads the whole history, but only hashes & parents. diff --git a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogSettings.java b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogSettings.java index 1d88a3ff6cec..e273be62a699 100644 --- a/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogSettings.java +++ b/platform/vcs-log/api/src/com/intellij/vcs/log/VcsLogSettings.java @@ -24,4 +24,17 @@ public interface VcsLogSettings { * Sets if the details pane (which shows commit meta-data) should be shown or hidden by default. */ void setShowDetails(boolean showDetails); + + /** + * Returns the number of recent commits which are loaded initially by default, and are always stored in memory. + */ + int getRecentCommitsCount(); + + /** + * Sets the number of recent commits which are loaded initially by default, and always stay in memory. + * The more this number is, the more memory is occupied, but the faster filtering works, and more commits can be viewed back in history + * without need to load additional details from the VCS. + */ + void setRecentCommitsBlockSize(int commitCount); + } 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 203fa542d608..10b05e1d3651 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 @@ -97,6 +97,7 @@ public class VcsLogDataHolder implements Disposable { @NotNull private final CommitDetailsGetter myDetailsGetter; @NotNull private final VcsLogJoiner myLogJoiner; @NotNull private final VcsLogMultiRepoJoiner myMultiRepoJoiner; + @NotNull private final VcsLogSettings mySettings; /** * Encapsulates all information about the log, which can be accessed by external clients. @@ -124,7 +125,7 @@ public class VcsLogDataHolder implements Disposable { @NotNull private final Map myTopCommitsDetailsCache = ContainerUtil.newConcurrentMap(); public VcsLogDataHolder(@NotNull Project project, @NotNull VcsLogObjectsFactory logObjectsFactory, - @NotNull Map logProviders) { + @NotNull Map logProviders, @NotNull VcsLogSettings settings) { myProject = project; myLogProviders = logProviders; myDataLoaderQueue = new BackgroundTaskQueue(project, "Loading history..."); @@ -133,6 +134,7 @@ public class VcsLogDataHolder implements Disposable { myLogJoiner = new VcsLogJoiner(); myMultiRepoJoiner = new VcsLogMultiRepoJoiner(); myFactory = logObjectsFactory; + mySettings = settings; } /** @@ -143,13 +145,13 @@ public class VcsLogDataHolder implements Disposable { *
  • Loads the whole log in background. When completed, substitutes the data and tells the UI to refresh itself.
  • * * + * @param settings * @param onInitialized This is called when the holder is initialized with the initial data received from the VCS. - * The consumer is called on the EDT. */ public static void init(@NotNull final Project project, @NotNull VcsLogObjectsFactory logObjectsFactory, @NotNull Map logProviders, - @NotNull final Consumer onInitialized) { - final VcsLogDataHolder dataHolder = new VcsLogDataHolder(project, logObjectsFactory, logProviders); + @NotNull VcsLogSettings settings, @NotNull final Consumer onInitialized) { + final VcsLogDataHolder dataHolder = new VcsLogDataHolder(project, logObjectsFactory, logProviders, settings); dataHolder.initialize(onInitialized); } @@ -231,7 +233,8 @@ public class VcsLogDataHolder implements Disposable { VcsLogProvider logProvider = entry.getValue(); // read info from VCS - List firstBlockDetails = logProvider.readFirstBlock(root, fairRefresh); + List firstBlockDetails = logProvider.readFirstBlock(root, fairRefresh, + mySettings.getRecentCommitsCount()); Collection newRefs = logProvider.readAllRefs(root); // some commits may be no longer available (e.g. rewritten after rebase), but let them stay in the cache: diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java index beea4eaf5c2c..9b324b9c6251 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java @@ -30,6 +30,7 @@ import com.intellij.util.ui.UIUtil; import com.intellij.vcs.log.VcsLogObjectsFactory; import com.intellij.vcs.log.VcsLogProvider; import com.intellij.vcs.log.VcsLogRefresher; +import com.intellij.vcs.log.VcsLogSettings; import com.intellij.vcs.log.data.VcsLogDataHolder; import com.intellij.vcs.log.ui.VcsLogColorManagerImpl; import com.intellij.vcs.log.ui.VcsLogUI; @@ -50,13 +51,16 @@ public class VcsLogManager extends AbstractProjectComponent { @NotNull private final ProjectLevelVcsManager myVcsManager; @NotNull private final VcsLogObjectsFactory myLogObjectsFactory; + @NotNull private final VcsLogSettings mySettings; + private PostponeableLogRefresher myLogRefresher; protected VcsLogManager(@NotNull Project project, @NotNull ProjectLevelVcsManager vcsManagerInitializedFirst, - @NotNull VcsLogObjectsFactory logObjectsFactory) { + @NotNull VcsLogObjectsFactory logObjectsFactory, @NotNull VcsLogSettings settings) { super(project); myVcsManager = vcsManagerInitializedFirst; myLogObjectsFactory = logObjectsFactory; + mySettings = settings; } @Override @@ -87,11 +91,12 @@ public class VcsLogManager extends AbstractProjectComponent { changesView.addContent(content); content.setCloseable(false); - VcsLogDataHolder.init(myProject, myLogObjectsFactory, logProviders, new Consumer() { + VcsLogDataHolder.init(myProject, myLogObjectsFactory, logProviders, mySettings, new Consumer() { @Override public void consume(VcsLogDataHolder vcsLogDataHolder) { Disposer.register(myProject, vcsLogDataHolder); - VcsLogUI logUI = new VcsLogUI(vcsLogDataHolder, myProject, new VcsLogColorManagerImpl(logProviders.keySet())); + VcsLogUI logUI = new VcsLogUI(vcsLogDataHolder, myProject, mySettings, + new VcsLogColorManagerImpl(logProviders.keySet())); mainPanel.init(logUI.getMainFrame().getMainComponent()); myLogRefresher = new PostponeableLogRefresher(myProject, vcsLogDataHolder, content); refreshLogOnVcsEvents(logProviders); diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogSettingsImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogSettingsImpl.java index 1c8ac07c4266..c5a86ee7600e 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogSettingsImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogSettingsImpl.java @@ -17,6 +17,7 @@ public class VcsLogSettingsImpl implements VcsLogSettings, PersistentStateCompon public static class State { public boolean SHOW_DETAILS = false; + public int RECENT_COMMITS_COUNT = 1000; } @Nullable @@ -40,4 +41,14 @@ public class VcsLogSettingsImpl implements VcsLogSettings, PersistentStateCompon myState.SHOW_DETAILS = showDetails; } + @Override + public int getRecentCommitsCount() { + return myState.RECENT_COMMITS_COUNT; + } + + @Override + public void setRecentCommitsBlockSize(int commitCount) { + myState.RECENT_COMMITS_COUNT = commitCount; + } + } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUI.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUI.java index 6f7f5359c0dd..66ad5e2f2881 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUI.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogUI.java @@ -5,6 +5,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.util.ui.UIUtil; import com.intellij.vcs.log.Hash; +import com.intellij.vcs.log.VcsLogSettings; import com.intellij.vcs.log.compressedlist.UpdateRequest; import com.intellij.vcs.log.data.DataPack; import com.intellij.vcs.log.data.VcsLogDataHolder; @@ -36,11 +37,12 @@ public class VcsLogUI { @Nullable private GraphElement prevGraphElement; - public VcsLogUI(@NotNull VcsLogDataHolder logDataHolder, @NotNull Project project, @NotNull VcsLogColorManager manager) { + public VcsLogUI(@NotNull VcsLogDataHolder logDataHolder, @NotNull Project project, @NotNull VcsLogSettings settings, + @NotNull VcsLogColorManager manager) { myLogDataHolder = logDataHolder; myColorManager = manager; myFilterer = new VcsLogFilterer(logDataHolder, this); - myMainFrame = new MainFrame(myLogDataHolder, this, project); + myMainFrame = new MainFrame(myLogDataHolder, this, project, settings); project.getMessageBus().connect(project).subscribe(VcsLogDataHolder.REFRESH_COMPLETED, new Runnable() { @Override public void run() { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java index 11f6f353bf7e..ec17981924f5 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/MainFrame.java @@ -3,7 +3,6 @@ package com.intellij.vcs.log.ui.frame; import com.intellij.icons.AllIcons; import com.intellij.ide.actions.RefreshAction; import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.ui.JBColor; @@ -12,8 +11,8 @@ import com.intellij.ui.SeparatorOrientation; import com.intellij.vcs.log.VcsLogSettings; import com.intellij.vcs.log.data.VcsLogDataHolder; import com.intellij.vcs.log.ui.GitLogIcons; -import com.intellij.vcs.log.ui.filter.VcsLogClassicFilterUi; import com.intellij.vcs.log.ui.VcsLogUI; +import com.intellij.vcs.log.ui.filter.VcsLogClassicFilterUi; import com.intellij.vcs.log.ui.filter.VcsLogFilterUi; import org.jetbrains.annotations.NotNull; @@ -33,11 +32,12 @@ public class MainFrame { @NotNull private final VcsLogSettings mySettings; @NotNull private final VcsLogFilterUi myFilterUi; - public MainFrame(@NotNull VcsLogDataHolder logDataHolder, @NotNull VcsLogUI vcsLogUI, @NotNull Project project) { + public MainFrame(@NotNull VcsLogDataHolder logDataHolder, @NotNull VcsLogUI vcsLogUI, @NotNull Project project, + @NotNull VcsLogSettings settings) { myLogDataHolder = logDataHolder; myUI = vcsLogUI; myProject = project; - mySettings = ServiceManager.getService(myProject, VcsLogSettings.class); + mySettings = settings; myActiveSurface = new ActiveSurface(logDataHolder, vcsLogUI, project); myActiveSurface.setupDetailsSplitter(mySettings.isShowDetails()); diff --git a/plugins/git4idea/src/git4idea/log/GitLogProvider.java b/plugins/git4idea/src/git4idea/log/GitLogProvider.java index 8d3eebdc2530..1abd01dbf72e 100644 --- a/plugins/git4idea/src/git4idea/log/GitLogProvider.java +++ b/plugins/git4idea/src/git4idea/log/GitLogProvider.java @@ -58,9 +58,10 @@ 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, int commitCount) throws VcsException { String[] params = { "HEAD", "--branches", "--remotes", "--tags", "--encoding=UTF-8", "--full-history", "--sparse", - "--max-count=" + VcsLogProvider.COMMIT_BLOCK_SIZE}; + "--max-count=" + commitCount}; if (ordered) { params = ArrayUtil.append(params, "--date-order"); } From d0448ed0d0614ca24e4211da076acf17721423e1 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 21 Oct 2013 17:07:43 +0200 Subject: [PATCH 2/2] correctly handle internal structure of .tar.gz --- python/build/python_plugin_build.gant | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/python/build/python_plugin_build.gant b/python/build/python_plugin_build.gant index 144745aa5836..6e6ca328e90d 100644 --- a/python/build/python_plugin_build.gant +++ b/python/build/python_plugin_build.gant @@ -8,13 +8,14 @@ includeTargets << new File("${projectHome}/build/scripts/utils.gant") setProperty("outDir", "${projectHome}/out/python") setProperty("ideaDir", "${outDir}/ideaCE") -setProperty("ideaHome", "${ideaDir}/jdk16") //compiled idea - setProperty("pluginHelp", "${outDir}/help") setProperty("buildNumber", requireProperty("build.number", snapshot)) setProperty("ideaBuildNumber", requireProperty("idea.build.number")) +setProperty("ideaHomePacked", "${ideaDir}/jdk16") //compiled idea +setProperty("ideaHome", "${ideaDir}/jdk16/idea-IC-${ideaBuildNumber}") //compiled idea + setProperty("pluginHome", "${projectHome}/python") setProperty("pluginRevision", "${buildNumber}") @@ -69,9 +70,9 @@ target(name: "clean", description: "Cleanup output") { } target(name: "unzip") { - ant.mkdir(dir: "${ideaHome}") + ant.mkdir(dir: "${ideaHomePacked}") ant.gunzip(src: "${ideaDir}/ideaIC-${ideaBuildNumber}.tar.gz") - ant.untar(src: "${ideaDir}/ideaIC-${ideaBuildNumber}.tar", dest: "${ideaHome}") + ant.untar(src: "${ideaDir}/ideaIC-${ideaBuildNumber}.tar", dest: "${ideaHomePacked}") } target(name: "compile", description: "Compile module python") {