diff options
author | Michael Valenta | 2005-04-06 20:32:37 +0000 |
---|---|---|
committer | Michael Valenta | 2005-04-06 20:32:37 +0000 |
commit | 5b732678f6ef0279f1b91105da62f9d9ae84f9d8 (patch) | |
tree | 9d3d86812900ef8fa34dc95dd33579011af00016 | |
parent | d3e91ab4077fa966e5f850f5750289860c13e636 (diff) | |
download | eclipse.platform.team-5b732678f6ef0279f1b91105da62f9d9ae84f9d8.tar.gz eclipse.platform.team-5b732678f6ef0279f1b91105da62f9d9ae84f9d8.tar.xz eclipse.platform.team-5b732678f6ef0279f1b91105da62f9d9ae84f9d8.zip |
Bug 72304 [Core Performance] Add to .cvsignore does not scale well
2 files changed, 34 insertions, 1 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseSynchronizer.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseSynchronizer.java index 62a0295c9..0e3e19c54 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseSynchronizer.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseSynchronizer.java @@ -628,8 +628,37 @@ public class EclipseSynchronizer implements IFlushOperation { rule = beginBatching(container, null); try { beginOperation(); + + // Record the previous ignore pattterns + FileNameMatcher oldIgnores = null; + if (sessionPropertyCache.isFolderSyncInfoCached(container)) { + oldIgnores = cacheFolderIgnores(container); + } + + // Purge the cached state for direct children of the container changed.addAll(Arrays.asList( - sessionPropertyCache.purgeCache(container, false /*don't flush children*/))); + sessionPropertyCache.purgeCache(container, oldIgnores == null /*flush deeply if the old patterns are not known*/))); + + // Purge the state for any children of previously ignored containers + if (oldIgnores != null) { + FileNameMatcher newIgnores = cacheFolderIgnores(container); + try { + IResource[] members = container.members(); + for (int j = 0; j < members.length; j++) { + IResource resource = members[j]; + if (resource.getType() == IResource.FOLDER) { + String name = resource.getName(); + if (oldIgnores.match(name) && !newIgnores.match(name)) { + changed.addAll(Arrays.asList( + sessionPropertyCache.purgeCache((IContainer)resource, true /*flush deeply*/))); + } + } + } + } catch (CoreException e) { + // Just log and continue + CVSProviderPlugin.log(e); + } + } } finally { endOperation(); } diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/SessionPropertySyncInfoCache.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/SessionPropertySyncInfoCache.java index e23c79925..7b2821677 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/SessionPropertySyncInfoCache.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/SessionPropertySyncInfoCache.java @@ -77,6 +77,10 @@ import org.eclipse.team.internal.ccvs.core.util.SyncFileWriter; } return matcher; } + + /* package */ boolean isIgnoresCached(IContainer container) throws CVSException { + return safeGetSessionProperty(container, IGNORE_SYNC_KEY) != null; + } /*package*/ boolean isFolderSyncInfoCached(IContainer container) throws CVSException { Object info = safeGetSessionProperty(container, FOLDER_SYNC_KEY); |