ASSIGNED - bug 302190: when checking out a project from SCM, don't add every single file to the context
https://bugs.eclipse.org/bugs/show_bug.cgi?id=302190
diff --git a/org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF
index 7a29c44..a4f9269 100644
--- a/org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
Bundle-ManifestVersion: 2
Bundle-Name: Mylyn Java Tests
Bundle-SymbolicName: org.eclipse.mylyn.java.tests;singleton:=true
-Bundle-Version: 3.4.0.qualifier
+Bundle-Version: 3.4.1.qualifier
Bundle-Vendor: Eclipse Mylyn
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.jdt.core,
diff --git a/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceChangeMonitorTest.java b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceChangeMonitorTest.java
index 30c5eec..79d64de 100644
--- a/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceChangeMonitorTest.java
+++ b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceChangeMonitorTest.java
@@ -11,7 +11,9 @@
package org.eclipse.mylyn.resources.tests;
+import java.util.ArrayList;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import org.eclipse.core.internal.events.ResourceChangeEvent;
@@ -137,6 +139,110 @@
assertTrue(element.getInterest().isPropagated());
}
+ public void testLargeFileChangeNotAddedToContext() throws CoreException {
+
+ List<String> filePaths = new ArrayList<String>();
+ filePaths.add("/" + file.getProjectRelativePath().toPortableString());
+ for (int i = 0; i < 10; i++) {
+ IFile newFile = project.getProject().getFile("test" + i + ".txt");
+ newFile.create(null, true, null);
+ assertTrue(newFile.exists());
+ filePaths.add("/" + newFile.getProjectRelativePath().toPortableString());
+ }
+
+ MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+ filePaths.toArray(new String[filePaths.size()]), (IResourceDelta.CHANGED | IResourceDelta.CONTENT),
+ IResource.PROJECT);
+ IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+ changeMonitor.resourceChanged(event);
+ String handle = ContextCore.getStructureBridge(file).getHandleIdentifier(file);
+ assertNotNull(handle);
+ IInteractionElement element = context.get(handle);
+ assertNull(element);
+ }
+
+ public void testLargeFileAddedNotAddedToContext() throws CoreException {
+
+ List<String> filePaths = new ArrayList<String>();
+ filePaths.add("/" + file.getProjectRelativePath().toPortableString());
+ for (int i = 0; i < 10; i++) {
+ IFile newFile = project.getProject().getFile("test" + i + ".txt");
+ newFile.create(null, true, null);
+ assertTrue(newFile.exists());
+ filePaths.add("/" + newFile.getProjectRelativePath().toPortableString());
+ }
+
+ MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+ filePaths.toArray(new String[filePaths.size()]), (IResourceDelta.ADDED | IResourceDelta.CONTENT),
+ IResource.PROJECT);
+ IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+ changeMonitor.resourceChanged(event);
+ String handle = ContextCore.getStructureBridge(file).getHandleIdentifier(file);
+ assertNotNull(handle);
+ IInteractionElement element = context.get(handle);
+ assertNull(element);
+ }
+
+ public void testLargeFolderAddedNotAddedToContext() throws CoreException {
+
+ List<String> folderPaths = new ArrayList<String>();
+ folderPaths.add("/" + folder.getProjectRelativePath().toPortableString());
+ for (int i = 0; i < 3; i++) {
+ IFolder newFolder = project.getProject().getFolder("testFolder" + i);
+ newFolder.create(true, true, null);
+ assertTrue(newFolder.exists());
+ folderPaths.add("/" + newFolder.getProjectRelativePath().toPortableString());
+ }
+
+ MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+ folderPaths.toArray(new String[folderPaths.size()]), (IResourceDelta.ADDED | IResourceDelta.CONTENT),
+ IResource.PROJECT);
+ IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+ changeMonitor.resourceChanged(event);
+ String handle = ContextCore.getStructureBridge(folder).getHandleIdentifier(folder);
+ assertNotNull(handle);
+ IInteractionElement element = context.get(handle);
+ assertNull(element);
+ }
+
+ public void testLargeFolderChangeNotAddedToContext() throws CoreException {
+
+ List<String> folderPaths = new ArrayList<String>();
+ folderPaths.add("/" + folder.getProjectRelativePath().toPortableString());
+ for (int i = 0; i < 3; i++) {
+ IFolder newFolder = project.getProject().getFolder("testFolder" + i);
+ newFolder.create(true, true, null);
+ assertTrue(newFolder.exists());
+ folderPaths.add("/" + newFolder.getProjectRelativePath().toPortableString());
+ }
+
+ MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+ folderPaths.toArray(new String[folderPaths.size()]), (IResourceDelta.CHANGED | IResourceDelta.CONTENT),
+ IResource.PROJECT);
+ IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+ changeMonitor.resourceChanged(event);
+ String handle = ContextCore.getStructureBridge(folder).getHandleIdentifier(folder);
+ assertNotNull(handle);
+ IInteractionElement element = context.get(handle);
+ assertNull(element);
+ }
+
+ public void testFolderAdded() throws CoreException {
+
+ List<String> folderPaths = new ArrayList<String>();
+ folderPaths.add("/" + folder.getProjectRelativePath().toPortableString());
+
+ MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+ folderPaths.toArray(new String[folderPaths.size()]), (IResourceDelta.ADDED | IResourceDelta.CONTENT),
+ IResource.PROJECT);
+ IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+ changeMonitor.resourceChanged(event);
+ String handle = ContextCore.getStructureBridge(folder).getHandleIdentifier(folder);
+ assertNotNull(handle);
+ IInteractionElement element = context.get(handle);
+ assertNull(element);
+ }
+
public void testModifiedFile() throws CoreException {
MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
new String[] { "/test.txt" }, (IResourceDelta.CHANGED | IResourceDelta.CONTENT), IResource.PROJECT);
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java
index d6a32b4..bde6235 100644
--- a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java
@@ -38,6 +38,10 @@
*/
public class ResourceChangeMonitor implements IResourceChangeListener {
+ private static final int MAX_FILE_DELTA_SIZE = 10;
+
+ private static final int MAX_NEW_FOLDER_DELTA_SIZE = 3;
+
private class ResourceDeltaVisitor implements IResourceDeltaVisitor {
private final Set<IResource> addedResources;
@@ -48,6 +52,10 @@
private final List<IResourceExclusionStrategy> resourceExclusions;
+ private int numNonExcludedFiles = 0;
+
+ private int numAddedFolders = 0;
+
public ResourceDeltaVisitor(List<IResourceExclusionStrategy> resourceExclusions) {
this.resourceExclusions = resourceExclusions;
this.addedResources = new HashSet<IResource>();
@@ -89,6 +97,12 @@
return false;
}
+ if (resource instanceof IFile) {
+ numNonExcludedFiles++;
+ } else if (resource instanceof IFolder) {
+ numAddedFolders++;
+ }
+
addedResources.add(resource);
}
}
@@ -107,7 +121,9 @@
if (hasTeamPrivate(resource)) {
return false;
}
-
+ if (resource instanceof IFile) {
+ numNonExcludedFiles++;
+ }
changedResources.add(resource);
}
}
@@ -142,6 +158,14 @@
return addedResources;
}
+ public int getNumChangedAndAddedFiles() {
+ return numNonExcludedFiles;
+ }
+
+ public int getNumAddedFolders() {
+ return numAddedFolders;
+ }
+
};
private boolean enabled;
@@ -181,8 +205,13 @@
try {
rootDelta.accept(visitor, IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | IContainer.INCLUDE_HIDDEN);
if (visitor.hasValidResult()) {
- ResourcesUi.addResourceToContext(visitor.getChangedResources(), InteractionEvent.Kind.PREDICTION);
- ResourcesUi.addResourceToContext(visitor.getAddedResources(), InteractionEvent.Kind.PROPAGATION);
+ // discard large changes as to not pollute the task context
+ if (visitor.getNumChangedAndAddedFiles() <= MAX_FILE_DELTA_SIZE
+ && visitor.getNumAddedFolders() <= MAX_NEW_FOLDER_DELTA_SIZE) {
+ ResourcesUi.addResourceToContext(visitor.getChangedResources(),
+ InteractionEvent.Kind.PREDICTION);
+ ResourcesUi.addResourceToContext(visitor.getAddedResources(), InteractionEvent.Kind.PROPAGATION);
+ }
}
} catch (CoreException e) {
StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN,
diff --git a/org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF b/org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF
index 8f87be6..a5ccfdd 100644
--- a/org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF
+++ b/org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.mylyn.team.cvs;singleton:=true
-Bundle-Version: 3.4.0.qualifier
+Bundle-Version: 3.4.1.qualifier
Bundle-Vendor: %Bundle-Vendor
Require-Bundle: org.eclipse.team.core,
org.eclipse.team.cvs.ui,
diff --git a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsContextChangeSet.java b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsContextChangeSet.java
index 5f27715..e521a2f 100644
--- a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsContextChangeSet.java
+++ b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsContextChangeSet.java
@@ -15,7 +15,6 @@
import java.util.Set;
import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
@@ -24,15 +23,10 @@
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.team.ui.ContextChangeSet;
import org.eclipse.mylyn.internal.team.ui.LinkedTaskInfo;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-import org.eclipse.mylyn.resources.ui.ResourcesUi;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.team.ui.AbstractTaskReference;
import org.eclipse.mylyn.team.ui.IContextChangeSet;
-import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.diff.IDiff;
-import org.eclipse.team.core.diff.provider.ThreeWayDiff;
-import org.eclipse.team.core.mapping.provider.ResourceDiff;
import org.eclipse.team.internal.ccvs.core.mapping.CVSActiveChangeSet;
import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
import org.osgi.service.prefs.Preferences;
@@ -50,16 +44,11 @@
public static final String SOURCE_ID = "org.eclipse.mylyn.java.context.changeset.add"; //$NON-NLS-1$
- private boolean suppressInterestContribution = false;
-
private final ITask task;
- private final ActiveChangeSetManager manager;
-
public CvsContextChangeSet(ITask task, ActiveChangeSetManager manager) {
super(manager, task.getSummary());
this.task = task;
- this.manager = manager;
updateLabel();
}
@@ -118,26 +107,6 @@
@Override
public void add(IDiff diff) {
super.add(diff);
- IResource resource = getResourceFromDiff(diff);
- if (!suppressInterestContribution && resource != null) {
- Set<IResource> resources = new HashSet<IResource>();
- resources.add(resource);
- if (ResourcesUiBridgePlugin.getDefault() != null && manager.isDefault(this)) {
- // only add to the context if it is the active change set (bug 289240)
- ResourcesUi.addResourceToContext(resources, InteractionEvent.Kind.SELECTION);
- }
- }
- }
-
- private IResource getResourceFromDiff(IDiff diff) {
- if (diff instanceof ResourceDiff) {
- return ((ResourceDiff) diff).getResource();
- } else if (diff instanceof ThreeWayDiff) {
- ThreeWayDiff threeWayDiff = (ThreeWayDiff) diff;
- return ResourcesPlugin.getWorkspace().getRoot().findMember(threeWayDiff.getPath());
- } else {
- return null;
- }
}
@Override
@@ -151,15 +120,8 @@
}
public void restoreResources(IResource[] newResources) throws CoreException {
- suppressInterestContribution = true;
- try {
- super.add(newResources);
- setComment(getComment(false));
- } catch (TeamException e) {
- throw e;
- } finally {
- suppressInterestContribution = false;
- }
+ super.add(newResources);
+ setComment(getComment(false));
}
@Override
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSet.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSet.java
index e7b5799..c2ce85f 100644
--- a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSet.java
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSet.java
@@ -30,14 +30,11 @@
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.internal.team.ui.properties.TeamPropertiesLinkProvider;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-import org.eclipse.mylyn.resources.ui.ResourcesUi;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.team.ui.AbstractTaskReference;
import org.eclipse.mylyn.team.ui.IContextChangeSet;
import org.eclipse.swt.widgets.Display;
-import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.diff.IDiff;
import org.eclipse.team.core.diff.provider.ThreeWayDiff;
import org.eclipse.team.core.mapping.provider.ResourceDiff;
@@ -56,8 +53,6 @@
public static final String SOURCE_ID = "org.eclipse.mylyn.java.context.changeset.add"; //$NON-NLS-1$
- private boolean suppressInterestContribution = false;
-
private final ITask task;
public ContextChangeSet(ITask task, ActiveChangeSetManager manager) {
@@ -121,14 +116,6 @@
@Override
public void add(IDiff diff) {
super.add(diff);
- IResource resource = getResourceFromDiff(diff);
- if (!suppressInterestContribution && resource != null) {
- Set<IResource> resources = new HashSet<IResource>();
- resources.add(resource);
- if (ResourcesUiBridgePlugin.getDefault() != null) {
- ResourcesUi.addResourceToContext(resources, InteractionEvent.Kind.SELECTION);
- }
- }
}
private IResource getResourceFromDiff(IDiff diff) {
@@ -153,15 +140,8 @@
}
public void restoreResources(IResource[] newResources) throws CoreException {
- suppressInterestContribution = true;
- try {
- super.add(newResources);
- setComment(getComment(false));
- } catch (TeamException e) {
- throw e;
- } finally {
- suppressInterestContribution = false;
- }
+ super.add(newResources);
+ setComment(getComment(false));
}
@Override