1 /*******************************************************************************
2 * Copyright (c) 2010-2013 SAP AG and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License 2.0
5 * which accompanies this distribution, and is available at
6 * https://www.eclipse.org/legal/epl-2.0/
8 * SPDX-License-Identifier: EPL-2.0
11 * Mathias Kinzler (SAP AG) - initial implementation
12 * Stefan Lay (SAP AG) - improvements
13 *******************************************************************************/
14 package org
.eclipse
.egit
.ui
.internal
.clone
;
17 import java
.io
.IOException
;
18 import java
.lang
.reflect
.InvocationTargetException
;
19 import java
.net
.URISyntaxException
;
20 import java
.util
.ArrayList
;
21 import java
.util
.Arrays
;
22 import java
.util
.HashSet
;
23 import java
.util
.List
;
26 import org
.eclipse
.core
.resources
.IProject
;
27 import org
.eclipse
.core
.resources
.IProjectDescription
;
28 import org
.eclipse
.core
.resources
.IResource
;
29 import org
.eclipse
.core
.resources
.IWorkspaceRunnable
;
30 import org
.eclipse
.core
.resources
.ResourcesPlugin
;
31 import org
.eclipse
.core
.runtime
.CoreException
;
32 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
33 import org
.eclipse
.core
.runtime
.Path
;
34 import org
.eclipse
.core
.runtime
.SubMonitor
;
35 import org
.eclipse
.egit
.core
.op
.ConnectProviderOperation
;
36 import org
.eclipse
.egit
.ui
.Activator
;
37 import org
.eclipse
.egit
.ui
.internal
.UIIcons
;
38 import org
.eclipse
.egit
.ui
.internal
.UIText
;
39 import org
.eclipse
.egit
.ui
.internal
.clone
.GitCloneSourceProviderExtension
.CloneSourceProvider
;
40 import org
.eclipse
.egit
.ui
.internal
.provisional
.wizards
.GitRepositoryInfo
;
41 import org
.eclipse
.egit
.ui
.internal
.provisional
.wizards
.IRepositorySearchResult
;
42 import org
.eclipse
.egit
.ui
.internal
.provisional
.wizards
.NoRepositoryInfoException
;
43 import org
.eclipse
.jface
.dialogs
.IDialogSettings
;
44 import org
.eclipse
.jface
.operation
.IRunnableWithProgress
;
45 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
46 import org
.eclipse
.jface
.wizard
.IWizardPage
;
47 import org
.eclipse
.jgit
.lib
.Constants
;
48 import org
.eclipse
.jgit
.lib
.Repository
;
49 import org
.eclipse
.ui
.IImportWizard
;
50 import org
.eclipse
.ui
.IWorkbench
;
51 import org
.eclipse
.ui
.IWorkingSet
;
52 import org
.eclipse
.ui
.PlatformUI
;
53 import org
.eclipse
.ui
.actions
.NewProjectAction
;
56 * A wizard which allows to optionally clone a repository and to import projects from a repository.
58 public class GitImportWizard
extends AbstractGitCloneWizard
implements IImportWizard
{
59 private static final String GIT_IMPORT_SECTION
= "GitImportWizard"; //$NON-NLS-1$
61 private GitSelectRepositoryPage selectRepoPage
= new GitSelectRepositoryPage(
64 private GitSelectWizardPage importWithDirectoriesPage
= new GitSelectWizardPage(){
66 public void setVisible(boolean visible
) {
67 if (existingRepo
== null && visible
&& (cloneDestination
.cloneSettingsChanged())) {
68 setCallerRunsCloneOperation(true);
70 final GitRepositoryInfo repositoryInfo
= currentSearchResult
.getGitRepositoryInfo();
71 performClone(repositoryInfo
);
72 importWithDirectoriesPage
.getControl().getDisplay().asyncExec(new Runnable() {
76 runCloneOperation(getContainer(), repositoryInfo
);
77 cloneDestination
.saveSettingsForClonedRepo();
79 } catch (URISyntaxException e
) {
80 Activator
.error(UIText
.GitImportWizard_errorParsingURI
, e
);
81 } catch (NoRepositoryInfoException e
) {
82 Activator
.error(UIText
.GitImportWizard_noRepositoryInfo
, e
);
83 } catch (Exception e
) {
84 Activator
.error(e
.getMessage(), e
);
87 super.setVisible(visible
);
91 private GitProjectsImportPage projectsImportPage
= new GitProjectsImportPage() {
93 public void setVisible(boolean visible
) {
95 setProjectsList(importWithDirectoriesPage
.getPath());
96 super.setVisible(visible
);
100 private GitCreateGeneralProjectPage createGeneralProjectPage
= new GitCreateGeneralProjectPage() {
102 public void setVisible(boolean visible
) {
104 setPath(importWithDirectoriesPage
.getPath());
105 super.setVisible(visible
);
109 private Repository existingRepo
;
112 * The default constructor
114 public GitImportWizard() {
119 * Construct the import wizard based on given repository search result. The
120 * wizard skips the repository location page in this case.
122 * @param searchResult
123 * the search result to initialize the import wizard with.
125 public GitImportWizard(IRepositorySearchResult searchResult
) {
127 setWindowTitle(UIText
.GitImportWizard_WizardTitle
);
128 setDefaultPageImageDescriptor(UIIcons
.WIZBAN_IMPORT_REPO
);
129 setDialogSettings(getImportWizardDialogSettings());
133 protected void addPreClonePages() {
134 if (!hasSearchResult())
135 addPage(selectRepoPage
);
139 protected void addPostClonePages() {
140 addPage(importWithDirectoriesPage
);
141 addPage(projectsImportPage
);
142 addPage(createGeneralProjectPage
);
146 protected List
<CloneSourceProvider
> getCloneSourceProviders() {
147 List
<CloneSourceProvider
> cloneSourceProvider
= super.getCloneSourceProviders();
148 cloneSourceProvider
.add(0, CloneSourceProvider
.LOCAL
);
149 return cloneSourceProvider
;
153 public void init(IWorkbench workbench
, IStructuredSelection selection
) {
158 public IWizardPage
getNextPage(IWizardPage page
) {
159 if (page
== selectRepoPage
) {
160 existingRepo
= selectRepoPage
.getRepository();
161 importWithDirectoriesPage
.setRepository(selectRepoPage
163 return importWithDirectoriesPage
;
164 } else if (page
== cloneDestination
) {
166 importWithDirectoriesPage
.setRepository(getTargetRepository());
167 return importWithDirectoriesPage
;
168 } else if (page
== importWithDirectoriesPage
)
169 switch (importWithDirectoriesPage
.getWizardSelection()) {
170 case GitSelectWizardPage
.EXISTING_PROJECTS_WIZARD
:
171 return projectsImportPage
;
172 case GitSelectWizardPage
.NEW_WIZARD
:
174 case GitSelectWizardPage
.GENERAL_WIZARD
:
175 return createGeneralProjectPage
;
177 else if (page
== createGeneralProjectPage
178 || page
== projectsImportPage
)
180 return super.getNextPage(page
);
183 private Repository
getTargetRepository() {
184 if (existingRepo
!= null)
188 return org
.eclipse
.egit
.core
.Activator
190 .getRepositoryCache()
192 new File(cloneDestination
.getDestinationFile(),
194 } catch (IOException e
) {
196 .error("Error looking up repository at " + cloneDestination
.getDestinationFile(), e
); //$NON-NLS-1$
202 public boolean performFinish() {
204 getContainer().run(true, true, new IRunnableWithProgress() {
206 public void run(IProgressMonitor monitor
)
207 throws InvocationTargetException
, InterruptedException
{
208 importProjects(monitor
);
211 } catch (InvocationTargetException e
) {
213 .handleError(e
.getCause().getMessage(), e
.getCause(), true);
215 } catch (InterruptedException e
) {
216 Activator
.handleError(
217 UIText
.GitCreateProjectViaWizardWizard_AbortedMessage
, e
,
225 public boolean canFinish() {
226 switch (importWithDirectoriesPage
.getWizardSelection()) {
227 case GitSelectWizardPage
.EXISTING_PROJECTS_WIZARD
:
228 return projectsImportPage
.isPageComplete();
229 case GitSelectWizardPage
.NEW_WIZARD
:
231 case GitSelectWizardPage
.GENERAL_WIZARD
:
232 return createGeneralProjectPage
.isPageComplete();
234 return super.canFinish();
238 private void importProjects(IProgressMonitor monitor
)
239 throws InvocationTargetException
, InterruptedException
{
240 switch (importWithDirectoriesPage
.getWizardSelection()) {
241 case GitSelectWizardPage
.EXISTING_PROJECTS_WIZARD
: {
242 final Set
<ProjectRecord
> projectsToCreate
= new HashSet
<>();
243 final List
<IWorkingSet
> workingSets
= new ArrayList
<>();
244 // get the data from the pages in the UI thread
245 PlatformUI
.getWorkbench().getDisplay().syncExec(new Runnable() {
248 projectsToCreate
.addAll(projectsImportPage
249 .getCheckedProjects());
250 IWorkingSet
[] workingSetArray
= projectsImportPage
251 .getSelectedWorkingSets();
252 workingSets
.addAll(Arrays
.asList(workingSetArray
));
253 projectsImportPage
.saveWidgetValues();
256 ProjectUtils
.createProjects(projectsToCreate
,
257 workingSets
.toArray(new IWorkingSet
[0]),
261 case GitSelectWizardPage
.NEW_WIZARD
: {
262 final File
[] repoDir
= new File
[1];
263 PlatformUI
.getWorkbench().getDisplay().syncExec(new Runnable() {
266 repoDir
[0] = getTargetRepository().getDirectory();
269 final List
<IProject
> previousProjects
= Arrays
270 .asList(ResourcesPlugin
.getWorkspace().getRoot()
272 PlatformUI
.getWorkbench().getDisplay().syncExec(new Runnable() {
275 new NewProjectAction(PlatformUI
.getWorkbench()
276 .getActiveWorkbenchWindow()).run();
279 IWorkspaceRunnable wsr
= new IWorkspaceRunnable() {
281 public void run(IProgressMonitor actMonitor
)
282 throws CoreException
{
283 IProject
[] currentProjects
= ResourcesPlugin
.getWorkspace()
284 .getRoot().getProjects();
285 SubMonitor progress
= SubMonitor
.convert(actMonitor
,
286 currentProjects
.length
);
287 for (IProject current
: currentProjects
)
288 if (!previousProjects
.contains(current
)) {
289 ConnectProviderOperation cpo
= new ConnectProviderOperation(
290 current
, repoDir
[0]);
291 cpo
.execute(progress
.newChild(1));
298 ResourcesPlugin
.getWorkspace().run(wsr
, monitor
);
299 } catch (CoreException e
) {
300 throw new InvocationTargetException(e
);
304 case GitSelectWizardPage
.GENERAL_WIZARD
: {
305 final String
[] projectName
= new String
[1];
306 final boolean[] defaultLocation
= new boolean[1];
307 final String
[] path
= new String
[1];
308 final File
[] repoDir
= new File
[1];
309 // get the data from the page in the UI thread
310 PlatformUI
.getWorkbench().getDisplay().syncExec(new Runnable() {
313 projectName
[0] = createGeneralProjectPage
.getProjectName();
314 defaultLocation
[0] = createGeneralProjectPage
315 .isDefaultLocation();
316 path
[0] = importWithDirectoriesPage
.getPath();
317 repoDir
[0] = getTargetRepository().getDirectory();
321 IWorkspaceRunnable wsr
= new IWorkspaceRunnable() {
323 public void run(IProgressMonitor actMonitor
)
324 throws CoreException
{
325 final IProjectDescription desc
= ResourcesPlugin
326 .getWorkspace().newProjectDescription(
328 desc
.setLocation(new Path(path
[0]));
329 SubMonitor progress
= SubMonitor
.convert(actMonitor
, 4);
330 IProject prj
= ResourcesPlugin
.getWorkspace().getRoot()
331 .getProject(desc
.getName());
332 prj
.create(desc
, progress
.newChild(1));
333 prj
.open(progress
.newChild(1));
334 ConnectProviderOperation cpo
= new ConnectProviderOperation(
336 cpo
.execute(progress
.newChild(1));
338 ResourcesPlugin
.getWorkspace().getRoot().refreshLocal(
339 IResource
.DEPTH_ONE
, progress
.newChild(1));
342 ResourcesPlugin
.getWorkspace().run(wsr
, monitor
);
343 } catch (CoreException e
) {
344 throw new InvocationTargetException(e
);
351 static IDialogSettings
getImportWizardDialogSettings() {
352 IDialogSettings settings
= Activator
.getDefault().getDialogSettings();
354 IDialogSettings wizardSettings
= settings
355 .getSection(GitImportWizard
.GIT_IMPORT_SECTION
);
356 if (wizardSettings
== null) {
357 wizardSettings
= settings
358 .addNewSection(GitImportWizard
.GIT_IMPORT_SECTION
);
360 return wizardSettings
;