diff options
Diffstat (limited to 'org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/SynchronizeWorkspaceActionHandler.java')
-rw-r--r-- | org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/SynchronizeWorkspaceActionHandler.java | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/SynchronizeWorkspaceActionHandler.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/SynchronizeWorkspaceActionHandler.java index 19b33470e1..9d035e192c 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/SynchronizeWorkspaceActionHandler.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/SynchronizeWorkspaceActionHandler.java @@ -11,9 +11,18 @@ package org.eclipse.egit.ui.internal.actions; import static org.eclipse.jgit.lib.Constants.HEAD; import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.egit.core.project.RepositoryMapping; import org.eclipse.egit.core.synchronize.dto.GitSynchronizeData; import org.eclipse.egit.core.synchronize.dto.GitSynchronizeDataSet; import org.eclipse.egit.ui.Activator; @@ -31,15 +40,21 @@ public class SynchronizeWorkspaceActionHandler extends RepositoryActionHandler { } public Object execute(ExecutionEvent event) throws ExecutionException { - Repository[] repos = getRepositories(event); + IResource[] resources = getSelectedResources(event); + Map<Repository, Set<IContainer>> containerMap = mapContainerResources(resources); - if (repos.length == 0) + if (containerMap.isEmpty()) return null; GitSynchronizeDataSet gsdSet = new GitSynchronizeDataSet(); - for (Repository repo : repos) + for (Entry<Repository, Set<IContainer>> entry : containerMap.entrySet()) try { - gsdSet.add(new GitSynchronizeData(repo, HEAD, HEAD, true)); + GitSynchronizeData data = new GitSynchronizeData(entry.getKey(), HEAD, HEAD, true); + Set<IContainer> containers = entry.getValue(); + if (!containers.isEmpty()) + data.setIncludedPaths(containers); + + gsdSet.add(data); } catch (IOException e) { Activator.handleError(e.getMessage(), e, true); } @@ -49,4 +64,26 @@ public class SynchronizeWorkspaceActionHandler extends RepositoryActionHandler { return null; } + private Map<Repository, Set<IContainer>> mapContainerResources( + IResource[] resources) { + Map<Repository, Set<IContainer>> result = new HashMap<Repository, Set<IContainer>>(); + + for (IResource resource : resources) { + RepositoryMapping rm = RepositoryMapping.getMapping(resource); + if (resource instanceof IProject) + result.put(rm.getRepository(), new HashSet<IContainer>()); + else if (resource instanceof IContainer) { + Set<IContainer> containers = result.get(rm.getRepository()); + if (containers == null) { + containers = new HashSet<IContainer>(); + result.put(rm.getRepository(), containers); + containers.add((IContainer) resource); + } else if (containers.size() > 0) + containers.add((IContainer) resource); + } + } + + return result; + } + } |