diff options
Diffstat (limited to 'bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSTeamProvider.java')
-rw-r--r-- | bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSTeamProvider.java | 127 |
1 files changed, 37 insertions, 90 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSTeamProvider.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSTeamProvider.java index f12a519cb..854061189 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSTeamProvider.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSTeamProvider.java @@ -24,7 +24,6 @@ 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.core.runtime.Status; import org.eclipse.team.core.IFileTypeRegistry; import org.eclipse.team.core.ITeamNature; @@ -46,19 +45,13 @@ import org.eclipse.team.internal.ccvs.core.client.listeners.DiffListener; import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation; import org.eclipse.team.internal.ccvs.core.connection.CVSServerException; import org.eclipse.team.internal.ccvs.core.resources.CVSRemoteSyncElement; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFile; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; -import org.eclipse.team.internal.ccvs.core.resources.ICVSResource; -import org.eclipse.team.internal.ccvs.core.resources.ICVSResourceVisitor; -import org.eclipse.team.internal.ccvs.core.resources.LocalFile; -import org.eclipse.team.internal.ccvs.core.resources.LocalFolder; -import org.eclipse.team.internal.ccvs.core.resources.LocalResource; +import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; import org.eclipse.team.internal.ccvs.core.resources.RemoteFile; import org.eclipse.team.internal.ccvs.core.resources.RemoteFolder; +import org.eclipse.team.internal.ccvs.core.resources.RemoteFolderTreeBuilder; import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; import org.eclipse.team.internal.ccvs.core.util.Assert; -import org.eclipse.team.internal.ccvs.core.util.RemoteFolderTreeBuilder; /** * This class acts as both the ITeamNature and the ITeamProvider instances @@ -92,7 +85,7 @@ import org.eclipse.team.internal.ccvs.core.util.RemoteFolderTreeBuilder; public class CVSTeamProvider implements ITeamNature, ITeamProvider { // Instance variables - private ICVSFolder managedProject; + private CVSWorkspaceRoot workspaceRoot; private IProject project; private String comment = ""; //$NON-NLS-1$ @@ -128,9 +121,9 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { public void setProject(IProject project) { this.project = project; try { - this.managedProject = Session.getManagedFolder(project.getLocation().toFile()); + this.workspaceRoot = new CVSWorkspaceRoot(project); // Ensure that the project has CVS info - if (managedProject.getFolderSyncInfo() == null) { + if (workspaceRoot.getLocalRoot().getFolderSyncInfo() == null) { throw new CVSException(new CVSStatus(CVSStatus.ERROR, Policy.bind("CVSTeamProvider.noFolderInfo", project.getName()))); //$NON-NLS-1$ } } catch (CVSException e) { @@ -143,7 +136,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { * @see ITeamNature#getProvider() */ public ITeamProvider getProvider() throws TeamException { - if (managedProject == null) { + if (workspaceRoot == null) { // An error must have occured when we were configured throw new TeamException(new Status(IStatus.ERROR, CVSProviderPlugin.ID, TeamException.UNABLE, Policy.bind("CVSTeamProvider.initializationFailed", new Object[]{project.getName()}), null)); //$NON-NLS-1$ } @@ -247,7 +240,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { // Add the folders, followed by files! IStatus status; - Session s = new Session(getRemoteRoot(), managedProject); + Session s = new Session(workspaceRoot.getRemoteLocation(), workspaceRoot.getLocalRoot()); progress.beginTask(null, 100); try { // Opening the session takes 10% of the time @@ -313,7 +306,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { // Commit the resources IStatus status; - Session s = new Session(getRemoteRoot(), managedProject); + Session s = new Session(workspaceRoot.getRemoteLocation(), workspaceRoot.getLocalRoot()); progress.beginTask(null, 100); try { // Opening the session takes 20% of the time @@ -411,7 +404,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { // Remove the files remotely IStatus status; - Session s = new Session(getRemoteRoot(), managedProject); + Session s = new Session(workspaceRoot.getRemoteLocation(), workspaceRoot.getLocalRoot()); s.open(progress); try { status = Command.REMOVE.execute(s, @@ -440,7 +433,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { String[] arguments = getValidArguments(resources, options); IStatus status; - Session s = new Session(getRemoteRoot(), managedProject); + Session s = new Session(workspaceRoot.getRemoteLocation(), workspaceRoot.getLocalRoot()); progress.beginTask(null, 100); try { s.open(Policy.subMonitorFor(progress, 20)); @@ -515,56 +508,11 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { */ private ICVSResource getChild(IResource resource) throws CVSException { if (resource.equals(project)) - return managedProject; - return managedProject.getChild(resource.getFullPath().removeFirstSegments(1).toString()); - } - - /** - * Answer the name of the connection method for the given resource's - * project. - */ - public String getConnectionMethod(IResource resource) throws TeamException { - checkIsChild(resource); - return getRemoteRoot().getMethod().getName(); - } - - /** - * Get the print stream to which information from CVS commands - * is sent. - */ - private PrintStream getPrintStream() { - return CVSProviderPlugin.getProvider().getPrintStream(); - } - - /** - * Get the remote resource corresponding to the base of the local resource. - * This method returns null if the corresponding local resource does not have a base. - * - * Use getRemoteSyncTree() to get the current remote state of HEAD or a branch. - */ - public ICVSRemoteResource getRemoteResource(IResource resource) throws TeamException { - checkIsChild(resource); - ICVSResource managed = getChild(resource); - if (managed.isFolder()) { - ICVSFolder folder = (ICVSFolder)managed; - if (folder.isCVSFolder()) { - FolderSyncInfo syncInfo = folder.getFolderSyncInfo(); - return new RemoteFolder(null, CVSProvider.getInstance().getRepository(syncInfo.getRoot()), new Path(syncInfo.getRepository()), syncInfo.getTag()); - } - } else { - if (managed.isManaged()) - return RemoteFile.getBase((RemoteFolder)getRemoteResource(resource.getParent()), (ICVSFile)managed); - } - return null; - } - - /** - * Return the repository location to which the provider is connected - */ - public ICVSRepositoryLocation getRemoteRoot() throws CVSException { - return CVSProvider.getInstance().getRepository(managedProject.getFolderSyncInfo().getRoot()); + return workspaceRoot.getLocalRoot(); + return workspaceRoot.getLocalRoot().getChild(resource.getProjectRelativePath().toString()); } + /* * Helper method that uses the parent of a local resource that has no base to ensure that the resource * wasn't added remotely by a third party @@ -574,10 +522,11 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { ICVSFolder parent = managed.getParent(); if (!parent.isCVSFolder()) { // Check to make sure the project still has the CVS information - if (managedProject.getFolderSyncInfo() == null) { + ICVSFolder root = workspaceRoot.getLocalRoot(); + if (!root.isCVSFolder()) { // This is a catastrophic error. The project should have CVS information TeamPlugin.getManager().removeProvider(project, Policy.monitorFor(null)); - throw new CVSException(new CVSStatus(CVSStatus.ERROR, project.getFullPath(), Policy.bind("CVSTeamProvider.invalidProjectState", managedProject.getName()), null)); //$NON-NLS-1$ + throw new CVSException(new CVSStatus(CVSStatus.ERROR, project.getFullPath(), Policy.bind("CVSTeamProvider.invalidProjectState", root.getName()), null)); //$NON-NLS-1$ } else { throw new CVSException(new CVSStatus(CVSStatus.ERROR, resource.getFullPath(), Policy.bind("CVSTeamProvider.unmanagedParent", resource.getFullPath().toString()), null)); //$NON-NLS-1$ } @@ -602,7 +551,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { public IRemoteSyncElement getRemoteSyncTree(IResource resource, CVSTag tag, IProgressMonitor progress) throws TeamException { checkIsChild(resource); ICVSResource managed = getChild(resource); - ICVSRemoteResource remote = getRemoteResource(resource); + ICVSRemoteResource remote = workspaceRoot.getRemoteResourceFor(resource); ICVSRemoteResource baseTree = null; // The resource doesn't have a remote base. @@ -611,7 +560,8 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { remote = getRemoteTreeFromParent(resource, managed, tag, progress); } else if(resource.getType() == IResource.FILE) { baseTree = remote; - remote = RemoteFile.getLatest((RemoteFolder)getRemoteResource(resource.getParent()), (ICVSFile)managed, tag, progress); + ICVSRemoteResource remoteParent = workspaceRoot.getRemoteResourceFor(resource.getParent()); + remote = RemoteFile.getLatest((RemoteFolder)remoteParent, (ICVSFile)managed, tag, progress); } else { ICVSRepositoryLocation location = remote.getRepository(); baseTree = RemoteFolderTreeBuilder.buildBaseTree((CVSRepositoryLocation)location, (ICVSFolder)managed, tag, progress); @@ -623,11 +573,12 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { public ICVSRemoteResource getRemoteTree(IResource resource, CVSTag tag, IProgressMonitor progress) throws TeamException { checkIsChild(resource); ICVSResource managed = getChild(resource); - ICVSRemoteResource remote = getRemoteResource(resource); + ICVSRemoteResource remote = workspaceRoot.getRemoteResourceFor(resource); if (remote == null) { remote = getRemoteTreeFromParent(resource, managed, tag, progress); } else if(resource.getType() == IResource.FILE) { - remote = RemoteFile.getLatest((RemoteFolder)getRemoteResource(resource.getParent()), (ICVSFile)managed, tag, progress); + ICVSRemoteResource remoteParent = workspaceRoot.getRemoteResourceFor(resource.getParent()); + remote = RemoteFile.getLatest((RemoteFolder)remoteParent, (ICVSFile)managed, tag, progress); } else { ICVSRepositoryLocation location = remote.getRepository(); remote = RemoteFolderTreeBuilder.buildRemoteTree((CVSRepositoryLocation)location, (ICVSFolder)managed, tag, progress); @@ -643,7 +594,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { public IUserInfo getUserInfo(IResource resource) throws TeamException { checkIsChild(resource); // Get the repository location for the receiver - CVSRepositoryLocation location = (CVSRepositoryLocation)getRemoteRoot(); + CVSRepositoryLocation location = (CVSRepositoryLocation)workspaceRoot.getRemoteLocation(); return location.getUserInfo(true); } @@ -674,17 +625,15 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { */ public boolean hasRemote(IResource resource) { try { - LocalResource cvsResource; + ICVSResource cvsResource = workspaceRoot.getCVSResourceFor(resource); int type = resource.getType(); if(type!=IResource.FILE) { - cvsResource = new LocalFolder(resource.getLocation().toFile()); if(type==IResource.PROJECT) { return ((ICVSFolder)cvsResource).isCVSFolder(); } else { return cvsResource.isManaged(); } } else { - cvsResource = new LocalFile(resource.getLocation().toFile()); ResourceSyncInfo info = cvsResource.getSyncInfo(); if(info!=null) { return !info.getRevision().equals(ResourceSyncInfo.ADDED_REVISION); @@ -716,7 +665,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { * Helper to indicate if the resource is a child of the receiver's project */ private boolean isChildResource(IResource resource) { - return resource.getProject().getName().equals(managedProject.getName()); + return resource.getProject().getName().equals(project.getName()); } /** @@ -756,18 +705,12 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { /** * @see ITeamProvider#move(IResource, IPath, IProgressMonitor) */ - public void moved(IPath source, IResource resource, IProgressMonitor progress) - throws TeamException { - + public void moved(IPath source, IResource resource, IProgressMonitor progress) throws TeamException { + // XXX // this translates to a delete and an add - // How is this managed? Do we do the move or is that done after? // It becomes complicated if the local and remote operations // are independant as this is not the way CVS works! - - // Could implement a CVSProvider.MOVE!!! - - // XXX ???? } /** @@ -789,9 +732,9 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { if (!CVSRepositoryLocation.validateConnectionMethod(methodName)) return false; - + // Get the original location - ICVSRepositoryLocation location = getRemoteRoot(); + ICVSRepositoryLocation location = workspaceRoot.getRemoteLocation(); // Make a copy to work on CVSRepositoryLocation newLocation = CVSRepositoryLocation.fromString(location.getLocation()); @@ -825,7 +768,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { // Check if there is a differnece between the new and old roots final String root = location.getLocation(); - if (root.equals(getRemoteRoot().getLocation())) + if (root.equals(workspaceRoot.getRemoteLocation())) return; try { @@ -833,7 +776,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { monitor.beginTask(Policy.bind("CVSTeamProvider.folderInfo", project.getName()), 256); //$NON-NLS-1$ // Visit all the children folders in order to set the root in the folder sync info - managedProject.accept(new ICVSResourceVisitor() { + workspaceRoot.getLocalRoot().accept(new ICVSResourceVisitor() { public void visitFile(ICVSFile file) throws CVSException {}; public void visitFolder(ICVSFolder folder) throws CVSException { monitor.worked(1); @@ -881,7 +824,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { arguments = (String[])args.toArray(new String[args.size()]); IStatus status; - Session s = new Session(getRemoteRoot(), managedProject); + Session s = new Session(workspaceRoot.getRemoteLocation(), workspaceRoot.getLocalRoot()); progress.beginTask(null, 100); try { // Opening the session takes 20% of the time @@ -942,7 +885,7 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { String[] arguments = getValidArguments(resources, commandOptions); IStatus status; - Session s = new Session(getRemoteRoot(), managedProject); + Session s = new Session(workspaceRoot.getRemoteLocation(), workspaceRoot.getLocalRoot()); progress.beginTask(null, 100); try { // Opening the session takes 20% of the time @@ -1023,4 +966,8 @@ public class CVSTeamProvider implements ITeamNature, ITeamProvider { Assert.isTrue(false); return false; } + + public CVSWorkspaceRoot getCVSWorkspaceRoot() { + return workspaceRoot; + } }
\ No newline at end of file |