Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java139
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

Back to the top