diff options
author | Stefan Lay | 2012-05-29 13:44:15 +0000 |
---|---|---|
committer | Matthias Sohn | 2012-06-04 14:16:02 +0000 |
commit | bc785070f9bd4f3e991c05fbdc2963c819e17238 (patch) | |
tree | 83c7ce9cfe79c1afcc7e452d603b6c67b54b6547 | |
parent | 53ff64118482ecdc7221d9896c0717dbe9dab308 (diff) | |
download | egit-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
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); } } |