From 9b0f51b3f4bef582b145ec212a5ac7d10c4150f2 Mon Sep 17 00:00:00 2001 From: Michael Valenta Date: Wed, 30 Jan 2002 16:23:14 +0000 Subject: Slight refactoring --- .../team/internal/ccvs/core/CVSProvider.java | 5 +- .../internal/ccvs/core/ICVSRemoteResource.java | 2 +- .../team/internal/ccvs/core/client/Checkout.java | 34 +++++++- .../team/internal/ccvs/core/client/Command.java | 4 +- .../team/internal/ccvs/core/client/Import.java | 2 +- .../team/internal/ccvs/core/client/Tag.java | 4 +- .../core/client/listeners/IStatusListener.java | 6 +- .../ccvs/core/client/listeners/StatusListener.java | 12 +-- .../internal/ccvs/core/resources/ICVSResource.java | 2 +- .../ccvs/core/resources/LocalResource.java | 2 +- .../internal/ccvs/core/resources/RemoteFile.java | 15 +--- .../internal/ccvs/core/resources/RemoteFolder.java | 91 +++++++++++++--------- .../ccvs/core/resources/RemoteFolderTree.java | 7 ++ .../ccvs/core/resources/RemoteResource.java | 11 +-- .../ccvs/core/util/RemoteFolderTreeBuilder.java | 21 +++-- .../eclipse/team/internal/ccvs/core/util/Util.java | 24 ++++-- .../internal/ccvs/ui/CVSCompareEditorInput.java | 2 +- .../team/internal/ccvs/ui/CVSPropertiesPage.java | 2 +- .../team/internal/ccvs/ui/model/RemoteModule.java | 2 +- .../eclipse/team/tests/ccvs/core/EclipseTest.java | 13 ++++ .../tests/ccvs/core/compatible/ConflictTest.java | 5 +- .../tests/ccvs/core/provider/CVSProviderTest.java | 18 ++++- 22 files changed, 183 insertions(+), 101 deletions(-) diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProvider.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProvider.java index 0fc89ef9f..2f176f702 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProvider.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProvider.java @@ -33,7 +33,6 @@ 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.core.runtime.SubProgressMonitor; import org.eclipse.team.ccvs.core.CVSProviderPlugin; import org.eclipse.team.ccvs.core.CVSTag; import org.eclipse.team.ccvs.core.CVSTeamProvider; @@ -59,9 +58,7 @@ import org.eclipse.team.internal.ccvs.core.connection.CVSServerException; import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; import org.eclipse.team.internal.ccvs.core.resources.RemoteFolder; import org.eclipse.team.internal.ccvs.core.resources.RemoteFolderTree; -import org.eclipse.team.internal.ccvs.core.syncinfo.*; import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; -import org.eclipse.team.internal.ccvs.core.syncinfo.FileSystemSynchronizer; import org.eclipse.team.internal.ccvs.core.util.Util; public class CVSProvider implements ICVSProvider { @@ -228,7 +225,7 @@ public class CVSProvider implements ICVSProvider { RemoteFolder resource = (RemoteFolder)resources[i]; if (projects != null) project = projects[i]; - checkout(resource.getRepository(), project, resource.getRemotePath(), resource.getTag(), Policy.subMonitorFor(pm, 1000)); + checkout(resource.getRepository(), project, resource.getRepositoryRelativePath(), resource.getTag(), Policy.subMonitorFor(pm, 1000)); } } catch (TeamException e) { diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSRemoteResource.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSRemoteResource.java index 11c28e1ad..96256ff62 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSRemoteResource.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSRemoteResource.java @@ -38,7 +38,7 @@ public interface ICVSRemoteResource extends IRemoteResource { /** * Answers the repository relative path of this remote folder. */ - public String getRelativePath(); + public String getRepositoryRelativePath(); /** * Compares two objects for equality; for cvs remote resources, equality is defined in diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Checkout.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Checkout.java index 04ff3f80a..4baa88039 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Checkout.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Checkout.java @@ -6,10 +6,14 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.client.Command.GlobalOption; import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption; import org.eclipse.team.internal.ccvs.core.client.Command.Option; +import org.eclipse.team.internal.ccvs.core.client.listeners.ModuleDefinitionsListener; +import org.eclipse.team.internal.ccvs.core.client.listeners.ModuleExpansion; +import org.eclipse.team.internal.ccvs.core.connection.CVSServerException; 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.util.Assert; @@ -21,14 +25,20 @@ public class Checkout extends Command { return new LocalOption("-d", moduleName); } + /** Command options found in the CVSROOT/modules file */ + public static LocalOption ALIAS = new LocalOption("-a"); + public static LocalOption makeStatusOption(String status) { + return new LocalOption("-s", status); + } + protected Checkout() { } protected String getCommandId() { return "co"; } - protected ICVSResource[] computeWorkResources(Session session, String[] arguments) + protected ICVSResource[] computeWorkResources(Session session, String[] arguments, LocalOption[] localOptions) throws CVSException { - if (arguments.length < 1) throw new IllegalArgumentException(); + if (arguments.length < 1 && ! FETCH_MODULE_ALIASES.isElementOf(localOptions)) throw new IllegalArgumentException(); return new ICVSResource[0]; } @@ -81,5 +91,23 @@ public class Checkout extends Command { } } } - + + /** + * Perform a checkout to get the module expansions defined in the CVSROOT/modules file + */ + public ModuleExpansion[] getModuleExpansions(Session session, IProgressMonitor monitor) + throws CVSException { + + ModuleDefinitionsListener moduleDefinitionListener = new ModuleDefinitionsListener(); + + IStatus status = execute(session, NO_GLOBAL_OPTIONS, new LocalOption[] {FETCH_MODULE_ALIASES}, NO_ARGUMENTS, + moduleDefinitionListener, monitor); + + if (status.getCode() == CVSException.SERVER_ERROR) { + // XXX diff errors?? + throw new CVSServerException(status); + } + + return moduleDefinitionListener.getModuleExpansions(); + } } \ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Command.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Command.java index 167b4a5d5..3858e3da6 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Command.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Command.java @@ -197,7 +197,7 @@ public abstract class Command { * can be more easily manipulated. Subclasses must override this method * if this assumption is false. */ - protected ICVSResource[] computeWorkResources(Session session, String[] arguments) + protected ICVSResource[] computeWorkResources(Session session, String[] arguments, LocalOption[] localOptions) throws CVSException { ICVSFolder localRoot = session.getLocalRoot(); @@ -310,7 +310,7 @@ public abstract class Command { // Ensure that the commands run with the latest contents of the CVS subdirectory sync files // and not the cached values. Allow 10% of work. - resources = computeWorkResources(session, arguments); + resources = computeWorkResources(session, arguments, localOptions); reloadSyncInfo(resources, Policy.subMonitorFor(monitor, 10)); Policy.checkCanceled(monitor); diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Import.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Import.java index 111922730..508e65d12 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Import.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Import.java @@ -23,7 +23,7 @@ public class Import extends Command { return "import"; } - protected ICVSResource[] computeWorkResources(Session session, String[] arguments) + protected ICVSResource[] computeWorkResources(Session session, String[] arguments, LocalOption[] localOptions) throws CVSException { if (arguments.length < 3) throw new IllegalArgumentException(); return new ICVSResource[0]; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Tag.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Tag.java index d177a2d09..2a5b8d5cc 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Tag.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Tag.java @@ -20,12 +20,12 @@ public class Tag extends Command { return "tag"; } - protected ICVSResource[] computeWorkResources(Session session, String[] arguments) + protected ICVSResource[] computeWorkResources(Session session, String[] arguments, LocalOption[] localOptions) throws CVSException { if (arguments.length < 1) throw new IllegalArgumentException(); String[] allButFirst = new String[arguments.length - 1]; System.arraycopy(arguments, 1, allButFirst, 0, arguments.length - 1); - return super.computeWorkResources(session, allButFirst); + return super.computeWorkResources(session, allButFirst, localOptions); } protected void sendLocalResourceState(Session session, GlobalOption[] globalOptions, diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IStatusListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IStatusListener.java index 85cda3835..ff566028a 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IStatusListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IStatusListener.java @@ -12,11 +12,9 @@ public interface IStatusListener { public static final String FOLDER_REVISION = ""; /** - * provides access to the revision of a file through - * the use of the Status command. + * Provides access to the revision of a file through the use of the Status command. * - * @see StatusMessageHandler - * @see StatusErrorHandler + * The provided path is the absoulte remote path of the resource including the repository root directory */ public void fileStatus(IPath path, String remoteRevision); } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/StatusListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/StatusListener.java index a3dc5df5e..519bebc6a 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/StatusListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/StatusListener.java @@ -25,6 +25,7 @@ public class StatusListener implements ICommandOutputListener { public IStatus messageLine(String line, ICVSFolder commandRoot, IProgressMonitor monitor) { + // We're only concerned about file revisions. if (line.startsWith(" Repository revision:")) { if (!line.startsWith(" Repository revision: No revision control file")) { @@ -34,15 +35,8 @@ public class StatusListener implements ICommandOutputListener { // This is the full location on the server (e.g. /home/cvs/repo/project/file.txt) String fileLocation = line.substring(separatingTabIndex + 1, line.length() - 2); - // This is the path relative to the ICVSResource used as the root of the command - IPath fullPath; - try { - fullPath = new Path(fileLocation.substring( - commandRoot.getRemoteLocation(commandRoot).length() + 1)); - } catch (CVSException e) { - return new Status(IStatus.ERROR, CVSProviderPlugin.ID, CVSException.IO_FAILED, - "could not get remote location of resource", e); - } + // This is the absolute remote pathincluding the repository root directory + IPath fullPath = new Path(fileLocation); // If the status returns that the file is in the Attic, then remove the // Attic segment. This is because files added to a branch that are not in diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/ICVSResource.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/ICVSResource.java index e3c54919b..3ea3c5417 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/ICVSResource.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/ICVSResource.java @@ -75,7 +75,7 @@ public interface ICVSResource { public boolean exists() throws CVSException; /** - * Answers a relative path to the given ancestor. + * Answers the local relative path from the given ancestor to the receiver. * * @return the ancestor relative path for this resource. */ diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalResource.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalResource.java index 5a41bfeae..1413b9d18 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalResource.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalResource.java @@ -60,7 +60,7 @@ public abstract class LocalResource implements ICVSResource { } result = Util.getRelativePath(rootFolder.getPath(),getPath()); - return result.replace('\\', '/'); + return result; } /** diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java index 2798e6269..8b02e0624 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java @@ -144,7 +144,7 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile, ICVSFi return null; } } - + /** * @see ICVSRemoteFile#getLogEntries() */ @@ -185,7 +185,7 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile, ICVSFi * Therefore, we need a new parent so that we can fecth the contents of the remote file revision */ public RemoteFile toRevision(String revision) { - RemoteFolder newParent = new RemoteFolder(null, parent.getRepository(), new Path(parent.getRemotePath()), parent.getTag()); + RemoteFolder newParent = new RemoteFolder(null, parent.getRepository(), new Path(parent.getRepositoryRelativePath()), parent.getTag()); RemoteFile file = new RemoteFile(newParent, getName(), revision, CVSTag.DEFAULT); newParent.setChildren(new ICVSRemoteResource[] {file}); return file; @@ -220,13 +220,6 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile, ICVSFi return result + Session.SERVER_SEPARATOR + getName(); } - /** - * @see ICVSRemoteFolder#getRelativePath() - */ - public String getRelativePath() { - return getRemotePath(); - } - /** * @see ICVSResource#getRemoteLocation(ICVSFolder) */ @@ -237,8 +230,8 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile, ICVSFi /** * Get the remote path for the receiver relative to the repository location path */ - public String getRemotePath() { - String parentPath = parent.getRemotePath(); + public String getRepositoryRelativePath() { + String parentPath = parent.getRepositoryRelativePath(); return parentPath + Session.SERVER_SEPARATOR + getName(); } 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 7be17c5c9..1b423204a 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 @@ -34,30 +34,48 @@ import org.eclipse.team.internal.ccvs.core.client.listeners.IStatusListener; import org.eclipse.team.internal.ccvs.core.client.listeners.IUpdateMessageListener; import org.eclipse.team.internal.ccvs.core.client.listeners.StatusListener; import org.eclipse.team.internal.ccvs.core.client.listeners.UpdateListener; -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.syncinfo.*; +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.Util; /** * This class provides the implementation of ICVSRemoteFolder + * + * The parent of the RemoteFolder represents the folders parent in a local configuration. + * For instance, the parent may correspond to the remote parent or may be a folder in the + * same repository that has no physical relationship to the RemoteFolder (resulting from the use + * of a module definition, for instance). A RemoteFolder may not have a parent, indicating that it is + * the root of the local configuration it represents. + * + * A RemoteFolder has the following: + * A name in the folder's local configuration + * */ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, ICVSFolder { + public static final String VIRTUAL_DIRECTORY = "CVSROOT/Emptydir"; + + private FolderSyncInfo folderInfo; private ICVSRemoteResource[] children; - private CVSRepositoryLocation repository; - private IPath repositoryRelativePath; - private CVSTag tag; + private ICVSRepositoryLocation repository; /** * Constructor for RemoteFolder. */ public RemoteFolder(RemoteFolder parent, ICVSRepositoryLocation repository, IPath repositoryRelativePath, CVSTag tag) { - String name = repositoryRelativePath.lastSegment() == null ? "" : repositoryRelativePath.lastSegment(); + this(parent, + repositoryRelativePath.lastSegment() == null ? "" : repositoryRelativePath.lastSegment(), + repository, + repositoryRelativePath, + tag); + } + + public RemoteFolder(RemoteFolder parent, String name, ICVSRepositoryLocation repository, IPath repositoryRelativePath, CVSTag tag) { this.info = new ResourceSyncInfo(name); this.parent = parent; - this.tag = tag; - this.repository = (CVSRepositoryLocation)repository; - this.repositoryRelativePath = repositoryRelativePath; + this.folderInfo = new FolderSyncInfo(repositoryRelativePath.toString(), repository.getLocation(), tag, false); + this.repository = repository; } // Get the file revisions for the given filenames @@ -246,7 +264,7 @@ public class RemoteFolder extends RemoteResource implements ICVSRemoteFolder, IC result.add(new RemoteFile(this, (String)newRemoteFiles.get(i), tag)); } for (int i=0;i