diff options
author | Michael Valenta | 2003-11-24 17:15:56 +0000 |
---|---|---|
committer | Michael Valenta | 2003-11-24 17:15:56 +0000 |
commit | 0ed6496dfb8965c60f7acf21f00e1f00c29acb40 (patch) | |
tree | d7a075134432191e64267dd0b8b2f6762be60b32 /bundles | |
parent | bae585d14485d902351e0edeaff1253d0c36b470 (diff) | |
download | eclipse.platform.team-0ed6496dfb8965c60f7acf21f00e1f00c29acb40.tar.gz eclipse.platform.team-0ed6496dfb8965c60f7acf21f00e1f00c29acb40.tar.xz eclipse.platform.team-0ed6496dfb8965c60f7acf21f00e1f00c29acb40.zip |
46629: Cannot share project in a sub directory of a module
Diffstat (limited to 'bundles')
4 files changed, 185 insertions, 72 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java index ccdfe5297..478b08c3c 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java @@ -225,77 +225,6 @@ public class CVSWorkspaceRoot { } /** - * Create a remote module in the CVS repository and link the project directory to this remote module. - * The contents of the project are not imported. - */ - public static void createModule(final ICVSRepositoryLocation location, final IProject project, String moduleName, IProgressMonitor monitor) throws TeamException { - - // Determine if the repository is known - boolean alreadyExists = CVSProviderPlugin.getPlugin().isKnownRepository(location.getLocation()); - // Set the folder sync info of the project to point to the remote module - final ICVSFolder folder = (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(project); - - try { - String projectName = project.getName(); - if (moduleName == null) - moduleName = projectName; - - // Perform the import using a dummy root so the local project is not traversed - RemoteFolderTree root = new RemoteFolderTree(null, location, Path.EMPTY.toString(), null); - root.setChildren(new ICVSRemoteResource[] { - new RemoteFolder(root, moduleName, null, null, null, false) - }); - Session s = new Session(location, root); - s.open(monitor, true /* open for modification */); - try { - IStatus status = Command.ADD.execute(s, - Command.NO_GLOBAL_OPTIONS, - Command.NO_LOCAL_OPTIONS, - new String[] { moduleName }, - null, - monitor); - // If we get a warning, the operation most likely failed so check that the status is OK - if (status.getCode() == CVSStatus.SERVER_ERROR || ! status.isOK()) { - throw new CVSServerException(status); - } - } finally { - s.close(); - } - - // perform the workspace modifications in a runnable - try { - final TeamException[] exception = new TeamException[] {null}; - final String modName = moduleName; - ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { - public void run(IProgressMonitor monitor) throws CoreException { - try { - // Link the project to the newly created module - folder.setFolderSyncInfo(new FolderSyncInfo(modName, location.getLocation(), null, false)); - //Register it with Team. If it already is, no harm done. - RepositoryProvider.map(project, CVSProviderPlugin.getTypeId()); - } catch (TeamException e) { - exception[0] = e; - } - } - }, project, monitor); - if (exception[0] != null) - throw exception[0]; - } catch (CoreException e) { - throw CVSException.wrapException(e); - } - } catch (TeamException e) { - // The checkout may have triggered password caching - // Therefore, if this is a newly created location, we want to clear its cache - if ( ! alreadyExists) - CVSProviderPlugin.getPlugin().disposeRepository(location); - throw e; - } - // Add the repository if it didn't exist already - if ( ! alreadyExists) - CVSProviderPlugin.getPlugin().addRepository(location); - } - - /** * Set the sharing for a project to enable it to be used with the CVSTeamProvider. * This method ensure that the repository in the FolderSyncInfo is known and that * the project is mapped to a CVS repository provider. It does not modify the sync diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java index 8916a12e3..5841ae1c0 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java @@ -463,6 +463,7 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC * @see ICVSRemoteFolder#getTag() */ public CVSTag getTag() { + if (folderInfo == null) return null; return folderInfo.getTag(); } /* diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/ShareProjectOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/ShareProjectOperation.java new file mode 100644 index 000000000..66e733a7e --- /dev/null +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/ShareProjectOperation.java @@ -0,0 +1,178 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.team.internal.ccvs.ui.operations; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspaceRunnable; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.team.core.RepositoryProvider; +import org.eclipse.team.core.TeamException; +import org.eclipse.team.internal.ccvs.core.CVSException; +import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; +import org.eclipse.team.internal.ccvs.core.CVSStatus; +import org.eclipse.team.internal.ccvs.core.ICVSFolder; +import org.eclipse.team.internal.ccvs.core.ICVSRemoteResource; +import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation; +import org.eclipse.team.internal.ccvs.core.client.Command; +import org.eclipse.team.internal.ccvs.core.client.Session; +import org.eclipse.team.internal.ccvs.core.connection.CVSServerException; +import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; +import org.eclipse.team.internal.ccvs.core.resources.RemoteFolderTree; +import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; +import org.eclipse.team.internal.ccvs.ui.Policy; + +/** + * Create a folder and any missing parents in the repository + */ +public class ShareProjectOperation extends CVSOperation { + + private ICVSRepositoryLocation location; + private IProject project; + private String moduleName; + + public ShareProjectOperation(Shell shell, ICVSRepositoryLocation location, IProject project, String moduleName) { + super(shell); + this.moduleName = moduleName; + this.project = project; + this.location = location; + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ccvs.ui.operations.CVSOperation#execute(org.eclipse.core.runtime.IProgressMonitor) + */ + protected void execute(IProgressMonitor monitor) throws CVSException, InterruptedException { + + // Determine if the repository is known + boolean alreadyExists = CVSProviderPlugin.getPlugin().isKnownRepository(location.getLocation()); + + try { + createRemoteFolder(monitor); + mapProjectToRemoteFolder(monitor); + } catch (CVSException e) { + // The checkout may have triggered password caching + // Therefore, if this is a newly created location, we want to clear its cache + if ( ! alreadyExists) + CVSProviderPlugin.getPlugin().disposeRepository(location); + throw e; + } + // Add the repository if it didn't exist already + if ( ! alreadyExists) { + CVSProviderPlugin.getPlugin().addRepository(location); + } + } + + private void mapProjectToRemoteFolder(IProgressMonitor monitor) throws CVSException { + // perform the workspace modifications in a runnable + try { + // Set the folder sync info of the project to point to the remote module + final ICVSFolder folder = (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(project); + final TeamException[] exception = new TeamException[] {null}; + final String modName = moduleName; + ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { + public void run(IProgressMonitor monitor) throws CoreException { + try { + // Link the project to the newly created module + folder.setFolderSyncInfo(new FolderSyncInfo(modName, location.getLocation(), null, false)); + //Register it with Team. If it already is, no harm done. + RepositoryProvider.map(project, CVSProviderPlugin.getTypeId()); + } catch (TeamException e) { + exception[0] = e; + } + } + }, project, 0, monitor); + if (exception[0] != null) + throw exception[0]; + } catch (CoreException e) { + throw CVSException.wrapException(e); + } + } + + /* + * Create the remote folder (and any ancestors). + */ + private void createRemoteFolder(IProgressMonitor monitor) throws CVSException { + String projectName = project.getName(); + if (moduleName == null) + moduleName = projectName; + + RemoteFolderTree root = new RemoteFolderTree(null, location, Path.EMPTY.toString(), null); + Path path = new Path(moduleName); + + try { + monitor.beginTask(getTaskName(), 100 * path.segmentCount()); + ensureTreeExists(root, path, monitor); + } catch (TeamException e) { + throw CVSException.wrapException(e); + } finally { + monitor.done(); + } + } + + /* + * Create handles for all the children in the moduleName path + */ + private RemoteFolderTree createChild(RemoteFolderTree parent, String name, IProgressMonitor monitor) throws CVSException, TeamException { + RemoteFolderTree child = new RemoteFolderTree(parent, name, location, new Path(parent.getRepositoryRelativePath()).append(name).toString(), null); + parent.setChildren(new ICVSRemoteResource[] { child }); + if (child.exists(Policy.subMonitorFor(monitor, 50))) { + // The child exists so get the handle that was received from the server + return (RemoteFolderTree)parent.getFolder(name); + } else { + // Create the folder remotely + createFolder(child, Policy.subMonitorFor(monitor, 50)); + return child; + } + } + + /* + * Ensure that all the folders in the tree exist + */ + private void ensureTreeExists(RemoteFolderTree folder, IPath path, IProgressMonitor monitor) throws TeamException { + if (path.isEmpty()) return; + String name = path.segment(0); + RemoteFolderTree child = createChild(folder, name, monitor); + ensureTreeExists(child, path.removeFirstSegments(1), monitor); + } + + private void createFolder(RemoteFolderTree folder, IProgressMonitor monitor) throws TeamException { + Session s = new Session(location, folder.getParent()); + s.open(monitor, true /* open for modification */); + try { + IStatus status = Command.ADD.execute(s, + Command.NO_GLOBAL_OPTIONS, + Command.NO_LOCAL_OPTIONS, + new String[] { folder.getName() }, + null, + monitor); + // If we get a warning, the operation most likely failed so check that the status is OK + if (status.getCode() == CVSStatus.SERVER_ERROR || ! status.isOK()) { + throw new CVSServerException(status); + } + } finally { + s.close(); + } + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ccvs.ui.operations.CVSOperation#getTaskName() + */ + protected String getTaskName() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java index 4d10c0ff7..72699db59 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java @@ -29,6 +29,7 @@ import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; import org.eclipse.team.internal.ccvs.ui.*; import org.eclipse.team.internal.ccvs.ui.Policy; +import org.eclipse.team.internal.ccvs.ui.operations.ShareProjectOperation; import org.eclipse.team.ui.IConfigurationWizard; import org.eclipse.team.ui.synchronize.TeamSubscriberParticipant; import org.eclipse.ui.IWorkbench; @@ -241,10 +242,14 @@ public class SharingWizard extends Wizard implements IConfigurationWizard { } // Create the remote module for the project - CVSWorkspaceRoot.createModule(location, project, getModuleName(), new SubProgressMonitor(monitor, 50)); + ShareProjectOperation op = new ShareProjectOperation(getShell(), location, project, getModuleName()); + op.run(new SubProgressMonitor(monitor, 50)); } } catch (TeamException e) { throw new InvocationTargetException(e); + } catch (InterruptedException e) { + // Must have been canceled + return; } finally { monitor.done(); } |