diff options
author | Michael Valenta | 2003-10-17 16:23:56 +0000 |
---|---|---|
committer | Michael Valenta | 2003-10-17 16:23:56 +0000 |
commit | 16ce9034e025b0ae7e57412935d3a560651ba839 (patch) | |
tree | 2d99c89afb780ada76fd8faf2613520bdd7a0c2d | |
parent | 70e2aa9e6a69ef9a7083ce0e514f30f943437ecc (diff) | |
download | eclipse.platform.team-16ce9034e025b0ae7e57412935d3a560651ba839.tar.gz eclipse.platform.team-16ce9034e025b0ae7e57412935d3a560651ba839.tar.xz eclipse.platform.team-16ce9034e025b0ae7e57412935d3a560651ba839.zip |
43494: [CVS UI] Orphaned CVS folders remain until auto-build
3 files changed, 68 insertions, 12 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java index 8d962a619..0f3e45440 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java @@ -702,4 +702,21 @@ public class CVSWorkspaceRoot { if (cvsResource.isIgnored()) return false; return cvsResource.getParent().isCVSFolder(); } + + /** + * Return whether the given container is an orphaned subtree. An orphaned subtree + * is folder (i.e. non-project) that is a CVS folder but is not managed and is not + * a linked resource. To know if the resource is a descendant of an orphaned subtree, + * the client must invoked this method for each ancestor of a resource. + * @param container the container being tested + * @return whether the container is an orphaned CVS folder + * @throws CVSException + */ + public static boolean isOrphanedSubtree(IContainer container) throws CVSException { + ICVSFolder mFolder = CVSWorkspaceRoot.getCVSFolderFor(container); + return (mFolder.isCVSFolder() + && ! mFolder.isManaged() + && mFolder.getIResource().getType() == IResource.FOLDER + && !isLinkedResource(container)); + } } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/BuildCleanupListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/BuildCleanupListener.java index 7841f4a59..16d82a15b 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/BuildCleanupListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/BuildCleanupListener.java @@ -27,7 +27,6 @@ import org.eclipse.team.core.TeamException; import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; import org.eclipse.team.internal.ccvs.core.ICVSFolder; -import org.eclipse.team.internal.ccvs.core.ICVSResource; import org.eclipse.team.internal.ccvs.core.ICVSRunnable; import org.eclipse.team.internal.ccvs.core.Policy; import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; @@ -80,10 +79,8 @@ public class BuildCleanupListener implements IResourceDeltaVisitor, IResourceCha */ private boolean handleOrphanedSubtree(IContainer container) { try { - ICVSFolder mFolder = CVSWorkspaceRoot.getCVSFolderFor(container); - if (mFolder.isCVSFolder() && ! mFolder.isManaged() && mFolder.getIResource().getParent().getType() != IResource.ROOT) { - // linked resources are not considered orphans even if they have CVS folders in them - if (isLinkedResource(mFolder)) return false; + if (CVSWorkspaceRoot.isOrphanedSubtree(container)) { + ICVSFolder mFolder = CVSWorkspaceRoot.getCVSFolderFor(container); mFolder.unmanage(null); return true; } @@ -93,13 +90,6 @@ public class BuildCleanupListener implements IResourceDeltaVisitor, IResourceCha return false; } - private boolean isLinkedResource(ICVSResource cvsResource) throws CVSException { - IResource iResource = cvsResource.getIResource(); - if (iResource != null) - return CVSWorkspaceRoot.isLinkedResource(iResource); - return false; - } - public void resourceChanged(IResourceChangeEvent event) { try { IResourceDelta root = event.getDelta(); diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java index 9196cd564..d12fd29f6 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java @@ -21,6 +21,7 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceStatus; @@ -66,6 +67,10 @@ public abstract class WorkspaceAction extends CVSAction { if (super.beginExecution(action)) { // Ensure that the required sync info is loaded if (requiresLocalSyncInfo()) { + // There is a possibility of the selection containing an orphaned subtree. + // If it does, they will be purged and enablement rechecked before the + // operation is performed. + handleOrphanedSubtrees(); // Check enablement just in case the sync info wasn't loaded if (!isEnabled()) { MessageDialog.openInformation(getShell(), Policy.bind("CVSAction.disabledTitle"), Policy.bind("CVSAction.disabledMessage")); //$NON-NLS-1$ //$NON-NLS-2$ @@ -78,6 +83,50 @@ public abstract class WorkspaceAction extends CVSAction { } } + /* + * Determine if any of the selected resources are deascendants of + * an orphaned CVS subtree and if they are, purge the CVS folders. + */ + private boolean handleOrphanedSubtrees() { + // invoke the inherited method so that overlaps are maintained + IResource[] resources = getSelectedResources(); + for (int i = 0; i < resources.length; i++) { + IResource resource = resources[i]; + handleOrphanedSubtree(resource); + } + return false; + } + + /* + * Determine if the resource is a descendant of an orphaned subtree. + * If it is, purge the CVS folders of the subtree. + */ + private void handleOrphanedSubtree(IResource resource) { + try { + if (!CVSWorkspaceRoot.isSharedWithCVS(resource)) return ; + ICVSFolder folder; + if (resource.getType() == IResource.FILE) { + folder = CVSWorkspaceRoot.getCVSFolderFor(resource.getParent()); + } else { + folder = CVSWorkspaceRoot.getCVSFolderFor((IContainer)resource); + } + handleOrphanedSubtree(folder); + } catch (CVSException e) { + CVSProviderPlugin.log(e); + } + } + + /* + * Recursively check for and handle orphaned CVS folders + */ + private void handleOrphanedSubtree(ICVSFolder folder) throws CVSException { + if (folder.getIResource().getType() == IResource.PROJECT) return; + if (CVSWorkspaceRoot.isOrphanedSubtree((IContainer)folder.getIResource())) { + folder.unmanage(null); + } + handleOrphanedSubtree(folder.getParent()); + } + /** * Return true if the sync info is loaded for all selected resources. * The purpose of this method is to allow enablement code to be as fast |