* [EGIT PATCH 0/2] Quickdiff improvement @ 2008-07-10 22:41 Robin Rosenberg 2008-07-10 22:41 ` [EGIT PATCH 1/2] Make quick diff aware of changes in the repository Robin Rosenberg 0 siblings, 1 reply; 7+ messages in thread From: Robin Rosenberg @ 2008-07-10 22:41 UTC (permalink / raw) To: Shawn O. Pearce; +Cc: git, Marek Zawirski, Robin Rosenberg Connect quickdiff to the repository event mechanism and allow us to specify what to compare against. -- robin Robin Rosenberg (2): Make quick diff aware of changes in the repository. Provide the ability to configure the quickdiff baseline org.spearce.egit.ui/plugin.properties | 2 +- org.spearce.egit.ui/plugin.xml | 14 +++ .../actions/QuickdiffBaselineOperation.java | 44 ++++++++++ .../actions/ResetQuickdiffBaselineAction.java | 24 +++++ .../actions/SetQuickdiffBaselineAction.java | 26 ++++++ .../egit/ui/internal/decorators/GitDocument.java | 86 +++++++++++++++++++ .../internal/decorators/GitQuickDiffProvider.java | 90 +++++++++----------- 7 files changed, 236 insertions(+), 50 deletions(-) create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/QuickdiffBaselineOperation.java create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/ResetQuickdiffBaselineAction.java create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SetQuickdiffBaselineAction.java create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitDocument.java ^ permalink raw reply [flat|nested] 7+ messages in thread
* [EGIT PATCH 1/2] Make quick diff aware of changes in the repository. 2008-07-10 22:41 [EGIT PATCH 0/2] Quickdiff improvement Robin Rosenberg @ 2008-07-10 22:41 ` Robin Rosenberg 2008-07-10 22:41 ` [EGIT PATCH 2/2] Provide the ability to configure the quickdiff baseline Robin Rosenberg 2008-07-11 21:34 ` [PATCH] Fix nullpointer exceptions in Quickdiff Robin Rosenberg 0 siblings, 2 replies; 7+ messages in thread From: Robin Rosenberg @ 2008-07-10 22:41 UTC (permalink / raw) To: Shawn O. Pearce; +Cc: git, Marek Zawirski, Robin Rosenberg 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 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [EGIT PATCH 2/2] Provide the ability to configure the quickdiff baseline 2008-07-10 22:41 ` [EGIT PATCH 1/2] Make quick diff aware of changes in the repository Robin Rosenberg @ 2008-07-10 22:41 ` Robin Rosenberg 2008-07-11 5:00 ` Shawn O. Pearce 2008-07-11 21:34 ` [PATCH] Fix nullpointer exceptions in Quickdiff Robin Rosenberg 1 sibling, 1 reply; 7+ messages in thread From: Robin Rosenberg @ 2008-07-10 22:41 UTC (permalink / raw) To: Shawn O. Pearce; +Cc: git, Marek Zawirski, Robin Rosenberg By default quickdiff compares to HEAD, but you can change that using the context menu in the history graph. The setting is remembered during a session on a per Git repository basis. Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com> --- org.spearce.egit.ui/plugin.properties | 2 +- org.spearce.egit.ui/plugin.xml | 14 +++++ .../actions/QuickdiffBaselineOperation.java | 44 +++++++++++++++ .../actions/ResetQuickdiffBaselineAction.java | 24 ++++++++ .../actions/SetQuickdiffBaselineAction.java | 26 +++++++++ .../egit/ui/internal/decorators/GitDocument.java | 57 ++++++------------- .../internal/decorators/GitQuickDiffProvider.java | 33 +++++++++++- 7 files changed, 158 insertions(+), 42 deletions(-) create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/QuickdiffBaselineOperation.java create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/ResetQuickdiffBaselineAction.java create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SetQuickdiffBaselineAction.java diff --git a/org.spearce.egit.ui/plugin.properties b/org.spearce.egit.ui/plugin.properties index 64a88c3..3240ec0 100644 --- a/org.spearce.egit.ui/plugin.properties +++ b/org.spearce.egit.ui/plugin.properties @@ -6,7 +6,7 @@ Git_clone_wizard=Git Repository Git_clone_description=Clone an existing Git repository. SharingWizard_name=Git -GitRemoteQuickDiffProvider_label=Latest Git Revision +GitRemoteQuickDiffProvider_label=A Git Revision DisconnectAction_label=Disconnect DisconnectAction_tooltip=Disconnect the Git team provider. diff --git a/org.spearce.egit.ui/plugin.xml b/org.spearce.egit.ui/plugin.xml index cfd4b80..b809300 100644 --- a/org.spearce.egit.ui/plugin.xml +++ b/org.spearce.egit.ui/plugin.xml @@ -124,6 +124,20 @@ enablesFor="1" tooltip="Resets HEAD and index, and working directory (changed in tracked files will be lost)"> </action> + <action + class="org.spearce.egit.ui.internal.actions.SetQuickdiffBaselineAction" + enablesFor="1" + id="org.spearce.egit.ui.setquickdiffbaseline" + label="Set as quickdiff baseline" + menubarPath="additions"> + </action> + <action + class="org.spearce.egit.ui.internal.actions.ResetQuickdiffBaselineAction" + enablesFor="*" + id="org.spearce.egit.ui.resetquickdiffbaseline" + label="Reset quickdiff baseline to HEAD" + menubarPath="additions"> + </action> </objectContribution> </extension> diff --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 new file mode 100644 index 0000000..990958f --- /dev/null +++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/QuickdiffBaselineOperation.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * 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.actions; + +import java.io.IOException; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.spearce.egit.ui.Activator; +import org.spearce.egit.ui.internal.decorators.GitQuickDiffProvider; +import org.spearce.jgit.lib.Repository; + +/** + * UI operation to change the git quickdiff baseline + */ +public class QuickdiffBaselineOperation extends AbstractRevObjectOperation { + + private final String baseline; + + /** + * Construct a QuickdiffBaselineOperation for changing quickdiff baseline + * @param repository + * + * @param baseline + */ + QuickdiffBaselineOperation(final Repository repository, final String baseline) { + super(repository); + this.baseline = baseline; + } + + public void run(IProgressMonitor monitor) throws CoreException { + try { + GitQuickDiffProvider.setBaselineReference(repository, baseline); + } catch (IOException e) { + Activator.logError("Cannot set quickdiff basekine", e); + } + } + +} diff --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 new file mode 100644 index 0000000..a42635a --- /dev/null +++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/ResetQuickdiffBaselineAction.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * 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.actions; + +import java.util.List; + +import org.eclipse.core.resources.IWorkspaceRunnable; +import org.eclipse.jface.action.IAction; + +/** + * Changes the reference for the quickdiff + */ +public class ResetQuickdiffBaselineAction extends AbstractRevObjectAction { + + @Override + protected IWorkspaceRunnable createOperation(IAction act, List selection) { + return new QuickdiffBaselineOperation(getActiveRepository(), "HEAD"); + } +} diff --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 new file mode 100644 index 0000000..05686cf --- /dev/null +++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SetQuickdiffBaselineAction.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * 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.actions; + +import java.util.List; + +import org.eclipse.core.resources.IWorkspaceRunnable; +import org.eclipse.jface.action.IAction; +import org.spearce.jgit.revwalk.RevObject; + +/** + * Changes the reference for the quickdiff + */ +public class SetQuickdiffBaselineAction extends AbstractRevObjectAction { + + @Override + protected IWorkspaceRunnable createOperation(IAction act, List selection) { + return new QuickdiffBaselineOperation(getActiveRepository(), ((RevObject)selection.get(0)).getId().toString()); + } + +} 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 index 23e06d9..ebed0cf 100644 --- 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 @@ -7,33 +7,26 @@ *******************************************************************************/ 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.ObjectLoader; import org.spearce.jgit.lib.RefsChangedEvent; import org.spearce.jgit.lib.Repository; import org.spearce.jgit.lib.RepositoryListener; +import org.spearce.jgit.lib.TreeEntry; class GitDocument extends Document implements RepositoryListener { private final IResource resource; - static GitDocument create(IResource resource) throws IOException, CoreException { + static GitDocument create(final IResource resource) throws IOException { GitDocument ret = null; if (RepositoryProvider.getProvider(resource.getProject()) instanceof GitProvider) { ret = new GitDocument(resource); @@ -44,36 +37,24 @@ class GitDocument extends Document implements RepositoryListener { private GitDocument(IResource resource) { this.resource = resource; + GitQuickDiffProvider.doc2repo.put(this, getRepository()); } - void populate() throws IOException, CoreException { + void populate() throws IOException { 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(); + final IProject project = resource.getProject(); + final String gitPath = RepositoryMapping.getMapping(project).getRepoRelativePath(resource); + final Repository repository = getRepository(); + repository.addRepositoryChangedListener(this); + String baseline = GitQuickDiffProvider.baseline.get(repository); + if (baseline == null) + baseline = "HEAD"; + TreeEntry blobEnry = repository.mapTree(baseline).findBlobMember(gitPath); + if (blobEnry != null) { + Activator.trace("(GitQuickDiffProvider) compareTo: " + baseline); + ObjectLoader loader = repository.openBlob(blobEnry.getId()); + byte[] bytes = loader.getBytes(); + String s = new String(bytes); // FIXME Platform default charset. should be Eclipse default set(s); Activator.trace("(GitQuickDiffProvider) has reference doc, size=" + s.length() + " bytes"); } else { @@ -90,8 +71,6 @@ class GitDocument extends Document implements RepositoryListener { populate(); } catch (IOException e1) { Activator.logError("Failed to refresh quickdiff", e1); - } catch (CoreException e1) { - Activator.logError("Failed to refresh quickdiff", e1); } } 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 052552e..88f5ea0 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 @@ -9,6 +9,8 @@ package org.spearce.egit.ui.internal.decorators; import java.io.IOException; +import java.util.Map; +import java.util.WeakHashMap; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; @@ -21,6 +23,7 @@ import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.texteditor.quickdiff.IQuickDiffReferenceProvider; import org.spearce.egit.ui.Activator; import org.spearce.egit.ui.UIText; +import org.spearce.jgit.lib.Repository; /** * This class provides input for the Eclipse Quick Diff feature. @@ -33,8 +36,19 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider { private IResource resource; + static Map<Repository,String> baseline = new WeakHashMap<Repository,String>(); + static Map<GitDocument,Repository> doc2repo = new WeakHashMap<GitDocument, Repository>(); + + /** + * Create the GitQuickDiffProvider instance + */ + public GitQuickDiffProvider() { + // Empty + } + public void dispose() { Activator.trace("(GitQuickDiffProvider) dispose"); + doc2repo.remove(document); if (document != null) document.dispose(); } @@ -51,8 +65,6 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider { if (provider != null) { try { document = GitDocument.create(resource); - } catch (CoreException e) { - Activator.error(UIText.QuickDiff_failedLoading, e); } catch (IOException e) { Activator.error(UIText.QuickDiff_failedLoading, e); } @@ -74,4 +86,21 @@ public class GitQuickDiffProvider implements IQuickDiffReferenceProvider { public void setId(String id) { this.id = id; } + + /** + * Set a new baseline for quickdiff + * + * @param repository + * @param baseline any commit reference, ref, symref or sha-1 + * @throws IOException + */ + public static void setBaselineReference(final Repository repository, final String baseline) throws IOException { + GitQuickDiffProvider.baseline.put(repository, baseline); + for (Map.Entry<GitDocument, Repository> i : doc2repo.entrySet()) { + if (i.getValue() == repository) { + i.getKey().populate(); + } + } + } + } -- 1.5.6.2.220.g44701 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [EGIT PATCH 2/2] Provide the ability to configure the quickdiff baseline 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 0 siblings, 0 replies; 7+ messages in thread From: Shawn O. Pearce @ 2008-07-11 5:00 UTC (permalink / raw) To: Robin Rosenberg; +Cc: git, Marek Zawirski Robin Rosenberg <robin.rosenberg@dewire.com> wrote: > + TreeEntry blobEnry = repository.mapTree(baseline).findBlobMember(gitPath); > + if (blobEnry != null) { > + Activator.trace("(GitQuickDiffProvider) compareTo: " + baseline); > + ObjectLoader loader = repository.openBlob(blobEnry.getId()); For what it is worth, it is probably faster to use TreeWalk: final TreeWalk tw = TreeWalk.forPath( repository, gitPath, new ObjectId[]{ repository.resolve(baseline + "^{tree}") }); if (tw != null) { Activator.trace("(GitQuickDiffProvider) compareTo: " + baseline); ObjectLoader loader = repository.openBlob(tw.getObjectId(0)); I probably should teach TreeWalk how to do the ^{tree} on its own so it can just take a tree-ish here, but you still had to invoke resolve to go from String to ObjectId so its not major problem. The reason TreeWalk is faster is we spend less time parsing the entries, and we avoid entries which are after the path we need to walk down. E.g. if the subtree we need to enter into is in the middle of the parent tree TreeWalk won't even touch the remainder of the parent tree records. Tree/TreeEntry still does. -- Shawn. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] Fix nullpointer exceptions in Quickdiff 2008-07-10 22:41 ` [EGIT PATCH 1/2] Make quick diff aware of changes in the repository Robin Rosenberg 2008-07-10 22:41 ` [EGIT PATCH 2/2] Provide the ability to configure the quickdiff baseline Robin Rosenberg @ 2008-07-11 21:34 ` Robin Rosenberg 2008-07-11 21:50 ` EGIT, was " Johannes Schindelin 1 sibling, 1 reply; 7+ messages in thread From: Robin Rosenberg @ 2008-07-11 21:34 UTC (permalink / raw) To: Shawn O. Pearce; +Cc: git, Marek Zawirski --- I saw some problem when resources were no longer in the worspace, such as during a bisectg. This one should probably just be squashed into patch 1. -- robin 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 index ebed0cf..3724304 100644 --- 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 @@ -43,7 +43,10 @@ class GitDocument extends Document implements RepositoryListener { void populate() throws IOException { set(""); final IProject project = resource.getProject(); - final String gitPath = RepositoryMapping.getMapping(project).getRepoRelativePath(resource); + RepositoryMapping mapping = RepositoryMapping.getMapping(project); + if (mapping == null) + return; + final String gitPath = mapping.getRepoRelativePath(resource); final Repository repository = getRepository(); repository.addRepositoryChangedListener(this); String baseline = GitQuickDiffProvider.baseline.get(repository); @@ -63,7 +66,9 @@ class GitDocument extends Document implements RepositoryListener { } void dispose() { - getRepository().removeRepositoryChangedListener(this); + Repository repository = getRepository(); + if (repository != null) + repository.removeRepositoryChangedListener(this); } public void refsChanged(final RefsChangedEvent e) { @@ -81,6 +86,8 @@ class GitDocument extends Document implements RepositoryListener { private Repository getRepository() { IProject project = resource.getProject(); RepositoryMapping mapping = RepositoryMapping.getMapping(project); - return mapping.getRepository(); + if (mapping != null) + return mapping.getRepository(); + return null; } } -- 1.5.6.2.220.g44701 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* EGIT, was Re: [PATCH] Fix nullpointer exceptions in Quickdiff 2008-07-11 21:34 ` [PATCH] Fix nullpointer exceptions in Quickdiff Robin Rosenberg @ 2008-07-11 21:50 ` Johannes Schindelin 2008-07-11 22:15 ` Robin Rosenberg 0 siblings, 1 reply; 7+ messages in thread From: Johannes Schindelin @ 2008-07-11 21:50 UTC (permalink / raw) To: Andreas Ericsson; +Cc: git Hi Andreas, On Fri, 11 Jul 2008, Robin Rosenberg wrote: > > --- > I saw some problem when resources were no longer in the worspace, such as during a bisectg. > This one should probably just be squashed into patch 1. This patch is for egit, before you ask. But be prepared for a lot of unmarked Windows discussion, somebody wants to shift msysGit's mail list payload to git@vger ;-) Ciao, Dscho ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: EGIT, was Re: [PATCH] Fix nullpointer exceptions in Quickdiff 2008-07-11 21:50 ` EGIT, was " Johannes Schindelin @ 2008-07-11 22:15 ` Robin Rosenberg 0 siblings, 0 replies; 7+ messages in thread From: Robin Rosenberg @ 2008-07-11 22:15 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Andreas Ericsson, git fredagen den 11 juli 2008 23.50.07 skrev Johannes Schindelin: > Hi Andreas, > > On Fri, 11 Jul 2008, Robin Rosenberg wrote: > > > > > --- > > I saw some problem when resources were no longer in the worspace, such as during a bisectg. > > This one should probably just be squashed into patch 1. > > This patch is for egit, before you ask. > > But be prepared for a lot of unmarked Windows discussion, somebody wants > to shift msysGit's mail list payload to git@vger ;-) Aaaaaaaaaaa.... I've take a leave now .) -- robin ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-07-11 22:22 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-07-10 22:41 [EGIT PATCH 0/2] Quickdiff improvement Robin Rosenberg 2008-07-10 22:41 ` [EGIT PATCH 1/2] Make quick diff aware of changes in the repository Robin Rosenberg 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
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).