Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Valenta2003-10-21 20:45:54 +0000
committerMichael Valenta2003-10-21 20:45:54 +0000
commit66322f2051539648ff9b8c9c6ef020fed10dab72 (patch)
tree7b5f3a892bbd3f6e6f0b42596ba7f1ba99901586
parent48c453816da934719caecbf4adc786313afcdf0a (diff)
downloadeclipse.platform.team-66322f2051539648ff9b8c9c6ef020fed10dab72.tar.gz
eclipse.platform.team-66322f2051539648ff9b8c9c6ef020fed10dab72.tar.xz
eclipse.platform.team-66322f2051539648ff9b8c9c6ef020fed10dab72.zip
*** empty log message ***
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RDiff.java1
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IMessagePatterns.java14
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/RDiffSummaryListener.java28
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ServerMessageLineMatcher.java13
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties3
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/FileContentCachingService.java17
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java32
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareRemoteWithTagAction.java63
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties1
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteCompareOperation.java124
-rw-r--r--tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/unit/CompareOperationTests.java25
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 */);
+
}
}

Back to the top