{"thread":{"id":"14402","subject":"[EGIT PATCH 1/2] Make quick diff aware of changes in the repository.","startedAt":"2008-07-10T22:41:10Z","lastAt":"2008-07-11T22:15:58Z","messageCount":7,"participants":["Robin Rosenberg","Shawn O. Pearce","Johannes Schindelin"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"82878","messageId":"1215729672-26906-1-git-send-email-robin.rosenberg@dewire.com","threadId":"14402","inReplyTo":null,"subject":"[EGIT PATCH 0/2] Quickdiff improvement","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2008-07-10T22:41:10Z","receivedAt":"2008-07-10T22:41:10Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"Connect quickdiff to the repository event mechanism and allow us\nto specify what to compare against.\n\n-- robin\n\nRobin Rosenberg (2):\n  Make quick diff aware of changes in the repository.\n  Provide the ability to configure the quickdiff baseline\n\n org.spearce.egit.ui/plugin.properties              |    2 +-\n org.spearce.egit.ui/plugin.xml                     |   14 +++\n .../actions/QuickdiffBaselineOperation.java        |   44 ++++++++++\n .../actions/ResetQuickdiffBaselineAction.java      |   24 +++++\n .../actions/SetQuickdiffBaselineAction.java        |   26 ++++++\n .../egit/ui/internal/decorators/GitDocument.java   |   86 +++++++++++++++++++\n .../internal/decorators/GitQuickDiffProvider.java  |   90 +++++++++-----------\n 7 files changed, 236 insertions(+), 50 deletions(-)\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/QuickdiffBaselineOperation.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/ResetQuickdiffBaselineAction.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SetQuickdiffBaselineAction.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java\n"},{"id":"82874","messageId":"1215729672-26906-2-git-send-email-robin.rosenberg@dewire.com","threadId":"14402","inReplyTo":"1215729672-26906-1-git-send-email-robin.rosenberg@dewire.com","subject":"[EGIT PATCH 1/2] Make quick diff aware of changes in the repository.","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2008-07-10T22:41:11Z","receivedAt":"2008-07-10T22:41:11Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"Currently only refs changes are relevant.\n\nSigned-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n .../egit/ui/internal/decorators/GitDocument.java   |  107 ++++++++++++++++++++\n .../internal/decorators/GitQuickDiffProvider.java  |   57 ++---------\n 2 files changed, 117 insertions(+), 47 deletions(-)\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java\n\ndiff --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\nnew file mode 100644\nindex 0000000..23e06d9\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java\n@@ -0,0 +1,107 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.decorators;\n+\n+import java.io.BufferedReader;\n+import java.io.CharArrayWriter;\n+import java.io.IOException;\n+import java.io.InputStream;\n+import java.io.InputStreamReader;\n+\n+import org.eclipse.core.resources.IProject;\n+import org.eclipse.core.resources.IResource;\n+import org.eclipse.core.resources.IStorage;\n+import org.eclipse.core.runtime.CoreException;\n+import org.eclipse.jface.text.Document;\n+import org.eclipse.team.core.RepositoryProvider;\n+import org.eclipse.team.core.history.IFileHistory;\n+import org.eclipse.team.core.history.IFileHistoryProvider;\n+import org.eclipse.team.core.history.IFileRevision;\n+import org.spearce.egit.core.GitProvider;\n+import org.spearce.egit.core.project.RepositoryMapping;\n+import org.spearce.egit.ui.Activator;\n+import org.spearce.jgit.lib.IndexChangedEvent;\n+import org.spearce.jgit.lib.RefsChangedEvent;\n+import org.spearce.jgit.lib.Repository;\n+import org.spearce.jgit.lib.RepositoryListener;\n+\n+class GitDocument extends Document implements RepositoryListener {\n+\tprivate final IResource resource;\n+\n+\tstatic GitDocument create(IResource resource) throws IOException, CoreException {\n+\t\tGitDocument ret = null;\n+\t\tif (RepositoryProvider.getProvider(resource.getProject()) instanceof GitProvider) {\n+\t\t\tret = new GitDocument(resource);\n+\t\t\tret.populate();\n+\t\t}\n+\t\treturn ret;\n+\t}\n+\n+\tprivate GitDocument(IResource resource) {\n+\t\tthis.resource = resource;\n+\t}\n+\n+\tvoid populate() throws IOException, CoreException {\n+\t\tset(\"\");\n+\t\tIProject project = resource.getProject();\n+\t\tRepositoryProvider provider = RepositoryProvider.getProvider(project);\n+\t\tgetRepository().addRepositoryChangedListener(this);\n+\t\tIFileHistoryProvider fileHistoryProvider = provider\n+\t\t\t\t.getFileHistoryProvider();\n+\t\tIFileHistory fileHistoryFor = fileHistoryProvider.getFileHistoryFor(\n+\t\t\t\tresource, IFileHistoryProvider.SINGLE_REVISION, null);\n+\t\tIFileRevision[] revisions = fileHistoryFor.getFileRevisions();\n+\t\tif (revisions != null && revisions.length > 0) {\n+\t\t\tIFileRevision revision = revisions[0];\n+\t\t\tActivator.trace(\"(GitQuickDiffProvider) compareTo: \"\n+\t\t\t\t\t+ revision.getContentIdentifier());\n+\t\t\tIStorage storage = revision.getStorage(null);\n+\t\t\tInputStream contents = storage.getContents();\n+\t\t\tBufferedReader in = new BufferedReader(new InputStreamReader(\n+\t\t\t\t\tcontents));\n+\t\t\tfinal int DEFAULT_FILE_SIZE = 15 * 1024;\n+\n+\t\t\tCharArrayWriter caw = new CharArrayWriter(DEFAULT_FILE_SIZE);\n+\t\t\tchar[] readBuffer = new char[2048];\n+\t\t\tint n = in.read(readBuffer);\n+\t\t\twhile (n > 0) {\n+\t\t\t\tcaw.write(readBuffer, 0, n);\n+\t\t\t\tn = in.read(readBuffer);\n+\t\t\t}\n+\t\t\tString s = caw.toString();\n+\t\t\tset(s);\n+\t\t\tActivator.trace(\"(GitQuickDiffProvider) has reference doc, size=\" + s.length() + \" bytes\");\n+\t\t} else {\n+\t\t\tActivator.trace(\"(GitQuickDiffProvider) no revision.\");\n+\t\t}\n+\t}\n+\n+\tvoid dispose() {\n+\t\tgetRepository().removeRepositoryChangedListener(this);\n+\t}\n+\n+\tpublic void refsChanged(final RefsChangedEvent e) {\n+\t\ttry {\n+\t\t\tpopulate();\n+\t\t} catch (IOException e1) {\n+\t\t\tActivator.logError(\"Failed to refresh quickdiff\", e1);\n+\t\t} catch (CoreException e1) {\n+\t\t\tActivator.logError(\"Failed to refresh quickdiff\", e1);\n+\t\t}\n+\t}\n+\n+\tpublic void indexChanged(final IndexChangedEvent e) {\n+\t\t// Index not relevant at this moment\n+\t}\n+\n+\tprivate Repository getRepository() {\n+\t\tIProject project = resource.getProject();\n+\t\tRepositoryMapping mapping = RepositoryMapping.getMapping(project);\n+\t\treturn mapping.getRepository();\n+\t}\n+}\ndiff --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\nindex 5525914..052552e 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitQuickDiffProvider.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitQuickDiffProvider.java\n@@ -8,22 +8,13 @@\n  *******************************************************************************/\n package org.spearce.egit.ui.internal.decorators;\n \n-import java.io.BufferedReader;\n-import java.io.CharArrayWriter;\n import java.io.IOException;\n-import java.io.InputStream;\n-import java.io.InputStreamReader;\n \n-import org.eclipse.core.resources.IFile;\n-import org.eclipse.core.resources.IStorage;\n+import org.eclipse.core.resources.IResource;\n import org.eclipse.core.runtime.CoreException;\n import org.eclipse.core.runtime.IProgressMonitor;\n-import org.eclipse.jface.text.Document;\n import org.eclipse.jface.text.IDocument;\n import org.eclipse.team.core.RepositoryProvider;\n-import org.eclipse.team.core.history.IFileHistory;\n-import org.eclipse.team.core.history.IFileHistoryProvider;\n-import org.eclipse.team.core.history.IFileRevision;\n import org.eclipse.ui.IEditorInput;\n import org.eclipse.ui.ide.ResourceUtil;\n import org.eclipse.ui.texteditor.ITextEditor;\n@@ -38,12 +29,14 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider {\n \n \tprivate String id;\n \n-\tprivate Document document;\n+\tprivate GitDocument document;\n \n-\tprivate IFile file;\n+\tprivate IResource resource;\n \n \tpublic void dispose() {\n-\t\t// No resources to free\n+\t\tActivator.trace(\"(GitQuickDiffProvider) dispose\");\n+\t\tif (document != null)\n+\t\t\tdocument.dispose();\n \t}\n \n \tpublic String getId() {\n@@ -52,42 +45,12 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider {\n \n \tpublic IDocument getReference(IProgressMonitor monitor)\n \t\t\tthrows CoreException {\n-\t\tdocument = new Document();\n-\t\tActivator.trace(\"(GitQuickDiffProvider) file: \" + file);\n-\n-\t\tRepositoryProvider provider = RepositoryProvider.getProvider(file\n+\t\tActivator.trace(\"(GitQuickDiffProvider) file: \" + resource);\n+\t\tRepositoryProvider provider = RepositoryProvider.getProvider(resource\n \t\t\t\t.getProject());\n \t\tif (provider != null) {\n \t\t\ttry {\n-\t\t\t\tIFileHistoryProvider fileHistoryProvider = provider\n-\t\t\t\t\t\t.getFileHistoryProvider();\n-\t\t\t\tIFileHistory fileHistoryFor = fileHistoryProvider\n-\t\t\t\t\t\t.getFileHistoryFor(file,\n-\t\t\t\t\t\t\t\tIFileHistoryProvider.SINGLE_REVISION, null);\n-\t\t\t\tIFileRevision[] revisions = fileHistoryFor.getFileRevisions();\n-\t\t\t\tif (revisions != null && revisions.length > 0) {\n-\t\t\t\t\tIFileRevision revision = revisions[0];\n-\t\t\t\t\tActivator.trace(\"(GitQuickDiffProvider) compareTo: \"\n-\t\t\t\t\t\t\t+ revision.getContentIdentifier());\n-\t\t\t\t\tIStorage storage = revision.getStorage(null);\n-\t\t\t\t\tInputStream contents = storage.getContents();\n-\t\t\t\t\tBufferedReader in = new BufferedReader(\n-\t\t\t\t\t\t\tnew InputStreamReader(contents));\n-\t\t\t\t\tfinal int DEFAULT_FILE_SIZE = 15 * 1024;\n-\n-\t\t\t\t\tCharArrayWriter caw = new CharArrayWriter(DEFAULT_FILE_SIZE);\n-\t\t\t\t\tchar[] readBuffer = new char[2048];\n-\t\t\t\t\tint n = in.read(readBuffer);\n-\t\t\t\t\twhile (n > 0) {\n-\t\t\t\t\t\tcaw.write(readBuffer, 0, n);\n-\t\t\t\t\t\tn = in.read(readBuffer);\n-\t\t\t\t\t}\n-\t\t\t\t\tString s = caw.toString();\n-\t\t\t\t\tdocument.set(s);\n-\t\t\t\t} else {\n-\t\t\t\t\tActivator.trace(\"(GitQuickDiffProvider) no revision.\");\n-\t\t\t\t\tdocument.set(\"\");\n-\t\t\t\t}\n+\t\t\t\tdocument = GitDocument.create(resource);\n \t\t\t} catch (CoreException e) {\n \t\t\t\tActivator.error(UIText.QuickDiff_failedLoading, e);\n \t\t\t} catch (IOException e) {\n@@ -105,7 +68,7 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider {\n \n \tpublic void setActiveEditor(ITextEditor editor) {\n \t\tIEditorInput editorInput = editor.getEditorInput();\n-\t\tfile = ResourceUtil.getFile(editorInput);\n+\t\tresource = ResourceUtil.getResource(editorInput);\n \t}\n \n \tpublic void setId(String id) {\n-- \n1.5.6.2.220.g44701\n"},{"id":"82879","messageId":"1215729672-26906-3-git-send-email-robin.rosenberg@dewire.com","threadId":"14402","inReplyTo":"1215729672-26906-2-git-send-email-robin.rosenberg@dewire.com","subject":"[EGIT PATCH 2/2] Provide the ability to configure the quickdiff baseline","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2008-07-10T22:41:12Z","receivedAt":"2008-07-10T22:41:12Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"By default quickdiff compares to HEAD, but you can change that\nusing the context menu in the history graph. The setting is\nremembered during a session on a per Git repository basis.\n\nSigned-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n org.spearce.egit.ui/plugin.properties              |    2 +-\n org.spearce.egit.ui/plugin.xml                     |   14 +++++\n .../actions/QuickdiffBaselineOperation.java        |   44 +++++++++++++++\n .../actions/ResetQuickdiffBaselineAction.java      |   24 ++++++++\n .../actions/SetQuickdiffBaselineAction.java        |   26 +++++++++\n .../egit/ui/internal/decorators/GitDocument.java   |   57 ++++++-------------\n .../internal/decorators/GitQuickDiffProvider.java  |   33 +++++++++++-\n 7 files changed, 158 insertions(+), 42 deletions(-)\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/QuickdiffBaselineOperation.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/ResetQuickdiffBaselineAction.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SetQuickdiffBaselineAction.java\n\ndiff --git a/org.spearce.egit.ui/plugin.properties b/org.spearce.egit.ui/plugin.properties\nindex 64a88c3..3240ec0 100644\n--- a/org.spearce.egit.ui/plugin.properties\n+++ b/org.spearce.egit.ui/plugin.properties\n@@ -6,7 +6,7 @@ Git_clone_wizard=Git Repository\n Git_clone_description=Clone an existing Git repository.\n \n SharingWizard_name=Git\n-GitRemoteQuickDiffProvider_label=Latest Git Revision\n+GitRemoteQuickDiffProvider_label=A Git Revision\n \n DisconnectAction_label=Disconnect\n DisconnectAction_tooltip=Disconnect the Git team provider.\ndiff --git a/org.spearce.egit.ui/plugin.xml b/org.spearce.egit.ui/plugin.xml\nindex cfd4b80..b809300 100644\n--- a/org.spearce.egit.ui/plugin.xml\n+++ b/org.spearce.egit.ui/plugin.xml\n@@ -124,6 +124,20 @@\n                enablesFor=\"1\"\n                tooltip=\"Resets HEAD and index, and working directory (changed in tracked files will be lost)\">\n          </action>\n+\t <action\n+\t       class=\"org.spearce.egit.ui.internal.actions.SetQuickdiffBaselineAction\"\n+\t       enablesFor=\"1\"\n+\t       id=\"org.spearce.egit.ui.setquickdiffbaseline\"\n+\t       label=\"Set as quickdiff baseline\"\n+\t       menubarPath=\"additions\">\n+\t </action>\n+\t <action\n+\t       class=\"org.spearce.egit.ui.internal.actions.ResetQuickdiffBaselineAction\"\n+\t       enablesFor=\"*\"\n+\t       id=\"org.spearce.egit.ui.resetquickdiffbaseline\"\n+\t       label=\"Reset quickdiff baseline to HEAD\"\n+\t       menubarPath=\"additions\">\n+\t </action>\n \t  </objectContribution>\n    </extension>\n \ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/QuickdiffBaselineOperation.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/QuickdiffBaselineOperation.java\nnew file mode 100644\nindex 0000000..990958f\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/QuickdiffBaselineOperation.java\n@@ -0,0 +1,44 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.actions;\n+\n+import java.io.IOException;\n+\n+import org.eclipse.core.runtime.CoreException;\n+import org.eclipse.core.runtime.IProgressMonitor;\n+import org.spearce.egit.ui.Activator;\n+import org.spearce.egit.ui.internal.decorators.GitQuickDiffProvider;\n+import org.spearce.jgit.lib.Repository;\n+\n+/**\n+ * UI operation to change the git quickdiff baseline\n+ */\n+public class QuickdiffBaselineOperation extends AbstractRevObjectOperation {\n+\n+\tprivate final String baseline;\n+\n+\t/**\n+\t * Construct a QuickdiffBaselineOperation for changing quickdiff baseline\n+\t * @param repository\n+\t *\n+\t * @param baseline\n+\t */\n+\tQuickdiffBaselineOperation(final Repository repository, final String baseline) {\n+\t\tsuper(repository);\n+\t\tthis.baseline = baseline;\n+\t}\n+\n+\tpublic void run(IProgressMonitor monitor) throws CoreException {\n+\t\ttry {\n+\t\t\tGitQuickDiffProvider.setBaselineReference(repository, baseline);\n+\t\t} catch (IOException e) {\n+\t\t\tActivator.logError(\"Cannot set quickdiff basekine\", e);\n+\t\t}\n+\t}\n+\n+}\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/ResetQuickdiffBaselineAction.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/ResetQuickdiffBaselineAction.java\nnew file mode 100644\nindex 0000000..a42635a\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/ResetQuickdiffBaselineAction.java\n@@ -0,0 +1,24 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.actions;\n+\n+import java.util.List;\n+\n+import org.eclipse.core.resources.IWorkspaceRunnable;\n+import org.eclipse.jface.action.IAction;\n+\n+/**\n+ * Changes the reference for the quickdiff\n+ */\n+public class ResetQuickdiffBaselineAction extends AbstractRevObjectAction {\n+\n+\t@Override\n+\tprotected IWorkspaceRunnable createOperation(IAction act, List selection) {\n+\t\treturn new QuickdiffBaselineOperation(getActiveRepository(), \"HEAD\");\n+\t}\n+}\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SetQuickdiffBaselineAction.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SetQuickdiffBaselineAction.java\nnew file mode 100644\nindex 0000000..05686cf\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SetQuickdiffBaselineAction.java\n@@ -0,0 +1,26 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.actions;\n+\n+import java.util.List;\n+\n+import org.eclipse.core.resources.IWorkspaceRunnable;\n+import org.eclipse.jface.action.IAction;\n+import org.spearce.jgit.revwalk.RevObject;\n+\n+/**\n+ * Changes the reference for the quickdiff\n+ */\n+public class SetQuickdiffBaselineAction extends AbstractRevObjectAction {\n+\n+\t@Override\n+\tprotected IWorkspaceRunnable createOperation(IAction act, List selection) {\n+\t\treturn new QuickdiffBaselineOperation(getActiveRepository(), ((RevObject)selection.get(0)).getId().toString());\n+\t}\n+\n+}\ndiff --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\nindex 23e06d9..ebed0cf 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java\n@@ -7,33 +7,26 @@\n  *******************************************************************************/\n package org.spearce.egit.ui.internal.decorators;\n \n-import java.io.BufferedReader;\n-import java.io.CharArrayWriter;\n import java.io.IOException;\n-import java.io.InputStream;\n-import java.io.InputStreamReader;\n \n import org.eclipse.core.resources.IProject;\n import org.eclipse.core.resources.IResource;\n-import org.eclipse.core.resources.IStorage;\n-import org.eclipse.core.runtime.CoreException;\n import org.eclipse.jface.text.Document;\n import org.eclipse.team.core.RepositoryProvider;\n-import org.eclipse.team.core.history.IFileHistory;\n-import org.eclipse.team.core.history.IFileHistoryProvider;\n-import org.eclipse.team.core.history.IFileRevision;\n import org.spearce.egit.core.GitProvider;\n import org.spearce.egit.core.project.RepositoryMapping;\n import org.spearce.egit.ui.Activator;\n import org.spearce.jgit.lib.IndexChangedEvent;\n+import org.spearce.jgit.lib.ObjectLoader;\n import org.spearce.jgit.lib.RefsChangedEvent;\n import org.spearce.jgit.lib.Repository;\n import org.spearce.jgit.lib.RepositoryListener;\n+import org.spearce.jgit.lib.TreeEntry;\n \n class GitDocument extends Document implements RepositoryListener {\n \tprivate final IResource resource;\n \n-\tstatic GitDocument create(IResource resource) throws IOException, CoreException {\n+\tstatic GitDocument create(final IResource resource) throws IOException {\n \t\tGitDocument ret = null;\n \t\tif (RepositoryProvider.getProvider(resource.getProject()) instanceof GitProvider) {\n \t\t\tret = new GitDocument(resource);\n@@ -44,36 +37,24 @@ class GitDocument extends Document implements RepositoryListener {\n \n \tprivate GitDocument(IResource resource) {\n \t\tthis.resource = resource;\n+\t\tGitQuickDiffProvider.doc2repo.put(this, getRepository());\n \t}\n \n-\tvoid populate() throws IOException, CoreException {\n+\tvoid populate() throws IOException {\n \t\tset(\"\");\n-\t\tIProject project = resource.getProject();\n-\t\tRepositoryProvider provider = RepositoryProvider.getProvider(project);\n-\t\tgetRepository().addRepositoryChangedListener(this);\n-\t\tIFileHistoryProvider fileHistoryProvider = provider\n-\t\t\t\t.getFileHistoryProvider();\n-\t\tIFileHistory fileHistoryFor = fileHistoryProvider.getFileHistoryFor(\n-\t\t\t\tresource, IFileHistoryProvider.SINGLE_REVISION, null);\n-\t\tIFileRevision[] revisions = fileHistoryFor.getFileRevisions();\n-\t\tif (revisions != null && revisions.length > 0) {\n-\t\t\tIFileRevision revision = revisions[0];\n-\t\t\tActivator.trace(\"(GitQuickDiffProvider) compareTo: \"\n-\t\t\t\t\t+ revision.getContentIdentifier());\n-\t\t\tIStorage storage = revision.getStorage(null);\n-\t\t\tInputStream contents = storage.getContents();\n-\t\t\tBufferedReader in = new BufferedReader(new InputStreamReader(\n-\t\t\t\t\tcontents));\n-\t\t\tfinal int DEFAULT_FILE_SIZE = 15 * 1024;\n-\n-\t\t\tCharArrayWriter caw = new CharArrayWriter(DEFAULT_FILE_SIZE);\n-\t\t\tchar[] readBuffer = new char[2048];\n-\t\t\tint n = in.read(readBuffer);\n-\t\t\twhile (n > 0) {\n-\t\t\t\tcaw.write(readBuffer, 0, n);\n-\t\t\t\tn = in.read(readBuffer);\n-\t\t\t}\n-\t\t\tString s = caw.toString();\n+\t\tfinal IProject project = resource.getProject();\n+\t\tfinal String gitPath = RepositoryMapping.getMapping(project).getRepoRelativePath(resource);\n+\t\tfinal Repository repository = getRepository();\n+\t\trepository.addRepositoryChangedListener(this);\n+\t\tString baseline = GitQuickDiffProvider.baseline.get(repository);\n+\t\tif (baseline == null)\n+\t\t\tbaseline = \"HEAD\";\n+\t\tTreeEntry blobEnry = repository.mapTree(baseline).findBlobMember(gitPath);\n+\t\tif (blobEnry != null) {\n+\t\t\tActivator.trace(\"(GitQuickDiffProvider) compareTo: \" + baseline);\n+\t\t\tObjectLoader loader = repository.openBlob(blobEnry.getId());\n+\t\t\tbyte[] bytes = loader.getBytes();\n+\t\t\tString s = new String(bytes); // FIXME Platform default charset. should be Eclipse default\n \t\t\tset(s);\n \t\t\tActivator.trace(\"(GitQuickDiffProvider) has reference doc, size=\" + s.length() + \" bytes\");\n \t\t} else {\n@@ -90,8 +71,6 @@ class GitDocument extends Document implements RepositoryListener {\n \t\t\tpopulate();\n \t\t} catch (IOException e1) {\n \t\t\tActivator.logError(\"Failed to refresh quickdiff\", e1);\n-\t\t} catch (CoreException e1) {\n-\t\t\tActivator.logError(\"Failed to refresh quickdiff\", e1);\n \t\t}\n \t}\n \ndiff --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\nindex 052552e..88f5ea0 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitQuickDiffProvider.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitQuickDiffProvider.java\n@@ -9,6 +9,8 @@\n package org.spearce.egit.ui.internal.decorators;\n \n import java.io.IOException;\n+import java.util.Map;\n+import java.util.WeakHashMap;\n \n import org.eclipse.core.resources.IResource;\n import org.eclipse.core.runtime.CoreException;\n@@ -21,6 +23,7 @@ import org.eclipse.ui.texteditor.ITextEditor;\n import org.eclipse.ui.texteditor.quickdiff.IQuickDiffReferenceProvider;\n import org.spearce.egit.ui.Activator;\n import org.spearce.egit.ui.UIText;\n+import org.spearce.jgit.lib.Repository;\n \n /**\n  * This class provides input for the Eclipse Quick Diff feature.\n@@ -33,8 +36,19 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider {\n \n \tprivate IResource resource;\n \n+\tstatic Map<Repository,String> baseline = new WeakHashMap<Repository,String>();\n+\tstatic Map<GitDocument,Repository> doc2repo = new WeakHashMap<GitDocument, Repository>();\n+\n+\t/**\n+\t * Create the GitQuickDiffProvider instance\n+\t */\n+\tpublic GitQuickDiffProvider() {\n+\t\t// Empty\n+\t}\n+\n \tpublic void dispose() {\n \t\tActivator.trace(\"(GitQuickDiffProvider) dispose\");\n+\t\tdoc2repo.remove(document);\n \t\tif (document != null)\n \t\t\tdocument.dispose();\n \t}\n@@ -51,8 +65,6 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider {\n \t\tif (provider != null) {\n \t\t\ttry {\n \t\t\t\tdocument = GitDocument.create(resource);\n-\t\t\t} catch (CoreException e) {\n-\t\t\t\tActivator.error(UIText.QuickDiff_failedLoading, e);\n \t\t\t} catch (IOException e) {\n \t\t\t\tActivator.error(UIText.QuickDiff_failedLoading, e);\n \t\t\t}\n@@ -74,4 +86,21 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider {\n \tpublic void setId(String id) {\n \t\tthis.id = id;\n \t}\n+\n+\t/**\n+\t * Set a new baseline for quickdiff\n+\t *\n+\t * @param repository\n+\t * @param baseline any commit reference, ref, symref or sha-1\n+\t * @throws IOException\n+\t */\n+\tpublic static void setBaselineReference(final Repository repository, final String baseline) throws IOException {\n+\t\tGitQuickDiffProvider.baseline.put(repository, baseline);\n+\t\tfor (Map.Entry<GitDocument, Repository> i : doc2repo.entrySet()) {\n+\t\t\tif (i.getValue() == repository) {\n+\t\t\t\ti.getKey().populate();\n+\t\t\t}\n+\t\t}\n+\t}\n+\n }\n-- \n1.5.6.2.220.g44701\n"},{"id":"82919","messageId":"20080711050035.GE32633@spearce.org","threadId":"14402","inReplyTo":"1215729672-26906-3-git-send-email-robin.rosenberg@dewire.com","subject":"Re: [EGIT PATCH 2/2] Provide the ability to configure the quickdiff baseline","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-11T05:00:35Z","receivedAt":"2008-07-11T05:00:35Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Robin Rosenberg <robin.rosenberg@dewire.com> wrote:\n> +\t\tTreeEntry blobEnry = repository.mapTree(baseline).findBlobMember(gitPath);\n> +\t\tif (blobEnry != null) {\n> +\t\t\tActivator.trace(\"(GitQuickDiffProvider) compareTo: \" + baseline);\n> +\t\t\tObjectLoader loader = repository.openBlob(blobEnry.getId());\n\nFor what it is worth, it is probably faster to use TreeWalk:\n\n\tfinal TreeWalk tw = TreeWalk.forPath(\n\t\trepository,\n\t\tgitPath,\n\t\tnew ObjectId[]{ repository.resolve(baseline + \"^{tree}\") });\n\tif (tw != null) {\n\t\tActivator.trace(\"(GitQuickDiffProvider) compareTo: \" + baseline);\n\t\tObjectLoader loader = repository.openBlob(tw.getObjectId(0));\n\nI probably should teach TreeWalk how to do the ^{tree} on its own\nso it can just take a tree-ish here, but you still had to invoke\nresolve to go from String to ObjectId so its not major problem.\n\nThe reason TreeWalk is faster is we spend less time parsing the\nentries, and we avoid entries which are after the path we need to\nwalk down.  E.g. if the subtree we need to enter into is in the\nmiddle of the parent tree TreeWalk won't even touch the remainder\nof the parent tree records.  Tree/TreeEntry still does.\n\n-- \nShawn.\n"},{"id":"83019","messageId":"200807112334.47552.robin.rosenberg@dewire.com","threadId":"14402","inReplyTo":"1215729672-26906-2-git-send-email-robin.rosenberg@dewire.com","subject":"[PATCH] Fix nullpointer exceptions in Quickdiff","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2008-07-11T21:34:47Z","receivedAt":"2008-07-11T21:34:47Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"\n--- \nI saw some problem when resources were no longer in the worspace, such as during a bisectg. \nThis one should probably just be squashed into patch 1.\n\n-- robin\n\ndiff --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\nindex ebed0cf..3724304 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java\n@@ -43,7 +43,10 @@ class GitDocument extends Document implements RepositoryListener {\n \tvoid populate() throws IOException {\n \t\tset(\"\");\n \t\tfinal IProject project = resource.getProject();\n-\t\tfinal String gitPath = RepositoryMapping.getMapping(project).getRepoRelativePath(resource);\n+\t\tRepositoryMapping mapping = RepositoryMapping.getMapping(project);\n+\t\tif (mapping == null)\n+\t\t\treturn;\n+\t\tfinal String gitPath = mapping.getRepoRelativePath(resource);\n \t\tfinal Repository repository = getRepository();\n \t\trepository.addRepositoryChangedListener(this);\n \t\tString baseline = GitQuickDiffProvider.baseline.get(repository);\n@@ -63,7 +66,9 @@ class GitDocument extends Document implements RepositoryListener {\n \t}\n \n \tvoid dispose() {\n-\t\tgetRepository().removeRepositoryChangedListener(this);\n+\t\tRepository repository = getRepository();\n+\t\tif (repository != null)\n+\t\t\trepository.removeRepositoryChangedListener(this);\n \t}\n \n \tpublic void refsChanged(final RefsChangedEvent e) {\n@@ -81,6 +86,8 @@ class GitDocument extends Document implements RepositoryListener {\n \tprivate Repository getRepository() {\n \t\tIProject project = resource.getProject();\n \t\tRepositoryMapping mapping = RepositoryMapping.getMapping(project);\n-\t\treturn mapping.getRepository();\n+\t\tif (mapping != null)\n+\t\t\treturn mapping.getRepository();\n+\t\treturn null;\n \t}\n }\n-- \n1.5.6.2.220.g44701\n"},{"id":"83020","messageId":"alpine.DEB.1.00.0807112249010.8950@racer","threadId":"14402","inReplyTo":"200807112334.47552.robin.rosenberg@dewire.com","subject":"EGIT, was Re: [PATCH] Fix nullpointer exceptions in Quickdiff","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-07-11T21:50:07Z","receivedAt":"2008-07-11T21:50:07Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi Andreas,\n\nOn Fri, 11 Jul 2008, Robin Rosenberg wrote:\n\n> \n> --- \n> I saw some problem when resources were no longer in the worspace, such as during a bisectg. \n> This one should probably just be squashed into patch 1.\n\nThis patch is for egit, before you ask.\n\nBut be prepared for a lot of unmarked Windows discussion, somebody wants \nto shift msysGit's mail list payload to git@vger ;-)\n\nCiao,\nDscho\n"},{"id":"83031","messageId":"200807120015.58909.robin.rosenberg.lists@dewire.com","threadId":"14402","inReplyTo":"alpine.DEB.1.00.0807112249010.8950@racer","subject":"Re: EGIT, was Re: [PATCH] Fix nullpointer exceptions in Quickdiff","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg.lists@dewire.com","sentAt":"2008-07-11T22:15:58Z","receivedAt":"2008-07-11T22:15:58Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"fredagen den 11 juli 2008 23.50.07 skrev Johannes Schindelin:\n> Hi Andreas,\n> \n> On Fri, 11 Jul 2008, Robin Rosenberg wrote:\n> \n> > \n> > --- \n> > I saw some problem when resources were no longer in the worspace, such as during a bisectg. \n> > This one should probably just be squashed into patch 1.\n> \n> This patch is for egit, before you ask.\n> \n> But be prepared for a lot of unmarked Windows discussion, somebody wants \n> to shift msysGit's mail list payload to git@vger ;-)\n\nAaaaaaaaaaa.... I've take a leave now .)\n\n-- robin\t\n"}]}