Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Sawicki2012-02-02 00:47:51 +0000
committerMatthias Sohn2012-02-02 00:47:51 +0000
commitf17f42ac645650a328d42f65c34503910436bdd5 (patch)
tree092ab8df9c8fede2bd25cd250a4cd19d2c6696b8
parent110c492a9f6a0d40ed56c65f917f1de0eb2fcb08 (diff)
downloadegit-f17f42ac645650a328d42f65c34503910436bdd5.tar.gz
egit-f17f42ac645650a328d42f65c34503910436bdd5.tar.xz
egit-f17f42ac645650a328d42f65c34503910436bdd5.zip
[historyView] Add context menu to compare with working directory
This action can be used to bring back hunks from previous revisions or to pull changes from an opened stashed commit. This action will also be available in the Files section of the commit editor. Change-Id: I0e2404b9af9c434467656f7243ed11fd69871430 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java3
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitFileDiffViewer.java58
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties1
3 files changed, 62 insertions, 0 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java
index be84978aa4..e56b2604d1 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java
@@ -3419,6 +3419,9 @@ public class UIText extends NLS {
public static String CommitFileDiffViewer_CompareMenuLabel;
/** */
+ public static String CommitFileDiffViewer_CompareWorkingDirectoryMenuLabel;
+
+ /** */
public static String CommitFileDiffViewer_FileDoesNotExist;
/** */
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitFileDiffViewer.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitFileDiffViewer.java
index ee95fdc090..40219c1743 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitFileDiffViewer.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/history/CommitFileDiffViewer.java
@@ -13,6 +13,9 @@ import java.io.IOException;
import java.util.Iterator;
import org.eclipse.compare.ITypedElement;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
@@ -27,6 +30,7 @@ import org.eclipse.egit.ui.internal.CompareUtils;
import org.eclipse.egit.ui.internal.EgitUiEditorUtils;
import org.eclipse.egit.ui.internal.GitCompareFileRevisionEditorInput;
import org.eclipse.egit.ui.internal.blame.BlameOperation;
+import org.eclipse.egit.ui.internal.synchronize.compare.LocalNonWorkspaceTypedElement;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
@@ -42,6 +46,7 @@ import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
+import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.treewalk.TreeWalk;
@@ -61,6 +66,7 @@ import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.team.core.history.IFileRevision;
+import org.eclipse.team.ui.synchronize.SaveableCompareEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.IWorkbenchWindow;
@@ -96,6 +102,8 @@ public class CommitFileDiffViewer extends TableViewer {
private IAction compare;
+ private IAction compareWorkingTreeVersion;
+
private final IWorkbenchSite site;
/**
@@ -255,9 +263,22 @@ public class CommitFileDiffViewer extends TableViewer {
}
};
+ compareWorkingTreeVersion = new Action(
+ UIText.CommitFileDiffViewer_CompareWorkingDirectoryMenuLabel) {
+ @Override
+ public void run() {
+ final ISelection s = getSelection();
+ if (s.isEmpty() || !(s instanceof IStructuredSelection))
+ return;
+ final IStructuredSelection iss = (IStructuredSelection) s;
+ showWorkingDirectoryFileDiff((FileDiff) iss.getFirstElement());
+ }
+ };
+
mgr.add(open);
mgr.add(openWorkingTreeVersion);
mgr.add(compare);
+ mgr.add(compareWorkingTreeVersion);
mgr.add(blame);
mgr.add(new Separator());
@@ -298,6 +319,14 @@ public class CommitFileDiffViewer extends TableViewer {
open.setEnabled(!sel.isEmpty());
openWorkingTreeVersion.setEnabled(!sel.isEmpty());
compare.setEnabled(sel.size() == 1);
+
+ if (sel.size() == 1) {
+ FileDiff diff = (FileDiff) sel.getFirstElement();
+ String path = new Path(getRepository().getWorkTree()
+ .getAbsolutePath()).append(diff.getPath()).toOSString();
+ compareWorkingTreeVersion.setEnabled(new File(path).exists());
+ } else
+ compareWorkingTreeVersion.setEnabled(false);
}
private IAction createStandardAction(final ActionFactory af) {
@@ -447,6 +476,35 @@ public class CommitFileDiffViewer extends TableViewer {
}
+ void showWorkingDirectoryFileDiff(final FileDiff d) {
+ final GitCompareFileRevisionEditorInput in;
+
+ final String p = d.getPath();
+ final RevCommit c = d.getCommit();
+ final ObjectId[] blobs = d.getBlobs();
+ final ITypedElement base;
+ final ITypedElement next;
+
+ String path = new Path(getRepository().getWorkTree().getAbsolutePath())
+ .append(p).toOSString();
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IFile[] files = root.findFilesForLocationURI(new File(path).toURI());
+ if (files.length > 0)
+ next = SaveableCompareEditorInput.createFileElement(files[0]);
+ else
+ next = new LocalNonWorkspaceTypedElement(path);
+
+ if (d.getChange().equals(ChangeType.DELETE))
+ base = new GitCompareFileRevisionEditorInput.EmptyTypedElement(""); //$NON-NLS-1$
+ else
+ base = CompareUtils.getFileRevisionTypedElement(p, c,
+ getRepository(), blobs[blobs.length - 1]);
+
+ in = new GitCompareFileRevisionEditorInput(next, base, null);
+ CompareUtils.openInCompare(site.getWorkbenchWindow().getActivePage(),
+ in);
+ }
+
TreeWalk getTreeWalk() {
if (walker == null)
throw new IllegalStateException("TreeWalk has not been set"); //$NON-NLS-1$
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties
index 5f22ac16fd..621e562902 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties
@@ -1199,6 +1199,7 @@ MultiPullResultDialog_WindowTitle=Pull Result for Multiple Repositories
CommitFileDiffViewer_CanNotOpenCompareEditorTitle=Can not Open Compare Editor
CommitFileDiffViewer_CompareMenuLabel=Compare with &Version in Ancestor
+CommitFileDiffViewer_CompareWorkingDirectoryMenuLabel=Compare with &Working Directory
CommitFileDiffViewer_FileDoesNotExist=File {0} does not exist in working tree
CommitFileDiffViewer_MergeCommitMultiAncestorMessage=This is a merge commit with more than one ancestor
CommitFileDiffViewer_notContainedInCommit=File {0} is not contained in commit {1}

Back to the top