diff options
author | Dariusz Luksza | 2011-05-12 21:20:35 +0000 |
---|---|---|
committer | Chris Aniszczyk | 2011-05-23 19:40:43 +0000 |
commit | a8e1af9c9dcf76a1cb6caa5c759a23ef253f5ab0 (patch) | |
tree | 6d5ecfb68918c1d779134b1c0751a75dc4eb2193 | |
parent | 1c5bd87e06b4cc32012b541f67e6a23148d37893 (diff) | |
download | egit-a8e1af9c9dcf76a1cb6caa5c759a23ef253f5ab0.tar.gz egit-a8e1af9c9dcf76a1cb6caa5c759a23ef253f5ab0.tar.xz egit-a8e1af9c9dcf76a1cb6caa5c759a23ef253f5ab0.zip |
[sync] Fetch changes before synchronization launch
Automatically fetch changes from remote or remote tracking branch (if
configured) just before synchronization launch.
Change-Id: If6283420d56cd24ad28c564fd16b529d82c41a25
Signed-off-by: Dariusz Luksza <dariusz@luksza.org>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Signed-off-by: Chris Aniszczyk <caniszczyk@gmail.com>
4 files changed, 106 insertions, 1 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java index d0058f7780..810150d898 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java @@ -3664,6 +3664,15 @@ public class UIText extends NLS { /** */ public static String SynchronizeWithMenu_custom; + /** */ + public static String SynchronizeFetchJob_JobName; + + /** */ + public static String SynchronizeFetchJob_TaskName; + + /** */ + public static String SynchronizeFetchJob_SubTaskName; + static { initializeMessages(BUNDLE_NAME, UIText.class); } diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/synchronize/GitModelSynchronize.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/synchronize/GitModelSynchronize.java index 45bd04c52d..bbc49c30ac 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/synchronize/GitModelSynchronize.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/synchronize/GitModelSynchronize.java @@ -16,11 +16,13 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.mapping.RemoteResourceMappingContext; import org.eclipse.core.resources.mapping.ResourceMapping; import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.egit.core.synchronize.GitResourceVariantTreeSubscriber; import org.eclipse.egit.core.synchronize.GitSubscriberMergeContext; import org.eclipse.egit.core.synchronize.GitSubscriberResourceMappingContext; import org.eclipse.egit.core.synchronize.dto.GitSynchronizeData; import org.eclipse.egit.core.synchronize.dto.GitSynchronizeDataSet; +import org.eclipse.egit.ui.Activator; import org.eclipse.team.core.RepositoryProvider; import org.eclipse.team.core.subscribers.SubscriberScopeManager; import org.eclipse.team.ui.TeamUI; @@ -53,8 +55,12 @@ public class GitModelSynchronize { * @param gsdSet * @param resources */ - public static final void launch(GitSynchronizeDataSet gsdSet, + public static final void launch(final GitSynchronizeDataSet gsdSet, IResource[] resources) { + Job fetchJob = new SynchronizeFetchJob(gsdSet); + fetchJob.setUser(true); + fetchJob.schedule(); + ResourceMapping[] mappings = getSelectedResourceMappings(resources); GitResourceVariantTreeSubscriber subscriber = new GitResourceVariantTreeSubscriber( @@ -76,6 +82,11 @@ public class GitModelSynchronize { if (window != null) activePart = window.getActivePage().getActivePart(); + try { + fetchJob.join(); + } catch (InterruptedException e) { + Activator.logError("Fetch operation interupted", e); //$NON-NLS-1$ + } participant.run(activePart); } diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/synchronize/SynchronizeFetchJob.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/synchronize/SynchronizeFetchJob.java new file mode 100644 index 0000000000..8608773384 --- /dev/null +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/synchronize/SynchronizeFetchJob.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * Copyright (C) 2011, Dariusz Luksza <dariusz@luksza.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.synchronize; + +import java.net.URISyntaxException; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubMonitor; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.egit.core.synchronize.dto.GitSynchronizeData; +import org.eclipse.egit.core.synchronize.dto.GitSynchronizeDataSet; +import org.eclipse.egit.ui.Activator; +import org.eclipse.egit.ui.UIPreferences; +import org.eclipse.egit.ui.UIText; +import org.eclipse.egit.ui.credentials.EGitCredentialsProvider; +import org.eclipse.egit.ui.internal.fetch.FetchOperationUI; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.lib.StoredConfig; +import org.eclipse.jgit.transport.RemoteConfig; +import org.eclipse.osgi.util.NLS; + +class SynchronizeFetchJob extends Job { + + private final int timeout; + + private final GitSynchronizeDataSet gsdSet; + + SynchronizeFetchJob(GitSynchronizeDataSet gsdSet) { + super(UIText.SynchronizeFetchJob_JobName); + this.gsdSet = gsdSet; + timeout = Activator.getDefault().getPreferenceStore() + .getInt(UIPreferences.REMOTE_CONNECTION_TIMEOUT); + } + + @Override + protected IStatus run(IProgressMonitor monitor) { + monitor.beginTask(UIText.SynchronizeFetchJob_TaskName, gsdSet.size()); + + for (GitSynchronizeData gsd : gsdSet) { + Repository repo = gsd.getRepository(); + StoredConfig repoConfig = repo.getConfig(); + String remoteName = gsd.getDstRemoteName(); + if (remoteName == null) + continue; + + monitor.subTask(NLS.bind(UIText.SynchronizeFetchJob_SubTaskName, + remoteName)); + + RemoteConfig config; + try { + config = new RemoteConfig(repoConfig, remoteName); + } catch (URISyntaxException e) { + Activator.logError(e.getMessage(), e); + continue; + } + + FetchOperationUI fetchOperationUI = new FetchOperationUI(repo, + config, timeout, false); + fetchOperationUI.setCredentialsProvider(new EGitCredentialsProvider()); + SubMonitor subMonitor = SubMonitor.convert(monitor); + + try { + fetchOperationUI.execute(subMonitor); + } catch (CoreException e) { + Activator.logError(e.getMessage(), e); + } + + monitor.worked(1); + } + + return Status.OK_STATUS; + } +} diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties index 151c842414..6486ef9ef0 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties @@ -1275,3 +1275,6 @@ StagingView_Add_Change_ID=Add Change-ID StagingView_Commit=Commit SynchronizeWithMenu_custom=&Custom... +SynchronizeFetchJob_JobName=Fetching changes before synchronization launch +SynchronizeFetchJob_TaskName=Fetching changes for synchronization +SynchronizeFetchJob_SubTaskName=Fetching changes from {0} |