Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Valenta2003-10-17 16:23:56 +0000
committerMichael Valenta2003-10-17 16:23:56 +0000
commit16ce9034e025b0ae7e57412935d3a560651ba839 (patch)
tree2d99c89afb780ada76fd8faf2613520bdd7a0c2d
parent70e2aa9e6a69ef9a7083ce0e514f30f943437ecc (diff)
downloadeclipse.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
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java17
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/BuildCleanupListener.java14
-rw-r--r--bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java49
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

Back to the top