Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Stocker2013-11-24 15:01:42 +0000
committerMatthias Sohn2013-12-09 21:12:01 +0000
commitefd1fbd7588ba7058d7bb2758d1996193a9c3707 (patch)
tree9098f7c6e21cc2b2ac2a1ff76b38b58480e2f58c
parent6a3c67be83891253416dc7519bf839da2cdfb665 (diff)
downloadegit-efd1fbd7588ba7058d7bb2758d1996193a9c3707.tar.gz
egit-efd1fbd7588ba7058d7bb2758d1996193a9c3707.tar.xz
egit-efd1fbd7588ba7058d7bb2758d1996193a9c3707.zip
Make Merge Tool work for non-workspace files
It should even work for a repository that does not even have a single project in the workspace (I don't know why one would actually do that though). Bug: 421734 Change-Id: Ic4d8c3f37b7d584f13f52fb819a0e924babaee35 Signed-off-by: Robin Stocker <robin@nibor.org> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryCache.java21
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/internal/util/ResourceUtil.java20
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/LocationEditableRevision.java119
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ResourceEditableRevision.java (renamed from org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/FileEditableRevision.java)9
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/MergeToolActionHandler.java17
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/RepositoryActionHandler.java8
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CompareTreeView.java4
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/merge/GitMergeEditorInput.java101
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/rebase/RebaseResultDialog.java23
9 files changed, 247 insertions, 75 deletions
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryCache.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryCache.java
index b86b276c2b..2ae56c3e72 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryCache.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryCache.java
@@ -78,10 +78,28 @@ public class RepositoryCache {
* @param resource
* the resource to find the repository for
* @return the git repository which has the given resource in its working
- * tree
+ * tree, or null if none found
* @since 3.2
*/
public Repository getRepository(final IResource resource) {
+ IPath location = resource.getLocation();
+ if (location == null)
+ return null;
+ return getRepository(location);
+ }
+
+ /**
+ * Lookup the closest git repository with a working tree containing the
+ * given file location. If there are repositories nested above in the file
+ * system hierarchy we select the closest one above the given location.
+ *
+ * @param location
+ * the file location to find the repository for
+ * @return the git repository which has the given location in its working
+ * tree, or null if none found
+ * @since 3.2
+ */
+ public Repository getRepository(final IPath location) {
Repository[] repositories = org.eclipse.egit.core.Activator
.getDefault().getRepositoryCache().getAllRepositories();
Repository repository = null;
@@ -91,7 +109,6 @@ public class RepositoryCache {
try {
IPath repoPath = new Path(r.getWorkTree()
.getCanonicalPath());
- IPath location = resource.getLocation();
if (location != null && repoPath.isPrefixOf(location)) {
if (repository == null
|| repoPath.segmentCount() > largestSegmentCount) {
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/util/ResourceUtil.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/util/ResourceUtil.java
index 4046fd58c5..ca21ae8867 100644
--- a/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/util/ResourceUtil.java
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/internal/util/ResourceUtil.java
@@ -36,6 +36,7 @@ import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.egit.core.Activator;
import org.eclipse.egit.core.GitProvider;
+import org.eclipse.egit.core.RepositoryCache;
import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.team.core.RepositoryProvider;
@@ -138,7 +139,7 @@ public class ResourceUtil {
if (repositoryMapping == null)
continue;
String path = repositoryMapping.getRepoRelativePath(resource);
- addPathToMap(repositoryMapping, path, result);
+ addPathToMap(repositoryMapping.getRepository(), path, result);
}
return result;
}
@@ -168,13 +169,17 @@ public class ResourceUtil {
*/
public static Map<Repository, Collection<String>> splitPathsByRepository(
Collection<IPath> paths) {
+ RepositoryCache repositoryCache = Activator.getDefault()
+ .getRepositoryCache();
Map<Repository, Collection<String>> result = new HashMap<Repository, Collection<String>>();
for (IPath path : paths) {
- RepositoryMapping repositoryMapping = RepositoryMapping.getMapping(path);
- if (repositoryMapping == null)
- continue;
- String p = repositoryMapping.getRepoRelativePath(path);
- addPathToMap(repositoryMapping, p, result);
+ Repository repository = repositoryCache.getRepository(path);
+ if (repository != null) {
+ IPath repoPath = new Path(repository.getWorkTree()
+ .getAbsolutePath());
+ IPath repoRelativePath = path.makeRelativeTo(repoPath);
+ addPathToMap(repository, repoRelativePath.toString(), result);
+ }
}
return result;
}
@@ -222,10 +227,9 @@ public class ResourceUtil {
return shortestPath;
}
- private static void addPathToMap(RepositoryMapping repositoryMapping,
+ private static void addPathToMap(Repository repository,
String path, Map<Repository, Collection<String>> result) {
if (path != null) {
- Repository repository = repositoryMapping.getRepository();
Collection<String> resourcesList = result.get(repository);
if (resourcesList == null) {
resourcesList = new ArrayList<String>();
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/LocationEditableRevision.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/LocationEditableRevision.java
new file mode 100644
index 0000000000..4d9e62f30c
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/LocationEditableRevision.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (C) 2013, Robin Stocker <robin@nibor.org>
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal;
+
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.egit.ui.Activator;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.team.core.history.IFileRevision;
+
+/**
+ * Editable revision backed by a file outside of the workspace (just IPath).
+ * <p>
+ * Use {@link ResourceEditableRevision} if you have a resource.
+ */
+public class LocationEditableRevision extends EditableRevision {
+
+ private final IPath location;
+
+ private final IRunnableContext runnableContext;
+
+ /**
+ * @param fileRevision
+ * @param location
+ * @param runnableContext
+ */
+ public LocationEditableRevision(IFileRevision fileRevision, IPath location,
+ IRunnableContext runnableContext) {
+ super(fileRevision, null);
+ this.location = location;
+ Assert.isNotNull(runnableContext);
+ this.runnableContext = runnableContext;
+ }
+
+ @Override
+ public void setContent(final byte[] newContent) {
+ try {
+ runnableContext.run(false, false, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor)
+ throws InvocationTargetException, InterruptedException {
+ IFileStore store = EFS.getLocalFileSystem().getStore(
+ location);
+ BufferedOutputStream out = null;
+ try {
+ out = new BufferedOutputStream(store.openOutputStream(
+ 0, monitor));
+ out.write(newContent);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } catch (IOException e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ // Ignore this one
+ }
+ }
+ }
+ }
+ });
+ } catch (InvocationTargetException e) {
+ Activator.handleError(e.getTargetException().getMessage(),
+ e.getTargetException(), true);
+ } catch (InterruptedException e) {
+ // ignore here
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result
+ + ((location == null) ? 0 : location.hashCode());
+ result = prime * result
+ + ((runnableContext == null) ? 0 : runnableContext.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ LocationEditableRevision other = (LocationEditableRevision) obj;
+ if (location == null) {
+ if (other.location != null)
+ return false;
+ } else if (!location.equals(other.location))
+ return false;
+ if (runnableContext == null) {
+ if (other.runnableContext != null)
+ return false;
+ } else if (!runnableContext.equals(other.runnableContext))
+ return false;
+ return true;
+ }
+
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/FileEditableRevision.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ResourceEditableRevision.java
index 4d00da9494..15d0f9436a 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/FileEditableRevision.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ResourceEditableRevision.java
@@ -23,8 +23,11 @@ import org.eclipse.team.core.history.IFileRevision;
/**
* Editable revision backed by an {@link IFile}.
+ * <p>
+ * Use {@link LocationEditableRevision} if you just have a path (for
+ * non-workspace files).
*/
-public class FileEditableRevision extends EditableRevision {
+public class ResourceEditableRevision extends EditableRevision {
private final IFile file;
@@ -39,7 +42,7 @@ public class FileEditableRevision extends EditableRevision {
* @param runnableContext
* the context to use for the file write operation
*/
- public FileEditableRevision(IFileRevision fileRevision, IFile file,
+ public ResourceEditableRevision(IFileRevision fileRevision, IFile file,
IRunnableContext runnableContext) {
super(fileRevision, CompareCoreUtils.getResourceEncoding(file));
this.file = file;
@@ -87,7 +90,7 @@ public class FileEditableRevision extends EditableRevision {
return false;
if (getClass() != obj.getClass())
return false;
- FileEditableRevision other = (FileEditableRevision) obj;
+ ResourceEditableRevision other = (ResourceEditableRevision) obj;
if (file == null) {
if (other.file != null)
return false;
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/MergeToolActionHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/MergeToolActionHandler.java
index 438504fcf1..7819b64034 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/MergeToolActionHandler.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/MergeToolActionHandler.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010 SAP AG.
+ * Copyright (c) 2010, 2013 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -11,6 +11,7 @@
package org.eclipse.egit.ui.internal.actions;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
@@ -19,7 +20,7 @@ import org.eclipse.compare.CompareEditorInput;
import org.eclipse.compare.CompareUI;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.egit.core.internal.indexdiff.IndexDiffCache;
import org.eclipse.egit.core.internal.indexdiff.IndexDiffCacheEntry;
@@ -39,25 +40,25 @@ public class MergeToolActionHandler extends RepositoryActionHandler {
public Object execute(final ExecutionEvent event) throws ExecutionException {
int mergeMode = Activator.getDefault().getPreferenceStore().getInt(
UIPreferences.MERGE_MODE);
+ IPath[] locations = getSelectedLocations(event);
CompareEditorInput input;
if (mergeMode == 0) {
MergeModeDialog dlg = new MergeModeDialog(getShell(event));
if (dlg.open() != Window.OK)
return null;
- input = new GitMergeEditorInput(dlg.useWorkspace(),
- getSelectedResources(event));
+ input = new GitMergeEditorInput(dlg.useWorkspace(), locations);
} else {
boolean useWorkspace = mergeMode == 1;
- input = new GitMergeEditorInput(useWorkspace,
- getSelectedResources(event));
+ input = new GitMergeEditorInput(useWorkspace, locations);
}
CompareUI.openCompareEditor(input);
return null;
}
public boolean isEnabled() {
- IResource[] resources = getSelectedResources();
- Map<Repository, Collection<String>> pathsByRepository = ResourceUtil.splitResourcesByRepository(resources);
+ IPath[] paths = getSelectedLocations();
+ Map<Repository, Collection<String>> pathsByRepository = ResourceUtil
+ .splitPathsByRepository(Arrays.asList(paths));
Set<Repository> repos = pathsByRepository.keySet();
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/RepositoryActionHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/RepositoryActionHandler.java
index 5482cfc8d2..484b6e9006 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/RepositoryActionHandler.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/RepositoryActionHandler.java
@@ -512,6 +512,14 @@ abstract class RepositoryActionHandler extends AbstractHandler {
}
/**
+ * @return the locations in the selection
+ */
+ protected IPath[] getSelectedLocations() {
+ IStructuredSelection selection = getSelection();
+ return getSelectedLocations(selection);
+ }
+
+ /**
* @return true if all selected items map to the same repository, false otherwise.
*/
protected boolean selectionMapsToSingleRepository() {
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CompareTreeView.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CompareTreeView.java
index afcd5edb24..86651084f9 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CompareTreeView.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CompareTreeView.java
@@ -45,7 +45,7 @@ import org.eclipse.egit.ui.UIPreferences;
import org.eclipse.egit.ui.UIUtils;
import org.eclipse.egit.ui.internal.CompareUtils;
import org.eclipse.egit.ui.internal.EgitUiEditorUtils;
-import org.eclipse.egit.ui.internal.FileEditableRevision;
+import org.eclipse.egit.ui.internal.ResourceEditableRevision;
import org.eclipse.egit.ui.internal.FileRevisionTypedElement;
import org.eclipse.egit.ui.internal.GitCompareFileRevisionEditorInput;
import org.eclipse.egit.ui.internal.LocalFileRevision;
@@ -254,7 +254,7 @@ public class CompareTreeView extends ViewPart implements IMenuListener, IShowInS
} else if (selected instanceof IFile) {
final IFile res = (IFile) selected;
LocalFileRevision revision = new LocalFileRevision(res);
- left = new FileEditableRevision(revision, res, PlatformUI.getWorkbench().getProgressService());
+ left = new ResourceEditableRevision(revision, res, PlatformUI.getWorkbench().getProgressService());
GitFileRevision rightRevision = compareVersionMap.get(new Path(
repositoryMapping.getRepoRelativePath(res)));
if (rightRevision == null) {
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/merge/GitMergeEditorInput.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/merge/GitMergeEditorInput.java
index 96af561a39..783c25d43d 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/merge/GitMergeEditorInput.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/merge/GitMergeEditorInput.java
@@ -12,7 +12,10 @@ import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
+import java.util.Map;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareEditorInput;
@@ -22,20 +25,23 @@ import org.eclipse.compare.structuremergeviewer.Differencer;
import org.eclipse.compare.structuremergeviewer.IDiffContainer;
import org.eclipse.compare.structuremergeviewer.IDiffElement;
import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
import org.eclipse.egit.core.internal.CompareCoreUtils;
import org.eclipse.egit.core.internal.storage.GitFileRevision;
+import org.eclipse.egit.core.internal.storage.WorkingTreeFileRevision;
import org.eclipse.egit.core.internal.util.ResourceUtil;
-import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.CompareUtils;
-import org.eclipse.egit.ui.internal.FileEditableRevision;
+import org.eclipse.egit.ui.internal.EditableRevision;
import org.eclipse.egit.ui.internal.FileRevisionTypedElement;
import org.eclipse.egit.ui.internal.GitCompareFileRevisionEditorInput.EmptyTypedElement;
import org.eclipse.egit.ui.internal.LocalFileRevision;
+import org.eclipse.egit.ui.internal.LocationEditableRevision;
+import org.eclipse.egit.ui.internal.ResourceEditableRevision;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jgit.api.RebaseCommand;
@@ -79,20 +85,20 @@ public class GitMergeEditorInput extends CompareEditorInput {
private final boolean useWorkspace;
- private final IResource[] resources;
+ private final IPath[] locations;
/**
* @param useWorkspace
* if <code>true</code>, use the workspace content (i.e. the
* Git-merged version) as "left" content, otherwise use HEAD
* (i.e. the previous, non-merged version)
- * @param resources
+ * @param locations
* as selected by the user
*/
- public GitMergeEditorInput(boolean useWorkspace, IResource... resources) {
+ public GitMergeEditorInput(boolean useWorkspace, IPath... locations) {
super(new CompareConfiguration());
this.useWorkspace = useWorkspace;
- this.resources = resources;
+ this.locations = locations;
CompareConfiguration config = getCompareConfiguration();
config.setLeftEditable(true);
}
@@ -106,23 +112,17 @@ public class GitMergeEditorInput extends CompareEditorInput {
monitor.beginTask(
UIText.GitMergeEditorInput_CheckingResourcesTaskName,
IProgressMonitor.UNKNOWN);
- List<String> filterPaths = new ArrayList<String>();
- Repository repo = null;
- for (IResource resource : resources) {
- RepositoryMapping map = RepositoryMapping.getMapping(resource
- .getProject());
- if (repo != null && repo != map.getRepository())
- throw new InvocationTargetException(
- new IllegalStateException(
- UIText.RepositoryAction_multiRepoSelection));
- filterPaths.add(map.getRepoRelativePath(resource));
- repo = map.getRepository();
- }
- if (repo == null)
+ Map<Repository, Collection<String>> pathsByRepository = ResourceUtil
+ .splitPathsByRepository(Arrays.asList(locations));
+ if (pathsByRepository.size() != 1) {
throw new InvocationTargetException(
new IllegalStateException(
UIText.RepositoryAction_multiRepoSelection));
+ }
+ Repository repo = pathsByRepository.keySet().iterator().next();
+ List<String> filterPaths = new ArrayList<String>(
+ pathsByRepository.get(repo));
if (monitor.isCanceled())
throw new InterruptedException();
@@ -329,23 +329,32 @@ public class GitMergeEditorInput extends CompareEditorInput {
// if the file is not conflicting (as it was auto-merged)
// we will show the auto-merged (local) version
- IFile file = ResourceUtil.getFileForLocation(repository,
- fit.getEntryPathString());
- if (file == null)
- // TODO in the future, we should be able to show a version
- // for a non-workspace file as well
- continue;
- if (!conflicting || useWorkspace)
- rev = new LocalFileRevision(file);
- else
+ Path repositoryPath = new Path(repository.getWorkTree()
+ .getAbsolutePath());
+ IPath location = repositoryPath
+ .append(fit.getEntryPathString());
+ IFile file = ResourceUtil.getFileForLocation(location);
+ if (!conflicting || useWorkspace) {
+ if (file != null)
+ rev = new LocalFileRevision(file);
+ else
+ rev = new WorkingTreeFileRevision(location.toFile());
+ } else {
rev = GitFileRevision.inIndex(repository, gitPath,
DirCacheEntry.STAGE_2);
+ }
IRunnableContext runnableContext = getContainer();
if (runnableContext == null)
runnableContext = PlatformUI.getWorkbench().getProgressService();
- FileEditableRevision leftEditable = new FileEditableRevision(rev, file, runnableContext);
+ EditableRevision leftEditable;
+ if (file != null)
+ leftEditable = new ResourceEditableRevision(rev, file,
+ runnableContext);
+ else
+ leftEditable = new LocationEditableRevision(rev, location,
+ runnableContext);
// make sure we don't need a round trip later
try {
leftEditable.cacheContents(monitor);
@@ -359,7 +368,8 @@ public class GitMergeEditorInput extends CompareEditorInput {
else if (modified)
kind = Differencer.PSEUDO_CONFLICT;
- DiffNode fileParent = getFileParent(result, file);
+ IDiffContainer fileParent = getFileParent(result,
+ repositoryPath, file, location);
ITypedElement anc;
if (ancestorCommit != null)
@@ -380,12 +390,29 @@ public class GitMergeEditorInput extends CompareEditorInput {
}
}
- private DiffNode getFileParent(IDiffContainer root, IFile file) {
- String projectName = file.getProject().getName();
- DiffNode child = getOrCreateChild(root, projectName, true);
- IPath path = file.getProjectRelativePath();
- for (int i = 0; i < path.segmentCount() - 1; i++)
- child = getOrCreateChild(child, path.segment(i), false);
+ private IDiffContainer getFileParent(IDiffContainer root,
+ IPath repositoryPath, IFile file, IPath location) {
+ int projectSegment = -1;
+ String projectName = null;
+ if (file != null) {
+ IProject project = file.getProject();
+ IPath projectLocation = project.getLocation();
+ if (projectLocation != null) {
+ IPath projectPath = project.getLocation().makeRelativeTo(
+ repositoryPath);
+ projectSegment = projectPath.segmentCount() - 1;
+ projectName = project.getName();
+ }
+ }
+
+ IPath path = location.makeRelativeTo(repositoryPath);
+ IDiffContainer child = root;
+ for (int i = 0; i < path.segmentCount() - 1; i++) {
+ if (i == projectSegment)
+ child = getOrCreateChild(child, projectName, true);
+ else
+ child = getOrCreateChild(child, path.segment(i), false);
+ }
return child;
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/rebase/RebaseResultDialog.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/rebase/RebaseResultDialog.java
index 16dc961c87..d321b10acf 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/rebase/RebaseResultDialog.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/rebase/RebaseResultDialog.java
@@ -544,14 +544,12 @@ public class RebaseResultDialog extends MessageDialog {
if (startMergeButton.getSelection()) {
super.buttonPressed(buttonId);
// open the merge tool
- List<IProject> validProjects = new ArrayList<IProject>();
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
.getProjects();
for (IProject project : projects) {
RepositoryMapping mapping = RepositoryMapping
.getMapping(project);
if (mapping != null && mapping.getRepository().equals(repo)) {
- validProjects.add(project);
try {
// make sure to refresh before opening the merge
// tool
@@ -563,20 +561,14 @@ public class RebaseResultDialog extends MessageDialog {
}
}
}
- List<IResource> resourceList = new ArrayList<IResource>();
+ List<IPath> locationList = new ArrayList<IPath>();
IPath repoWorkdirPath = new Path(repo.getWorkTree().getPath());
for (String repoPath : conflictPaths) {
- IPath filePath = repoWorkdirPath.append(repoPath);
- for (IProject project : validProjects)
- if (project.getLocation().isPrefixOf(filePath)) {
- IResource res = project.getFile(filePath
- .removeFirstSegments(project.getLocation()
- .segmentCount()));
- resourceList.add(res);
- }
+ IPath location = repoWorkdirPath.append(repoPath);
+ locationList.add(location);
}
- IResource[] resources = new IResource[resourceList.size()];
- resourceList.toArray(resources);
+ IPath[] locations = locationList.toArray(new IPath[locationList
+ .size()]);
int mergeMode = Activator.getDefault().getPreferenceStore()
.getInt(UIPreferences.MERGE_MODE);
CompareEditorInput input;
@@ -585,10 +577,11 @@ public class RebaseResultDialog extends MessageDialog {
if (dlg.open() != Window.OK)
return;
input = new GitMergeEditorInput(dlg.useWorkspace(),
- resources);
+ locations);
} else {
boolean useWorkspace = mergeMode == 1;
- input = new GitMergeEditorInput(useWorkspace, resources);
+ input = new GitMergeEditorInput(useWorkspace,
+ locations);
}
CompareUI.openCompareEditor(input);
return;

Back to the top