git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[EGIT PATCH 1/2] Make quick diff aware of changes in the repository.

From
Robin Rosenberg <robin.rosenberg@dewire.com>
Date
Jul 10, 2008, 22:41 UTC
Message-ID
<1215729672-26906-2-git-send-email-robin.rosenberg@dewire.com>
In-Reply-To
<1215729672-26906-1-git-send-email-robin.rosenberg@dewire.com>
Currently only refs changes are relevant.
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
 .../egit/ui/internal/decorators/GitDocument.java   |  107 ++++++++++++++++++++
 .../internal/decorators/GitQuickDiffProvider.java  |   57 ++---------
 2 files changed, 117 insertions(+), 47 deletions(-)
 create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java
diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java
new file mode 100644
index 0000000..23e06d9
--- /dev/null
+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * See LICENSE for the full license text, also available.
+ *******************************************************************************/
+package org.spearce.egit.ui.internal.decorators;
+
+import java.io.BufferedReader;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.Document;
+import org.eclipse.team.core.RepositoryProvider;
+import org.eclipse.team.core.history.IFileHistory;
+import org.eclipse.team.core.history.IFileHistoryProvider;
+import org.eclipse.team.core.history.IFileRevision;
+import org.spearce.egit.core.GitProvider;
+import org.spearce.egit.core.project.RepositoryMapping;
+import org.spearce.egit.ui.Activator;
+import org.spearce.jgit.lib.IndexChangedEvent;
+import org.spearce.jgit.lib.RefsChangedEvent;
+import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.lib.RepositoryListener;
+
+class GitDocument extends Document implements RepositoryListener {
+	private final IResource resource;
+
+	static GitDocument create(IResource resource) throws IOException, CoreException {
+		GitDocument ret = null;
+		if (RepositoryProvider.getProvider(resource.getProject()) instanceof GitProvider) {
+			ret = new GitDocument(resource);
+			ret.populate();
+		}
+		return ret;
+	}
+
+	private GitDocument(IResource resource) {
+		this.resource = resource;
+	}
+
+	void populate() throws IOException, CoreException {
+		set("");
+		IProject project = resource.getProject();
+		RepositoryProvider provider = RepositoryProvider.getProvider(project);
+		getRepository().addRepositoryChangedListener(this);
+		IFileHistoryProvider fileHistoryProvider = provider
+				.getFileHistoryProvider();
+		IFileHistory fileHistoryFor = fileHistoryProvider.getFileHistoryFor(
+				resource, IFileHistoryProvider.SINGLE_REVISION, null);
+		IFileRevision[] revisions = fileHistoryFor.getFileRevisions();
+		if (revisions != null && revisions.length > 0) {
+			IFileRevision revision = revisions[0];
+			Activator.trace("(GitQuickDiffProvider) compareTo: "
+					+ revision.getContentIdentifier());
+			IStorage storage = revision.getStorage(null);
+			InputStream contents = storage.getContents();
+			BufferedReader in = new BufferedReader(new InputStreamReader(
+					contents));
+			final int DEFAULT_FILE_SIZE = 15 * 1024;
+
+			CharArrayWriter caw = new CharArrayWriter(DEFAULT_FILE_SIZE);
+			char[] readBuffer = new char[2048];
+			int n = in.read(readBuffer);
+			while (n > 0) {
+				caw.write(readBuffer, 0, n);
+				n = in.read(readBuffer);
+			}
+			String s = caw.toString();
+			set(s);
+			Activator.trace("(GitQuickDiffProvider) has reference doc, size=" + s.length() + " bytes");
+		} else {
+			Activator.trace("(GitQuickDiffProvider) no revision.");
+		}
+	}
+
+	void dispose() {
+		getRepository().removeRepositoryChangedListener(this);
+	}
+
+	public void refsChanged(final RefsChangedEvent e) {
+		try {
+			populate();
+		} catch (IOException e1) {
+			Activator.logError("Failed to refresh quickdiff", e1);
+		} catch (CoreException e1) {
+			Activator.logError("Failed to refresh quickdiff", e1);
+		}
+	}
+
+	public void indexChanged(final IndexChangedEvent e) {
+		// Index not relevant at this moment
+	}
+
+	private Repository getRepository() {
+		IProject project = resource.getProject();
+		RepositoryMapping mapping = RepositoryMapping.getMapping(project);
+		return mapping.getRepository();
+	}
+}
diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitQuickDiffProvider.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitQuickDiffProvider.java
index 5525914..052552e 100644
--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitQuickDiffProvider.java
+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitQuickDiffProvider.java
@@ -8,22 +8,13 @@
  *******************************************************************************/
 package org.spearce.egit.ui.internal.decorators;
 
