diff options
author | Kevin Sawicki | 2012-02-02 00:47:51 +0000 |
---|---|---|
committer | Matthias Sohn | 2012-02-02 00:47:51 +0000 |
commit | f17f42ac645650a328d42f65c34503910436bdd5 (patch) | |
tree | 092ab8df9c8fede2bd25cd250a4cd19d2c6696b8 | |
parent | 110c492a9f6a0d40ed56c65f917f1de0eb2fcb08 (diff) | |
download | egit-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>
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} |