diff options
author | Michael Valenta | 2005-10-18 18:07:26 +0000 |
---|---|---|
committer | Michael Valenta | 2005-10-18 18:07:26 +0000 |
commit | 0e4b5b19487640968ee213f52459015c717f6db1 (patch) | |
tree | b943c60451225c21f57702f6e34200a86bf5bd38 | |
parent | 049d3cccf3b009bacdc3418863247b268b5951ee (diff) | |
download | eclipse.platform.team-0e4b5b19487640968ee213f52459015c717f6db1.tar.gz eclipse.platform.team-0e4b5b19487640968ee213f52459015c717f6db1.tar.xz eclipse.platform.team-0e4b5b19487640968ee213f52459015c717f6db1.zip |
Implement base and remote tree contents caching
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; } }); |