diff options
author | Jean Michel-Lemieux | 2002-02-28 21:12:14 +0000 |
---|---|---|
committer | Jean Michel-Lemieux | 2002-02-28 21:12:14 +0000 |
commit | 0e3293fc6a815dfe4d2f6fcc9ebee53b9559ff22 (patch) | |
tree | d1068388a65cfbce3b9ae10a8835ea1d20902a1b /bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs | |
parent | ff4ccf5556ccf7ab43228bc3ad82c443c07bd759 (diff) | |
download | eclipse.platform.team-0e3293fc6a815dfe4d2f6fcc9ebee53b9559ff22.tar.gz eclipse.platform.team-0e3293fc6a815dfe4d2f6fcc9ebee53b9559ff22.tar.xz eclipse.platform.team-0e3293fc6a815dfe4d2f6fcc9ebee53b9559ff22.zip |
refactoring progress..
Diffstat (limited to 'bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs')
61 files changed, 1210 insertions, 1782 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 824d4dd99..fa0f1f90e 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,10 +33,12 @@ 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.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSProviderPlugin; import org.eclipse.team.ccvs.core.CVSStatus; import org.eclipse.team.ccvs.core.CVSTag; import org.eclipse.team.ccvs.core.CVSTeamProvider; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.ccvs.core.ICVSListener; import org.eclipse.team.ccvs.core.ICVSProvider; import org.eclipse.team.ccvs.core.ICVSRemoteFolder; @@ -56,7 +58,7 @@ import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption; import org.eclipse.team.internal.ccvs.core.client.Command.QuietOption; 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.ICVSFolder; +import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; 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.FolderSyncInfo; @@ -116,7 +118,7 @@ public class CVSProvider implements ICVSProvider { project = ResourcesPlugin.getWorkspace().getRoot().getProject(new Path(sourceModule).lastSegment()); // Get the location of the workspace root - ICVSFolder root = Session.getManagedFolder(ResourcesPlugin.getWorkspace().getRoot().getLocation().toFile()); + ICVSFolder root = (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(project.getParent()); // Build the local options List localOptions = new ArrayList(); @@ -331,17 +333,7 @@ public class CVSProvider implements ICVSProvider { } - /** - * Get the print stream to which information from CVS commands - * is sent. - */ - public PrintStream getPrintStream() { - if (printStream == null) - return System.out; - else - return printStream; - } - + /** * @see ICVSProvider#getRepository(String) */ @@ -401,7 +393,7 @@ public class CVSProvider implements ICVSProvider { } // Set the folder sync info of the project to point to the remote module - ICVSFolder folder = (ICVSFolder)Session.getManagedResource(project); + ICVSFolder folder = (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(project); folder.setFolderSyncInfo(new FolderSyncInfo(moduleName, location.getLocation(), null, false)); // Register the project with Team @@ -470,7 +462,7 @@ public class CVSProvider implements ICVSProvider { public void setSharing(IProject project, FolderSyncInfo info, IProgressMonitor monitor) throws TeamException { // Ensure provided info matches that of the project - ICVSFolder folder = (ICVSFolder)Session.getManagedResource(project); + ICVSFolder folder = (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(project); FolderSyncInfo folderInfo = folder.getFolderSyncInfo(); if ( ! info.equals(folderInfo)) { throw new CVSException(new CVSStatus(CVSStatus.ERROR, Policy.bind("CVSProvider.infoMismatch", project.getName())));//$NON-NLS-1$ @@ -539,7 +531,7 @@ public class CVSProvider implements ICVSProvider { ITeamProvider provider = manager.getProvider(projects[i]); if (provider instanceof CVSTeamProvider) { CVSTeamProvider cvsProvider = (CVSTeamProvider)provider; - ICVSFolder folder = (ICVSFolder)Session.getManagedResource(projects[i]); + ICVSFolder folder = (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(projects[i]); FolderSyncInfo info = folder.getFolderSyncInfo(); if (info != null) { ICVSRepositoryLocation result = getRepository(info.getRoot()); diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProviderPlugin.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProviderPlugin.java index 7c1d05b3c..fdbf2ad12 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProviderPlugin.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProviderPlugin.java @@ -23,7 +23,7 @@ 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.client.Command.QuietOption; -import org.eclipse.team.internal.ccvs.core.resources.ICVSSynchronizer; +import org.eclipse.team.internal.ccvs.core.resources.*; import org.eclipse.team.internal.ccvs.core.syncinfo.*; import org.eclipse.team.internal.ccvs.core.syncinfo.FileSystemSynchronizer; import org.eclipse.team.internal.ccvs.core.util.OrphanedFolderListener; 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 diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/ICVSFile.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSFile.java index 995f59d81..20ad63336 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/ICVSFile.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSFile.java @@ -1,84 +1,85 @@ -package org.eclipse.team.internal.ccvs.core.resources;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-
-/**
- * The CVS analog of a file. CVS files have access to synchronization information
- * that describes their association with the CVS repository. CVS files also provide
- * mechanisms for sending and receiving content.
- *
- * @see ICVSResource
- */
-public interface ICVSFile extends ICVSResource {
-
- /**
- * Answers the size of the file.
- */
- long getSize();
-
- /**
- * Gets an input stream for reading from the file.
- * It is the responsibility of the caller to close the stream when finished.
- */
- InputStream getInputStream() throws CVSException;
-
- /**
- * Gets an output stream for writing to the file.
- * It is the responsibility of the caller to close the stream when finished.
- */
- OutputStream getOutputStream() throws CVSException;
-
- /**
- * Sets the file's read-only permission.
- */
- void setReadOnly(boolean readOnly) throws CVSException;
-
- /**
- * Move the resource to another location. Does overwrite without
- * promting.
- */
- void moveTo(String filename) throws CVSException;
-
- /**
- * Answers the current timestamp for this file. The returned format must be in the
- * following format:
- *
- * E MMM dd HH:mm:ss yyyy
- *
- * @throws CVSFileNotFoundException if exists() = false
- */
- String getTimeStamp() throws CVSFileNotFoundException;
-
- /**
- * Sets the current timestamp for this file. The supplied date must be in the
- * following format:
- *
- * E MMM dd HH:mm:ss yyyy
- *
- * If the date is <code>null</code> then the current time is used as
- * the timestamp.
- */
- void setTimeStamp(String date) throws CVSException;
-
- /**
- * Answers <code>true</code> if the file differs from its base. If the file has no
- * base, it is not dirty
- */
- boolean isDirty() throws CVSException;
-
- /**
- * Answers <code>true</code> if the file has changed since it was last updated
- * from the repository, if the file does not exist, or is not managed. And <code>false</code>
- * if it has not changed.
- */
- boolean isModified() throws CVSException;
+package org.eclipse.team.ccvs.core; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +import java.io.InputStream; +import java.io.OutputStream; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; +import org.eclipse.team.internal.ccvs.core.CVSException; + +/** + * The CVS analog of a file. CVS files have access to synchronization information + * that describes their association with the CVS repository. CVS files also provide + * mechanisms for sending and receiving content. + * + * @see ICVSResource + */ +public interface ICVSFile extends ICVSResource { + + /** + * Answers the size of the file. + */ + long getSize(); + + /** + * Gets an input stream for reading from the file. + * It is the responsibility of the caller to close the stream when finished. + */ + InputStream getInputStream() throws CVSException; + + /** + * Gets an output stream for writing to the file. + * It is the responsibility of the caller to close the stream when finished. + */ + OutputStream getOutputStream() throws CVSException; + + /** + * Sets the file's read-only permission. + */ + void setReadOnly(boolean readOnly) throws CVSException; + + /** + * Move the resource to another location. Does overwrite without + * promting. + */ + void moveTo(String filename) throws CVSException; + + /** + * Answers the current timestamp for this file. The returned format must be in the + * following format: + * + * E MMM dd HH:mm:ss yyyy + * + * @throws CVSFileNotFoundException if exists() = false + */ + String getTimeStamp(); + + /** + * Sets the current timestamp for this file. The supplied date must be in the + * following format: + * + * E MMM dd HH:mm:ss yyyy + * + * If the date is <code>null</code> then the current time is used as + * the timestamp. + */ + void setTimeStamp(String date) throws CVSException; + + /** + * Answers <code>true</code> if the file differs from its base. If the file has no + * base, it is not dirty + */ + boolean isDirty() throws CVSException; + + /** + * Answers <code>true</code> if the file has changed since it was last updated + * from the repository, if the file does not exist, or is not managed. And <code>false</code> + * if it has not changed. + */ + boolean isModified() throws CVSException; }
\ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/ICVSFolder.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSFolder.java index f5dbd3ae5..a183caf7d 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/ICVSFolder.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSFolder.java @@ -1,96 +1,96 @@ -package org.eclipse.team.internal.ccvs.core.resources;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.syncinfo.*;
-
-/**
- * The CVS analog of a directory. CVS folders have access to synchronization information
- * that describes the association between the folder and the remote repository.
- *
- * @see ICVSResource
- * @see ICVSFile
- */
-public interface ICVSFolder extends ICVSResource {
-
- /**
- * Answers the immediate folder children of this resource. This includes the union
- * of children that satisfy the following criteria:
- * <ul>
- * <li> exists but is not managed (not under CVS control)
- * <li> does not exist() but is managed (deleted folder)
- * <li> exist() and isManaged() (normal registered file)
- * </ul>
- * If the folder does not exist then a zero length array is returned.
- */
- ICVSFolder[] getFolders() throws CVSException;
-
- /**
- * Answers the immediate file children of this resource. This includes the union
- * of children that satisfy the following criteria:
- * <ul>
- * <li> exists but is not managed (not under CVS control)
- * <li> does not exist() but is managed (deleted file)
- * <li> exist() and isManaged() (normal registered file)
- * </ul>
- */
- ICVSFile[] getFiles() throws CVSException;
-
- /**
- * Answers a child folder of this resource with the given name or <code>null</code> if
- * the given folder does not have a child with that name.
- */
- ICVSFolder getFolder(String name) throws CVSException;
-
- /**
- * Answers a child file of this resource with the given name or <code>null</code> if
- * the given folder does not have a child with that name.
- */
- ICVSFile getFile(String name) throws CVSException;
-
- /**
- * Return the child resource at the given path relative to
- * the receiver.
- */
- ICVSResource getChild(String path) throws CVSException;
-
- /**
- * Create the folder if it did not exist before. Does only
- * work if the direct subfolder did exist.
- *
- * @throws CVSException if for some reason it was not possible to create the folder
- */
- void mkdir() throws CVSException;
-
- /**
- * Answers the folder's synchronization information or <code>null</code> if the folder
- * is not a CVS folder.
- * <p>
- * To modify the folder sync info the caller must call <code>setFolderSyncInfo</code> with
- * new sync information.</p>
- */
- FolderSyncInfo getFolderSyncInfo() throws CVSException;
-
- /**
- * Set the folder sync information for this folder. Setting the folder information
- * to <code>null</code> is not supported. The only mechanism for removing an existing
- * CVS folder is to delete the resource.
- */
- void setFolderSyncInfo(FolderSyncInfo folderInfo) throws CVSException;
-
- /**
- * Accepts the visitor on all files and all subFolder in the folder. Files are
- * visited first, then all the folders..
- */
- public void acceptChildren(ICVSResourceVisitor visitor) throws CVSException;
-
- /**
- * Answers <code>true</code> if the folder has CVS synchronization information and
- * <code>false</code> otherwise.
- */
- public boolean isCVSFolder();
+package org.eclipse.team.ccvs.core; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +import org.eclipse.team.internal.ccvs.core.CVSException; +import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; + +/** + * The CVS analog of a directory. CVS folders have access to synchronization information + * that describes the association between the folder and the remote repository. + * + * @see ICVSResource + * @see ICVSFile + */ +public interface ICVSFolder extends ICVSResource { + + /** + * Answers the immediate folder children of this resource. This includes the union + * of children that satisfy the following criteria: + * <ul> + * <li> exists but is not managed (not under CVS control) + * <li> does not exist() but is managed (deleted folder) + * <li> exist() and isManaged() (normal registered file) + * </ul> + * If the folder does not exist then a zero length array is returned. + */ + ICVSFolder[] getFolders() throws CVSException; + + /** + * Answers the immediate file children of this resource. This includes the union + * of children that satisfy the following criteria: + * <ul> + * <li> exists but is not managed (not under CVS control) + * <li> does not exist() but is managed (deleted file) + * <li> exist() and isManaged() (normal registered file) + * </ul> + */ + ICVSFile[] getFiles() throws CVSException; + + /** + * Answers a child folder of this resource with the given name or <code>null</code> if + * the given folder does not have a child with that name. + */ + ICVSFolder getFolder(String name) throws CVSException; + + /** + * Answers a child file of this resource with the given name or <code>null</code> if + * the given folder does not have a child with that name. + */ + ICVSFile getFile(String name) throws CVSException; + + /** + * Return the child resource at the given path relative to + * the receiver. + */ + ICVSResource getChild(String path) throws CVSException; + + /** + * Create the folder if it did not exist before. Does only + * work if the direct subfolder did exist. + * + * @throws CVSException if for some reason it was not possible to create the folder + */ + void mkdir() throws CVSException; + + /** + * Answers the folder's synchronization information or <code>null</code> if the folder + * is not a CVS folder. + * <p> + * To modify the folder sync info the caller must call <code>setFolderSyncInfo</code> with + * new sync information.</p> + */ + FolderSyncInfo getFolderSyncInfo() throws CVSException; + + /** + * Set the folder sync information for this folder. Setting the folder information + * to <code>null</code> is not supported. The only mechanism for removing an existing + * CVS folder is to delete the resource. + */ + void setFolderSyncInfo(FolderSyncInfo folderInfo) throws CVSException; + + /** + * Accepts the visitor on all files and all subFolder in the folder. Files are + * visited first, then all the folders.. + */ + public void acceptChildren(ICVSResourceVisitor visitor) throws CVSException; + + /** + * Answers <code>true</code> if the folder has CVS synchronization information and + * <code>false</code> otherwise. + */ + public boolean isCVSFolder(); }
\ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSProvider.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSProvider.java index 2877e9c39..0eb4f7d8b 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSProvider.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSProvider.java @@ -140,11 +140,7 @@ public interface ICVSProvider { */ public String[] getSupportedConnectionMethods(); - /** - * Get the stream to which command message and error output is sent - */ - public PrintStream getPrintStream(); - + /** * Set the print stream to which command message and error output is sent */ 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/ICVSResource.java index b57ab8371..9d288a464 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/ICVSResource.java @@ -1,137 +1,148 @@ -package org.eclipse.team.internal.ccvs.core.resources;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.syncinfo.*;
-
-/**
- * The CVS analog of file system files and directories. These are handles to
- * state maintained by a CVS client. That is, the CVS resource does not
- * actually contain data but rather represents CVS state and behavior. You are
- * free to manipulate handles for CVS resources that do not exist but be aware
- * that some methods require that an actual resource be available.
- * <p>
- * The CVS client has been designed to work on these handles uniquely. As such, the
- * handle could be to a remote resource or a local resource and the client could
- * perform CVS operations ignoring the actual location of the resources.</p>
- *
- * @see ICVSFolder
- * @see ICVSFile
- */
-public interface ICVSResource {
-
- /**
- * Answers the name of the resource.
- *
- * @return the name of the resource this handle represents. It can never
- * be <code>null</code>.
- */
- public String getName();
-
- /**
- * Answers if this resource has CVS synchronization information associated
- * with it.
- *
- * @return <code>true</code> if the resource is
- */
- public boolean isManaged();
-
- /**
- * Unmanage the given resource by purging any CVS synchronization associated with the
- * resource. The only way a resource can become managed is by running the
- * appropriate CVS commands (e.g. add/commit/update).
- */
- public void unmanage() throws CVSException;
-
- /**
- * Answer whether the resource could be ignored because it is in the one of the
- * ignore lists maintained by CVS. Even if a resource is ignored, it can still be
- * added to a repository, at which time it should never be ignored by the CVS
- * client.
- *
- * @return <code>true</code> if this resource is listed in one of the ignore
- * files maintained by CVS and <code>false</code> otherwise.
- */
- public boolean isIgnored();
-
- /**
- * Add the following file to the parent's ignore list
- */
- public void setIgnored() throws CVSException;
-
- /**
- * Add the following pattern to the file's parent ignore list
- */
- public void setIgnoredAs(String pattern) throws CVSException;
-
- /**
- * Answers if the handle is a file or a folder handle.
- *
- * @return <code>true</code> if this is a folder handle and <code>false</code> if
- * it is a file handle.
- */
- public boolean isFolder();
-
- /**
- * Answers if the resource identified by this handle exists.
- *
- * @return <code>true</code> if the resource represented by this handle
- * exists and <code>false</code> false otherwise.
- */
- public boolean exists() throws CVSException;
-
- /**
- * Answers the local relative path from the given ancestor to the receiver.
- *
- * @return the ancestor relative path for this resource.
- */
- public String getRelativePath(ICVSFolder ancestor) throws CVSException;
-
- /**
- * Get the remote location of a resource.
- *
- * @return the remote location.
- */
- public String getRemoteLocation(ICVSFolder stopSearching) throws CVSException;
-
- /**
- * Answers the workspace synchronization information for this resource. This would
- * typically include information from the <b>Entries</b> file that is used to track
- * the base revisions of local CVS resources.
- *
- * @return the synchronization information for this resource, or <code>null</code>
- * if the resource does not have synchronization information available.
- */
- public ResourceSyncInfo getSyncInfo() throws CVSException;
-
- /**
- * Called to set the workspace synchronization information for a resource. To
- * clear sync information call <code>unmanage</code>. The sync info will
- * become the persisted between workbench sessions.
- *
- * @param info the resource synchronization to associate with this resource.
- */
- public void setSyncInfo(ResourceSyncInfo info) throws CVSException;
-
- /**
- * Deletes the resource represented by the handle.
- */
- public void delete() throws CVSException;
-
- /**
- * Give the folder that contains this resource. If the resource is not managed
- * then the result of the operation is not specified.
- *
- * @return a handle to the parent of this resource.
- */
- public ICVSFolder getParent();
-
- /**
- * Accept a vistor to this resource.
- */
- public void accept(ICVSResourceVisitor visitor) throws CVSException;
+package org.eclipse.team.ccvs.core; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.internal.ccvs.core.CVSException; +import org.eclipse.team.internal.ccvs.core.syncinfo.*; + +/** + * The CVS analog of file system files and directories. These are handles to + * state maintained by a CVS client. That is, the CVS resource does not + * actually contain data but rather represents CVS state and behavior. You are + * free to manipulate handles for CVS resources that do not exist but be aware + * that some methods require that an actual resource be available. + * <p> + * The CVS client has been designed to work on these handles uniquely. As such, the + * handle could be to a remote resource or a local resource and the client could + * perform CVS operations ignoring the actual location of the resources.</p> + * + * @see ICVSFolder + * @see ICVSFile + */ +public interface ICVSResource { + + /** + * Answers the name of the resource. + * + * @return the name of the resource this handle represents. It can never + * be <code>null</code>. + */ + public String getName(); + + /** + * Answers if this resource has CVS synchronization information associated + * with it. + * + * @return <code>true</code> if the resource is + */ + public boolean isManaged(); + + /** + * Unmanage the given resource by purging any CVS synchronization associated with the + * resource. The only way a resource can become managed is by running the + * appropriate CVS commands (e.g. add/commit/update). + */ + public void unmanage() throws CVSException; + + /** + * Answer whether the resource could be ignored because it is in the one of the + * ignore lists maintained by CVS. Even if a resource is ignored, it can still be + * added to a repository, at which time it should never be ignored by the CVS + * client. + * + * @return <code>true</code> if this resource is listed in one of the ignore + * files maintained by CVS and <code>false</code> otherwise. + */ + public boolean isIgnored(); + + /** + * Add the following file to the parent's ignore list + */ + public void setIgnored() throws CVSException; + + /** + * Add the following pattern to the file's parent ignore list + */ + public void setIgnoredAs(String pattern) throws CVSException; + + /** + * Answers if the handle is a file or a folder handle. + * + * @return <code>true</code> if this is a folder handle and <code>false</code> if + * it is a file handle. + */ + public boolean isFolder(); + + /** + * Answers if the resource identified by this handle exists. + * + * @return <code>true</code> if the resource represented by this handle + * exists and <code>false</code> false otherwise. + */ + public boolean exists() throws CVSException; + + /** + * Answers the local relative path from the given ancestor to the receiver. + * + * @return the ancestor relative path for this resource. + */ + public String getRelativePath(ICVSFolder ancestor) throws CVSException; + + /** + * Get the remote location of a resource. + * + * @return the remote location. + */ + public String getRemoteLocation(ICVSFolder stopSearching) throws CVSException; + + /** + * Answers the workspace synchronization information for this resource. This would + * typically include information from the <b>Entries</b> file that is used to track + * the base revisions of local CVS resources. + * + * @return the synchronization information for this resource, or <code>null</code> + * if the resource does not have synchronization information available. + */ + public ResourceSyncInfo getSyncInfo() throws CVSException; + + /** + * Called to set the workspace synchronization information for a resource. To + * clear sync information call <code>unmanage</code>. The sync info will + * become the persisted between workbench sessions. + * + * @param info the resource synchronization to associate with this resource. + */ + public void setSyncInfo(ResourceSyncInfo info) throws CVSException; + + /** + * Deletes the resource represented by the handle. + */ + public void delete() throws CVSException; + + /** + * Give the folder that contains this resource. If the resource is not managed + * then the result of the operation is not specified. + * + * @return a handle to the parent of this resource. + */ + public ICVSFolder getParent(); + + /** + * Accept a vistor to this resource. + */ + public void accept(ICVSResourceVisitor visitor) throws CVSException; + + /** + * Reload sync info from for this resource and all child resources from disk + */ + public void reloadSyncInfo(IProgressMonitor monitor) throws CVSException; + + /** + * Save sync info from for this resource and all child resources from disk + */ + public void saveSyncInfo(IProgressMonitor monitor) throws CVSException; }
\ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/ICVSResourceVisitor.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSResourceVisitor.java index a61b0b6c4..c181ee8cc 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/ICVSResourceVisitor.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSResourceVisitor.java @@ -1,19 +1,17 @@ -package org.eclipse.team.internal.ccvs.core.resources;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import org.eclipse.team.internal.ccvs.core.CVSException;
-
-/**
- * Interface for an visitor of the IManagedResources.
- */
-public interface ICVSResourceVisitor {
-
- public void visitFile(ICVSFile file) throws CVSException;
- public void visitFolder(ICVSFolder folder) throws CVSException;
-
-}
-
+package org.eclipse.team.ccvs.core; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +import org.eclipse.team.internal.ccvs.core.CVSException; + +/** + * Interface for an visitor of the IManagedResources. + */ +public interface ICVSResourceVisitor { + public void visitFile(ICVSFile file) throws CVSException; + public void visitFolder(ICVSFolder folder) throws CVSException; +} + diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AbstractMessageCommand.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AbstractMessageCommand.java index 7e5cba7b9..ae5b410c4 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AbstractMessageCommand.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AbstractMessageCommand.java @@ -6,10 +6,11 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; +import org.eclipse.team.ccvs.core.ICVSResource; 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.resources.ICVSResource; /** * Superclass for commands that do not change the structure on diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AbstractStructureVisitor.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AbstractStructureVisitor.java index 7dd8544b6..87c5db444 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AbstractStructureVisitor.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AbstractStructureVisitor.java @@ -6,12 +6,11 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSResourceVisitor; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.resources.CVSEntryLineTag; -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.ICVSResourceVisitor; -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.Assert; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Add.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Add.java index db81258e3..a50c0f01f 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Add.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Add.java @@ -6,14 +6,15 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSStatus; +import org.eclipse.team.ccvs.core.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSResource; +import org.eclipse.team.ccvs.core.ICVSResourceVisitor; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.Policy; 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.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.syncinfo.FolderSyncInfo; import org.eclipse.team.internal.ccvs.core.util.Assert; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AddStructureVisitor.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AddStructureVisitor.java index eb664c723..fd5a10dbd 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AddStructureVisitor.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AddStructureVisitor.java @@ -9,9 +9,9 @@ import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; -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.util.Assert; /** diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CheckedInHandler.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CheckedInHandler.java index bb655c8f4..9a7d0ced2 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CheckedInHandler.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CheckedInHandler.java @@ -6,10 +6,9 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; -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.syncinfo.*; import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; /** 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 419e1b0fc..2213b5c9e 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 @@ -7,8 +7,11 @@ package org.eclipse.team.internal.ccvs.core.client; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSStatus; import org.eclipse.team.ccvs.core.CVSTag; +import org.eclipse.team.ccvs.core.ICVSResource; +import org.eclipse.team.ccvs.core.ICVSResourceVisitor; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.Policy; import org.eclipse.team.internal.ccvs.core.client.Command.GlobalOption; @@ -17,8 +20,6 @@ import org.eclipse.team.internal.ccvs.core.client.Command.Option; import org.eclipse.team.internal.ccvs.core.client.listeners.ICommandOutputListener; import org.eclipse.team.internal.ccvs.core.client.listeners.ModuleDefinitionsListener; 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.resources.RemoteModule; import org.eclipse.team.internal.ccvs.core.util.Assert; 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 bbaf2f28c..45ab49512 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 @@ -18,13 +18,12 @@ import org.eclipse.core.runtime.MultiStatus; import org.eclipse.team.ccvs.core.CVSProviderPlugin; import org.eclipse.team.ccvs.core.CVSStatus; import org.eclipse.team.ccvs.core.CVSTag; +import org.eclipse.team.ccvs.core.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSResource; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.Policy; import org.eclipse.team.internal.ccvs.core.client.listeners.ICommandOutputListener; import org.eclipse.team.internal.ccvs.core.resources.CVSFileNotFoundException; -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.LocalResource; /** * Abstract base class for the commands which implements the ICommand @@ -312,9 +311,7 @@ public abstract class Command { monitor = Policy.monitorFor(monitor); monitor.beginTask(Policy.bind("Command.loadingSyncInfo"), 100 * resources.length);//$NON-NLS-1$ for (int i = 0; i < resources.length; i++) { - if(resources[i] instanceof LocalResource && resources[i].exists()) { - CVSProviderPlugin.getSynchronizer().reload(((LocalResource)resources[i]).getLocalFile(), Policy.subMonitorFor(monitor, 100)); - } + resources[i].reloadSyncInfo(Policy.subMonitorFor(monitor, 100)); } } finally { monitor.done(); @@ -332,9 +329,7 @@ public abstract class Command { monitor = Policy.monitorFor(monitor); monitor.beginTask(Policy.bind("Command.savingSyncInfo"), 100 * resources.length);//$NON-NLS-1$ for (int i = 0; i < resources.length; i++) { - if(resources[i] instanceof LocalResource) { - CVSProviderPlugin.getSynchronizer().save(((LocalResource)resources[i]).getLocalFile(), Policy.subMonitorFor(monitor, 100)); - } + resources[i].saveSyncInfo(Policy.subMonitorFor(monitor, 100)); } } finally { monitor.done(); diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Commit.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Commit.java index 721d388c2..b11cf7375 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Commit.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Commit.java @@ -6,11 +6,11 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSResource; 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.resources.ICVSFile; -import org.eclipse.team.internal.ccvs.core.resources.ICVSResource; public class Commit extends Command { /*** Local options: specific to commit ***/ diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CopyHandler.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CopyHandler.java index 210ade9ed..39387390f 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CopyHandler.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CopyHandler.java @@ -6,9 +6,9 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; -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.util.Assert; /** diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Diff.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Diff.java index 5aa2b17e0..6a8183852 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Diff.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Diff.java @@ -7,12 +7,13 @@ package org.eclipse.team.internal.ccvs.core.client; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.team.ccvs.core.*; +import org.eclipse.team.ccvs.core.ICVSResource; 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.listeners.ICommandOutputListener; import org.eclipse.team.internal.ccvs.core.connection.CVSServerException; -import org.eclipse.team.internal.ccvs.core.resources.ICVSResource; /** * Runs the CVS diff command. diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/DiffStructureVisitor.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/DiffStructureVisitor.java index 6d94c0b2c..c820db88b 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/DiffStructureVisitor.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/DiffStructureVisitor.java @@ -4,10 +4,8 @@ package org.eclipse.team.internal.ccvs.core.client; * All Rights Reserved. */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; import org.eclipse.team.internal.ccvs.core.CVSException; -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.syncinfo.*; import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; /** diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ExpandModules.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ExpandModules.java index 9d8ffb4c7..66280a5cf 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ExpandModules.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ExpandModules.java @@ -7,10 +7,11 @@ package org.eclipse.team.internal.ccvs.core.client; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.team.ccvs.core.*; +import org.eclipse.team.ccvs.core.ICVSResource; 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.resources.ICVSResource; public class ExpandModules extends Command { diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/FileStructureVisitor.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/FileStructureVisitor.java index ca98df7ce..7db300be7 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/FileStructureVisitor.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/FileStructureVisitor.java @@ -9,9 +9,9 @@ import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFile; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; /** * This visitor send the fileStructure to the requestSender. 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 2a7ed6902..a0abe7784 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 @@ -6,11 +6,12 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; +import org.eclipse.team.ccvs.core.ICVSResource; +import org.eclipse.team.ccvs.core.ICVSResourceVisitor; 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.resources.ICVSResource; -import org.eclipse.team.internal.ccvs.core.resources.ICVSResourceVisitor; public class Import extends Command { /*** Local options: specific to import ***/ diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ImportStructureVisitor.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ImportStructureVisitor.java index 8db40237c..937114194 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ImportStructureVisitor.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ImportStructureVisitor.java @@ -8,9 +8,9 @@ package org.eclipse.team.internal.ccvs.core.client; import java.util.StringTokenizer; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; -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.syncinfo.ResourceSyncInfo; import org.eclipse.team.internal.ccvs.core.util.FileNameMatcher; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/NewEntryHandler.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/NewEntryHandler.java index 904815da8..679dbb116 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/NewEntryHandler.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/NewEntryHandler.java @@ -6,9 +6,9 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; -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.syncinfo.ResourceSyncInfo; public class NewEntryHandler extends ResponseHandler { diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/PruneFolderVisitor.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/PruneFolderVisitor.java index 30b3635ee..b58159f35 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/PruneFolderVisitor.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/PruneFolderVisitor.java @@ -5,10 +5,10 @@ package org.eclipse.team.internal.ccvs.core.client; * All Rights Reserved. */ +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSResourceVisitor; import org.eclipse.team.internal.ccvs.core.CVSException; -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.ICVSResourceVisitor; /** * Goes recursivly through the folders checks if they are empyty diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RTag.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RTag.java index 251bae6df..0f6c5136d 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RTag.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RTag.java @@ -11,12 +11,13 @@ import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSTag; import org.eclipse.team.ccvs.core.ICVSRemoteResource; +import org.eclipse.team.ccvs.core.ICVSResource; 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.resources.ICVSResource; public class RTag extends Command { /*** Local options: specific to tag ***/ diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Remove.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Remove.java index 930328d51..a62719d94 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Remove.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Remove.java @@ -6,10 +6,11 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; +import org.eclipse.team.ccvs.core.ICVSResource; 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.resources.ICVSResource; public class Remove extends Command { /*** Local options: specific to remove ***/ diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RemoveEntryHandler.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RemoveEntryHandler.java index 49776b0a0..208fab03e 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RemoveEntryHandler.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RemoveEntryHandler.java @@ -6,9 +6,9 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; -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.util.Assert; /** diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RemovedHandler.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RemovedHandler.java index 38b31032f..796161fa9 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RemovedHandler.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RemovedHandler.java @@ -6,9 +6,9 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; -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.util.Assert; /** diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ResponseHandler.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ResponseHandler.java index f5fd6ebca..c01565358 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ResponseHandler.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ResponseHandler.java @@ -6,9 +6,10 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.resources.CVSEntryLineTag; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; import org.eclipse.team.internal.ccvs.core.syncinfo.*; import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; import org.eclipse.team.internal.ccvs.core.util.Util; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java index 722881b06..59e6974e5 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java @@ -6,7 +6,6 @@ package org.eclipse.team.internal.ccvs.core.client; */ import java.io.ByteArrayInputStream; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -14,18 +13,15 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.ccvs.core.ICVSRepositoryLocation; +import org.eclipse.team.ccvs.core.ICVSResource; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.Policy; import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation; import org.eclipse.team.internal.ccvs.core.connection.Connection; -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.LocalFile; -import org.eclipse.team.internal.ccvs.core.resources.LocalFolder; 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.Util; @@ -183,28 +179,6 @@ public class Session { } /** - * Gives you an LocalFolder for a absolute path in - * platform dependend style. - * - * @throws CVSException on path.indexOf("CVS") != -1 - * @throws CVSException on internal IOExeption - */ - public static ICVSFolder getManagedFolder(File folder) throws CVSException { - return new LocalFolder(folder); - } - public static ICVSFile getManagedFile(File file) throws CVSException { - return new LocalFile(file); - } - - public static ICVSResource getManagedResource(IResource resource) throws CVSException { - File file = resource.getLocation().toFile(); - if (resource.getType() == IResource.FILE) - return getManagedFile(file); - else - return getManagedFolder(file); - } - - /** * Returns the local root folder for this session. * <p> * Generally speaking, specifies the "current working directory" at @@ -778,4 +752,6 @@ public class Session { boolean isOutputToConsole() { return outputToConsole; } + + } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/StaticHandler.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/StaticHandler.java index 36c099bd4..16ff3baee 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/StaticHandler.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/StaticHandler.java @@ -6,8 +6,9 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; import org.eclipse.team.internal.ccvs.core.syncinfo.*; import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; import org.eclipse.team.internal.ccvs.core.util.Assert; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/StickyHandler.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/StickyHandler.java index 00adcca10..b27dc6e9e 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/StickyHandler.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/StickyHandler.java @@ -6,9 +6,10 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.resources.CVSEntryLineTag; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; import org.eclipse.team.internal.ccvs.core.syncinfo.*; import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; import org.eclipse.team.internal.ccvs.core.util.Assert; 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 aedbdb29c..2bb5e359e 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 @@ -6,10 +6,11 @@ package org.eclipse.team.internal.ccvs.core.client; */ import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; +import org.eclipse.team.ccvs.core.ICVSResource; 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.resources.ICVSResource; public class Tag extends Command { /*** Local options: specific to tag ***/ diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Update.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Update.java index 9b874367c..2349f5214 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Update.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Update.java @@ -9,15 +9,16 @@ import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSProviderPlugin; import org.eclipse.team.ccvs.core.CVSTag; +import org.eclipse.team.ccvs.core.ICVSResource; +import org.eclipse.team.ccvs.core.ICVSResourceVisitor; 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.listeners.ICommandOutputListener; import org.eclipse.team.internal.ccvs.core.client.listeners.UpdateListener; -import org.eclipse.team.internal.ccvs.core.resources.ICVSResource; -import org.eclipse.team.internal.ccvs.core.resources.ICVSResourceVisitor; public class Update extends Command { /*** Local options: specific to update ***/ diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/UpdatedHandler.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/UpdatedHandler.java index 7dbf2f89e..602d0ed8a 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/UpdatedHandler.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/UpdatedHandler.java @@ -8,9 +8,9 @@ package org.eclipse.team.internal.ccvs.core.client; import java.util.Date; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; -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.syncinfo.ResourceSyncInfo; import org.eclipse.team.internal.ccvs.core.util.Assert; import org.eclipse.team.internal.ccvs.core.util.EntryFileDateFormat; @@ -78,7 +78,7 @@ class UpdatedHandler extends ResponseHandler { boolean readOnly = permissionsLine.indexOf(READ_ONLY_FLAG) == -1; session.receiveFile(mFile, binary, monitor); - if (readOnly) mFile.setReadOnly(); + if (readOnly) mFile.setReadOnly(true); // Set the timestamp in the file, set the result in the fileInfo String timestamp = null; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ValidRequests.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ValidRequests.java index 1cfafb721..fe10f61f0 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ValidRequests.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ValidRequests.java @@ -1,10 +1,11 @@ package org.eclipse.team.internal.ccvs.core.client; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; +import org.eclipse.team.ccvs.core.ICVSResource; 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.resources.ICVSResource; /* * (c) Copyright IBM Corp. 2000, 2002. diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/DiffListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/DiffListener.java index 2f972bd87..2a4e5fa04 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/DiffListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/DiffListener.java @@ -9,8 +9,9 @@ import java.io.PrintStream; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSStatus; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSFolder; public class DiffListener implements ICommandOutputListener { PrintStream patchStream; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ICommandOutputListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ICommandOutputListener.java index f29c8238c..642d40d2d 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ICommandOutputListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ICommandOutputListener.java @@ -7,9 +7,10 @@ package org.eclipse.team.internal.ccvs.core.client.listeners; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSStatus; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.Policy; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; public interface ICommandOutputListener { diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java index 228bb299c..87a82a3a8 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java @@ -10,10 +10,10 @@ import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSTag; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.resources.RemoteFile; -import org.eclipse.team.internal.ccvs.core.client.listeners.LogEntry; public class LogListener implements ICommandOutputListener { private List entries; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ModuleDefinitionsListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ModuleDefinitionsListener.java index 8a16a0566..78aa8134c 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ModuleDefinitionsListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ModuleDefinitionsListener.java @@ -10,8 +10,9 @@ import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSStatus; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSFolder; /* * This class pares the output of the "cvs checkout -c" command which returns the list of modules 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 cda878cf5..b96d2859f 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 @@ -9,8 +9,9 @@ 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.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSStatus; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSFolder; public class StatusListener implements ICommandOutputListener { private static boolean isFolder = false; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/UpdateListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/UpdateListener.java index 89a7c69cf..b90cf98e5 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/UpdateListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/UpdateListener.java @@ -10,11 +10,12 @@ 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.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSProviderPlugin; import org.eclipse.team.ccvs.core.CVSStatus; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.client.Update; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; public class UpdateListener implements ICommandOutputListener { static final String SERVER_PREFIX = "cvs server: "; //$NON-NLS-1$ diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSLocalSyncElement.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSLocalSyncElement.java index 43c8f92fd..f8af2d450 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSLocalSyncElement.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSLocalSyncElement.java @@ -8,6 +8,7 @@ package org.eclipse.team.internal.ccvs.core.resources; import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
+import org.eclipse.team.ccvs.core.*;
import org.eclipse.team.core.sync.ILocalSyncElement;
import org.eclipse.team.core.sync.IRemoteResource;
import org.eclipse.team.core.sync.LocalSyncElement;
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSRemoteSyncElement.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSRemoteSyncElement.java index 2601ebf00..baae9c0fa 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSRemoteSyncElement.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSRemoteSyncElement.java @@ -9,7 +9,9 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.team.ccvs.core.CVSProviderPlugin;
+import org.eclipse.team.ccvs.core.ICVSFolder;
import org.eclipse.team.ccvs.core.ICVSRemoteResource;
+import org.eclipse.team.ccvs.core.ICVSResource;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.sync.ILocalSyncElement;
import org.eclipse.team.core.sync.IRemoteResource;
@@ -18,7 +20,6 @@ import org.eclipse.team.core.sync.RemoteSyncElement; 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.client.Session;
import org.eclipse.team.internal.ccvs.core.client.Update;
import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
@@ -33,7 +34,7 @@ public class CVSRemoteSyncElement extends RemoteSyncElement { public CVSRemoteSyncElement(boolean ignoreBaseTree, IResource local, IRemoteResource base, IRemoteResource remote) {
localSync = new CVSLocalSyncElement(local, base);
this.remote = remote;
- this.ignoreBaseTree = ignoreBaseTree;
+ this.ignoreBaseTree = ignoreBaseTree;
}
/*
@@ -201,13 +202,13 @@ public class CVSRemoteSyncElement extends RemoteSyncElement { } else {
// We have conflicting deletions. Clear the sync info
local.setSyncInfo(null);
- CVSProviderPlugin.getSynchronizer().save(((LocalResource)local).getLocalFile(), Policy.monitorFor(monitor));
+ local.saveSyncInfo(Policy.monitorFor(monitor));
return;
}
}
info = new ResourceSyncInfo(info.getName(), revision, ResourceSyncInfo.DUMMY_TIMESTAMP, info.getKeywordMode(), local.getParent().getFolderSyncInfo().getTag(), info.getPermissions());
local.setSyncInfo(info);
- CVSProviderPlugin.getSynchronizer().save(((LocalResource)local).getLocalFile(), Policy.monitorFor(monitor));
+ local.saveSyncInfo(Policy.monitorFor(monitor));
}
/*
@@ -218,7 +219,7 @@ public class CVSRemoteSyncElement extends RemoteSyncElement { // To make outgoing deletions incoming, the local will not exist but
// it is still important to unmanage (e.g. delete all meta info) for the
// deletion.
- Session.getManagedResource(getLocal()).unmanage();
+ CVSWorkspaceRoot.getCVSResourceFor(getLocal()).unmanage();
}
/*
@@ -259,7 +260,7 @@ public class CVSRemoteSyncElement extends RemoteSyncElement { FolderSyncInfo remoteInfo = remote.getFolderSyncInfo();
FolderSyncInfo localInfo = local.getParent().getFolderSyncInfo();
local.setFolderSyncInfo(new FolderSyncInfo(remoteInfo.getRepository(), remoteInfo.getRoot(), localInfo.getTag(), localInfo.getIsStatic()));
- CVSProviderPlugin.getSynchronizer().save(((LocalResource)local).getLocalFile(), Policy.monitorFor(monitor));
+ local.saveSyncInfo(Policy.monitorFor(monitor));
}
/*
* @see ILocalSyncElement#getSyncKind(int, IProgressMonitor)
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..025b12364 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java @@ -0,0 +1,109 @@ +package org.eclipse.team.internal.ccvs.core.resources; + +/* + * (c) Copyright IBM Corp. 2000, 2002. + * All Rights Reserved. + */ + +import java.io.File; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.Path; +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.internal.ccvs.core.CVSException; +import org.eclipse.team.internal.ccvs.core.CVSProvider; +import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; + +public class CVSWorkspaceRoot { + + private ICVSFolder localRoot; + + public CVSWorkspaceRoot(IContainer resource){ + this.localRoot = getCVSFolderFor(resource); + } + +/* public CVSWorkspaceRoot(File resource){ + try { + this.localRoot = getCVSFolderFor(resource); + } catch(ClassCastException e) { + this.localRoot = null; + } + } +*/ + /* + * @see ICVSWorkspaceRoot#getCVSResourceFor(File) + */ +/* public static ICVSResource getCVSResourceFor(File resource) { + if (resource.exists()) { + if (resource.isDirectory()) { + return new LocalFolder(resource); + } else { + return new LocalFile(resource); + } + } + return null; + } +*/ + /* + * @see ICVSWorkspaceRoot#getRemoteResourceFor(IResource) + */ + 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; + } + + /* + * @see ICVSWorkspaceRoot#getRemoteRoot() + */ + public ICVSRepositoryLocation getRemoteLocation() throws CVSException { + return CVSProvider.getInstance().getRepository(localRoot.getFolderSyncInfo().getRoot()); + } + + /* + * @see ICVSWorkspaceRoot#getLocalRoot() + */ + public ICVSFolder getLocalRoot() { + return localRoot; + } + + /** + * Gives you an LocalFolder for a absolute path in + * platform dependend style. + * + * @throws CVSException on path.indexOf("CVS") != -1 + * @throws CVSException on internal IOExeption + */ + 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); + } + +}
\ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseFile.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseFile.java index bd5d77de3..b2957c444 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseFile.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseFile.java @@ -15,8 +15,12 @@ import java.util.Date; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.team.ccvs.core.CVSProviderPlugin; +import org.eclipse.team.ccvs.core.ICVSFile; +import org.eclipse.team.ccvs.core.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSResourceVisitor; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.Policy; import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; @@ -26,7 +30,7 @@ import org.eclipse.team.internal.ccvs.core.util.EntryFileDateFormat; * Represents handles to CVS resource on the local file system. Synchronization * information is taken from the CVS subdirectories. */ -public class EclipseFile extends EclipseResource implements ICVSFile { +class EclipseFile extends EclipseResource implements ICVSFile { /** * Create a handle based on the given local resource. @@ -63,7 +67,7 @@ public class EclipseFile extends EclipseResource implements ICVSFile { /* * @see ICVSFile#getTimeStamp() */ - public String getTimeStamp() throws CVSFileNotFoundException { + public String getTimeStamp() { EntryFileDateFormat timestamp = new EntryFileDateFormat(); return timestamp.format(new Date(getIOFile().lastModified())); } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseFolder.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseFolder.java index 2c144d9b2..8e4a55bda 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseFolder.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseFolder.java @@ -16,6 +16,7 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSProviderPlugin; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; @@ -27,7 +28,7 @@ import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; * * @see ICVSFolder */ -public class EclipseFolder extends EclipseResource implements ICVSFolder { +class EclipseFolder extends EclipseResource implements ICVSFolder { protected EclipseFolder(IContainer container) { super(container); @@ -206,6 +207,9 @@ public class EclipseFolder extends EclipseResource implements ICVSFolder { */ public void setFolderSyncInfo(FolderSyncInfo folderInfo) throws CVSException { CVSProviderPlugin.getSynchronizer().setFolderSync(getIOFile(), folderInfo); + // the server won't add directories as sync info, therefore it must be done when + // a directory is shared with the repository. + setSyncInfo(new ResourceSyncInfo(getName())); } /* diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseResource.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseResource.java index 63907f38f..4ed893b12 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseResource.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseResource.java @@ -10,7 +10,10 @@ import java.io.File; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.team.ccvs.core.CVSProviderPlugin; +import org.eclipse.team.ccvs.core.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSResource; import org.eclipse.team.core.IIgnoreInfo; import org.eclipse.team.core.TeamPlugin; import org.eclipse.team.internal.ccvs.core.CVSException; @@ -19,7 +22,6 @@ import org.eclipse.team.internal.ccvs.core.client.Session; 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.FileNameMatcher; -import org.eclipse.team.internal.ccvs.core.util.FileUtil; import org.eclipse.team.internal.ccvs.core.util.SyncFileUtil; import org.eclipse.team.internal.ccvs.core.util.Util; @@ -30,7 +32,7 @@ import org.eclipse.team.internal.ccvs.core.util.Util; * @see LocalFolder * @see LocalFile */ -public abstract class EclipseResource implements ICVSResource { +abstract class EclipseResource implements ICVSResource { // The seperator that must be used when creating CVS resource paths. Never use // the platform default seperator since it is not compatible with CVS resources. @@ -206,7 +208,9 @@ public abstract class EclipseResource implements ICVSResource { * @see ICVSResource#setSyncInfo(ResourceSyncInfo) */ public void setSyncInfo(ResourceSyncInfo info) throws CVSException { - CVSProviderPlugin.getSynchronizer().setResourceSync(getIOFile(), info); + if (getParent().isCVSFolder()) { + CVSProviderPlugin.getSynchronizer().setResourceSync(getIOFile(), info); + } } /* @@ -230,4 +234,18 @@ public abstract class EclipseResource implements ICVSResource { protected File getIOFile() { return resource.getLocation().toFile(); } + + /* + * @see ICVSResource#reloadSyncInfo(IProgressMonitor) + */ + public void reloadSyncInfo(IProgressMonitor monitor) throws CVSException { + CVSProviderPlugin.getSynchronizer().reload(getIOFile(), monitor); + } + + /* + * @see ICVSResource#saveSyncInfo(IProgressMonitor) + */ + public void saveSyncInfo(IProgressMonitor monitor) throws CVSException { + CVSProviderPlugin.getSynchronizer().save(getIOFile(), monitor); + } }
\ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFile.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFile.java deleted file mode 100644 index 95f647ca7..000000000 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFile.java +++ /dev/null @@ -1,159 +0,0 @@ -package org.eclipse.team.internal.ccvs.core.resources;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2001.
- * All Rights Reserved.
- */
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.text.ParseException;
-import java.util.Date;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.team.ccvs.core.CVSProviderPlugin;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.Policy;
-import org.eclipse.team.internal.ccvs.core.syncinfo.*;
-import org.eclipse.team.internal.ccvs.core.util.EntryFileDateFormat;
-import org.eclipse.team.internal.ccvs.core.util.Util;
-
-/**
- * Represents handles to CVS resource on the local file system. Synchronization
- * information is taken from the CVS subdirectories.
- *
- * @see LocalFolder
- * @see LocalFile
- */
-public class LocalFile extends LocalResource implements ICVSFile {
- /**
- * Create a handle based on the given local resource.
- */
- protected LocalFile(File file) {
- super(file);
- }
-
- public long getSize() {
- return ioResource.length();
- }
-
- public InputStream getInputStream() throws CVSException {
- try {
- return new FileInputStream(ioResource);
- } catch (IOException e) {
- throw CVSException.wrapException(e);
- }
- }
-
- public OutputStream getOutputStream() throws CVSException {
- try {
- return new FileOutputStream(ioResource);
- } catch (IOException e) {
- throw CVSException.wrapException(e);
- }
- }
-
- public void setReadOnly(boolean readOnly) throws CVSException {
- if(readOnly) {
- ioResource.setReadOnly();
- }
- }
-
- public String getTimeStamp() throws CVSFileNotFoundException {
- EntryFileDateFormat timestamp = new EntryFileDateFormat();
- return timestamp.format(new Date(ioResource.lastModified()));
- }
-
- public void setTimeStamp(String date) throws CVSException {
- long millSec;
- if (date==null) {
- // get the current time
- millSec = new Date().getTime();
- } else {
- try {
- EntryFileDateFormat timestamp = new EntryFileDateFormat();
- millSec = timestamp.toDate(date).getTime();
- } catch (ParseException e) {
- throw new CVSException(Policy.bind("LocalFile.invalidDateFormat", date), e); //$NON-NLS-1$
- }
- }
- ioResource.setLastModified(millSec);
- }
-
- public boolean isFolder() {
- return false;
- }
-
- public boolean isDirty() throws CVSException {
- if (!exists() || !isManaged()) {
- return true;
- } else {
- ResourceSyncInfo info = getSyncInfo();
- if (info.isAdded()) return false;
- if (info.isDeleted()) return true;
- return !getTimeStamp().equals(info.getTimeStamp());
- }
- }
-
- public boolean isModified() throws CVSException {
- if (!exists() || !isManaged()) {
- return true;
- } else {
- ResourceSyncInfo info = getSyncInfo();
- return !getTimeStamp().equals(info.getTimeStamp());
- }
- }
-
- public void accept(ICVSResourceVisitor visitor) throws CVSException {
- visitor.visitFile(this);
- }
-
- /*
- * This is to be used by the Copy handler. The filename of the form .#filename
- */
- public void moveTo(String filename) throws CVSException {
-
- // Move the file to newFile (we know we do not need the
- // original any more anyway)
- // If this file exists then overwrite it
- LocalFile file;
- try {
- file = (LocalFile)getParent().getFile(filename);
- } catch(ClassCastException e) {
- throw CVSException.wrapException(e);
- }
-
- // We are deleting the old .#filename if it exists
- if (file.exists()) {
- file.delete();
- }
-
- boolean success = ioResource.renameTo(file.getFile());
-
- if (!success) {
- throw new CVSException(Policy.bind("LocalFile.moveFailed", ioResource.toString(), file.toString())); //$NON-NLS-1$
- }
- }
-
- File getFile() {
- return ioResource;
- }
-
- /**
- * @see ICVSResource#getRemoteLocation()
- */
- public String getRemoteLocation(ICVSFolder stopSearching) throws CVSException {
- return getParent().getRemoteLocation(stopSearching) + SEPARATOR + getName();
- }
- /*
- * @see ICVSResource#unmanage()
- */
- public void unmanage() throws CVSException {
- CVSProviderPlugin.getSynchronizer().deleteResourceSync(ioResource);
- }
-}
\ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFolder.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFolder.java deleted file mode 100644 index 9911a74b2..000000000 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalFolder.java +++ /dev/null @@ -1,264 +0,0 @@ -package org.eclipse.team.internal.ccvs.core.resources;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-import java.io.File;
-import java.io.FileFilter;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.team.ccvs.core.CVSProviderPlugin;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.Policy;
-import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
-import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
-
-/**
- * Implements the ICVSFolder interface on top of an
- * instance of the ICVSFolder interface
- *
- * @see ICVSFolder
- */
-public class LocalFolder extends LocalResource implements ICVSFolder {
-
- protected LocalFolder(File ioResource) {
- super(ioResource);
- }
-
- /**
- *
- * @see ICVSFolder#getFolders()
- */
- public ICVSFolder[] getFolders() throws CVSException {
-
- if(!getLocalFile().exists()) {
- return new ICVSFolder[0];
- }
-
- final List folders = new ArrayList();
-
- ResourceSyncInfo[] syncDirs = CVSProviderPlugin.getSynchronizer().members(ioResource);
- for (int i = 0; i < syncDirs.length; i++) {
- if(syncDirs[i].isDirectory()) {
- folders.add((new LocalFolder(new File(ioResource, syncDirs[i].getName()))));
- }
- }
-
- File[] realDirs = ioResource.listFiles(new FileFilter() {
- public boolean accept(File file) {
- if(file.isDirectory()) {
- LocalFolder cvsFolder = new LocalFolder(file);
- if(!cvsFolder.isIgnored() && !folders.contains(cvsFolder)) {
- folders.add(cvsFolder);
- }
- }
- return false;
- }
- });
-
- return (ICVSFolder[]) folders.toArray(new ICVSFolder[folders.size()]);
- }
-
- /**
- * @see ICVSFolder#getFiles()
- */
- public ICVSFile[] getFiles() throws CVSException {
-
- if(!getLocalFile().exists()) {
- return new ICVSFile[0];
- }
-
- final List files = new ArrayList();
-
- ResourceSyncInfo[] syncDirs = CVSProviderPlugin.getSynchronizer().members(ioResource);
- for (int i = 0; i < syncDirs.length; i++) {
- if(!syncDirs[i].isDirectory()) {
- files.add((new LocalFile(new File(ioResource, syncDirs[i].getName()))));
- }
- }
-
- File[] realDirs = ioResource.listFiles(new FileFilter() {
- public boolean accept(File file) {
- if(!file.isDirectory()) {
- LocalFile cvsFile = new LocalFile(file);
- if(!cvsFile.isIgnored() && !files.contains(cvsFile)) {
- files.add(cvsFile);
- }
- }
- return false;
- }
- });
- return (ICVSFile[]) files.toArray(new ICVSFile[files.size()]);
- }
-
- /**
- * @see ICVSFolder#createFolder(String)
- */
- public ICVSFolder getFolder(String name) throws CVSException {
- if ((CURRENT_LOCAL_FOLDER.equals(name)) || ((CURRENT_LOCAL_FOLDER + SEPARATOR).equals(name)))
- return this;
- return new LocalFolder(new File(ioResource, name));
- }
-
- /**
- * @see ICVSFolder#createFile(String)
- */
- public ICVSFile getFile(String name) throws CVSException {
- return new LocalFile(new File(ioResource, name));
- }
-
- /**
- * @see ICVSFolder#getChild(String)
- */
- public ICVSResource getChild(String name) throws CVSException {
-
- boolean isDirectory;
-
- File child = new File(ioResource, name);
- if(child.exists()) {
- isDirectory = child.isDirectory();
- } else {
- LocalFile localFile = new LocalFile(child);
- ResourceSyncInfo info = localFile.getSyncInfo();
- if (info == null)
- throw new CVSFileNotFoundException(Policy.bind("LocalFolder.invalidChild", child.getAbsolutePath())); //$NON-NLS-1$
- isDirectory = info.isDirectory();
- }
-
- if(isDirectory) {
- return getFolder(name);
- } else {
- return getFile(name);
- }
- }
- /**
- * @see ICVSFolder#mkdir()
- */
- public void mkdir() throws CVSException {
- ioResource.mkdir();
- }
-
- /**
- * @see ICVSResource#isFolder()
- */
- public boolean isFolder() {
- return true;
- }
-
-// /**
-// * Remove the fileInfo for a specific file. If it was not there
-// * before nothing happens.
-// *
-// * @param file has to satisfy file.getParent().equals(this)
-// */
-// void removeFileInfo(IManagedFile file) throws CVSException {
-//
-// Assert.isTrue(file.getParent().equals(this));
-//
-// fileInfoContainer.removeFileInfo(file.getName());
-// }
-
- /**
- * @see ICVSFolder#acceptChildren(ICVSResourceVisitor)
- */
- public void acceptChildren(ICVSResourceVisitor visitor) throws CVSException {
-
- ICVSResource[] subFiles;
- ICVSResource[] subFolders;
-
- subFiles = getFiles();
- subFolders = getFolders();
-
- for (int i=0; i<subFiles.length; i++) {
- subFiles[i].accept(visitor);
- }
-
- for (int i=0; i<subFolders.length; i++) {
- subFolders[i].accept(visitor);
- }
- }
-
- /**
- * @see ICVSResource#accept(ICVSResourceVisitor)
- */
- public void accept(ICVSResourceVisitor visitor) throws CVSException {
- visitor.visitFolder(this);
- }
-
- /**
- * @see ICVSResource#getRemoteLocation(ICVSFolder)
- */
- public String getRemoteLocation(ICVSFolder stopSearching) throws CVSException {
-
- String parentLocation;
-
- if (getFolderSyncInfo() != null) {
- return getFolderSyncInfo().getRemoteLocation();
- }
-
- if (equals(stopSearching)) {
- return null;
- }
-
- parentLocation = getParent().getRemoteLocation(stopSearching);
- if (parentLocation == null) {
- return null;
- } else {
- return parentLocation + SEPARATOR + getName();
- }
-
- }
-
- /*
- * @see ICVSFolder#childExists(String)
- */
- public boolean childExists(String path) {
- return false;
- }
-
- /*
- * @see ICVSFolder#getFolderInfo()
- */
- public FolderSyncInfo getFolderSyncInfo() throws CVSException {
- return CVSProviderPlugin.getSynchronizer().getFolderSync(ioResource);
- }
-
- /*
- * @see ICVSFolder#setFolderInfo(FolderSyncInfo)
- */
- public void setFolderSyncInfo(FolderSyncInfo folderInfo) throws CVSException {
- CVSProviderPlugin.getSynchronizer().setFolderSync(ioResource, folderInfo);
- }
-
- /*
- * @see ICVSFolder#isCVSFolder()
- */
- public boolean isCVSFolder() {
- try {
- return CVSProviderPlugin.getSynchronizer().getFolderSync(ioResource) != null;
- } catch(CVSException e) {
- return false;
- }
- }
-
- /*
- * @see ICVSResource#unmanage()
- */
- public void unmanage() throws CVSException {
- CVSProviderPlugin.getSynchronizer().deleteFolderSync(ioResource, new NullProgressMonitor());
- }
-
- /*
- * @see ICVSResource#isIgnored()
- */
- public boolean isIgnored() {
- if(isCVSFolder()) {
- return false;
- }
- return super.isIgnored();
- }
-}
\ No newline at end of file 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 deleted file mode 100644 index b619a8650..000000000 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/LocalResource.java +++ /dev/null @@ -1,219 +0,0 @@ -package org.eclipse.team.internal.ccvs.core.resources;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-import java.io.File;
-
-import org.eclipse.team.ccvs.core.CVSProviderPlugin;
-import org.eclipse.team.core.IIgnoreInfo;
-import org.eclipse.team.core.TeamPlugin;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.Policy;
-import org.eclipse.team.internal.ccvs.core.client.Session;
-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.FileNameMatcher;
-import org.eclipse.team.internal.ccvs.core.util.FileUtil;
-import org.eclipse.team.internal.ccvs.core.util.SyncFileUtil;
-import org.eclipse.team.internal.ccvs.core.util.Util;
-
-/**
- * Represents handles to CVS resource on the local file system. Synchronization
- * information is taken from the CVS subdirectories.
- *
- * @see LocalFolder
- * @see LocalFile
- */
-public abstract class LocalResource implements ICVSResource {
-
- // The seperator that must be used when creating CVS resource paths. Never use
- // the platform default seperator since it is not compatible with CVS resources.
- protected static final String SEPARATOR = Session.SERVER_SEPARATOR;
- protected static final String CURRENT_LOCAL_FOLDER = Session.CURRENT_LOCAL_FOLDER;
-
- /**
- * The local file represented by this handle.
- */
- File ioResource;
-
- /**
- * A local handle
- */
- protected LocalResource(File ioResource) {
- Assert.isNotNull(ioResource);
- this.ioResource = ioResource;
- }
-
- /**
- * Get the extention of the path of resource
- * relative to the path of root
- *
- * @throws CVSException if root is not a root-folder of resource
- */
- public String getRelativePath(ICVSFolder root)
- throws CVSException {
-
- LocalResource rootFolder;
- String result;
-
- try {
- rootFolder = (LocalResource)root;
- } catch (ClassCastException e) {
- throw new CVSException(Policy.bind("LocalResource.invalidResourceClass"),e); //$NON-NLS-1$
- }
-
- result = Util.getRelativePath(rootFolder.getPath(),getPath());
- return result;
- }
-
- /**
- * Do a DEEP delete.
- * @see ICVSResource#delete()
- */
- public void delete() {
- FileUtil.deepDelete(ioResource);
- // XXX Should we clear the cache in all cases?
- // XXX If not, should we provide a boolean parameter as a choice
- }
-
- /**
- * @see ICVSResource#exists()
- */
- public boolean exists() {
- return ioResource.exists();
- }
-
- /**
- * @see ICVSResource#getParent()
- */
- public ICVSFolder getParent() {
- File parentFile = ioResource.getParentFile();
- if (parentFile == null) return null;
- return new LocalFolder(parentFile);
- }
-
- /**
- * @see ICVSResource#getName()
- */
- public String getName() {
- return ioResource.getName();
- }
-
- /**
- * @see ICVSResource#isIgnored()
- */
- public boolean isIgnored() {
- // a managed resource is never ignored
- if(isManaged()) {
- return false;
- }
-
- // initialize matcher with global ignores and basic CVS ignore patterns
- IIgnoreInfo[] ignorePatterns = TeamPlugin.getManager().getGlobalIgnore();
- FileNameMatcher matcher = new FileNameMatcher(SyncFileUtil.BASIC_IGNORE_PATTERNS);
- for (int i = 0; i < ignorePatterns.length; i++) {
- IIgnoreInfo info = ignorePatterns[i];
- if(info.getEnabled()) {
- matcher.register(info.getPattern(), "true"); //$NON-NLS-1$
- }
- }
-
- // 1. check CVS default patterns and global ignores
- boolean ignored = matcher.match(ioResource.getName());
-
- // 2. check .cvsignore file
- if(!ignored) {
- ignored = CVSProviderPlugin.getSynchronizer().isIgnored(ioResource);
- }
-
- // 3. check the parent
- if(!ignored) {
- ICVSFolder parent = getParent();
- if(parent==null) return false;
- return parent.isIgnored();
- } else {
- return ignored;
- }
- }
-
- public void setIgnored() throws CVSException {
- CVSProviderPlugin.getSynchronizer().setIgnored(ioResource, null);
- }
-
- public void setIgnoredAs(String pattern) throws CVSException {
- CVSProviderPlugin.getSynchronizer().setIgnored(ioResource, pattern);
- }
-
- /**
- * @see ICVSResource#isManaged()
- */
- public boolean isManaged() {
- try {
- return getSyncInfo() != null;
- } catch(CVSException e) {
- return false;
- }
- }
-
- /**
- * Two ManagedResources are equal, if there cvsResources are
- * equal (and that is, if the point to the same file)
- */
- public boolean equals(Object obj) {
-
- if (!(obj instanceof LocalResource)) {
- return false;
- } else {
- return getPath().equals(((LocalResource) obj).getPath());
- }
- }
-
- /*
- * @see ICVSResource#getPath()
- */
- public String getPath() {
- return ioResource.getAbsolutePath();
- }
-
- /*
- * @see ICVSResource#isFolder()
- */
- public boolean isFolder() {
- return false;
- }
-
- /*
- * @see ICVSResource#getSyncInfo()
- */
- public ResourceSyncInfo getSyncInfo() throws CVSException {
- return CVSProviderPlugin.getSynchronizer().getResourceSync(ioResource);
- }
-
- /*
- * @see ICVSResource#setSyncInfo(ResourceSyncInfo)
- */
- public void setSyncInfo(ResourceSyncInfo info) throws CVSException {
- CVSProviderPlugin.getSynchronizer().setResourceSync(ioResource, info);
- }
-
- /*
- * Implement the hashcode on the underlying strings, like it is done in the equals.
- */
- public int hashCode() {
- return getPath().hashCode();
- }
-
- /*
- * Give the pathname back
- */
- public String toString() {
- return getPath();
- }
-
- public File getLocalFile() {
- return ioResource;
- }
-}
\ No newline at end of file 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 ebc2f958c..869f6fc75 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 @@ -16,6 +16,7 @@ import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSStatus; import org.eclipse.team.ccvs.core.CVSTag; import org.eclipse.team.ccvs.core.ICVSRemoteFile; @@ -326,7 +327,7 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile, ICVSFi /** * @see IManagedFile#getTimeStamp() */ - public String getTimeStamp() throws CVSFileNotFoundException { + public String getTimeStamp() { return info.getTimeStamp(); } 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 a86058f4d..6fc3a6b70 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 @@ -16,6 +16,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSStatus; import org.eclipse.team.ccvs.core.CVSTag; import org.eclipse.team.ccvs.core.ICVSRemoteFile; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTree.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTree.java index 2bf59497e..9fb0013c4 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTree.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTree.java @@ -7,6 +7,7 @@ package org.eclipse.team.internal.ccvs.core.resources; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSTag; import org.eclipse.team.ccvs.core.ICVSRemoteResource; import org.eclipse.team.ccvs.core.ICVSRepositoryLocation; diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/RemoteFolderTreeBuilder.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTreeBuilder.java index 10ce7a171..b186d6202 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/RemoteFolderTreeBuilder.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTreeBuilder.java @@ -1,556 +1,554 @@ -package org.eclipse.team.internal.ccvs.core.util;
-
-/*
- * (c) Copyright IBM Corp. 2000, 2002.
- * All Rights Reserved.
- */
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IContainer;
-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.team.ccvs.core.CVSProviderPlugin;
-import org.eclipse.team.ccvs.core.CVSStatus;
-import org.eclipse.team.ccvs.core.CVSTag;
-import org.eclipse.team.ccvs.core.ICVSRemoteResource;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.Policy;
-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.client.Update;
-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.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.resources.ICVSFile;
-import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder;
-import org.eclipse.team.internal.ccvs.core.resources.RemoteFile;
-import org.eclipse.team.internal.ccvs.core.resources.RemoteFolderTree;
-import org.eclipse.team.internal.ccvs.core.resources.RemoteResource;
-import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
-import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
-
-/*
- * This class is responsible for building a remote tree that shows the repository
- * state of a locally loaded folder tree.
- *
- * It is used as follows
- *
- * RemoteFolderTreeBuilder.buildRemoteTree(CVSRepositoryLocation, IManagedFolder, String, IProgressMonitor);
- *
- * The provider IManagedFolder can be a local resource or a RemoteFolderTree that
- * that was previously built.
- */
-public class RemoteFolderTreeBuilder {
-
- private Map fileDeltas;
- private List changedFiles;
- private Map remoteFolderTable;
-
- private ICVSFolder root;
- private RemoteFolderTree remoteRoot;
- private CVSRepositoryLocation repository;
-
- private CVSTag tag;
-
- private LocalOption[] updateLocalOptions;
-
- private boolean projectDoesNotExist = false;
-
- private static String UNKNOWN = ""; //$NON-NLS-1$
- private static String DELETED = "DELETED"; //$NON-NLS-1$
- private static String ADDED = "ADDED"; //$NON-NLS-1$
- private static String FOLDER = "FOLDER"; //$NON-NLS-1$
-
- private static Map EMPTY_MAP = new HashMap();
-
- static class DeltaNode {
- int syncState = Update.STATE_NONE;
- String name;
- String revision;
-
- DeltaNode(String name, String revision, int syncState) {
- this.name = name;
- this.revision = revision;
- this.syncState = syncState;
- }
-
- String getName() {
- return name;
- }
-
- String getRevision() {
- return revision;
- }
-
- int getSyncState() {
- return syncState;
- }
- }
-
-
- private RemoteFolderTreeBuilder(CVSRepositoryLocation repository, ICVSFolder root, CVSTag tag) {
- this.repository = repository;
- this.root = root;
- this.tag = tag;
- this.fileDeltas = new HashMap();
- this.changedFiles = new ArrayList();
- this.remoteFolderTable = new HashMap();
-
- // Build the local options
- List localOptions = new ArrayList();
- localOptions.add(Update.RETRIEVE_ABSENT_DIRECTORIES);
- if (tag != null) {
- if (tag.getType() == CVSTag.HEAD) {
- localOptions.add(Update.CLEAR_STICKY);
- } else {
- localOptions.add(Update.makeTagOption(tag));
- }
- }
- updateLocalOptions = (LocalOption[])localOptions.toArray(new LocalOption[localOptions.size()]);
- }
-
- private LocalOption[] getOptionsWithoutTag() {
- // Build the local options
- List localOptions = new ArrayList();
- localOptions.add(Update.RETRIEVE_ABSENT_DIRECTORIES);
- return (LocalOption[])localOptions.toArray(new LocalOption[localOptions.size()]);
- }
-
- public static RemoteFolderTree buildBaseTree(CVSRepositoryLocation repository, ICVSFolder root, CVSTag tag, IProgressMonitor monitor) throws CVSException {
- RemoteFolderTreeBuilder builder = new RemoteFolderTreeBuilder(repository, root, tag);
- return builder.buildBaseTree(null, root, monitor);
- }
-
- public static RemoteFolderTree buildRemoteTree(CVSRepositoryLocation repository, IContainer root, CVSTag tag, IProgressMonitor monitor) throws CVSException {
- return buildRemoteTree(repository, Session.getManagedFolder(root.getLocation().toFile()), tag, monitor);
- }
-
- public static RemoteFolderTree buildRemoteTree(CVSRepositoryLocation repository, ICVSFolder root, CVSTag tag, IProgressMonitor monitor) throws CVSException {
- RemoteFolderTreeBuilder builder = new RemoteFolderTreeBuilder(repository, root, tag);
- return builder.buildTree(monitor);
- }
-
- private RemoteFolderTree buildTree(IProgressMonitor monitor) throws CVSException {
- Session session = new Session(repository, root, false);
- session.open(monitor);
- try {
- fetchDelta(session, monitor);
- if (projectDoesNotExist) {
- return null;
- }
- } finally {
- session.close();
- }
- // FIXME: We need a second session because of the use of a different handle on the same remote resource
- // We didn't need one before!!! Perhaps we could support the changing of a sessions root as long as
- // the folder sync info is the same
- remoteRoot =
- new RemoteFolderTree(null, root.getName(), repository,
- new Path(root.getFolderSyncInfo().getRepository()),
- tagForRemoteFolder(root, tag));
- session = new Session(repository, remoteRoot, false);
- session.open(monitor);
- try {
- buildRemoteTree(session, root, remoteRoot, Path.EMPTY, monitor);
- if (!changedFiles.isEmpty())
- fetchFileRevisions(session, (String[])changedFiles.toArray(new String[changedFiles.size()]), monitor);
- return remoteRoot;
- } finally {
- session.close();
- }
- }
-
- /*
- * Build the base remote tree from the local tree.
- *
- * The localPath is used to retrieve deltas from the recorded deltas
- *
- */
- private RemoteFolderTree buildBaseTree(RemoteFolderTree parent, ICVSFolder local, IProgressMonitor monitor) throws CVSException {
-
- // Create a remote folder tree corresponding to the local resource
- RemoteFolderTree remote = new RemoteFolderTree(parent, local.getName(), repository, new Path(local.getFolderSyncInfo().getRepository()), local.getFolderSyncInfo().getTag());
-
- // Create a List to contain the created children
- List children = new ArrayList();
-
- // Build the child folders corresponding to local folders base
- ICVSFolder[] folders = local.getFolders();
- for (int i=0;i<folders.length;i++) {
- if (folders[i].isManaged() && folders[i].isCVSFolder()) {
- children.add(buildBaseTree(remote, folders[i], monitor));
- }
- }
-
- // Build the child files corresponding to local files base
- ICVSFile[] files = local.getFiles();
- for (int i=0;i<files.length;i++) {
- ICVSFile file = files[i];
- ResourceSyncInfo info = file.getSyncInfo();
- // if there is no sync info then there is no base
- if (info==null)
- continue;
- // There is no remote if the file was added
- if (info.isAdded())
- continue;
- // If the file was deleted locally, we need to generate a new sync info without the delete flag
- if (info.isDeleted())
- info = new ResourceSyncInfo(info.getName(), info.getRevision(), info.getTimeStamp(), info.getKeywordMode(), info.getTag(), info.getPermissions());
- children.add(new RemoteFile(remote, info));
- }
-
- // Add the children to the remote folder tree
- remote.setChildren((ICVSRemoteResource[])children.toArray(new ICVSRemoteResource[children.size()]));
-
- return remote;
- }
-
- /*
- * Build the remote tree from the local tree and the recorded deltas.
- *
- * The localPath is used to retrieve deltas from the recorded deltas
- *
- */
- private void buildRemoteTree(Session session, ICVSFolder local, RemoteFolderTree remote, IPath localPath, IProgressMonitor monitor) throws CVSException {
-
- // Add the remote folder to the remote folder lookup table (used to update file revisions)
- remoteFolderTable.put(remote.getFolderSyncInfo().getRemoteLocation(), remote);
-
- // Create a map to contain the created children
- Map children = new HashMap();
-
- // If there's no corresponding local resource then we need to fetch its contents in order to populate the deltas
- if (local == null) {
- fetchNewDirectory(session, remote, localPath, monitor);
- }
-
- // Fetch the delta's for the folder
- Map deltas = (Map)fileDeltas.get(localPath);
- if (deltas == null)
- deltas = EMPTY_MAP;
-
- // If there is a local, use the local children to start buidling the remote children
- if (local != null) {
- // Build the child folders corresponding to local folders
- ICVSFolder[] folders = local.getFolders();
- for (int i=0;i<folders.length;i++) {
- DeltaNode d = (DeltaNode)deltas.get(folders[i].getName());
- if (folders[i].isCVSFolder() && ! isOrphanedSubtree(session, folders[i]) && (d==null || d.getRevision() != DELETED)) {
- children.put(folders[i].getName(),
- new RemoteFolderTree(remote, folders[i].getName(), repository,
- new Path(folders[i].getFolderSyncInfo().getRepository()),
- tagForRemoteFolder(folders[i],tag)));
- }
- }
- // Build the child files corresponding to local files
- ICVSFile[] files = local.getFiles();
- for (int i=0;i<files.length;i++) {
- ICVSFile file = files[i];
-
- DeltaNode d = (DeltaNode)deltas.get(file.getName());
- ResourceSyncInfo info = file.getSyncInfo();
- // if there is no sync info then there isn't a remote file for this local file on the
- // server.
- if (info==null)
- continue;
- // There is no remote if the file was added and we didn't get a conflict (C) indicator from the server
- if (info.isAdded() && d==null)
- continue;
- // There is no remote if the file was deleted and we didn;t get a remove (R) indicator from the server
- if (info.isDeleted() && d==null)
- continue;
-
- int type = d==null ? Update.STATE_NONE : d.getSyncState();
- children.put(file.getName(), new RemoteFile(remote, type, info));
- }
- }
-
- // Build the children for new or out-of-date resources from the deltas
- Iterator i = deltas.keySet().iterator();
- while (i.hasNext()) {
- String name = (String)i.next();
- DeltaNode d = (DeltaNode)deltas.get(name);
- String revision = d.getRevision();
- if (revision == FOLDER) {
- // XXX should getRemotePath() return an IPath instead of a String?
- children.put(name, new RemoteFolderTree(remote, repository,
- new Path(remote.getRepositoryRelativePath()).append(name),
- tagForRemoteFolder(remote, tag)));
- } else if (revision == ADDED) {
- children.put(name, new RemoteFile(remote, d.getSyncState(), name, tagForRemoteFolder(remote, tag)));
- } else if (revision == UNKNOWN) {
- // The local resource is out of sync with the remote.
- // Create a RemoteFile associated with the tag so we are assured of getting the proper revision
- // (Note: this will replace the RemoteFile added from the local base)
- children.put(name, new RemoteFile(remote, d.getSyncState(), name, tagForRemoteFolder(remote, tag)));
- } else if (revision == DELETED) {
- // This should have been deleted while creating from the local resources.
- // If it wasn't, delete it now.
- if (children.containsKey(name))
- children.remove(name);
- } else {
- // We should never get here
- }
- }
-
- // Add the children to the remote folder tree
- remote.setChildren((ICVSRemoteResource[])children.values().toArray(new ICVSRemoteResource[children.size()]));
-
- // We have to delay building the child folders to support the proper fetching of new directories
- // due to the fact that the same CVS home directory (i.e. the same root directory) must
- // be used for all requests sent over the same connection
- Iterator childIterator = children.entrySet().iterator();
- List emptyChildren = new ArrayList();
- while (childIterator.hasNext()) {
- Map.Entry entry = (Map.Entry)childIterator.next();
- if (((RemoteResource)entry.getValue()).isFolder()) {
- RemoteFolderTree remoteFolder = (RemoteFolderTree)entry.getValue();
- String name = (String)entry.getKey();
- ICVSFolder localFolder;
- DeltaNode d = (DeltaNode)deltas.get(name);
- // for directories that are new on the server
- if (d!=null && d.getRevision() == FOLDER)
- localFolder = null;
- else
- localFolder = local.getFolder(name);
- buildRemoteTree(session, localFolder, remoteFolder, localPath.append(name), monitor);
- // Record any children that are empty
- if (pruneEmptyDirectories() && remoteFolder.getChildren().length == 0) {
- // Prune if the local folder is also empty.
- if (localFolder == null || (localFolder.getFiles().length == 0 && localFolder.getFolders().length == 0))
- emptyChildren.add(remoteFolder);
- else {
- // Also prune if the tag we are fetching is not HEAD and differs from the tag of the local folder
- FolderSyncInfo info = localFolder.getFolderSyncInfo();
- if (tag != null && info != null && ! tag.equals(CVSTag.DEFAULT) && ! tag.equals(info.getTag()))
- emptyChildren.add(remoteFolder);
- }
- }
- }
- }
-
- // Prune any empty child folders
- if (pruneEmptyDirectories() && !emptyChildren.isEmpty()) {
- List newChildren = new ArrayList();
- newChildren.addAll(Arrays.asList(remote.getChildren()));
- newChildren.removeAll(emptyChildren);
- remote.setChildren((ICVSRemoteResource[])newChildren.toArray(new ICVSRemoteResource[newChildren.size()]));
-
- }
- }
-
- /*
- * This method fetches the delta between the local state and the remote state of the resource tree
- * and records the deltas in the fileDeltas instance variable
- *
- * Returns the list of changed files
- */
- private List fetchDelta(Session session, IProgressMonitor monitor) throws CVSException {
-
- // Create an listener that will accumulate new and removed files and folders
- final List newChildDirectories = new ArrayList();
- IUpdateMessageListener listener = new IUpdateMessageListener() {
- public void directoryInformation(IPath path, boolean newDirectory) {
- if (newDirectory) {
- // Record new directory with parent so it can be retrieved when building the parent
- recordDelta(path, FOLDER, Update.STATE_NONE);
- // Record new directory to be used as a parameter to fetch its contents
- newChildDirectories.add(path.toString());
- }
- }
- public void directoryDoesNotExist(IPath path) {
- // Record removed directory with parent so it can be removed when building the parent
- if (path.isEmpty()) {
- projectDoesNotExist = true;
- } else {
- recordDelta(path, DELETED, Update.STATE_NONE);
- }
- }
- public void fileInformation(int type, String filename) {
- // Cases that do not require action are:
- // case 'A' : = A locally added file that does not exists remotely
- // case '?' : = A local file that has not been added and does not exists remotely
- // case 'M' : = A locally modified file that has not been modified remotely
- switch(type) {
- case Update.STATE_MERGEABLE_CONFLICT :
- case Update.STATE_CONFLICT :
- // We have an remote change to a modified local file
- // The change could be a local change conflicting with a remote deletion.
- // If so, the deltas may already have a DELETED for the file.
- // We shouldn't override this DELETED
- IPath filePath = new Path(filename);
- Map deltas = deltas = (Map)fileDeltas.get(filePath.removeLastSegments(1));
- DeltaNode d = deltas != null ? (DeltaNode)deltas.get(filePath.lastSegment()) : null;
- if ((d!=null) && (d.getRevision() == DELETED))
- break;
- case Update.STATE_DELETED : // We have a locally removed file that still exists remotely
- case Update.STATE_REMOTE_CHANGES : // We have an remote change to an unmodified local file
- changedFiles.add(filename);
- recordDelta(new Path(filename), UNKNOWN, type);
- break;
- }
- }
- public void fileDoesNotExist(String filename) {
- recordDelta(new Path(filename), DELETED, Update.STATE_NONE);
- }
- };
-
- // Perform a "cvs -n update -d [-r tag] ." in order to get the
- // messages from the server that will indicate what has changed on the
- // server.
- IStatus status = Command.UPDATE.execute(session,
- new GlobalOption[] { Command.DO_NOT_CHANGE },
- updateLocalOptions,
- new String[] { Session.CURRENT_LOCAL_FOLDER },
- new UpdateListener(listener),
- monitor);
- return changedFiles;
- }
-
- private void fetchNewDirectory(Session session, RemoteFolderTree newFolder, IPath localPath, IProgressMonitor monitor) throws CVSException {
-
- // Create an listener that will accumulate new files and folders
- IUpdateMessageListener listener = new IUpdateMessageListener() {
- public void directoryInformation(IPath path, boolean newDirectory) {
- if (newDirectory) {
- // Record new directory with parent so it can be retrieved when building the parent
- // NOTE: Check path prefix
- recordDelta(path, FOLDER, Update.STATE_NONE);
- }
- }
- public void directoryDoesNotExist(IPath path) {
- }
- public void fileInformation(int type, String filename) {
- // NOTE: Check path prefix
- changedFiles.add(filename);
- recordDelta(new Path(filename), ADDED, type);
- }
- public void fileDoesNotExist(String filename) {
- }
- };
-
- // NOTE: Should use the path relative to the remoteRoot
- IPath path = new Path(newFolder.getRepositoryRelativePath());
- IStatus status = Command.UPDATE.execute(session,
- new GlobalOption[] { Command.DO_NOT_CHANGE },
- updateLocalOptions,
- new String[] { localPath.toString() },
- new UpdateListener(listener),
- monitor);
- if (status.getCode() == CVSStatus.SERVER_ERROR) {
- // FIXME: This should be refactored (maybe static methods on CVSException?)
- CVSServerException e = new CVSServerException(status);
- if ( ! e.isNoTagException() && e.containsErrors())
- throw e;
- // we now know that this is an exception caused by a cvs bug.
- // if the folder has no files in it (just subfolders) cvs does not respond with the subfolders...
- // workaround: retry the request with no tag to get the directory names (if any)
- Policy.checkCanceled(monitor);
- status = Command.UPDATE.execute(session,
- new GlobalOption[] { Command.DO_NOT_CHANGE },
- getOptionsWithoutTag(),
- new String[] { localPath.toString() },
- new UpdateListener(listener),
- monitor);
- if (status.getCode() == CVSStatus.SERVER_ERROR) {
- throw new CVSServerException(status);
- }
- }
- }
-
- // Get the file revisions for the given filenames
- private void fetchFileRevisions(Session session, String[] fileNames, IProgressMonitor monitor) throws CVSException {
-
- // Create a listener for receiving the revision info
- final int[] count = new int[] {0};
- final Map revisions = new HashMap();
- IStatusListener listener = new IStatusListener() {
- public void fileStatus(IPath path, String remoteRevision) {
- try {
- updateRevision(path, remoteRevision);
- count[0]++;
- } catch (CVSException e) {
- // The count will be off which will trigger another exception
- CVSProviderPlugin.log(e);
- }
- }
- };
-
- // Perform a "cvs status..." with a custom message handler
- IStatus status = Command.STATUS.execute(session,
- Command.NO_GLOBAL_OPTIONS,
- Command.NO_LOCAL_OPTIONS,
- fileNames,
- new StatusListener(listener),
- monitor);
- if (status.getCode() == CVSStatus.SERVER_ERROR) {
- throw new CVSServerException(status);
- }
-
- // XXX we can't make this check because it may be valid to call this method
- // without any file names (e.g. fileNames array empty) which would run the
- // status on all files.
- //if (count[0] != fileNames.length)
- // throw new CVSException(Policy.bind("RemoteFolder.errorFetchingRevisions"));
- }
-
- private boolean pruneEmptyDirectories() {
- return CVSProviderPlugin.getPlugin().getPruneEmptyDirectories();
- }
- /*
- * Record the deltas in a double map where the outer key is the parent directory
- * and the inner key is the file name. The value is the revision of the file or
- * DELETED (file or folder). New folders have a revision of FOLDER.
- *
- * A revison of UNKNOWN indicates that the revision has not been fetched
- * from the repository yet.
- */
- private void recordDelta(IPath path, String revision, int syncState) {
- IPath parent = path.removeLastSegments(1);
- Map deltas = (Map)fileDeltas.get(parent);
- if (deltas == null) {
- deltas = new HashMap();
- fileDeltas.put(parent, deltas);
- }
- String name = path.lastSegment();
- deltas.put(name, new DeltaNode(name, revision, syncState));
- }
-
- private void updateRevision(IPath path, String revision) throws CVSException {
- RemoteFolderTree folder = (RemoteFolderTree)remoteFolderTable.get(path.removeLastSegments(1).toString());
- ((RemoteFile)folder.getFile(path.lastSegment())).setRevision(revision);
- }
-
- /*
- * Return the tag that should be associated with a remote folder.
- *
- * This method is used to ensure that new directories contain the tag
- * derived from the parant local folder when appropriate. For instance,
- *
- * The tag should be the provided tag. However, if tag is null, the
- * tag for the folder should be derived from the provided reference folder
- * which could be the local resource corresponding to the remote or the parent
- * of the remote.
- */
- private CVSTag tagForRemoteFolder(ICVSFolder folder, CVSTag tag) throws CVSException {
- return tag == null ? folder.getFolderSyncInfo().getTag() : tag;
- }
-
- private boolean isOrphanedSubtree(Session session, ICVSFolder mFolder) {
- return mFolder.isCVSFolder() && ! mFolder.isManaged() && ! mFolder.equals(session.getLocalRoot()) && mFolder.getParent().isCVSFolder();
- }
-}
-
+package org.eclipse.team.internal.ccvs.core.resources; + +/* + * (c) Copyright IBM Corp. 2000, 2002. + * All Rights Reserved. + */ + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.resources.IContainer; +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.team.ccvs.core.CVSProviderPlugin; +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.internal.ccvs.core.CVSException; +import org.eclipse.team.internal.ccvs.core.Policy; +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.client.Update; +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.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.FolderSyncInfo; +import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; +import org.omg.CORBA.UNKNOWN; + +/* + * This class is responsible for building a remote tree that shows the repository + * state of a locally loaded folder tree. + * + * It is used as follows + * + * RemoteFolderTreeBuilder.buildRemoteTree(CVSRepositoryLocation, IManagedFolder, String, IProgressMonitor); + * + * The provider IManagedFolder can be a local resource or a RemoteFolderTree that + * that was previously built. + */ +public class RemoteFolderTreeBuilder { + + private Map fileDeltas; + private List changedFiles; + private Map remoteFolderTable; + + private ICVSFolder root; + private RemoteFolderTree remoteRoot; + private CVSRepositoryLocation repository; + + private CVSTag tag; + + private LocalOption[] updateLocalOptions; + + private boolean projectDoesNotExist = false; + + private static String UNKNOWN = ""; //$NON-NLS-1$ + private static String DELETED = "DELETED"; //$NON-NLS-1$ + private static String ADDED = "ADDED"; //$NON-NLS-1$ + private static String FOLDER = "FOLDER"; //$NON-NLS-1$ + + private static Map EMPTY_MAP = new HashMap(); + + static class DeltaNode { + int syncState = Update.STATE_NONE; + String name; + String revision; + + DeltaNode(String name, String revision, int syncState) { + this.name = name; + this.revision = revision; + this.syncState = syncState; + } + + String getName() { + return name; + } + + String getRevision() { + return revision; + } + + int getSyncState() { + return syncState; + } + } + + + private RemoteFolderTreeBuilder(CVSRepositoryLocation repository, ICVSFolder root, CVSTag tag) { + this.repository = repository; + this.root = root; + this.tag = tag; + this.fileDeltas = new HashMap(); + this.changedFiles = new ArrayList(); + this.remoteFolderTable = new HashMap(); + + // Build the local options + List localOptions = new ArrayList(); + localOptions.add(Update.RETRIEVE_ABSENT_DIRECTORIES); + if (tag != null) { + if (tag.getType() == CVSTag.HEAD) { + localOptions.add(Update.CLEAR_STICKY); + } else { + localOptions.add(Update.makeTagOption(tag)); + } + } + updateLocalOptions = (LocalOption[])localOptions.toArray(new LocalOption[localOptions.size()]); + } + + private LocalOption[] getOptionsWithoutTag() { + // Build the local options + List localOptions = new ArrayList(); + localOptions.add(Update.RETRIEVE_ABSENT_DIRECTORIES); + return (LocalOption[])localOptions.toArray(new LocalOption[localOptions.size()]); + } + + public static RemoteFolderTree buildBaseTree(CVSRepositoryLocation repository, ICVSFolder root, CVSTag tag, IProgressMonitor monitor) throws CVSException { + RemoteFolderTreeBuilder builder = new RemoteFolderTreeBuilder(repository, root, tag); + return builder.buildBaseTree(null, root, monitor); + } + + public static RemoteFolderTree buildRemoteTree(CVSRepositoryLocation repository, IContainer root, CVSTag tag, IProgressMonitor monitor) throws CVSException { + return buildRemoteTree(repository, CVSWorkspaceRoot.getCVSFolderFor(root), tag, monitor); + } + + public static RemoteFolderTree buildRemoteTree(CVSRepositoryLocation repository, ICVSFolder root, CVSTag tag, IProgressMonitor monitor) throws CVSException { + RemoteFolderTreeBuilder builder = new RemoteFolderTreeBuilder(repository, root, tag); + return builder.buildTree(monitor); + } + + private RemoteFolderTree buildTree(IProgressMonitor monitor) throws CVSException { + Session session = new Session(repository, root, false); + session.open(monitor); + try { + fetchDelta(session, monitor); + if (projectDoesNotExist) { + return null; + } + } finally { + session.close(); + } + // FIXME: We need a second session because of the use of a different handle on the same remote resource + // We didn't need one before!!! Perhaps we could support the changing of a sessions root as long as + // the folder sync info is the same + remoteRoot = + new RemoteFolderTree(null, root.getName(), repository, + new Path(root.getFolderSyncInfo().getRepository()), + tagForRemoteFolder(root, tag)); + session = new Session(repository, remoteRoot, false); + session.open(monitor); + try { + buildRemoteTree(session, root, remoteRoot, Path.EMPTY, monitor); + if (!changedFiles.isEmpty()) + fetchFileRevisions(session, (String[])changedFiles.toArray(new String[changedFiles.size()]), monitor); + return remoteRoot; + } finally { + session.close(); + } + } + + /* + * Build the base remote tree from the local tree. + * + * The localPath is used to retrieve deltas from the recorded deltas + * + */ + private RemoteFolderTree buildBaseTree(RemoteFolderTree parent, ICVSFolder local, IProgressMonitor monitor) throws CVSException { + + // Create a remote folder tree corresponding to the local resource + RemoteFolderTree remote = new RemoteFolderTree(parent, local.getName(), repository, new Path(local.getFolderSyncInfo().getRepository()), local.getFolderSyncInfo().getTag()); + + // Create a List to contain the created children + List children = new ArrayList(); + + // Build the child folders corresponding to local folders base + ICVSFolder[] folders = local.getFolders(); + for (int i=0;i<folders.length;i++) { + if (folders[i].isManaged() && folders[i].isCVSFolder()) { + children.add(buildBaseTree(remote, folders[i], monitor)); + } + } + + // Build the child files corresponding to local files base + ICVSFile[] files = local.getFiles(); + for (int i=0;i<files.length;i++) { + ICVSFile file = files[i]; + ResourceSyncInfo info = file.getSyncInfo(); + // if there is no sync info then there is no base + if (info==null) + continue; + // There is no remote if the file was added + if (info.isAdded()) + continue; + // If the file was deleted locally, we need to generate a new sync info without the delete flag + if (info.isDeleted()) + info = new ResourceSyncInfo(info.getName(), info.getRevision(), info.getTimeStamp(), info.getKeywordMode(), info.getTag(), info.getPermissions()); + children.add(new RemoteFile(remote, info)); + } + + // Add the children to the remote folder tree + remote.setChildren((ICVSRemoteResource[])children.toArray(new ICVSRemoteResource[children.size()])); + + return remote; + } + + /* + * Build the remote tree from the local tree and the recorded deltas. + * + * The localPath is used to retrieve deltas from the recorded deltas + * + */ + private void buildRemoteTree(Session session, ICVSFolder local, RemoteFolderTree remote, IPath localPath, IProgressMonitor monitor) throws CVSException { + + // Add the remote folder to the remote folder lookup table (used to update file revisions) + remoteFolderTable.put(remote.getFolderSyncInfo().getRemoteLocation(), remote); + + // Create a map to contain the created children + Map children = new HashMap(); + + // If there's no corresponding local resource then we need to fetch its contents in order to populate the deltas + if (local == null) { + fetchNewDirectory(session, remote, localPath, monitor); + } + + // Fetch the delta's for the folder + Map deltas = (Map)fileDeltas.get(localPath); + if (deltas == null) + deltas = EMPTY_MAP; + + // If there is a local, use the local children to start buidling the remote children + if (local != null) { + // Build the child folders corresponding to local folders + ICVSFolder[] folders = local.getFolders(); + for (int i=0;i<folders.length;i++) { + DeltaNode d = (DeltaNode)deltas.get(folders[i].getName()); + if (folders[i].isCVSFolder() && ! isOrphanedSubtree(session, folders[i]) && (d==null || d.getRevision() != DELETED)) { + children.put(folders[i].getName(), + new RemoteFolderTree(remote, folders[i].getName(), repository, + new Path(folders[i].getFolderSyncInfo().getRepository()), + tagForRemoteFolder(folders[i],tag))); + } + } + // Build the child files corresponding to local files + ICVSFile[] files = local.getFiles(); + for (int i=0;i<files.length;i++) { + ICVSFile file = files[i]; + + DeltaNode d = (DeltaNode)deltas.get(file.getName()); + ResourceSyncInfo info = file.getSyncInfo(); + // if there is no sync info then there isn't a remote file for this local file on the + // server. + if (info==null) + continue; + // There is no remote if the file was added and we didn't get a conflict (C) indicator from the server + if (info.isAdded() && d==null) + continue; + // There is no remote if the file was deleted and we didn;t get a remove (R) indicator from the server + if (info.isDeleted() && d==null) + continue; + + int type = d==null ? Update.STATE_NONE : d.getSyncState(); + children.put(file.getName(), new RemoteFile(remote, type, info)); + } + } + + // Build the children for new or out-of-date resources from the deltas + Iterator i = deltas.keySet().iterator(); + while (i.hasNext()) { + String name = (String)i.next(); + DeltaNode d = (DeltaNode)deltas.get(name); + String revision = d.getRevision(); + if (revision == FOLDER) { + // XXX should getRemotePath() return an IPath instead of a String? + children.put(name, new RemoteFolderTree(remote, repository, + new Path(remote.getRepositoryRelativePath()).append(name), + tagForRemoteFolder(remote, tag))); + } else if (revision == ADDED) { + children.put(name, new RemoteFile(remote, d.getSyncState(), name, tagForRemoteFolder(remote, tag))); + } else if (revision == UNKNOWN) { + // The local resource is out of sync with the remote. + // Create a RemoteFile associated with the tag so we are assured of getting the proper revision + // (Note: this will replace the RemoteFile added from the local base) + children.put(name, new RemoteFile(remote, d.getSyncState(), name, tagForRemoteFolder(remote, tag))); + } else if (revision == DELETED) { + // This should have been deleted while creating from the local resources. + // If it wasn't, delete it now. + if (children.containsKey(name)) + children.remove(name); + } else { + // We should never get here + } + } + + // Add the children to the remote folder tree + remote.setChildren((ICVSRemoteResource[])children.values().toArray(new ICVSRemoteResource[children.size()])); + + // We have to delay building the child folders to support the proper fetching of new directories + // due to the fact that the same CVS home directory (i.e. the same root directory) must + // be used for all requests sent over the same connection + Iterator childIterator = children.entrySet().iterator(); + List emptyChildren = new ArrayList(); + while (childIterator.hasNext()) { + Map.Entry entry = (Map.Entry)childIterator.next(); + if (((RemoteResource)entry.getValue()).isFolder()) { + RemoteFolderTree remoteFolder = (RemoteFolderTree)entry.getValue(); + String name = (String)entry.getKey(); + ICVSFolder localFolder; + DeltaNode d = (DeltaNode)deltas.get(name); + // for directories that are new on the server + if (d!=null && d.getRevision() == FOLDER) + localFolder = null; + else + localFolder = local.getFolder(name); + buildRemoteTree(session, localFolder, remoteFolder, localPath.append(name), monitor); + // Record any children that are empty + if (pruneEmptyDirectories() && remoteFolder.getChildren().length == 0) { + // Prune if the local folder is also empty. + if (localFolder == null || (localFolder.getFiles().length == 0 && localFolder.getFolders().length == 0)) + emptyChildren.add(remoteFolder); + else { + // Also prune if the tag we are fetching is not HEAD and differs from the tag of the local folder + FolderSyncInfo info = localFolder.getFolderSyncInfo(); + if (tag != null && info != null && ! tag.equals(CVSTag.DEFAULT) && ! tag.equals(info.getTag())) + emptyChildren.add(remoteFolder); + } + } + } + } + + // Prune any empty child folders + if (pruneEmptyDirectories() && !emptyChildren.isEmpty()) { + List newChildren = new ArrayList(); + newChildren.addAll(Arrays.asList(remote.getChildren())); + newChildren.removeAll(emptyChildren); + remote.setChildren((ICVSRemoteResource[])newChildren.toArray(new ICVSRemoteResource[newChildren.size()])); + + } + } + + /* + * This method fetches the delta between the local state and the remote state of the resource tree + * and records the deltas in the fileDeltas instance variable + * + * Returns the list of changed files + */ + private List fetchDelta(Session session, IProgressMonitor monitor) throws CVSException { + + // Create an listener that will accumulate new and removed files and folders + final List newChildDirectories = new ArrayList(); + IUpdateMessageListener listener = new IUpdateMessageListener() { + public void directoryInformation(IPath path, boolean newDirectory) { + if (newDirectory) { + // Record new directory with parent so it can be retrieved when building the parent + recordDelta(path, FOLDER, Update.STATE_NONE); + // Record new directory to be used as a parameter to fetch its contents + newChildDirectories.add(path.toString()); + } + } + public void directoryDoesNotExist(IPath path) { + // Record removed directory with parent so it can be removed when building the parent + if (path.isEmpty()) { + projectDoesNotExist = true; + } else { + recordDelta(path, DELETED, Update.STATE_NONE); + } + } + public void fileInformation(int type, String filename) { + // Cases that do not require action are: + // case 'A' : = A locally added file that does not exists remotely + // case '?' : = A local file that has not been added and does not exists remotely + // case 'M' : = A locally modified file that has not been modified remotely + switch(type) { + case Update.STATE_MERGEABLE_CONFLICT : + case Update.STATE_CONFLICT : + // We have an remote change to a modified local file + // The change could be a local change conflicting with a remote deletion. + // If so, the deltas may already have a DELETED for the file. + // We shouldn't override this DELETED + IPath filePath = new Path(filename); + Map deltas = deltas = (Map)fileDeltas.get(filePath.removeLastSegments(1)); + DeltaNode d = deltas != null ? (DeltaNode)deltas.get(filePath.lastSegment()) : null; + if ((d!=null) && (d.getRevision() == DELETED)) + break; + case Update.STATE_DELETED : // We have a locally removed file that still exists remotely + case Update.STATE_REMOTE_CHANGES : // We have an remote change to an unmodified local file + changedFiles.add(filename); + recordDelta(new Path(filename), UNKNOWN, type); + break; + } + } + public void fileDoesNotExist(String filename) { + recordDelta(new Path(filename), DELETED, Update.STATE_NONE); + } + }; + + // Perform a "cvs -n update -d [-r tag] ." in order to get the + // messages from the server that will indicate what has changed on the + // server. + IStatus status = Command.UPDATE.execute(session, + new GlobalOption[] { Command.DO_NOT_CHANGE }, + updateLocalOptions, + new String[] { Session.CURRENT_LOCAL_FOLDER }, + new UpdateListener(listener), + monitor); + return changedFiles; + } + + private void fetchNewDirectory(Session session, RemoteFolderTree newFolder, IPath localPath, IProgressMonitor monitor) throws CVSException { + + // Create an listener that will accumulate new files and folders + IUpdateMessageListener listener = new IUpdateMessageListener() { + public void directoryInformation(IPath path, boolean newDirectory) { + if (newDirectory) { + // Record new directory with parent so it can be retrieved when building the parent + // NOTE: Check path prefix + recordDelta(path, FOLDER, Update.STATE_NONE); + } + } + public void directoryDoesNotExist(IPath path) { + } + public void fileInformation(int type, String filename) { + // NOTE: Check path prefix + changedFiles.add(filename); + recordDelta(new Path(filename), ADDED, type); + } + public void fileDoesNotExist(String filename) { + } + }; + + // NOTE: Should use the path relative to the remoteRoot + IPath path = new Path(newFolder.getRepositoryRelativePath()); + IStatus status = Command.UPDATE.execute(session, + new GlobalOption[] { Command.DO_NOT_CHANGE }, + updateLocalOptions, + new String[] { localPath.toString() }, + new UpdateListener(listener), + monitor); + if (status.getCode() == CVSStatus.SERVER_ERROR) { + // FIXME: This should be refactored (maybe static methods on CVSException?) + CVSServerException e = new CVSServerException(status); + if ( ! e.isNoTagException() && e.containsErrors()) + throw e; + // we now know that this is an exception caused by a cvs bug. + // if the folder has no files in it (just subfolders) cvs does not respond with the subfolders... + // workaround: retry the request with no tag to get the directory names (if any) + Policy.checkCanceled(monitor); + status = Command.UPDATE.execute(session, + new GlobalOption[] { Command.DO_NOT_CHANGE }, + getOptionsWithoutTag(), + new String[] { localPath.toString() }, + new UpdateListener(listener), + monitor); + if (status.getCode() == CVSStatus.SERVER_ERROR) { + throw new CVSServerException(status); + } + } + } + + // Get the file revisions for the given filenames + private void fetchFileRevisions(Session session, String[] fileNames, IProgressMonitor monitor) throws CVSException { + + // Create a listener for receiving the revision info + final int[] count = new int[] {0}; + final Map revisions = new HashMap(); + IStatusListener listener = new IStatusListener() { + public void fileStatus(IPath path, String remoteRevision) { + try { + updateRevision(path, remoteRevision); + count[0]++; + } catch (CVSException e) { + // The count will be off which will trigger another exception + CVSProviderPlugin.log(e); + } + } + }; + + // Perform a "cvs status..." with a custom message handler + IStatus status = Command.STATUS.execute(session, + Command.NO_GLOBAL_OPTIONS, + Command.NO_LOCAL_OPTIONS, + fileNames, + new StatusListener(listener), + monitor); + if (status.getCode() == CVSStatus.SERVER_ERROR) { + throw new CVSServerException(status); + } + + // XXX we can't make this check because it may be valid to call this method + // without any file names (e.g. fileNames array empty) which would run the + // status on all files. + //if (count[0] != fileNames.length) + // throw new CVSException(Policy.bind("RemoteFolder.errorFetchingRevisions")); + } + + private boolean pruneEmptyDirectories() { + return CVSProviderPlugin.getPlugin().getPruneEmptyDirectories(); + } + /* + * Record the deltas in a double map where the outer key is the parent directory + * and the inner key is the file name. The value is the revision of the file or + * DELETED (file or folder). New folders have a revision of FOLDER. + * + * A revison of UNKNOWN indicates that the revision has not been fetched + * from the repository yet. + */ + private void recordDelta(IPath path, String revision, int syncState) { + IPath parent = path.removeLastSegments(1); + Map deltas = (Map)fileDeltas.get(parent); + if (deltas == null) { + deltas = new HashMap(); + fileDeltas.put(parent, deltas); + } + String name = path.lastSegment(); + deltas.put(name, new DeltaNode(name, revision, syncState)); + } + + private void updateRevision(IPath path, String revision) throws CVSException { + RemoteFolderTree folder = (RemoteFolderTree)remoteFolderTable.get(path.removeLastSegments(1).toString()); + ((RemoteFile)folder.getFile(path.lastSegment())).setRevision(revision); + } + + /* + * Return the tag that should be associated with a remote folder. + * + * This method is used to ensure that new directories contain the tag + * derived from the parant local folder when appropriate. For instance, + * + * The tag should be the provided tag. However, if tag is null, the + * tag for the folder should be derived from the provided reference folder + * which could be the local resource corresponding to the remote or the parent + * of the remote. + */ + private CVSTag tagForRemoteFolder(ICVSFolder folder, CVSTag tag) throws CVSException { + return tag == null ? folder.getFolderSyncInfo().getTag() : tag; + } + + private boolean isOrphanedSubtree(Session session, ICVSFolder mFolder) { + return mFolder.isCVSFolder() && ! mFolder.isManaged() && ! mFolder.equals(session.getLocalRoot()) && mFolder.getParent().isCVSFolder(); + } +} + diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteModule.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteModule.java index ac14521cb..7118cde0a 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteModule.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteModule.java @@ -17,6 +17,7 @@ import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSTag; import org.eclipse.team.ccvs.core.ICVSRemoteResource; import org.eclipse.team.ccvs.core.ICVSRepositoryLocation; @@ -41,7 +42,7 @@ public class RemoteModule extends RemoteFolder { public static RemoteModule[] getRemoteModules(ICVSRepositoryLocation repository, CVSTag tag, IProgressMonitor monitor) throws TeamException { RemoteModule[] modules; - Session s = new Session(repository, (ICVSFolder)Session.getManagedResource(ResourcesPlugin.getWorkspace().getRoot()), false); + Session s = new Session(repository, (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(ResourcesPlugin.getWorkspace().getRoot()), false); s.open(monitor); try { modules = Command.CHECKOUT.getRemoteModules(s, tag, monitor); diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java index 0b817fa0f..3696c9d28 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java @@ -7,12 +7,14 @@ package org.eclipse.team.internal.ccvs.core.resources; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.PlatformObject; +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.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.Policy; import org.eclipse.team.internal.ccvs.core.client.Update; -import org.eclipse.team.internal.ccvs.core.syncinfo.*; +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.Util; @@ -149,4 +151,17 @@ public abstract class RemoteResource extends PlatformObject implements ICVSRemot // ensure that clients are not trying to set sync info on remote handles. Assert.isTrue(false); } + /* + * @see ICVSResource#reloadSyncInfo(IProgressMonitor) + */ + public void reloadSyncInfo(IProgressMonitor monitor) throws CVSException { + // NO-OP + } + + /* + * @see ICVSResource#saveSyncInfo(IProgressMonitor) + */ + public void saveSyncInfo(IProgressMonitor monitor) throws CVSException { + // NO-OP + } }
\ No newline at end of file diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/FileSystemSynchronizer.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/FileSystemSynchronizer.java index defe46701..a23245581 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/FileSystemSynchronizer.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/FileSystemSynchronizer.java @@ -19,17 +19,15 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; -import org.eclipse.team.ccvs.core.CVSProviderPlugin; import org.eclipse.team.core.TeamPlugin; import org.eclipse.team.internal.ccvs.core.CVSException; +import org.eclipse.team.internal.ccvs.core.Policy; import org.eclipse.team.internal.ccvs.core.resources.ICVSSynchronizer; -import org.eclipse.team.internal.ccvs.core.resources.LocalFolder; import org.eclipse.team.internal.ccvs.core.util.Assert; import org.eclipse.team.internal.ccvs.core.util.FileNameMatcher; import org.eclipse.team.internal.ccvs.core.util.FileUtil; import org.eclipse.team.internal.ccvs.core.util.ResourceDeltaVisitor; import org.eclipse.team.internal.ccvs.core.util.SyncFileUtil; -import org.eclipse.team.internal.ccvs.core.Policy; /** * The FileSystemSynchronizer stores sync information to be compatible with CVS command line @@ -244,7 +242,6 @@ public class FileSystemSynchronizer implements ICVSSynchronizer { */ public FolderSyncInfo getFolderSync(File file) throws CVSException { if(file.exists() && file.isDirectory()) { - LocalFolder folder = new LocalFolder(file); if(SyncFileUtil.getCVSSubdirectory(file).exists()) { CacheData data = (CacheData)folderSyncCache.get(file, null); if(data!=null) { @@ -261,12 +258,9 @@ public class FileSystemSynchronizer implements ICVSSynchronizer { public ResourceSyncInfo getResourceSync(File file) throws CVSException { File parentFile = file.getParentFile(); if (parentFile != null) { - LocalFolder parent = new LocalFolder(parentFile); - if(parent.exists() && parent.isCVSFolder()) { - CacheData data = (CacheData)resourceSyncCache.get(file, null); - if(data!=null) { - return (ResourceSyncInfo)data.getData(); - } + CacheData data = (CacheData)resourceSyncCache.get(file, null); + if(data!=null) { + return (ResourceSyncInfo)data.getData(); } } return null; @@ -277,12 +271,7 @@ public class FileSystemSynchronizer implements ICVSSynchronizer { */ public void setFolderSync(File file, FolderSyncInfo info) throws CVSException { SyncFileUtil.writeFolderConfig(file, info); - folderSyncCache.put(new CacheData(file, info, CACHE_EXPIRATION_MINUTES)); - - // the server won't add directories as sync info, therefore it must be done when - // a directory is shared with the repository. - setResourceSync(file, new ResourceSyncInfo(file.getName())); - + folderSyncCache.put(new CacheData(file, info, CACHE_EXPIRATION_MINUTES)); } /* @@ -292,14 +281,7 @@ public class FileSystemSynchronizer implements ICVSSynchronizer { Assert.isNotNull(info); Assert.isTrue(file.getName().equals(info.getName())); - try { - LocalFolder parent = new LocalFolder(file.getParentFile()); - if(parent.exists() && parent.isCVSFolder()) { - SyncFileUtil.writeResourceSync(file, info); - } - } catch(CVSException e) { - // XXX Bad eating of exception - } + SyncFileUtil.writeResourceSync(file, info); resourceSyncCache.put(new CacheData(file, info, CACHE_EXPIRATION_MINUTES)); } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/OrphanedFolderListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/OrphanedFolderListener.java index 0675ae320..4c0ce1747 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/OrphanedFolderListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/OrphanedFolderListener.java @@ -7,11 +7,13 @@ package org.eclipse.team.internal.ccvs.core.util; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSProviderPlugin; +import org.eclipse.team.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.Policy; import org.eclipse.team.internal.ccvs.core.client.Session; -import org.eclipse.team.internal.ccvs.core.resources.ICVSFolder; +import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; /** * Listen for the addition of orphaned subtrees as a result of a copy or move. @@ -24,7 +26,7 @@ public class OrphanedFolderListener extends ResourceDeltaVisitor { private void handleOrphanedSubtree(IResource resource) { if (resource.getType() == IResource.FOLDER) { try { - ICVSFolder mFolder = (ICVSFolder)Session.getManagedResource(resource); + ICVSFolder mFolder = (ICVSFolder)CVSWorkspaceRoot.getCVSResourceFor(resource); if (mFolder.isCVSFolder() && ! mFolder.isManaged() && mFolder.getParent().isCVSFolder()) { mFolder.unmanage(); CVSProviderPlugin.getSynchronizer().reload(resource.getLocation().toFile(), Policy.monitorFor(null)); diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java index 0be5cea3f..bf9ce02ab 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java @@ -9,11 +9,12 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; +import org.eclipse.team.ccvs.core.*; import org.eclipse.team.ccvs.core.CVSProviderPlugin; +import org.eclipse.team.ccvs.core.ICVSFolder; +import org.eclipse.team.ccvs.core.ICVSResource; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.client.Session; -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.Policy; /** |