diff options
Diffstat (limited to 'bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java')
-rw-r--r-- | bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java | 139 |
1 files changed, 139 insertions, 0 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 new file mode 100644 index 000000000..c6a45e510 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java @@ -0,0 +1,139 @@ +package org.eclipse.team.internal.ccvs.core.resources; + +/* + * (c) Copyright IBM Corp. 2000, 2002. + * All Rights Reserved. + */ + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; +import org.eclipse.team.ccvs.core.CVSStatus; +import org.eclipse.team.ccvs.core.CVSTag; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSRemoteResource; +import org.eclipse.team.ccvs.core.ICVSRepositoryLocation; +import org.eclipse.team.ccvs.core.ICVSResource; +import org.eclipse.team.core.TeamException; +import org.eclipse.team.core.TeamPlugin; +import org.eclipse.team.core.sync.IRemoteSyncElement; +import org.eclipse.team.internal.ccvs.core.CVSException; +import org.eclipse.team.internal.ccvs.core.CVSProvider; +import org.eclipse.team.internal.ccvs.core.Policy; +import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation; +import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; + +public class CVSWorkspaceRoot { + + private ICVSFolder localRoot; + + public CVSWorkspaceRoot(IContainer resource){ + this.localRoot = getCVSFolderFor(resource); + } + + public static ICVSFolder getCVSFolderFor(IContainer resource) { + return new EclipseFolder(resource); + } + + + public static ICVSFile getCVSFileFor(IFile resource) { + return new EclipseFile(resource); + } + + + public static ICVSResource getCVSResourceFor(IResource resource) { + if (resource.getType() == IResource.FILE) + return getCVSFileFor((IFile) resource); + else + return getCVSFolderFor((IContainer) resource); + } + + public static ICVSRemoteResource getRemoteResourceFor(IResource resource) throws CVSException { + ICVSResource managed = getCVSResourceFor(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)getRemoteResourceFor(resource.getParent()), (ICVSFile)managed); + } + return null; + } + + /* + * 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 + */ + private static ICVSRemoteResource getRemoteTreeFromParent(IResource resource, ICVSResource managed, CVSTag tag, IProgressMonitor progress) throws TeamException { + // If the parent isn't mapped to CVS, there's nothing we can do + ICVSFolder parent = managed.getParent(); + if (!parent.isCVSFolder()) { + throw new CVSException(new CVSStatus(CVSStatus.ERROR, resource.getFullPath(), Policy.bind("CVSTeamProvider.unmanagedParent", resource.getFullPath().toString()), null)); //$NON-NLS-1$ + } + ICVSRepositoryLocation location = CVSProvider.getInstance().getRepository(parent.getFolderSyncInfo().getRoot()); + // XXX We build and fetch the whole tree from the parent. We could restrict the search to just the desired child + RemoteFolder remoteParent = RemoteFolderTreeBuilder.buildRemoteTree((CVSRepositoryLocation)location, parent, tag, progress); + ICVSRemoteResource remote = null; + if (remoteParent != null) { + try { + remote = (ICVSRemoteResource)remoteParent.getChild(resource.getName()); + } catch (CVSException e) { + remote = null; + } + // The types need to match or we're in trouble + if (remote != null && !(remote.isContainer() == managed.isFolder())) + throw new CVSException(new CVSStatus(CVSStatus.ERROR, resource.getFullPath(), Policy.bind("CVSTeamProvider.typesDiffer", resource.getFullPath().toString()), null)); //$NON-NLS-1$ + } + return remote; + } + + public static IRemoteSyncElement getRemoteSyncTree(IResource resource, CVSTag tag, IProgressMonitor progress) throws TeamException { + ICVSResource managed = CVSWorkspaceRoot.getCVSResourceFor(resource); + ICVSRemoteResource remote = CVSWorkspaceRoot.getRemoteResourceFor(resource); + ICVSRemoteResource baseTree = null; + + // The resource doesn't have a remote base. + // However, we still need to check to see if its been created remotely by a third party. + if (remote == null) { + remote = getRemoteTreeFromParent(resource, managed, tag, progress); + } else if(resource.getType() == IResource.FILE) { + baseTree = remote; + ICVSRemoteResource remoteParent = CVSWorkspaceRoot.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); + remote = RemoteFolderTreeBuilder.buildRemoteTree((CVSRepositoryLocation)location, (ICVSFolder)managed, tag, progress); + } + return new CVSRemoteSyncElement(false, resource, baseTree, remote); + } + + public static ICVSRemoteResource getRemoteTree(IResource resource, CVSTag tag, IProgressMonitor progress) throws TeamException { + ICVSResource managed = CVSWorkspaceRoot.getCVSResourceFor(resource); + ICVSRemoteResource remote = CVSWorkspaceRoot.getRemoteResourceFor(resource); + if (remote == null) { + remote = getRemoteTreeFromParent(resource, managed, tag, progress); + } else if(resource.getType() == IResource.FILE) { + ICVSRemoteResource remoteParent = CVSWorkspaceRoot.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); + } + return remote; + } + + public ICVSRepositoryLocation getRemoteLocation() throws CVSException { + return CVSProvider.getInstance().getRepository(localRoot.getFolderSyncInfo().getRoot()); + } + + public ICVSFolder getLocalRoot() { + return localRoot; + } +}
\ No newline at end of file |