diff options
author | Kevin Sawicki | 2012-03-21 00:12:26 +0000 |
---|---|---|
committer | Matthias Sohn | 2012-03-21 00:12:26 +0000 |
commit | 39c7c6e5d6c7bd90cfe8b6eca2f5263efdd62dad (patch) | |
tree | ddfb623dac4b619ae274d01ede71fc1c29f1f1a2 | |
parent | 17a1ef81eb0bfb7c73e6237baf13d5c20b9933a9 (diff) | |
download | egit-39c7c6e5d6c7bd90cfe8b6eca2f5263efdd62dad.tar.gz egit-39c7c6e5d6c7bd90cfe8b6eca2f5263efdd62dad.tar.xz egit-39c7c6e5d6c7bd90cfe8b6eca2f5263efdd62dad.zip |
Add rename support to Compare With > Previous Revision
Change-Id: Ia14e869d527f5518544c724802cdc08fee225024
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
-rw-r--r-- | org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/CompareWithPreviousActionHandler.java | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/CompareWithPreviousActionHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/CompareWithPreviousActionHandler.java index aa798b86c2..02b70203a1 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/CompareWithPreviousActionHandler.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/CompareWithPreviousActionHandler.java @@ -12,6 +12,7 @@ package org.eclipse.egit.ui.internal.actions; import java.io.IOException; import java.text.MessageFormat; +import java.util.concurrent.atomic.AtomicReference; import org.eclipse.compare.CompareEditorInput; import org.eclipse.compare.CompareUI; @@ -32,9 +33,11 @@ import org.eclipse.egit.ui.internal.CompareUtils; import org.eclipse.egit.ui.internal.GitCompareFileRevisionEditorInput; import org.eclipse.egit.ui.internal.dialogs.CompareTreeView; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.FollowFilter; +import org.eclipse.jgit.revwalk.RenameCallback; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.swt.widgets.Shell; @@ -50,6 +53,18 @@ public class CompareWithPreviousActionHandler extends RepositoryActionHandler { private static class CompareWithPreviousOperation implements IEGitOperation { + private static class PreviousCommit { + + final RevCommit commit; + + final String path; + + PreviousCommit(final RevCommit commit, final String path) { + this.commit = commit; + this.path = path; + } + } + private ExecutionEvent event; private Repository repository; @@ -69,19 +84,19 @@ public class CompareWithPreviousActionHandler extends RepositoryActionHandler { } public void execute(IProgressMonitor monitor) throws CoreException { - RevCommit previous = findPreviousCommit(); + PreviousCommit previous = findPreviousCommit(); if (previous != null) if (resource instanceof IFile) { final ITypedElement base = SaveableCompareEditorInput .createFileElement((IFile) resource); ITypedElement next = CompareUtils - .getFileRevisionTypedElement(getRepositoryPath(), - previous, repository); + .getFileRevisionTypedElement(previous.path, + previous.commit, repository); CompareEditorInput input = new GitCompareFileRevisionEditorInput( base, next, null); CompareUI.openCompareEditor(input); } else - openCompareTreeView(previous); + openCompareTreeView(previous.commit); else showNotFoundDialog(); } @@ -104,18 +119,37 @@ public class CompareWithPreviousActionHandler extends RepositoryActionHandler { }); } - private RevCommit findPreviousCommit() { + private PreviousCommit findPreviousCommit() { + final AtomicReference<String> previousPath = new AtomicReference<String>(); RevWalk rw = new RevWalk(repository); try { String path = getRepositoryPath(); - if (path.length() > 0) - rw.setTreeFilter(FollowFilter.create(path)); + if (path.length() > 0) { + FollowFilter filter = FollowFilter.create(path); + filter.setRenameCallback(new RenameCallback() { + + public void renamed(DiffEntry entry) { + if (previousPath.get() == null) + previousPath.set(entry.getOldPath()); + } + }); + rw.setTreeFilter(filter); + } + RevCommit headCommit = rw.parseCommit(repository.getRef( Constants.HEAD).getObjectId()); rw.markStart(headCommit); headCommit = rw.next(); - if (headCommit != null) - return rw.next(); + + if (headCommit == null) + return null; + RevCommit previousCommit = rw.next(); + if (previousCommit == null) + return null; + + if (previousPath.get() == null) + previousPath.set(getRepositoryPath()); + return new PreviousCommit(previousCommit, previousPath.get()); } catch (IOException e) { Activator.handleError(e.getMessage(), e, true); } finally { |