From: Robin Rosenberg <robin.rosenberg@dewire.com>
To: "Shawn O. Pearce" <spearce@spearce.org>
Cc: git@vger.kernel.org, Marek Zawirski <marek.zawirski@gmail.com>,
Robin Rosenberg <robin.rosenberg@dewire.com>
Subject: [EGIT PATCH 1/2] Make quick diff aware of changes in the repository.
Date: Fri, 11 Jul 2008 00:41:11 +0200 [thread overview]
Message-ID: <1215729672-26906-2-git-send-email-robin.rosenberg@dewire.com> (raw)
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
next prev parent reply other threads:[~2008-07-10 22:47 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-10 22:41 [EGIT PATCH 0/2] Quickdiff improvement Robin Rosenberg
2008-07-10 22:41 ` Robin Rosenberg [this message]
2008-07-10 22:41 ` [EGIT PATCH 2/2] Provide the ability to configure the quickdiff baseline Robin Rosenberg
2008-07-11 5:00 ` Shawn O. Pearce
2008-07-11 21:34 ` [PATCH] Fix nullpointer exceptions in Quickdiff Robin Rosenberg
2008-07-11 21:50 ` EGIT, was " Johannes Schindelin
2008-07-11 22:15 ` Robin Rosenberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1215729672-26906-2-git-send-email-robin.rosenberg@dewire.com \
--to=robin.rosenberg@dewire.com \
--cc=git@vger.kernel.org \
--cc=marek.zawirski@gmail.com \
--cc=spearce@spearce.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).