diff options
author | Stefan Lay | 2012-01-30 14:13:09 +0000 |
---|---|---|
committer | Matthias Sohn | 2012-01-30 16:03:45 +0000 |
commit | acdb743e517df6ebb86cbd1061f75661582cd92b (patch) | |
tree | c86c41ef562f3352e9bdf50ea4c8fa844767a374 | |
parent | f743c8121dc5fae73fb57e0e4c5b912a31d7e63f (diff) | |
download | egit-acdb743e517df6ebb86cbd1061f75661582cd92b.tar.gz egit-acdb743e517df6ebb86cbd1061f75661582cd92b.tar.xz egit-acdb743e517df6ebb86cbd1061f75661582cd92b.zip |
Allow for repository configuration using GitRepositoryInfo
An extender of org.eclipse.egit.ui.cloneSourceProvider can specify
configuration settings using the class GitRepositoryInfo. This info is
used now in the clone step.
Change-Id: Ic65f07474083cd98fcc11dc22e8bfc4a284ec9d5
Signed-off-by: Sascha Scholz <sascha.scholz@gmail.com>
Signed-off-by: Stefan Lay <stefan.lay@sap.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
6 files changed, 125 insertions, 4 deletions
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/CoreText.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/CoreText.java index fe205c4274..0bc3bb84cb 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/CoreText.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/CoreText.java @@ -66,6 +66,9 @@ public class CoreText extends NLS { public static String CommitOperation_couldNotFindRepositoryMapping; /** */ + public static String ConfigureFetchAfterCloneTask_couldNotFetch; + + /** */ public static String ConnectProviderOperation_connecting; /** */ diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/coretext.properties b/org.eclipse.egit.core/src/org/eclipse/egit/core/coretext.properties index 320baee468..948aac3298 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/coretext.properties +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/coretext.properties @@ -13,6 +13,7 @@ CherryPickOperation_cherryPicking=Running cherry-pick on commit {0} CommitFileRevision_pathNotIn=Path {1} not in commit {0}. CommitFileRevision_errorLookingUpPath=IO error looking up path {1} in {0}. +ConfigureFetchAfterCloneTask_couldNotFetch=Could not fetch with refSpec {0} ConnectProviderOperation_connecting=Connecting Git team provider. ConnectProviderOperation_ConnectingProject=Connecting project {0} diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/ConfigureFetchAfterCloneTask.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/ConfigureFetchAfterCloneTask.java index e878305476..44f6af0149 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/ConfigureFetchAfterCloneTask.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/ConfigureFetchAfterCloneTask.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2011, Stefan Lay <stefan.lay@sap.com> + * Copyright (C) 2011-2012, Stefan Lay <stefan.lay@sap.com> * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -11,11 +11,13 @@ package org.eclipse.egit.core.op; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.egit.core.Activator; +import org.eclipse.egit.core.CoreText; import org.eclipse.egit.core.op.CloneOperation.PostCloneTask; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.RefSpec; import org.eclipse.jgit.transport.RemoteConfig; +import org.eclipse.osgi.util.NLS; /** * Adds a fetch specification of the cloned repository and performs a fetch @@ -50,7 +52,11 @@ public class ConfigureFetchAfterCloneTask implements PostCloneTask { configToUse.update(repository.getConfig()); repository.getConfig().save(); Git git = new Git(repository); - git.fetch().setRemote(remoteName).call(); + try { + git.fetch().setRemote(remoteName).call(); + } catch (Exception e) { + Activator.logError(NLS.bind(CoreText.ConfigureFetchAfterCloneTask_couldNotFetch, fetchRefSpec), e); + } } catch (Exception e) { throw new CoreException(Activator.error(e.getMessage(), e)); } diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/SetRepositoryConfigPropertyTask.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/SetRepositoryConfigPropertyTask.java new file mode 100644 index 0000000000..04c45bd0c6 --- /dev/null +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/SetRepositoryConfigPropertyTask.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (C) 2012, Stefan Lay <stefan.lay@sap.com> + * + * 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.core.op; + +import java.io.IOException; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.egit.core.Activator; +import org.eclipse.egit.core.op.CloneOperation.PostCloneTask; +import org.eclipse.jgit.lib.Repository; + +/** + * Sets config properties for a repository + */ +public class SetRepositoryConfigPropertyTask implements PostCloneTask { + + private final String section; + private final String subsection; + private final String name; + private final String value; + + /** + * @param section + * @param subsection + * @param name + * @param value + */ + public SetRepositoryConfigPropertyTask(String section, String subsection, String name, String value) { + this.section = section; + this.subsection = subsection; + this.name = name; + this.value = value; + } + + public void execute(Repository repository, IProgressMonitor monitor) + throws CoreException { + try { + repository.getConfig().setString(section, subsection, name, value); + repository.getConfig().save(); + } catch (IOException e) { + throw new CoreException(Activator.error(e.getMessage(), e)); + } + } + +} diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/AbstractGitCloneWizard.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/AbstractGitCloneWizard.java index 34c3b57eb1..f27aee767b 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/AbstractGitCloneWizard.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/AbstractGitCloneWizard.java @@ -5,17 +5,19 @@ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com> * Copyright (C) 2010, Mathias Kinzler <mathias.kinzler@sap.com> * Copyright (C) 2010, Benjamin Muskalla <bmuskalla@eclipsesource.com> - * Copyright (C) 2011, Stefan Lay <stefan.lay@sap.com> + * Copyright (C) 2012, Stefan Lay <stefan.lay@sap.com> * 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.clone; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.net.URISyntaxException; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; @@ -37,6 +39,7 @@ import org.eclipse.egit.core.op.ConfigureFetchAfterCloneTask; import org.eclipse.egit.core.op.ConfigurePushAfterCloneTask; import org.eclipse.egit.core.op.ListRemoteOperation; import org.eclipse.egit.core.op.SetChangeIdTask; +import org.eclipse.egit.core.op.SetRepositoryConfigPropertyTask; import org.eclipse.egit.core.securestorage.UserPasswordCredentials; import org.eclipse.egit.ui.Activator; import org.eclipse.egit.ui.JobFamilies; @@ -44,6 +47,9 @@ import org.eclipse.egit.ui.UIPreferences; import org.eclipse.egit.ui.UIText; import org.eclipse.egit.ui.internal.components.RepositorySelection; import org.eclipse.egit.ui.internal.credentials.EGitCredentialsProvider; +import org.eclipse.egit.ui.internal.provisional.wizards.GitRepositoryInfo; +import org.eclipse.egit.ui.internal.provisional.wizards.GitRepositoryInfo.PushInfo; +import org.eclipse.egit.ui.internal.provisional.wizards.GitRepositoryInfo.RepositoryConfigProperty; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; @@ -157,6 +163,25 @@ public abstract class AbstractGitCloneWizard extends Wizard { */ protected boolean performClone(URIish uri, UserPasswordCredentials credentials) { + try { + GitRepositoryInfo info = new GitRepositoryInfo(uri.toString()); + if (credentials != null) + info.setCredentials(credentials.getUser(), credentials.getPassword()); + return performClone(info); + } catch (URISyntaxException e) { + Activator.error(e.getMessage(), e); + return false; + } + } + + /** + * @param gitRepositoryInfo + * @return if clone was successful + * @throws URISyntaxException + */ + protected boolean performClone(GitRepositoryInfo gitRepositoryInfo) throws URISyntaxException { + URIish uri = new URIish(gitRepositoryInfo.getCloneUri()); + UserPasswordCredentials credentials = gitRepositoryInfo.getCredentials(); setWindowTitle(NLS.bind(UIText.GitCloneWizard_jobName, uri.toString())); final boolean allSelected; final Collection<Ref> selectedBranches; @@ -196,6 +221,10 @@ public abstract class AbstractGitCloneWizard extends Wizard { credentials.getUser(), credentials.getPassword())); op.setCloneSubmodules(cloneDestination.isCloneSubmodules()); + configureFetchSpec(op, gitRepositoryInfo, remoteName); + configurePush(op, gitRepositoryInfo, remoteName); + configureRepositoryConfig(op, gitRepositoryInfo); + if (gerritConfiguration != null && gerritConfiguration.configureGerrit()) { boolean hasReviewNotes = hasReviewNotes(uri, timeout, credentials); @@ -225,6 +254,36 @@ public abstract class AbstractGitCloneWizard extends Wizard { return true; } + private void configureFetchSpec(CloneOperation op, + GitRepositoryInfo gitRepositoryInfo, String remoteName) { + for (String fetchRefSpec : gitRepositoryInfo.getFetchRefSpecs()) + op.addPostCloneTask(new ConfigureFetchAfterCloneTask(remoteName, fetchRefSpec)); + } + + private void configurePush(CloneOperation op, + GitRepositoryInfo gitRepositoryInfo, String remoteName) { + for (PushInfo pushInfo : gitRepositoryInfo.getPushInfos()) { + try { + URIish uri = pushInfo.getPushUri() != null ? new URIish( + pushInfo.getPushUri()) : null; + ConfigurePushAfterCloneTask task = new ConfigurePushAfterCloneTask( + remoteName, pushInfo.getPushRefSpec(), uri); + op.addPostCloneTask(task); + } catch (URISyntaxException e) { + Activator.handleError(UIText.GitCloneWizard_failed, e, true); + } + } + } + + private void configureRepositoryConfig(CloneOperation op, GitRepositoryInfo gitRepositoryInfo) { + for (RepositoryConfigProperty p : gitRepositoryInfo.getRepositoryConfigProperties()) { + SetRepositoryConfigPropertyTask task = new SetRepositoryConfigPropertyTask( + p.getSection(), p.getSubsection(), p.getName(), + p.getValue()); + op.addPostCloneTask(task); + } + } + private void importProjects(final Repository repository, final IWorkingSet[] sets) { String repoName = Activator.getDefault().getRepositoryUtil() diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWizard.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWizard.java index 1a7d91f867..64d304da2b 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWizard.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWizard.java @@ -64,7 +64,7 @@ public class GitImportWizard extends AbstractGitCloneWizard implements IImportWi if (visible && (cloneDestination.cloneSettingsChanged())) { setCallerRunsCloneOperation(true); try { - performClone(new URIish(currentSearchResult.getGitRepositoryInfo().getCloneUri()), getCredentials()); + performClone(currentSearchResult.getGitRepositoryInfo()); importWithDirectoriesPage.getControl().getDisplay().asyncExec(new Runnable() { public void run() { |