diff options
author | Dariusz Luksza | 2011-08-06 23:18:31 +0000 |
---|---|---|
committer | Matthias Sohn | 2011-08-06 23:18:31 +0000 |
commit | bb5fa3c34dd48e596a426ed0ab27fbe6fa2c1402 (patch) | |
tree | 5584593239eab116b21a7b39ddeb5ffa4ef8d72a /org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions | |
parent | eb454a243857ab130029a24b3d12e5572237e790 (diff) | |
download | egit-bb5fa3c34dd48e596a426ed0ab27fbe6fa2c1402.tar.gz egit-bb5fa3c34dd48e596a426ed0ab27fbe6fa2c1402.tar.xz egit-bb5fa3c34dd48e596a426ed0ab27fbe6fa2c1402.zip |
[sync] Allow synchronize on folder level
When synchronization is launched from folder level, results will only
show changes inside this folder. When it is launched from project level
it will show changes in whole repository (same as before).
Folder level synchronization will always use Workspace presentation
model.
Change-Id: I937cb2bf870f47e4c3000ae89cd1eb83d0c2d918
Signed-off-by: Dariusz Luksza <dariusz@luksza.org>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions')
2 files changed, 60 insertions, 14 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/SynchronizeWithMenu.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/SynchronizeWithMenu.java index 5d66de702c..01ddfd223f 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/SynchronizeWithMenu.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/actions/SynchronizeWithMenu.java @@ -14,9 +14,11 @@ import static org.eclipse.jgit.lib.Constants.R_TAGS; import java.io.IOException; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IAdaptable; @@ -86,12 +88,12 @@ public class SynchronizeWithMenu extends ContributionItem implements public void fill(final Menu menu, int index) { if (srv == null) return; - final IProject selectedProject = getSelection(); - if (selectedProject == null) + final IResource selectedResource = getSelection(); + if (selectedResource == null) return; RepositoryMapping mapping = RepositoryMapping - .getMapping(selectedProject); + .getMapping(selectedResource.getProject()); if (mapping == null) return; @@ -145,7 +147,13 @@ public class SynchronizeWithMenu extends ContributionItem implements GitSynchronizeData data; try { data = new GitSynchronizeData(repo, HEAD, name, true); - GitModelSynchronize.launch(data, new IResource[] { selectedProject }); + if (!(selectedResource instanceof IProject)) { + HashSet<IContainer> containers = new HashSet<IContainer>(); + containers.add((IContainer) selectedResource); + data.setIncludedPaths(containers); + } + + GitModelSynchronize.launch(data, new IResource[] { selectedResource }); } catch (IOException e) { Activator.logError(e.getMessage(), e); } @@ -176,7 +184,7 @@ public class SynchronizeWithMenu extends ContributionItem implements public void initialize(IServiceLocator serviceLocator) { srv = (ISelectionService) serviceLocator - .getService(ISelectionService.class); + .getService(ISelectionService.class); } @Override @@ -189,7 +197,7 @@ public class SynchronizeWithMenu extends ContributionItem implements branchImage.dispose(); } - private IProject getSelection() { + private IResource getSelection() { ISelection sel = srv.getSelection(); if (!(sel instanceof IStructuredSelection)) @@ -197,10 +205,11 @@ public class SynchronizeWithMenu extends ContributionItem implements Object selected = ((IStructuredSelection) sel).getFirstElement(); if (selected instanceof IAdaptable) - return (IProject) ((IAdaptable) selected) - .getAdapter(IProject.class); - if (selected instanceof IProject) - return (IProject) selected; + return (IResource) ((IAdaptable) selected) + .getAdapter(IResource.class); + + if (selected instanceof IResource) + return (IResource) selected; return null; } 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; + } + } |