/******************************************************************************* * Copyright (c) 2010, 2013, 2015 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Mathias Kinzler (SAP AG) - initial implementation * Thomas Wolf <thomas.wolf@paranor.ch> - Bugs 477281, 478877 *******************************************************************************/ package org.eclipse.egit.ui.internal.repository.tree.command; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.preferences.DefaultScope; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.egit.core.Activator; import org.eclipse.egit.core.GitCorePreferences; import org.eclipse.egit.core.JobFamilies; import org.eclipse.egit.core.internal.CoreText; import org.eclipse.egit.core.internal.gerrit.GerritUtil; import org.eclipse.egit.core.internal.job.JobUtil; import org.eclipse.egit.core.op.ConnectProviderOperation; import org.eclipse.egit.core.project.RepositoryFinder; import org.eclipse.egit.core.project.RepositoryMapping; import org.eclipse.egit.ui.internal.repository.RepositorySearchWizard; import org.eclipse.egit.ui.internal.repository.tree.RepositoryTreeNode; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.jgit.util.FileUtils; import org.eclipse.team.core.RepositoryProvider; /** * "Adds" repositories */ public class AddCommand extends RepositoriesViewCommandHandler<RepositoryTreeNode> { @Override public Object execute(ExecutionEvent event) throws ExecutionException { RepositorySearchWizard wizard = new RepositorySearchWizard( util.getConfiguredRepositories(), true); WizardDialog dialog = new WizardDialog(getShell(event), wizard); if (dialog.open() == Window.OK) { for (String dir : wizard.getDirectories()) { File repositoryDir = FileUtils.canonicalize(new File(dir)); addRepository(repositoryDir); } } return null; } private void addRepository(File repositoryDir) { GerritUtil.tryToAutoConfigureForGerrit(repositoryDir); util.addConfiguredRepository(repositoryDir); if (doAutoShare()) { autoShareProjects(repositoryDir); } } private void autoShareProjects(File repositoryDir) { IPath workingDirPath = new Path(repositoryDir.getAbsolutePath()) .removeLastSegments(1); Map<IProject, File> connections = new HashMap<>(); IProject[] projects = ResourcesPlugin.getWorkspace().getRoot() .getProjects(); for (IProject project : projects) { RepositoryProvider provider = RepositoryProvider .getProvider(project); if (provider != null) continue; IPath location = project.getLocation(); if (location == null) continue; // In case the project is not inside the working directory, don't // even search for a mapping. if (!workingDirPath.isPrefixOf(location)) continue; RepositoryFinder f = new RepositoryFinder(project); f.setFindInChildren(false); try { List<RepositoryMapping> mappings = f .find(new NullProgressMonitor()); if (!mappings.isEmpty()) { // Connect to the first one; it's the innermost. IPath gitDir = mappings.get(0).getGitDirAbsolutePath(); if (gitDir != null) { connections.put(project, gitDir.toFile()); } } } catch (CoreException e) { // Ignore this project in that case continue; } } if (!connections.isEmpty()) { ConnectProviderOperation operation = new ConnectProviderOperation( connections); operation.setRefreshResources(false); JobUtil.scheduleUserJob(operation, CoreText.Activator_AutoShareJobName, JobFamilies.AUTO_SHARE); } } private boolean doAutoShare() { IEclipsePreferences d = DefaultScope.INSTANCE.getNode(Activator .getPluginId()); IEclipsePreferences p = InstanceScope.INSTANCE.getNode(Activator .getPluginId()); return p.getBoolean(GitCorePreferences.core_autoShareProjects, d.getBoolean(GitCorePreferences.core_autoShareProjects, true)); } }