diff options
author | Robin Stocker | 2013-11-24 15:01:42 +0000 |
---|---|---|
committer | Matthias Sohn | 2013-12-09 21:12:01 +0000 |
commit | efd1fbd7588ba7058d7bb2758d1996193a9c3707 (patch) | |
tree | 9098f7c6e21cc2b2ac2a1ff76b38b58480e2f58c | |
parent | 6a3c67be83891253416dc7519bf839da2cdfb665 (diff) | |
download | egit-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.java | 21 | ||||
-rw-r--r-- | org.eclipse.egit.core/src/org/eclipse/egit/core/internal/util/ResourceUtil.java | 20 | ||||
-rw-r--r-- | org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/LocationEditableRevision.java | 119 | ||||
-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.java | 17 | ||||
-rw-r--r-- | org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/RepositoryActionHandler.java | 8 | ||||
-rw-r--r-- | org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/CompareTreeView.java | 4 | ||||
-rw-r--r-- | org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/merge/GitMergeEditorInput.java | 101 | ||||
-rw-r--r-- | org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/rebase/RebaseResultDialog.java | 23 |
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; |