-import java.io.BufferedReader;
-import java.io.CharArrayWriter;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
 
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.text.Document;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.team.core.RepositoryProvider;
-import org.eclipse.team.core.history.IFileHistory;
-import org.eclipse.team.core.history.IFileHistoryProvider;
-import org.eclipse.team.core.history.IFileRevision;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.ide.ResourceUtil;
 import org.eclipse.ui.texteditor.ITextEditor;
@@ -38,12 +29,14 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider {
 
 	private String id;
 
-	private Document document;
+	private GitDocument document;
 
-	private IFile file;
+	private IResource resource;
 
 	public void dispose() {
-		// No resources to free
+		Activator.trace("(GitQuickDiffProvider) dispose");
+		if (document != null)
+			document.dispose();
 	}
 
 	public String getId() {
@@ -52,42 +45,12 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider {
 
 	public IDocument getReference(IProgressMonitor monitor)
 			throws CoreException {
-		document = new Document();
-		Activator.trace("(GitQuickDiffProvider) file: " + file);
-
-		RepositoryProvider provider = RepositoryProvider.getProvider(file
+		Activator.trace("(GitQuickDiffProvider) file: " + resource);
+		RepositoryProvider provider = RepositoryProvider.getProvider(resource
 				.getProject());
 		if (provider != null) {
 			try {
-				IFileHistoryProvider fileHistoryProvider = provider
-						.getFileHistoryProvider();
-				IFileHistory fileHistoryFor = fileHistoryProvider
-						.getFileHistoryFor(file,
-								IFileHistoryProvider.SINGLE_REVISION, null);
-				IFileRevision[] revisions = fileHistoryFor.getFileRevisions();
-				if (revisions != null && revisions.length > 0) {
-					IFileRevision revision = revisions[0];
-					Activator.trace("(GitQuickDiffProvider) compareTo: "
-							+ revision.getContentIdentifier());
-					IStorage storage = revision.getStorage(null);
-					InputStream contents = storage.getContents();
-					BufferedReader in = new BufferedReader(
-							new InputStreamReader(contents));
-					final int DEFAULT_FILE_SIZE = 15 * 1024;
-
-					CharArrayWriter caw = new CharArrayWriter(DEFAULT_FILE_SIZE);
-					char[] readBuffer = new char[2048];
-					int n = in.read(readBuffer);
-					while (n > 0) {
-						caw.write(readBuffer, 0, n);
-						n = in.read(readBuffer);
-					}
-					String s = caw.toString();
-					document.set(s);
-				} else {
-					Activator.trace("(GitQuickDiffProvider) no revision.");
-					document.set("");
-				}
+				document = GitDocument.create(resource);
 			} catch (CoreException e) {
 				Activator.error(UIText.QuickDiff_failedLoading, e);
 			} catch (IOException e) {
@@ -105,7 +68,7 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider {
 
 	public void setActiveEditor(ITextEditor editor) {
 		IEditorInput editorInput = editor.getEditorInput();
-		file = ResourceUtil.getFile(editorInput);
+		resource = ResourceUtil.getResource(editorInput);
 	}
 
 	public void setId(String id) {
-- 
1.5.6.2.220.g44701
Previous: Robin RosenbergNext: Robin Rosenberg
Message 2 of 7 in “Quickdiff improvement”
  1. 0/2 Quickdiff improvementRobin Rosenberg, Jul 10, 2008
  2. 1/2 Make quick diff aware of changes in the repository.Robin Rosenberg, Jul 10, 2008
  3. 2/2 Provide the ability to configure the quickdiff baselineRobin Rosenberg, Jul 10, 2008
  4. Shawn O. PearceJul 11, 2008
  5. Fix nullpointer exceptions in QuickdiffRobin Rosenberg, Jul 11, 2008
  6. EGIT, was Re: [PATCH] Fix nullpointer exceptions in QuickdiffJohannes Schindelin, Jul 11, 2008
  7. Robin RosenbergJul 11, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.