Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Lay2012-05-29 13:44:15 +0000
committerMatthias Sohn2012-06-04 14:16:02 +0000
commitbc785070f9bd4f3e991c05fbdc2963c819e17238 (patch)
tree83c7ce9cfe79c1afcc7e452d603b6c67b54b6547
parent53ff64118482ecdc7221d9896c0717dbe9dab308 (diff)
downloadegit-bc785070f9bd4f3e991c05fbdc2963c819e17238.tar.gz
egit-bc785070f9bd4f3e991c05fbdc2963c819e17238.tar.xz
egit-bc785070f9bd4f3e991c05fbdc2963c819e17238.zip
[historyView] Load commit body lazily
The body of loaded objects is now thrown away in the walker after it has parsed the information necessary to render the history graph. It is reloaded when content of the body is needed in the HistoryView. For large repositories this saves a lot of memory, e.g. about 110 MB for linux kernel. JGit-Dependency: I9291ba8c34c8744bc009b1bd302ed28bfa4e9476 Change-Id: I1504a6127e7fc2ebea67baade5e9799b256ab116
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java6
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FindToolbarThread.java10
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FormatJob.java20
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java1
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GraphLabelProvider.java11
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTCommit.java13
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTPlotRenderer.java11
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTWalk.java2
8 files changed, 58 insertions, 16 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
index 0403d5ba46..1bed7908ae 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitInfoBuilder.java
@@ -171,7 +171,8 @@ public class CommitInfoBuilder {
}
for (int i = 0; i < commit.getParentCount(); i++) {
- final RevCommit p = commit.getParent(i);
+ final SWTCommit p = (SWTCommit)commit.getParent(i);
+ p.parseBody();
d.append(UIText.CommitMessageViewer_parent);
d.append(": "); //$NON-NLS-1$
addLink(d, styles, p);
@@ -182,7 +183,8 @@ public class CommitInfoBuilder {
}
for (int i = 0; i < commit.getChildCount(); i++) {
- final RevCommit p = commit.getChild(i);
+ final SWTCommit p = (SWTCommit)commit.getChild(i);
+ p.parseBody();
d.append(UIText.CommitMessageViewer_child);
d.append(": "); //$NON-NLS-1$
addLink(d, styles, p);
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FindToolbarThread.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FindToolbarThread.java
index 8ae96b5136..f4ec52a07d 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FindToolbarThread.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FindToolbarThread.java
@@ -8,6 +8,10 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.history;
+import java.io.IOException;
+
+import org.eclipse.egit.ui.Activator;
+
/**
* This class executes the search function for the find toolbar. Only one thread
* is executed at a time.
@@ -114,6 +118,12 @@ public class FindToolbarThread extends Thread {
// Finds for the pattern in the revision history.
notFound = true;
SWTCommit revision = fileRevisions[i];
+ try {
+ revision.parseBody();
+ } catch (IOException e) {
+ Activator.error("Error parsing body", e); //$NON-NLS-1$
+ continue;
+ }
if (findInCommitId) {
String contentId = revision.getId().name();
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FormatJob.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FormatJob.java
index f34c71ac5f..9656c1fc48 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FormatJob.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/FormatJob.java
@@ -60,16 +60,18 @@ class FormatJob extends Job {
final List<StyleRange> styles = new ArrayList<StyleRange>();
final String commitInfo;
CommitInfoBuilder builder;
- synchronized(lock) {
- builder = new CommitInfoBuilder(formatRequest.getRepository(), formatRequest.getCommit(),
- formatRequest.getCurrentDiffs(), formatRequest.isFill(), formatRequest.getAllRefs());
- builder.setColors(formatRequest.getLinkColor(),
- formatRequest.getDarkGrey(),
- formatRequest.getHunkheaderColor(),
- formatRequest.getLinesAddedColor(),
- formatRequest.getLinesRemovedColor());
- }
try {
+ synchronized(lock) {
+ SWTCommit commit = (SWTCommit)formatRequest.getCommit();
+ commit.parseBody();
+ builder = new CommitInfoBuilder(formatRequest.getRepository(), commit,
+ formatRequest.getCurrentDiffs(), formatRequest.isFill(), formatRequest.getAllRefs());
+ builder.setColors(formatRequest.getLinkColor(),
+ formatRequest.getDarkGrey(),
+ formatRequest.getHunkheaderColor(),
+ formatRequest.getLinesAddedColor(),
+ formatRequest.getLinesRemovedColor());
+ }
commitInfo = builder.format(styles, monitor);
} catch (IOException e) {
return Activator.createErrorStatus(e.getMessage(), e);
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java
index f283a74485..8698b15249 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GitHistoryPage.java
@@ -1677,6 +1677,7 @@ public class GitHistoryPage extends HistoryPage implements RefsChangedListener,
}
walk.sort(RevSort.COMMIT_TIME_DESC, true);
walk.sort(RevSort.BOUNDARY, true);
+ walk.setRetainBody(false);
return walk;
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GraphLabelProvider.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GraphLabelProvider.java
index 130683d078..378902e4db 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GraphLabelProvider.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/GraphLabelProvider.java
@@ -11,6 +11,9 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.history;
+import java.io.IOException;
+
+import org.eclipse.egit.ui.Activator;
import org.eclipse.jface.viewers.BaseLabelProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jgit.lib.PersonIdent;
@@ -37,7 +40,13 @@ class GraphLabelProvider extends BaseLabelProvider implements
}
public String getColumnText(final Object element, final int columnIndex) {
- final RevCommit c = (RevCommit) element;
+ final SWTCommit c = (SWTCommit) element;
+ try {
+ c.parseBody();
+ } catch (IOException e) {
+ Activator.error("Error parsing body", e); //$NON-NLS-1$
+ return ""; //$NON-NLS-1$
+ }
if (columnIndex == 0)
return c.getId().abbreviate(7).name();
if (columnIndex == 1)
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTCommit.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTCommit.java
index 9892bffbe5..1ec39840ce 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTCommit.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTCommit.java
@@ -8,20 +8,31 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.history;
+import java.io.IOException;
+
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.revplot.PlotCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.swt.widgets.Widget;
class SWTCommit extends PlotCommit<SWTCommitList.SWTLane> {
Widget widget;
+ private RevWalk walk;
- SWTCommit(final AnyObjectId id) {
+ SWTCommit(final AnyObjectId id, RevWalk walk) {
super(id);
+ this.walk = walk;
}
@Override
public void reset() {
widget = null;
+ walk = null;
super.reset();
}
+
+ public void parseBody() throws IOException {
+ if (getRawBuffer() == null)
+ walk.parseBody(this);
+ }
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTPlotRenderer.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTPlotRenderer.java
index b54a05c63e..dc452854bd 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTPlotRenderer.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTPlotRenderer.java
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.history;
+import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@@ -22,7 +23,6 @@ import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.revplot.AbstractPlotRenderer;
-import org.eclipse.jgit.revplot.PlotCommit;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.Color;
@@ -123,7 +123,14 @@ class SWTPlotRenderer extends AbstractPlotRenderer<SWTLane, Color> {
textHeight = g.stringExtent("/").y; //$NON-NLS-1$
final TableItem ti = (TableItem) event.item;
- paintCommit((PlotCommit<SWTLane>) ti.getData(), event.height);
+ SWTCommit commit = (SWTCommit) ti.getData();
+ try {
+ commit.parseBody();
+ } catch (IOException e) {
+ Activator.error("Error parsing body", e); //$NON-NLS-1$
+ return;
+ }
+ paintCommit(commit , event.height);
}
protected void drawLine(final Color color, final int x1, final int y1,
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTWalk.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTWalk.java
index 5a68f18fc1..a0b35a9a5e 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTWalk.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/SWTWalk.java
@@ -20,6 +20,6 @@ class SWTWalk extends PlotWalk {
@Override
protected RevCommit createCommit(final AnyObjectId id) {
- return new SWTCommit(id);
+ return new SWTCommit(id, this);
}
}

Back to the top