Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Sawicki2012-03-21 00:12:26 +0000
committerMatthias Sohn2012-03-21 00:12:26 +0000
commit39c7c6e5d6c7bd90cfe8b6eca2f5263efdd62dad (patch)
treeddfb623dac4b619ae274d01ede71fc1c29f1f1a2
parent17a1ef81eb0bfb7c73e6237baf13d5c20b9933a9 (diff)
downloadegit-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.java52
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 {

Back to the top