Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileChangeListener.java')
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileChangeListener.java73
1 files changed, 31 insertions, 42 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileChangeListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileChangeListener.java
index e5405078a..eff0002eb 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileChangeListener.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileChangeListener.java
@@ -64,7 +64,16 @@ public class SyncFileChangeListener implements IResourceChangeListener {
protected boolean isProjectOpening = false;
- protected DeferredResourceChangeHandler deferredHandler = new DeferredResourceChangeHandler();
+ protected static DeferredResourceChangeHandler deferredHandler = new DeferredResourceChangeHandler();
+
+ /**
+ * This accessor is for use by test cases only.
+ *
+ * @return Returns the deferredHandler.
+ */
+ public static DeferredResourceChangeHandler getDeferredHandler() {
+ return deferredHandler;
+ }
/*
* When a resource changes this method will detect if the changed resources is a meta file that has changed
@@ -77,9 +86,12 @@ public class SyncFileChangeListener implements IResourceChangeListener {
public void resourceChanged(IResourceChangeEvent event) {
try {
final Set changedContainers = new HashSet();
+ final Set externalDeletions = new HashSet();
+
setProjectOpening(false);
event.getDelta().accept(new IResourceDeltaVisitor() {
+
public boolean visit(IResourceDelta delta) throws CoreException {
IResource resource = delta.getResource();
@@ -103,8 +115,6 @@ public class SyncFileChangeListener implements IResourceChangeListener {
(delta.getFlags() & INTERESTING_CHANGES) == 0) {
return true;
}
-
- IResource[] toBeNotified = new IResource[0];
if(name.equals(SyncFileWriter.CVS_DIRNAME)) {
handleCVSDir((IContainer)resource, kind);
@@ -116,38 +126,30 @@ public class SyncFileChangeListener implements IResourceChangeListener {
if(isProjectOpening()) return true;
}
- if (EclipseSynchronizer.getInstance().isWithinActiveOperationScope(resource)) {
- // The resource change will be handled by the EclipseSynchronizer
- // Still visit the children of non-team-private members so that
- // ignore file changes will be past on to the EclipseSynchronizer
- if (isIgnoreFile(resource)) {
- deferredHandler.ignoreFileChanged((IFile)resource);
+ if(isMetaFile(resource)) {
+ IResource[] toBeNotified = handleChangedMetaFile(resource, kind);
+ if(toBeNotified.length>0 && isModifiedBy3rdParty(resource)) {
+ for (int i = 0; i < toBeNotified.length; i++) {
+ changedContainers.add(toBeNotified[i]);
+ }
+ if(Policy.DEBUG_METAFILE_CHANGES) {
+ System.out.println("[cvs] metafile changed by 3rd party: " + resource.getFullPath()); //$NON-NLS-1$
+ }
+ return false; /*don't visit any children we have all the information we need*/
}
- return (!resource.isTeamPrivateMember());
- } if(isMetaFile(resource)) {
- toBeNotified = handleChangedMetaFile(resource, kind);
} else if(isIgnoreFile(resource)) {
- toBeNotified = handleChangedIgnoreFile(resource, kind);
+ deferredHandler.ignoreFileChanged((IFile)resource);
} else if (isExternalDeletion(resource, kind)) {
- toBeNotified = handleExternalDeletion(resource);
- }
-
- if(toBeNotified.length>0 && isModifiedBy3rdParty(resource)) {
- for (int i = 0; i < toBeNotified.length; i++) {
- changedContainers.add(toBeNotified[i]);
- }
- if(Policy.DEBUG_METAFILE_CHANGES) {
- System.out.println("[cvs] metafile changed by 3rd party: " + resource.getFullPath()); //$NON-NLS-1$
- }
- return false; /*don't visit any children we have all the information we need*/
- } else {
- return true;
+ externalDeletions.add(resource);
}
+ return true;
}
}, IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS);
- if(!changedContainers.isEmpty()) {
- EclipseSynchronizer.getInstance().syncFilesChanged((IContainer[])changedContainers.toArray(new IContainer[changedContainers.size()]));
+ if(!changedContainers.isEmpty() || !externalDeletions.isEmpty()) {
+ EclipseSynchronizer.getInstance().syncFilesChangedExternally(
+ (IContainer[])changedContainers.toArray(new IContainer[changedContainers.size()]),
+ (IFile[]) externalDeletions.toArray(new IFile[externalDeletions.size()]));
}
} catch(CoreException e) {
CVSProviderPlugin.log(e);
@@ -155,19 +157,6 @@ public class SyncFileChangeListener implements IResourceChangeListener {
}
/**
- * @param resource
- * @return
- */
- protected IContainer[] handleExternalDeletion(IResource resource) {
- IContainer changedContainer = resource.getParent();
- if(changedContainer.exists()) {
- return new IContainer[] {changedContainer};
- } else {
- return new IContainer[0];
- }
- }
-
- /**
* Treat a resource as an external deletion if
* - it is a file
* - the delta says the file was removed
@@ -186,7 +175,7 @@ public class SyncFileChangeListener implements IResourceChangeListener {
if (resource.getType() != IResource.FILE) return false;
ICVSFile file = CVSWorkspaceRoot.getCVSFileFor((IFile)resource);
try {
- return (!file.isManaged() && file.getParent().isCVSFolder());
+ return (!file.isManaged() && file.getParent().isCVSFolder() && file.getParent().exists());
} catch (CVSException e) {
CVSProviderPlugin.log(e);
return false;

Back to the top