diff options
author | Michael Valenta | 2003-10-21 20:45:54 +0000 |
---|---|---|
committer | Michael Valenta | 2003-10-21 20:45:54 +0000 |
commit | 66322f2051539648ff9b8c9c6ef020fed10dab72 (patch) | |
tree | 7b5f3a892bbd3f6e6f0b42596ba7f1ba99901586 | |
parent | 48c453816da934719caecbf4adc786313afcdf0a (diff) | |
download | eclipse.platform.team-66322f2051539648ff9b8c9c6ef020fed10dab72.tar.gz eclipse.platform.team-66322f2051539648ff9b8c9c6ef020fed10dab72.tar.xz eclipse.platform.team-66322f2051539648ff9b8c9c6ef020fed10dab72.zip |
*** empty log message ***
11 files changed, 204 insertions, 117 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RDiff.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RDiff.java index cb97b54f5..de27da825 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RDiff.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RDiff.java @@ -29,6 +29,7 @@ public class RDiff extends RemoteCommand { * Valid for: checkout export history rdiff update */ public static LocalOption makeTagOption(CVSTag tag) { + if (tag == null) tag = CVSTag.DEFAULT; int type = tag.getType(); switch (type) { case CVSTag.BRANCH: diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IMessagePatterns.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IMessagePatterns.java index c9715c5d2..ac968348c 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IMessagePatterns.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IMessagePatterns.java @@ -15,12 +15,14 @@ package org.eclipse.team.internal.ccvs.core.client.listeners; */ public interface IMessagePatterns { - public static final String SERVER_MESSAGE_PREFIX = "\\w* \\w*: "; - public static final String SERVER_ABORTED_MESSAGE_PREFIX = "\\w* [\\w* aborted]: "; + public static final String SERVER_MESSAGE_PREFIX = "\\w* \\w*: "; //$NON-NLS-1$ + public static final String SERVER_ABORTED_MESSAGE_PREFIX = "\\w* [\\w* aborted]: "; //$NON-NLS-1$ + public static final String UPDATE_SECOND_PARTY_CREATION = "\\w* \\w*: conflict: (filePath:.*:filePath) created independently by second party"; + // TODO: It would be better if the prefix was optional but this requires the use of a capturing group which throws the group count off - public static final String RDIFF_DIRECTORY = "\\w* \\w*: Diffing (remoteFolderPath:.*:remoteFolderPath)"; - public static final String RDIFF_SUMMARY_FILE_DIFF = "File (remoteFilePath:.*:remoteFilePath) changed from revision (leftRevision:.*:leftRevision) to (rightRevision:.*:rightRevision)"; - public static final String RDIFF_SUMMARY_NEW_FILE = "File (remoteFilePath:.*:remoteFilePath) is new; current revision (rightRevision:.*:rightRevision)"; - public static final String RDIFF_SUMMARY_DELETED_FILE = "File (remoteFilePath:.*:remoteFilePath) is removed; not included in release tag .*"; + public static final String RDIFF_DIRECTORY = "\\w* \\w*: Diffing (remoteFolderPath:.*:remoteFolderPath)"; //$NON-NLS-1$ + public static final String RDIFF_SUMMARY_FILE_DIFF = "File (remoteFilePath:.*:remoteFilePath) changed from revision (leftRevision:.*:leftRevision) to (rightRevision:.*:rightRevision)"; //$NON-NLS-1$ + public static final String RDIFF_SUMMARY_NEW_FILE = "File (remoteFilePath:.*:remoteFilePath) is new; current revision (rightRevision:.*:rightRevision)"; //$NON-NLS-1$ + public static final String RDIFF_SUMMARY_DELETED_FILE = "File (remoteFilePath:.*:remoteFilePath) is removed; not included in release tag .*"; //$NON-NLS-1$ } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/RDiffSummaryListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/RDiffSummaryListener.java index f808fb667..ffc0e8352 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/RDiffSummaryListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/RDiffSummaryListener.java @@ -25,6 +25,11 @@ import org.eclipse.team.internal.ccvs.core.client.CommandOutputListener; */ public class RDiffSummaryListener extends CommandOutputListener { + private static final String RIGHT_REVISION_VARIABLE_NAME = "rightRevision"; //$NON-NLS-1$ + private static final String LEFT_REVISION_VARIABLE_NAME = "leftRevision"; //$NON-NLS-1$ + private static final String REMOTE_FILE_PATH_VARIABLE_NAME = "remoteFilePath"; //$NON-NLS-1$ + private static final String REMOTE_FOLDER_PATH_VARIABLE_NAME = "remoteFolderPath"; //$NON-NLS-1$ + private IFileDiffListener listener; private static ServerMessageLineMatcher DIRECTORY_MATCHER; private static ServerMessageLineMatcher FILE_DIFF_MATCHER; @@ -38,13 +43,13 @@ public class RDiffSummaryListener extends CommandOutputListener { public static void initializePatterns() { try { DIRECTORY_MATCHER = new ServerMessageLineMatcher( - IMessagePatterns.RDIFF_DIRECTORY, new String[] {"remoteFolderPath"}); + IMessagePatterns.RDIFF_DIRECTORY, new String[] {REMOTE_FOLDER_PATH_VARIABLE_NAME}); FILE_DIFF_MATCHER = new ServerMessageLineMatcher( - IMessagePatterns.RDIFF_SUMMARY_FILE_DIFF, new String[] {"remoteFilePath", "leftRevision", "rightRevision"}); + IMessagePatterns.RDIFF_SUMMARY_FILE_DIFF, new String[] {REMOTE_FILE_PATH_VARIABLE_NAME, LEFT_REVISION_VARIABLE_NAME, RIGHT_REVISION_VARIABLE_NAME}); NEW_FILE_MATCHER = new ServerMessageLineMatcher( - IMessagePatterns.RDIFF_SUMMARY_NEW_FILE, new String[] {"remoteFilePath", "rightRevision"}); + IMessagePatterns.RDIFF_SUMMARY_NEW_FILE, new String[] {REMOTE_FILE_PATH_VARIABLE_NAME, RIGHT_REVISION_VARIABLE_NAME}); DELETED_FILE_MATCHER = new ServerMessageLineMatcher( - IMessagePatterns.RDIFF_SUMMARY_DELETED_FILE, new String[] {"remoteFilePath"}); + IMessagePatterns.RDIFF_SUMMARY_DELETED_FILE, new String[] {REMOTE_FILE_PATH_VARIABLE_NAME}); } catch (CVSException e) { // This is serious as the listener will not function properly CVSProviderPlugin.log(e); @@ -78,19 +83,25 @@ public class RDiffSummaryListener extends CommandOutputListener { Map variables = FILE_DIFF_MATCHER.processServerMessage(line); if (variables != null) { - listener.fileDiff((String)variables.get("remoteFilePath"), (String)variables.get("leftRevision"), (String)variables.get("rightRevision")); + listener.fileDiff( + (String)variables.get(REMOTE_FILE_PATH_VARIABLE_NAME), + (String)variables.get(LEFT_REVISION_VARIABLE_NAME), + (String)variables.get(RIGHT_REVISION_VARIABLE_NAME)); return OK; } variables = NEW_FILE_MATCHER.processServerMessage(line); if (variables != null) { - listener.newFile((String)variables.get("remoteFilePath"), (String)variables.get("rightRevision")); + listener.newFile( + (String)variables.get(REMOTE_FILE_PATH_VARIABLE_NAME), + (String)variables.get(RIGHT_REVISION_VARIABLE_NAME)); return OK; } variables = DELETED_FILE_MATCHER.processServerMessage(line); if (variables != null) { - listener.deletedFile((String)variables.get("remoteFilePath")); + listener.deletedFile( + (String)variables.get(REMOTE_FILE_PATH_VARIABLE_NAME)); return OK; } @@ -108,7 +119,8 @@ public class RDiffSummaryListener extends CommandOutputListener { Map variables = DIRECTORY_MATCHER.processServerMessage(line); if (variables != null) { - listener.directory((String)variables.get("remoteFolderPath")); + listener.directory( + (String)variables.get(REMOTE_FOLDER_PATH_VARIABLE_NAME)); return OK; } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ServerMessageLineMatcher.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ServerMessageLineMatcher.java index 466454cc4..3e42ee1a6 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ServerMessageLineMatcher.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ServerMessageLineMatcher.java @@ -20,6 +20,7 @@ import java.util.regex.Pattern; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.util.Assert; +import org.eclipse.team.internal.ccvs.core.Policy; /** * This class extracts matches server lines to expected patterns and extracts @@ -27,7 +28,7 @@ import org.eclipse.team.internal.ccvs.core.util.Assert; */ public class ServerMessageLineMatcher { - protected static final Pattern VARIABLE_MATCHING_PATTERN = Pattern.compile("(\\((\\w*):.*:\\2\\))"); + protected static final Pattern VARIABLE_MATCHING_PATTERN = Pattern.compile("(\\((\\w*):.*:\\2\\))"); //$NON-NLS-1$ Pattern pattern; String[] variables; @@ -38,7 +39,7 @@ public class ServerMessageLineMatcher { List variables = new ArrayList(); while (matcher.find()) { if (matcher.groupCount() != 2) { - throw new CVSException("Variable in template is not of the correct format: {0}" + template); + throw new CVSException(Policy.bind("ServerMessageLineMatcher.5", template)); //$NON-NLS-1$ } variables.add(matcher.group(2)); } @@ -49,8 +50,8 @@ public class ServerMessageLineMatcher { // (i.e. remove the variable markup) for (Iterator iter = variables.iterator(); iter.hasNext();) { String element = (String) iter.next(); - template = template.replaceAll(element + ":", ""); - template = template.replaceAll(":" + element, ""); + template = template.replaceAll(element + ":", ""); //$NON-NLS-1$ //$NON-NLS-2$ + template = template.replaceAll(":" + element, ""); //$NON-NLS-1$ //$NON-NLS-2$ } // Ensure that the number of groups in the pattern match the number of variables @@ -60,7 +61,7 @@ public class ServerMessageLineMatcher { count++; } if (count != variables.size()) { - throw new CVSException("There are additional groups above those defining variables in template: {0}" + template); + throw new CVSException(Policy.bind("ServerMessageLineMatcher.6", template)); //$NON-NLS-1$ } // Create the pattern fir matching lines from the server @@ -74,7 +75,7 @@ public class ServerMessageLineMatcher { for (int i = 0; i < expectedVariables.length; i++) { String expected = expectedVariables[i]; if (!variables.contains(expected)) { - throw new CVSException("Expected variable {0} in {1} but it is not present." + expected + template); + throw new CVSException(Policy.bind("ServerMessageLineMatcher.7", expected, template)); //$NON-NLS-1$ } } } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties index 3298d9cbc..45101361f 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties @@ -326,3 +326,6 @@ DeferredResourceChangeHandler.0=Reconciling CVS state changes DeferredResourceChangeHandler.1=Errors occured handling ignore file (.cvsignore) changes. Some resources may not be decorated properly. CVSWorkspaceRoot.11=The parent folder of managed file {0} does not have sync info associated with it. RemoveEntryHandler.2=Remove-entry received and ignored from CVS server for existing file {0}. +ServerMessageLineMatcher.5=Variable in template is not of the correct format: {0} +ServerMessageLineMatcher.6=There are additional groups above those defining variables in template: {0} +ServerMessageLineMatcher.7=Expected variable {0} in {1} but it is not present. diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/FileContentCachingService.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/FileContentCachingService.java index c2735c91d..e7b9146e4 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/FileContentCachingService.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/FileContentCachingService.java @@ -16,6 +16,7 @@ import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.team.internal.ccvs.core.CVSException; +import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; import org.eclipse.team.internal.ccvs.core.CVSTag; import org.eclipse.team.internal.ccvs.core.ICVSFile; import org.eclipse.team.internal.ccvs.core.ICVSFolder; @@ -49,6 +50,18 @@ public class FileContentCachingService { } } + /** + * Fetch and cache the file contents for the specified files. + * @param root the root folder for the files being fetched + * @param filePaths the root relative file paths + * @param monitor + * @throws CVSException + */ + public static void fetchFileContents(RemoteFolderTree root, String[] filePaths, IProgressMonitor monitor) throws CVSException { + FileContentCachingService service = new FileContentCachingService((CVSRepositoryLocation)root.getRepository(), root, filePaths); + service.cacheFileContents(monitor); + } + public static RemoteFile buildRemoteTree(CVSRepositoryLocation repository, ICVSFile file, CVSTag tag, IProgressMonitor monitor) throws CVSException { monitor.beginTask(null, 100); try { @@ -86,6 +99,10 @@ public class FileContentCachingService { files, null, Policy.subMonitorFor(monitor, files.length * 100)); + if (!status.isOK()) { + // No big deal but log the problem anyway + CVSProviderPlugin.log (new CVSException(status)); + } } finally { session.close(); monitor.done(); 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 1556dccf4..8d04eb5dc 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 @@ -180,6 +180,13 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { /* package*/ void fetchContents(IProgressMonitor monitor) throws CVSException { monitor.beginTask(Policy.bind("RemoteFile.getContents"), 100);//$NON-NLS-1$ + if (getRevision().equals(ResourceSyncInfo.ADDED_REVISION)) { + // The revision of the remote file is not known so we need to use the tag to get the status of the file + CVSTag tag = getSyncInfo().getTag(); + if (tag == null) tag = CVSTag.DEFAULT; + RemoteFolderMemberFetcher fetcher = new RemoteFolderMemberFetcher((RemoteFolder)getParent(), tag); + fetcher.updateFileRevisions(new ICVSFile[] { this }, Policy.subMonitorFor(monitor, 10)); + } Session session = new Session(getRepository(), parent, false /* create backups */); session.open(Policy.subMonitorFor(monitor, 10), false /* read-only */); try { @@ -191,7 +198,7 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { Update.IGNORE_LOCAL_CHANGES }, new ICVSResource[] { this }, null, - Policy.subMonitorFor(monitor, 90)); + Policy.subMonitorFor(monitor, 80)); if (status.getCode() == CVSStatus.SERVER_ERROR) { throw new CVSServerException(status); } @@ -412,13 +419,15 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { * Return whether there are already contents cached for the given handle */ public boolean isContentsCached() { + if (getRevision().equals(ResourceSyncInfo.ADDED_REVISION)) return false; return getRemoteContentsCache().hasContents(getCacheRelativePath()); } /* * @see ICVSFile#setReadOnly(boolean) */ - public void setReadOnly(boolean readOnly) throws CVSException { + public void setReadOnly(boolean readOnly) { + // RemoteFiles are always read only } /* @@ -438,20 +447,21 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { /* * @see ICVSFile#setTimeStamp(Date) */ - public void setTimeStamp(Date date) throws CVSException { + public void setTimeStamp(Date date) { + // RemoteFiles are not muttable so do not support timestamp changes } /** * @see ICVSFile#moveTo(String) */ - public void copyTo(String mFile) throws CVSException { + public void copyTo(String mFile) { // Do nothing } /* * @see IRemoteResource#members(IProgressMonitor) */ - public IRemoteResource[] members(IProgressMonitor progress) throws TeamException { + public IRemoteResource[] members(IProgressMonitor progress) { return new IRemoteResource[0]; } @@ -505,14 +515,14 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { /** * @see org.eclipse.team.internal.ccvs.core.ICVSFile#checkout(int) */ - public void edit(int notifications, IProgressMonitor monitor) throws CVSException { + public void edit(int notifications, IProgressMonitor monitor) { // do nothing } /** * @see org.eclipse.team.internal.ccvs.core.ICVSFile#uncheckout() */ - public void unedit(IProgressMonitor monitor) throws CVSException { + public void unedit(IProgressMonitor monitor) { // do nothing } @@ -526,7 +536,7 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { /** * @see org.eclipse.team.internal.ccvs.core.ICVSFile#getPendingNotification() */ - public NotifyInfo getPendingNotification() throws CVSException { + public NotifyInfo getPendingNotification() { return null; } @@ -551,13 +561,13 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { /** * @see org.eclipse.team.internal.ccvs.core.ICVSFile#committed(org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo) */ - public void checkedIn(String info) throws CVSException { + public void checkedIn(String info) { // do nothing } /** * @see org.eclipse.team.internal.ccvs.core.ICVSFile#isEdited() */ - public boolean isEdited() throws CVSException { + public boolean isEdited() { return false; } /** @@ -588,7 +598,7 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile { /* (non-Javadoc) * @see org.eclipse.team.core.sync.IRemoteResource#getContentIdentifier() */ - public String getContentIdentifier() throws CVSException { + public String getContentIdentifier() { return getRevision(); } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareRemoteWithTagAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareRemoteWithTagAction.java index 3eadde99f..75132bde9 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareRemoteWithTagAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareRemoteWithTagAction.java @@ -12,31 +12,19 @@ package org.eclipse.team.internal.ccvs.ui.actions; import java.lang.reflect.InvocationTargetException; -import org.eclipse.compare.CompareUI; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.IAction; import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.team.core.TeamException; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.CVSTag; -import org.eclipse.team.internal.ccvs.core.ICVSFile; import org.eclipse.team.internal.ccvs.core.ICVSFolder; import org.eclipse.team.internal.ccvs.core.ICVSRemoteFolder; import org.eclipse.team.internal.ccvs.core.ICVSRemoteResource; -import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation; -import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation; -import org.eclipse.team.internal.ccvs.core.resources.RemoteFolderTreeBuilder; -import org.eclipse.team.internal.ccvs.ui.CVSCompareEditorInput; -import org.eclipse.team.internal.ccvs.ui.ResourceEditionNode; import org.eclipse.team.internal.ccvs.ui.TagSelectionDialog; +import org.eclipse.team.internal.ccvs.ui.operations.RemoteCompareOperation; /** - * @author Administrator - * - * To change this generated comment edit the template variable "typecomment": - * Window>Preferences>Java>Templates. - * To enable and disable the creation of type comments go to - * Window>Preferences>Java>Code Generation. + * Compare to versions of a remote resource. */ public class CompareRemoteWithTagAction extends CVSAction { @@ -45,15 +33,14 @@ public class CompareRemoteWithTagAction extends CVSAction { */ protected void execute(IAction action) throws InvocationTargetException, InterruptedException { - ICVSRemoteResource[] editions = getSelectedRemoteResources(); - if (editions.length == 0) return; - final ICVSRemoteResource resource = editions[0]; + ICVSRemoteResource[] resources = getSelectedRemoteResources(); + if (resources.length == 0) return; - final ResourceEditionNode[] input = new ResourceEditionNode[] { null /* left */, null /* right */}; + // Obtain the tag to compare against + final ICVSRemoteResource resource = resources[0]; final CVSTag[] tag = new CVSTag[] { null}; - run(new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException { + public void run(IProgressMonitor monitor) { ICVSFolder folder; if (resource instanceof ICVSRemoteFolder) { folder = (ICVSFolder)resource; @@ -63,43 +50,21 @@ public class CompareRemoteWithTagAction extends CVSAction { tag[0] = TagSelectionDialog.getTagToCompareWith(getShell(), new ICVSFolder[] {folder}); } }, false /* cancelable */, PROGRESS_BUSYCURSOR); - if (tag[0] == null) return; - final ICVSRemoteResource[] remote = new ICVSRemoteResource[] { null }; - if (resource.isFolder()) { - remote[0] = resource.forTag(tag[0]); - } else { - run(new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException { - try { - ICVSRepositoryLocation location = resource.getRepository(); - remote[0] = RemoteFolderTreeBuilder.buildRemoteTree((CVSRepositoryLocation)location, (ICVSFile)resource, tag[0], monitor); - } catch (CVSException e) { - throw new InvocationTargetException(e); - } - } - }, false /* cancelable */, PROGRESS_DIALOG); + // Run the compare operation in the background + try { + new RemoteCompareOperation(null, resource, tag[0]) + .run(); + } catch (CVSException e) { + throw new InvocationTargetException(e); } - - input[0] = new ResourceEditionNode(resource); - input[1] = new ResourceEditionNode(remote[0]); - - if (input[0] == null || input[1] == null) return; - - run(new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InvocationTargetException { - CompareUI.openCompareEditorOnPage( - new CVSCompareEditorInput(input[0] /* left */, input[1] /* right */), - getTargetPage()); - } - }, false /* cancelable */, PROGRESS_BUSYCURSOR); } /** * @see org.eclipse.team.internal.ui.actions.TeamAction#isEnabled() */ - protected boolean isEnabled() throws TeamException { + protected boolean isEnabled() { ICVSRemoteResource[] resources = getSelectedRemoteResources(); // Only support single select for now. // Need to avoid overlap if multi-select is supported diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties index 8d5144747..cde9e01f0 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties @@ -1030,3 +1030,4 @@ FetchMembersOperation.0=Fetching members of {0}; RemoteRevisionQuickDiffProvider.readingFile=Error reading remote file RemoteRevisionQuickDiffProvider.closingFile=Error closing remote file RemoteRevisionQuickDiffProvider.fetchingFile=CVS QuickDiff: fetching remote contents for ''{0}'' +RemoteCompareOperation.0=Comparing tags {0} and {1} of {2} diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteCompareOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteCompareOperation.java index 9c56e8d70..9e2242d68 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteCompareOperation.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteCompareOperation.java @@ -10,14 +10,15 @@ *******************************************************************************/ package org.eclipse.team.internal.ccvs.ui.operations; -import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import org.eclipse.compare.CompareUI; 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.jface.operation.IRunnableWithProgress; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.team.internal.ccvs.core.CVSException; @@ -32,10 +33,13 @@ import org.eclipse.team.internal.ccvs.core.client.RDiff; import org.eclipse.team.internal.ccvs.core.client.Session; import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption; import org.eclipse.team.internal.ccvs.core.client.listeners.RDiffSummaryListener; +import org.eclipse.team.internal.ccvs.core.resources.FileContentCachingService; 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.util.Assert; import org.eclipse.team.internal.ccvs.ui.CVSCompareEditorInput; import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; +import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants; import org.eclipse.team.internal.ccvs.ui.Policy; import org.eclipse.team.internal.ccvs.ui.ResourceEditionNode; import org.eclipse.team.internal.ui.TeamUIPlugin; @@ -51,55 +55,110 @@ public class RemoteCompareOperation extends RemoteOperation implements RDiffSum private RemoteFolderTree leftTree, rightTree; - public RemoteCompareOperation(Shell shell, ICVSRemoteFolder[] remoteFolders, CVSTag left, CVSTag right) { - super(shell, remoteFolders); - this.left = left; - this.right = right; + /** + * Compare two versions of the given remote resource. + * @param shell + * @param remoteResource the resource whose tags are being compared + * @param left the earlier tag (not null) + * @param right the later tag (not null) + */ + public RemoteCompareOperation(Shell shell, ICVSRemoteResource remoteResource, CVSTag tag) { + super(shell, new ICVSRemoteResource[] {remoteResource}); + Assert.isNotNull(tag); + this.right = tag; + if (remoteResource.isContainer()) { + this.left = ((ICVSRemoteFolder)remoteResource).getTag(); + } else { + try { + this.left = remoteResource.getSyncInfo().getTag(); + } catch (CVSException e) { + // This shouldn't happen but log it just in case + CVSProviderPlugin.log(e); + } + } + if (this.left == null) { + this.left = CVSTag.DEFAULT; + } } + /* + * This command only supports the use of a single resource + */ + private ICVSRemoteResource getRemoteResource() { + return getRemoteResources()[0]; + } + /* (non-Javadoc) * @see org.eclipse.team.internal.ccvs.ui.operations.CVSOperation#execute(org.eclipse.core.runtime.IProgressMonitor) */ protected void execute(IProgressMonitor monitor) throws CVSException { leftTree = rightTree = null; - Command.QuietOption oldOption= CVSProviderPlugin.getPlugin().getQuietness(); + boolean fetchContents = CVSUIPlugin.getPlugin().getPluginPreferences().getBoolean(ICVSUIConstants.PREF_CONSIDER_CONTENTS); + monitor.beginTask(getTaskName(), 50 + (fetchContents ? 100 : 0)); try { - CVSProviderPlugin.getPlugin().setQuietness(Command.VERBOSE); - ICVSRemoteResource[] resources = getRemoteResources(); - monitor.beginTask("Comparing remote modules", 100 * resources.length); - for (int i = 0; i < resources.length; i++) { - ICVSRemoteFolder folder = (ICVSRemoteFolder)resources[i]; - Session session = new Session(folder.getRepository(), folder, false); - try { - session.open(Policy.subMonitorFor(monitor, 10)); - collectStatus(buildTrees(session, folder, Policy.subMonitorFor(monitor, 90))); - } finally { - session.close(); - } + ICVSRemoteResource resource = getRemoteResource(); + IStatus status = buildTrees(resource, Policy.subMonitorFor(monitor, 50)); + if (status.isOK() && fetchContents) { + fetchFileContents(leftTree, Policy.subMonitorFor(monitor, 50)); + fetchFileContents(rightTree, Policy.subMonitorFor(monitor, 50)); } + collectStatus(status); openCompareEditor(leftTree, rightTree); } finally { - CVSProviderPlugin.getPlugin().setQuietness(oldOption); monitor.done(); } } + private void fetchFileContents(RemoteFolderTree tree, IProgressMonitor monitor) throws CVSException { + String[] filePaths = getFilePaths(tree); + if (filePaths.length > 0) { + FileContentCachingService.fetchFileContents(tree, filePaths, monitor); + } + + } + + private String[] getFilePaths(RemoteFolderTree tree) { + ICVSRemoteResource[] children = tree.getChildren(); + List result = new ArrayList(); + for (int i = 0; i < children.length; i++) { + ICVSRemoteResource resource = children[i]; + if (resource.isContainer()) { + result.addAll(Arrays.asList(getFilePaths((RemoteFolderTree)resource))); + } else { + result.add(resource.getRepositoryRelativePath()); + } + } + return (String[]) result.toArray(new String[result.size()]); + } + /* * Build the two trees uses the reponses from "cvs rdiff -s ...". */ - private IStatus buildTrees(Session session, ICVSRemoteFolder folder, IProgressMonitor monitor) throws CVSException { + private IStatus buildTrees(ICVSRemoteResource resource, IProgressMonitor monitor) throws CVSException { // Initialize the resulting trees - if (leftTree == null) { - leftTree = new RemoteFolderTree(null, folder.getRepository(), ICVSRemoteFolder.REPOSITORY_ROOT_FOLDER_NAME, left); - rightTree = new RemoteFolderTree(null, folder.getRepository(), ICVSRemoteFolder.REPOSITORY_ROOT_FOLDER_NAME, right); + leftTree = new RemoteFolderTree(null, resource.getRepository(), ICVSRemoteFolder.REPOSITORY_ROOT_FOLDER_NAME, left); + rightTree = new RemoteFolderTree(null, resource.getRepository(), ICVSRemoteFolder.REPOSITORY_ROOT_FOLDER_NAME, right); + Command.QuietOption oldOption= CVSProviderPlugin.getPlugin().getQuietness(); + Session session = new Session(resource.getRepository(), leftTree, false); + try { + monitor.beginTask(getTaskName(), 100); + CVSProviderPlugin.getPlugin().setQuietness(Command.VERBOSE); + session.open(Policy.subMonitorFor(monitor, 10)); + IStatus status = Command.RDIFF.execute(session, + Command.NO_GLOBAL_OPTIONS, + getLocalOptions(), + new ICVSResource[] { resource }, + new RDiffSummaryListener(this), + Policy.subMonitorFor(monitor, 90)); + return status; + } finally { + try { + session.close(); + } finally { + CVSProviderPlugin.getPlugin().setQuietness(oldOption); + } + monitor.done(); } - IStatus status = Command.RDIFF.execute(session, - Command.NO_GLOBAL_OPTIONS, - getLocalOptions(), - new ICVSResource[] { folder }, - new RDiffSummaryListener(this), - monitor); - return status; } private LocalOption[] getLocalOptions() { @@ -110,7 +169,7 @@ public class RemoteCompareOperation extends RemoteOperation implements RDiffSum * @see org.eclipse.team.internal.ccvs.ui.operations.CVSOperation#getTaskName() */ protected String getTaskName() { - return "Comparing"; + return Policy.bind("RemoteCompareOperation.0", new Object[] {left.getName(), right.getName(), getRemoteResource().getRepositoryRelativePath()}); //$NON-NLS-1$ } /* (non-Javadoc) @@ -179,6 +238,7 @@ public class RemoteCompareOperation extends RemoteOperation implements RDiffSum child = tree.getChild(name); } else { child = new RemoteFolderTree(tree, tree.getRepository(), childPath.toString(), tag); + ((RemoteFolderTree)child).setChildren(new ICVSRemoteResource[0]); addChild(tree, (ICVSRemoteResource)child); } return getFolder((RemoteFolderTree)child, tag, remoteFolderPath.removeFirstSegments(1), childPath); diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/unit/CompareOperationTests.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/unit/CompareOperationTests.java index a312e777f..bad0d6d70 100644 --- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/unit/CompareOperationTests.java +++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/unit/CompareOperationTests.java @@ -39,8 +39,8 @@ public class CompareOperationTests extends CVSOperationTest { public class TestRemoteCompareOperation extends RemoteCompareOperation { private ICVSRemoteFolder leftTree, rightTree; - public TestRemoteCompareOperation(Shell shell, ICVSRemoteFolder[] remoteFolders, CVSTag left, CVSTag right) { - super(shell, remoteFolders, left, right); + public TestRemoteCompareOperation(Shell shell, ICVSRemoteResource resource, CVSTag tag) { + super(shell, resource, tag); } /* @@ -149,12 +149,27 @@ public class CompareOperationTests extends CVSOperationTest { deleteResources(copy, new String[] {"folder1/b.txt"}, false); getProvider(copy).checkin(new IResource[] {copy}, IResource.DEPTH_INFINITE, DEFAULT_MONITOR); - // Run the compare operation - ICVSRemoteFolder remoteResource = (ICVSRemoteFolder)CVSWorkspaceRoot.getRemoteResourceFor(project); - TestRemoteCompareOperation op = new TestRemoteCompareOperation(null, new ICVSRemoteFolder[] { remoteResource }, v1, CVSTag.DEFAULT); + // Run the compare operation of the project folder + ICVSRemoteResource remoteResource = CVSWorkspaceRoot.getRemoteResourceFor(project); + TestRemoteCompareOperation op = new TestRemoteCompareOperation(null, remoteResource, v1); run(op); assertRevisionsMatch(op.getLeftTree(), project, new String[] {"folder1/a.txt"}, new String[] {"folder1/b.txt"}); assertRevisionsMatch(op.getRightTree(), copy, new String[] {"folder1/a.txt", "folder1/newFile", "folder2/folder3/add.txt" }, null /* files with no revision */); + + // Run the compare operation of a subfolder + remoteResource = CVSWorkspaceRoot.getRemoteResourceFor(project.getFolder("folder1")); + op = new TestRemoteCompareOperation(null, remoteResource, v1); + run(op); + assertRevisionsMatch(op.getLeftTree(), project, new String[] {"folder1/a.txt"}, new String[] {"folder1/b.txt"}); + assertRevisionsMatch(op.getRightTree(), copy, new String[] {"folder1/a.txt", "folder1/newFile" }, null /* files with no revision */); + + // Run the operation on a single file + remoteResource = CVSWorkspaceRoot.getRemoteResourceFor(project.getFile("folder1/a.txt")); + op = new TestRemoteCompareOperation(null, remoteResource, v1); + run(op); + assertRevisionsMatch(op.getLeftTree(), project, new String[] {"folder1/a.txt"}, null); + assertRevisionsMatch(op.getRightTree(), copy, new String[] {"folder1/a.txt" }, null /* files with no revision */); + } } |