Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Valenta2005-10-18 18:07:26 +0000
committerMichael Valenta2005-10-18 18:07:26 +0000
commit0e4b5b19487640968ee213f52459015c717f6db1 (patch)
treeb943c60451225c21f57702f6e34200a86bf5bd38
parent049d3cccf3b009bacdc3418863247b268b5951ee (diff)
downloadeclipse.platform.team-0e4b5b19487640968ee213f52459015c717f6db1.tar.gz
eclipse.platform.team-0e4b5b19487640968ee213f52459015c717f6db1.tar.xz
eclipse.platform.team-0e4b5b19487640968ee213f52459015c717f6db1.zip
Implement base and remote tree contents caching
-rw-r--r--bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoTree.java5
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSWorkspaceSubscriber.java32
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java2
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTree.java17
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/CVSResourceVariantTree.java36
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheBaseContentsOperation.java122
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheRemoteContentsOperation.java59
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheTreeContentsOperation.java126
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/RefreshDirtyStateOperation.java93
-rw-r--r--tests/org.eclipse.team.tests.cvs.core/launchConfigurations/CVS UI Tests.launch26
-rw-r--r--tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseTest.java2
11 files changed, 316 insertions, 204 deletions
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoTree.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoTree.java
index 9b058c91b..7e4ed3c28 100644
--- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoTree.java
+++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoTree.java
@@ -47,6 +47,11 @@ public class SyncInfoTree extends SyncInfoSet {
*/
public SyncInfoTree(SyncInfo[] infos) {
super(infos);
+ for (int i = 0; i < infos.length; i++) {
+ SyncInfo info = infos[i];
+ IResource local = info.getLocal();
+ addToParents(local, local);
+ }
}
/**
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSWorkspaceSubscriber.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSWorkspaceSubscriber.java
index 4f4d35400..7c9e39cbe 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSWorkspaceSubscriber.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSWorkspaceSubscriber.java
@@ -19,10 +19,7 @@ import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.*;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.core.ITeamStatus;
import org.eclipse.team.core.RepositoryProvider;
@@ -277,13 +274,12 @@ public class CVSWorkspaceSubscriber extends CVSSyncTreeSubscriber implements IRe
*/
public void updateRemote(CVSTeamProvider provider, ICVSFolder folder, boolean recurse, IProgressMonitor monitor) throws TeamException {
try {
- monitor.beginTask(null, 100);
+ monitor.beginTask(null, IProgressMonitor.UNKNOWN);
IResource resource = folder.getIResource();
if (resource != null) {
- ICVSResource tree = RemoteFolderTreeBuilder.buildBaseTree(
- (CVSRepositoryLocation)provider.getRemoteLocation(),
- folder,
- null,
+ ICVSResource tree = buildBaseTree(
+ resource,
+ false,
Policy.subMonitorFor(monitor, 50));
setRemote(resource, (IResourceVariant)tree, Policy.subMonitorFor(monitor, 50));
}
@@ -291,5 +287,23 @@ public class CVSWorkspaceSubscriber extends CVSSyncTreeSubscriber implements IRe
monitor.done();
}
}
+
+ public ICVSRemoteResource buildBaseTree(IResource resource, boolean immutable, IProgressMonitor monitor) throws TeamException {
+ try {
+ monitor.beginTask(null, IProgressMonitor.UNKNOWN);
+ return ((CVSResourceVariantTree)getBaseTree()).buildTree(null, resource, immutable, monitor);
+ } finally {
+ monitor.done();
+ }
+ }
+
+ public ICVSRemoteResource buildRemoteTree(IResource resource, boolean immutable, IProgressMonitor monitor) throws TeamException {
+ try {
+ monitor.beginTask(null, IProgressMonitor.UNKNOWN);
+ return ((CVSResourceVariantTree)getRemoteTree()).buildTree(null, resource, immutable, monitor);
+ } finally {
+ 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 f6a7e5698..6f3a3e8c7 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
@@ -132,7 +132,7 @@ public class RemoteFile extends RemoteResource implements ICVSRemoteFile {
return newInfo.getBytes();
}
- /* package */ RemoteFile(RemoteFolder parent, byte[] syncBytes) throws CVSException {
+ public RemoteFile(RemoteFolder parent, byte[] syncBytes) throws CVSException {
this(parent, Update.STATE_NONE, syncBytes);
}
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 49230bbf7..b111ed527 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
@@ -11,6 +11,7 @@
package org.eclipse.team.internal.ccvs.core.resources;
+import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.core.CVSTag;
@@ -18,6 +19,9 @@ import org.eclipse.team.internal.ccvs.core.ICVSRemoteResource;
import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation;
import org.eclipse.team.internal.ccvs.core.ICVSResource;
import org.eclipse.team.internal.ccvs.core.ICVSResourceVisitor;
+import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
+import org.eclipse.team.internal.ccvs.core.util.Assert;
+import org.eclipse.team.internal.ccvs.core.util.KnownRepositories;
/**
* Whereas the RemoteFolder class provides access to a remote hierarchy using
@@ -26,12 +30,23 @@ import org.eclipse.team.internal.ccvs.core.ICVSResourceVisitor;
*/
public class RemoteFolderTree extends RemoteFolder {
+ public static RemoteFolderTree fromBytes(RemoteFolderTree parent, IResource local, byte[] bytes) throws CVSException {
+ Assert.isNotNull(bytes);
+ Assert.isTrue(local.getType() != IResource.FILE);
+ FolderSyncInfo syncInfo = FolderSyncInfo.getFolderSyncInfo(bytes);
+ return new RemoteFolderTree(parent, local.getName(), KnownRepositories.getInstance().getRepository(syncInfo.getRoot()), syncInfo.getRepository(), syncInfo.getTag(), syncInfo.getIsStatic());
+ }
+
public RemoteFolderTree(RemoteFolder parent, ICVSRepositoryLocation repository, String repositoryRelativePath, CVSTag tag) {
super(parent, repository, repositoryRelativePath, tag);
}
public RemoteFolderTree(RemoteFolder parent, String name, ICVSRepositoryLocation repository, String repositoryRelativePath, CVSTag tag) {
- super(parent, name, repository, repositoryRelativePath, tag, false);
+ this(parent, name, repository, repositoryRelativePath, tag, false);
+ }
+
+ public RemoteFolderTree(RemoteFolder parent, String name, ICVSRepositoryLocation repository, String repositoryRelativePath, CVSTag tag, boolean isStatic) {
+ super(parent, name, repository, repositoryRelativePath, tag, isStatic);
}
/*
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/CVSResourceVariantTree.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/CVSResourceVariantTree.java
index 8478e5af9..bd1dcef47 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/CVSResourceVariantTree.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/CVSResourceVariantTree.java
@@ -352,4 +352,40 @@ public class CVSResourceVariantTree extends ResourceVariantTree {
}
return false;
}
+
+
+ public ICVSRemoteResource buildTree(RemoteFolderTree parent, IResource resource, boolean immutable, IProgressMonitor monitor) throws TeamException {
+
+ Policy.checkCanceled(monitor);
+
+ byte[] remoteBytes = getByteStore().getBytes(resource);
+ if (remoteBytes == null) {
+ // There is no remote handle for this resource
+ return null;
+ }
+
+ if (resource.getType() == IResource.FILE) {
+ if (immutable) {
+ remoteBytes = ResourceSyncInfo.setTag(remoteBytes, new CVSTag(ResourceSyncInfo.getRevision(remoteBytes), CVSTag.VERSION));
+ }
+ if (parent == null) {
+ return (ICVSRemoteResource)getResourceVariant(resource);
+ }
+ return new RemoteFile(parent, remoteBytes);
+ } else {
+ RemoteFolderTree remote = RemoteFolderTree.fromBytes(parent, resource, remoteBytes);
+ IResource[] members = members(resource);
+ List children = new ArrayList();
+ for (int i = 0; i < members.length; i++) {
+ IResource member = members[i];
+ ICVSRemoteResource child = buildTree(remote, member, immutable, monitor);
+ if (child != null)
+ children.add(child);
+ }
+
+ // Add the children to the remote folder tree
+ remote.setChildren((ICVSRemoteResource[])children.toArray(new ICVSRemoteResource[children.size()]));
+ return remote;
+ }
+ }
}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheBaseContentsOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheBaseContentsOperation.java
index 98c7f4b79..f3c9cc251 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheBaseContentsOperation.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheBaseContentsOperation.java
@@ -10,135 +10,55 @@
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.operations;
-import java.util.ArrayList;
-import java.util.List;
-
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.util.NLS;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.synchronize.SyncInfo;
import org.eclipse.team.core.synchronize.SyncInfoTree;
import org.eclipse.team.core.variants.IResourceVariant;
import org.eclipse.team.internal.ccvs.core.*;
-import org.eclipse.team.internal.ccvs.core.client.*;
import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption;
-import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation;
-import org.eclipse.team.internal.ccvs.core.resources.*;
-import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
+import org.eclipse.team.internal.ccvs.core.resources.RemoteFile;
import org.eclipse.ui.IWorkbenchPart;
/**
* Operation that ensures that the contents for base
* of each local resource is cached.
*/
-public class CacheBaseContentsOperation extends SingleCommandOperation {
+public class CacheBaseContentsOperation extends CacheTreeContentsOperation {
- private final SyncInfoTree tree;
private final boolean includeOutgoing;
public CacheBaseContentsOperation(IWorkbenchPart part, ResourceMapping[] mappers, LocalOption[] options, SyncInfoTree tree, boolean includeOutgoing) {
- super(part, mappers, options);
- this.tree = tree;
+ super(part, mappers, options, tree);
this.includeOutgoing = includeOutgoing;
}
-
- protected void execute(CVSTeamProvider provider, IResource[] resources, boolean recurse, IProgressMonitor monitor) throws CVSException, InterruptedException {
- IResource[] files = getFilesWithUncachedContents(resources, recurse);
- if (files.length > 0)
- super.execute(provider, files, recurse, monitor);
- }
- private IResource[] getFilesWithUncachedContents(IResource[] resources, boolean recurse) {
- ArrayList result = new ArrayList();
- for (int i = 0; i < resources.length; i++) {
- IResource resource = resources[i];
- SyncInfo[] infos = tree.getSyncInfos(resource, recurse ? IResource.DEPTH_INFINITE: IResource.DEPTH_ONE);
- for (int j = 0; j < infos.length; j++) {
- SyncInfo info = infos[j];
- IResource local = info.getLocal();
- IResourceVariant base = info.getBase();
- if (base != null && local.getType() == IResource.FILE) {
- int direction = SyncInfo.getDirection(info.getKind());
- if (isEnabledForDirection(direction)) {
- if (base instanceof RemoteFile) {
- RemoteFile remote = (RemoteFile) base;
- if (!remote.isContentsCached()) {
- result.add(local);
- }
- }
- }
- }
+ protected boolean needsContents(SyncInfo info) {
+ IResource local = info.getLocal();
+ IResourceVariant base = info.getBase();
+ if (base != null && local.getType() == IResource.FILE) {
+ int direction = SyncInfo.getDirection(info.getKind());
+ if (isEnabledForDirection(direction)) {
+ if (base instanceof RemoteFile) {
+ RemoteFile remote = (RemoteFile) base;
+ if (!remote.isContentsCached()) {
+ return true;
+ }
+ }
}
}
- return (IResource[]) result.toArray(new IResource[result.size()]);
+ return false;
}
- /**
- * By default, this operation will only fetch the base for
- * files that are conflicting.
- * @param direction the change direction
- * @return whether the operation is enabled for the given change direction
- */
- protected boolean isEnabledForDirection(int direction) {
+ private boolean isEnabledForDirection(int direction) {
return direction == SyncInfo.CONFLICTING ||
(includeOutgoing && direction == SyncInfo.OUTGOING);
}
- /* (non-Javadoc)
- *
- * Use a local root that is really the base tree so we can cache
- * the base contents without affecting the local contents.
- *
- * @see org.eclipse.team.internal.ccvs.ui.operations.RepositoryProviderOperation#getLocalRoot(org.eclipse.team.internal.ccvs.core.CVSTeamProvider)
- */
- protected ICVSFolder getLocalRoot(CVSTeamProvider provider)
- throws CVSException {
- RemoteFolderTree tree = RemoteFolderTreeBuilder.buildBaseTree(
- (CVSRepositoryLocation) getRemoteLocation(provider),
- CVSWorkspaceRoot.getCVSFolderFor(provider.getProject()), null,
- new NullProgressMonitor());
- return tree;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.team.internal.ccvs.ui.operations.RepositoryProviderOperation#getCVSArguments(org.eclipse.core.resources.IResource[])
- */
- protected ICVSResource[] getCVSArguments(Session session, IResource[] resources) {
- List result = new ArrayList();
- for (int i = 0; i < resources.length; i++) {
- IResource resource = resources[i];
- try {
- ICVSResource file = session.getLocalRoot().getChild(resource.getProjectRelativePath().toString());
- result.add(file);
- } catch (CVSException e) {
- // Log and continue
- CVSUIPlugin.log(e);
- }
- }
-
- return (ICVSResource[]) result.toArray(new ICVSResource[result.size()]);
- }
-
- protected IStatus executeCommand(Session session, CVSTeamProvider provider, ICVSResource[] resources, boolean recurse, IProgressMonitor monitor) throws CVSException, InterruptedException {
- return Command.UPDATE.execute(
- session,
- Command.NO_GLOBAL_OPTIONS,
- getLocalOptions(true),
- resources,
- null,
- monitor);
- }
-
- protected LocalOption[] getLocalOptions(boolean recurse) {
- return Update.IGNORE_LOCAL_CHANGES.addTo(super.getLocalOptions(recurse));
- }
- protected String getTaskName(CVSTeamProvider provider) {
- return NLS.bind("Fetching contents for changed files in {0}", new String[] {provider.getProject().getName()});
- }
-
- protected String getTaskName() {
- return "Fetching contents for changed files";
+ protected ICVSRemoteResource buildTree(CVSTeamProvider provider) throws TeamException {
+ return CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber().buildBaseTree(provider.getProject(), true, new NullProgressMonitor());
}
}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheRemoteContentsOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheRemoteContentsOperation.java
new file mode 100644
index 000000000..1c088c890
--- /dev/null
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheRemoteContentsOperation.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.team.internal.ccvs.ui.operations;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.mapping.ResourceMapping;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.team.core.TeamException;
+import org.eclipse.team.core.synchronize.SyncInfo;
+import org.eclipse.team.core.synchronize.SyncInfoTree;
+import org.eclipse.team.core.variants.IResourceVariant;
+import org.eclipse.team.internal.ccvs.core.*;
+import org.eclipse.team.internal.ccvs.core.CVSTeamProvider;
+import org.eclipse.team.internal.ccvs.core.ICVSRemoteResource;
+import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption;
+import org.eclipse.team.internal.ccvs.core.resources.RemoteFile;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Operation that ensures that the contents for remote
+ * of each local resource is cached.
+ */
+public class CacheRemoteContentsOperation extends CacheTreeContentsOperation {
+
+ public CacheRemoteContentsOperation(IWorkbenchPart part, ResourceMapping[] mappers, LocalOption[] options, SyncInfoTree tree) {
+ super(part, mappers, options, tree);
+ }
+
+ protected boolean needsContents(SyncInfo info) {
+ IResource local = info.getLocal();
+ IResourceVariant remote = info.getRemote();
+ if (remote != null && local.getType() == IResource.FILE) {
+ int direction = SyncInfo.getDirection(info.getKind());
+ if (direction == SyncInfo.CONFLICTING ||
+ direction == SyncInfo.INCOMING) {
+ if (remote instanceof RemoteFile) {
+ RemoteFile remoteFile = (RemoteFile) remote;
+ if (!remoteFile.isContentsCached()) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ protected ICVSRemoteResource buildTree(CVSTeamProvider provider) throws TeamException {
+ return CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber().buildRemoteTree(provider.getProject(), true, new NullProgressMonitor());
+ }
+
+}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheTreeContentsOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheTreeContentsOperation.java
new file mode 100644
index 000000000..d7ad454ba
--- /dev/null
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CacheTreeContentsOperation.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.team.internal.ccvs.ui.operations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.mapping.ResourceMapping;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.team.core.TeamException;
+import org.eclipse.team.core.synchronize.SyncInfo;
+import org.eclipse.team.core.synchronize.SyncInfoTree;
+import org.eclipse.team.internal.ccvs.core.*;
+import org.eclipse.team.internal.ccvs.core.client.*;
+import org.eclipse.team.internal.ccvs.core.client.Command.LocalOption;
+import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Abstract operation for caching the contents for any files
+ * in a particular remote tree that differ from the local contents.*
+ */
+public abstract class CacheTreeContentsOperation extends SingleCommandOperation {
+
+ private final SyncInfoTree tree;
+
+ public CacheTreeContentsOperation(IWorkbenchPart part, ResourceMapping[] mappers, LocalOption[] options, SyncInfoTree tree) {
+ super(part, mappers, options);
+ this.tree = tree;
+ }
+
+ protected void execute(CVSTeamProvider provider, IResource[] resources, boolean recurse, IProgressMonitor monitor) throws CVSException, InterruptedException {
+ IResource[] files = getFilesWithUncachedContents(resources, recurse);
+ if (files.length > 0)
+ super.execute(provider, files, recurse, monitor);
+ }
+
+ private IResource[] getFilesWithUncachedContents(IResource[] resources, boolean recurse) {
+ ArrayList result = new ArrayList();
+ for (int i = 0; i < resources.length; i++) {
+ IResource resource = resources[i];
+ SyncInfo[] infos = tree.getSyncInfos(resource, recurse ? IResource.DEPTH_INFINITE: IResource.DEPTH_ONE);
+ for (int j = 0; j < infos.length; j++) {
+ SyncInfo info = infos[j];
+ if (needsContents(info)) {
+ result.add(info.getLocal());
+ }
+ }
+ }
+ return (IResource[]) result.toArray(new IResource[result.size()]);
+ }
+
+ protected abstract boolean needsContents(SyncInfo info);
+
+ /* (non-Javadoc)
+ *
+ * Use a local root that is really the base tree so we can cache
+ * the base contents without affecting the local contents.
+ *
+ * @see org.eclipse.team.internal.ccvs.ui.operations.RepositoryProviderOperation#getLocalRoot(org.eclipse.team.internal.ccvs.core.CVSTeamProvider)
+ */
+ protected ICVSFolder getLocalRoot(CVSTeamProvider provider)
+ throws CVSException {
+ try {
+ ICVSRemoteResource tree = buildTree(provider);
+ return (ICVSFolder)tree;
+ } catch (TeamException e) {
+ throw CVSException.wrapException(e);
+ }
+ }
+
+ protected abstract ICVSRemoteResource buildTree(CVSTeamProvider provider) throws TeamException;
+
+ /* (non-Javadoc)
+ * @see org.eclipse.team.internal.ccvs.ui.operations.RepositoryProviderOperation#getCVSArguments(org.eclipse.core.resources.IResource[])
+ */
+ protected ICVSResource[] getCVSArguments(Session session, IResource[] resources) {
+ List result = new ArrayList();
+ for (int i = 0; i < resources.length; i++) {
+ IResource resource = resources[i];
+ try {
+ ICVSResource file = session.getLocalRoot().getChild(resource.getProjectRelativePath().toString());
+ result.add(file);
+ } catch (CVSException e) {
+ // Log and continue
+ CVSUIPlugin.log(e);
+ }
+ }
+
+ return (ICVSResource[]) result.toArray(new ICVSResource[result.size()]);
+ }
+
+ protected IStatus executeCommand(Session session, CVSTeamProvider provider, ICVSResource[] resources, boolean recurse, IProgressMonitor monitor) throws CVSException, InterruptedException {
+ return Command.UPDATE.execute(
+ session,
+ Command.NO_GLOBAL_OPTIONS,
+ getLocalOptions(true),
+ resources,
+ null,
+ monitor);
+ }
+
+ protected LocalOption[] getLocalOptions(boolean recurse) {
+ return Update.IGNORE_LOCAL_CHANGES.addTo(super.getLocalOptions(recurse));
+ }
+
+ protected String getTaskName(CVSTeamProvider provider) {
+ return NLS.bind("Fetching contents for changed files in {0}", new String[] {provider.getProject().getName()});
+ }
+
+ protected String getTaskName() {
+ return "Fetching contents for changed files";
+ }
+
+}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/RefreshDirtyStateOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/RefreshDirtyStateOperation.java
index f04b7367f..a9115fedc 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/RefreshDirtyStateOperation.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/RefreshDirtyStateOperation.java
@@ -10,29 +10,22 @@
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.subscriber;
-import java.util.ArrayList;
-import java.util.List;
+import java.lang.reflect.InvocationTargetException;
import org.eclipse.compare.structuremergeviewer.IDiffElement;
import org.eclipse.core.resources.*;
+import org.eclipse.core.resources.mapping.ResourceMapping;
import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.synchronize.*;
import org.eclipse.team.core.synchronize.SyncInfoFilter.ContentComparisonSyncInfoFilter;
-import org.eclipse.team.core.variants.IResourceVariant;
import org.eclipse.team.internal.ccvs.core.*;
-import org.eclipse.team.internal.ccvs.core.client.*;
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.Command.LocalOption;
-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.*;
-import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
-import org.eclipse.team.internal.ccvs.core.util.KnownRepositories;
+import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
import org.eclipse.team.internal.ccvs.ui.CVSUIMessages;
import org.eclipse.team.internal.ccvs.ui.Policy;
+import org.eclipse.team.internal.ccvs.ui.operations.CacheBaseContentsOperation;
import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration;
/**
@@ -54,7 +47,7 @@ public class RefreshDirtyStateOperation extends CVSSubscriberOperation {
monitor.beginTask(null, 200);
IProject project = infos[0].getLocal().getProject();
ICVSFolder folder = CVSWorkspaceRoot.getCVSFolderFor(project);
- ensureBaseContentsCached(folder, infos, Policy.subMonitorFor(monitor, 100));
+ ensureBaseContentsCached(project, infos, Policy.subMonitorFor(monitor, 100));
folder.run(new ICVSRunnable() {
public void run(IProgressMonitor monitor) throws CVSException {
monitor.beginTask(null, infos.length * 100);
@@ -74,71 +67,15 @@ public class RefreshDirtyStateOperation extends CVSSubscriberOperation {
monitor.done();
}
- private void ensureBaseContentsCached(ICVSFolder project, SyncInfo[] infos, IProgressMonitor monitor) throws CVSException {
- ICVSRepositoryLocation location = getRemoteLocation(project);
- if (location == null) return;
- monitor.beginTask(null, 100);
- SyncInfo[] needContents = getBaseFilesWithUncachedContents(infos, Policy.subMonitorFor(monitor, 10));
- if (needContents.length == 0) return;
- RemoteFolderTree tree = RemoteFolderTreeBuilder.buildBaseTree((CVSRepositoryLocation)location , project, null, Policy.subMonitorFor(monitor, 20));
- ICVSFile[] files = getFilesToUpdate(tree, infos);
- replaceContents(location, tree, files, Policy.subMonitorFor(monitor, 70));
- monitor.done();
- }
-
- private ICVSFile[] getFilesToUpdate(RemoteFolderTree tree, SyncInfo[] infos) throws CVSException {
- List newFiles = new ArrayList();
- for (int i = 0; i < infos.length; i++) {
- SyncInfo info = infos[i];
- ICVSFile file = tree.getFile(info.getLocal().getProjectRelativePath().toString());
- newFiles.add(file);
- }
-
- return (ICVSFile[]) newFiles.toArray(new ICVSFile[newFiles.size()]);
- }
-
- private void replaceContents(ICVSRepositoryLocation location, ICVSFolder project, ICVSFile[] files, IProgressMonitor monitor) throws CVSException {
- monitor.beginTask(null, 100);
- Session session = new Session(location, project, false);
- try {
- session.open(Policy.subMonitorFor(monitor, 10));
- IStatus execute = Command.UPDATE.execute(
- session,
- Command.NO_GLOBAL_OPTIONS,
- new LocalOption[] { Update.IGNORE_LOCAL_CHANGES },
- files,
- null,
- Policy.subMonitorFor(monitor, 90));
- if (execute.getCode() == CVSStatus.SERVER_ERROR) {
- throw new CVSServerException(execute);
- }
- } finally {
- session.close();
- }
-
- }
-
- private SyncInfo[] getBaseFilesWithUncachedContents(SyncInfo[] infos, IProgressMonitor monitor) {
- List files = new ArrayList();
- for (int i = 0; i < infos.length; i++) {
- SyncInfo info = infos[i];
- IResourceVariant base = info.getBase();
- if (base instanceof RemoteFile) {
- RemoteFile remote = (RemoteFile) base;
- if (!remote.isContentsCached()) {
- files.add(info);
- }
- }
- }
- return (SyncInfo[]) files.toArray(new SyncInfo[files.size()]);
- }
-
- private ICVSRepositoryLocation getRemoteLocation(ICVSFolder project) throws CVSException {
- FolderSyncInfo info = project.getFolderSyncInfo();
- if (info == null) {
- return null;
- }
- return KnownRepositories.getInstance().getRepository(info.getRoot());
+ private void ensureBaseContentsCached(IProject project, SyncInfo[] infos, IProgressMonitor monitor) throws CVSException {
+ try {
+ new CacheBaseContentsOperation(getPart(), new ResourceMapping[] { (ResourceMapping)project.getAdapter(ResourceMapping.class) },
+ Command.NO_LOCAL_OPTIONS, new SyncInfoTree(infos), true).run(monitor);
+ } catch (InvocationTargetException e) {
+ throw CVSException.wrapException(e);
+ } catch (InterruptedException e) {
+ throw new OperationCanceledException();
+ }
}
protected String getErrorTitle() {
diff --git a/tests/org.eclipse.team.tests.cvs.core/launchConfigurations/CVS UI Tests.launch b/tests/org.eclipse.team.tests.cvs.core/launchConfigurations/CVS UI Tests.launch
index a91334527..67cb9dc59 100644
--- a/tests/org.eclipse.team.tests.cvs.core/launchConfigurations/CVS UI Tests.launch
+++ b/tests/org.eclipse.team.tests.cvs.core/launchConfigurations/CVS UI Tests.launch
@@ -55,19 +55,19 @@
<mapEntry key="org.eclipse.help.ui/debug/ieadapter/inprocess" value="false"/>
<mapEntry key="org.eclipse.jface/trace/actions" value="false"/>
<mapEntry key="org.eclipse.core.runtime/registry/debug/events/extension" value="false"/>
-<mapEntry key="org.eclipse.help.webapp/debug" value="true"/>
<mapEntry key="org.eclipse.jdt.core/debug/hierarchy" value="false"/>
+<mapEntry key="org.eclipse.help.webapp/debug" value="true"/>
<mapEntry key="org.eclipse.team.cvs.core/debug" value="true"/>
<mapEntry key="org.eclipse.jdt.core/debug/cpresolution" value="false"/>
<mapEntry key="org.eclipse.team.cvs.core/threading" value="false"/>
<mapEntry key="org.eclipse.update.core/debug/warning" value="false"/>
<mapEntry key="org.eclipse.core.resources/save" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/internalerror/openDialog" value="false"/>
<mapEntry key="org.eclipse.update.core/debug/install" value="false"/>
+<mapEntry key="org.eclipse.ui/debug/internalerror/openDialog" value="false"/>
<mapEntry key="org.eclipse.core.resources/debug" value="false"/>
<mapEntry key="org.eclipse.update.core/debug/parsing" value="false"/>
-<mapEntry key="org.eclipse.core.boot/trace/filters" value="trace.properties"/>
<mapEntry key="org.eclipse.core.resources/restore/syncinfo" value="false"/>
+<mapEntry key="org.eclipse.core.boot/trace/filters" value="trace.properties"/>
<mapEntry key="org.eclipse.team.cvs.core/cvsprotocol" value="true"/>
<mapEntry key="org.eclipse.jdt.core/debug/postaction" value="false"/>
<mapEntry key="org.eclipse.core.runtime/url/debug/cachelookup" value="false"/>
@@ -77,15 +77,15 @@
<mapEntry key="org.eclipse.core.resources/save/syncinfo" value="false"/>
<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/resource" value="*"/>
<mapEntry key="org.eclipse.team.ftp/list" value="true"/>
-<mapEntry key="org.eclipse.team.cvs.ssh/debug" value="false"/>
<mapEntry key="org.eclipse.core.runtime/loader/debug/activateplugin" value="false"/>
+<mapEntry key="org.eclipse.team.cvs.ssh/debug" value="false"/>
<mapEntry key="org.eclipse.core.resources/monitor/builders" value="false"/>
<mapEntry key="org.eclipse.core.resources/save/markers" value="false"/>
<mapEntry key="org.eclipse.update.core/debug/installhandler" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/selection" value="false"/>
<mapEntry key="org.eclipse.jdt.core/debug/javadelta" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/workbench.restore" value="false"/>
+<mapEntry key="org.eclipse.jdt.core/debug/selection" value="false"/>
<mapEntry key="org.eclipse.core.resources/restore/tree" value="false"/>
+<mapEntry key="org.eclipse.ui/trace/workbench.restore" value="false"/>
<mapEntry key="org.eclipse.ui/trace/part.create" value="false"/>
<mapEntry key="org.eclipse.help/debug/protocols" value="false"/>
<mapEntry key="org.eclipse.core.resources/restore/snapshots" value="false"/>
@@ -93,13 +93,13 @@
<mapEntry key="org.eclipse.team.cvs.core/dirtycaching" value="false"/>
<mapEntry key="org.eclipse.core.runtime/loader/debug/filter/native" value="*"/>
<mapEntry key="org.eclipse.jdt.core/debug/zipaccess" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/loader/debug/properties" value="false"/>
<mapEntry key="org.eclipse.core.runtime/url/debug/cachecopy" value="false"/>
+<mapEntry key="org.eclipse.core.runtime/loader/debug/properties" value="false"/>
<mapEntry key="org.eclipse.core.runtime/loader/debug/create" value="false"/>
<mapEntry key="org.eclipse.core.runtime/jobs/beginend" value="false"/>
<mapEntry key="org.eclipse.team.cvs.core/metafiles" value="false"/>
-<mapEntry key="org.eclipse.team.core/debug" value="false"/>
<mapEntry key="org.eclipse.team.ftp/responses" value="true"/>
+<mapEntry key="org.eclipse.team.core/debug" value="false"/>
<mapEntry key="org.eclipse.core.runtime/loader/debug/prefixes/success" value="false"/>
<mapEntry key="org.eclipse.core.runtime/jobs" value="false"/>
<mapEntry key="org.eclipse.core.boot/monitor/plugins" value="false"/>
@@ -125,8 +125,8 @@
<mapEntry key="org.eclipse.core.runtime/config/debug" value="false"/>
<mapEntry key="org.eclipse.help.ui/debug" value="true"/>
<mapEntry key="org.eclipse.core.resources/restore/metainfo" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug" value="true"/>
<mapEntry key="org.eclipse.core.resources/save/mastertable" value="false"/>
+<mapEntry key="org.eclipse.debug.ui/debug" value="true"/>
<mapEntry key="org.eclipse.jdt.debug/debug" value="true"/>
<mapEntry key="org.eclipse.core.runtime/debug" value="false"/>
<mapEntry key="org.eclipse.jdt.core/debug/buffermanager" value="false"/>
@@ -142,17 +142,18 @@
<booleanAttribute key="automaticAdd" value="true"/>
<stringAttribute key="checked" value="[NONE]"/>
<booleanAttribute key="includeFragments" value="false"/>
+<stringAttribute key="location" value="C:\Eclipse\Latest-Eclipse-Drop\eclipse\runtime-test-workspace"/>
<booleanAttribute key="clearws" value="true"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.team.tests.ccvs.core.AllTests"/>
<stringAttribute key="location1" value="C:\Eclipse\Latest-Eclipse-Drop\eclipse\runtime-test-workspace"/>
-<stringAttribute key="vmargs" value="-Declipse.cvs.properties=c:\eclipse\repository.properties -Declipse.cvs.testName2=testFileAdditions"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os win32 -ws win32 -arch x86 -nl en_CA"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.cvs.properties=c:\eclipse\repository.properties -Declipse.cvs.testName2=testFileAdditions"/>
<booleanAttribute key="default" value="true"/>
<booleanAttribute key="clearConfig" value="true"/>
<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="true"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
<stringAttribute key="onePluginID" value=""/>
-<stringAttribute key="progargs" value="-os win32 -ws win32 -arch x86 -nl en_CA"/>
<booleanAttribute key="useDefaultConfig" value="true"/>
<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.team.tests.cvs.core"/>
@@ -160,5 +161,4 @@
<booleanAttribute key="onePlugin" value="false"/>
<booleanAttribute key="includeOptional" value="true"/>
<booleanAttribute key="maximized" value="false"/>
-<stringAttribute key="location0" value="C:\Eclipse\Latest-Eclipse-Drop\eclipse\runtime-test-workspace"/>
</launchConfiguration>
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseTest.java
index ce72760c2..1c9a3927d 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseTest.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseTest.java
@@ -416,7 +416,7 @@ public class EclipseTest extends ResourceTest {
RemoteFolder remote = new RemoteFolder(null, repository, sourceModule == null ? project.getName() : sourceModule, tag);
executeHeadless(new CheckoutSingleProjectOperation(null, remote, project, null, false /* the project is not preconfigured */) {
- public boolean promptToOverwrite(String title, String msg) {
+ public boolean promptToOverwrite(String title, String msg, IResource resource) {
return true;
}
});

Back to the top