From af28c6569cf267ca1d78836bb6dfe1d96f4e24bb Mon Sep 17 00:00:00 2001 From: Chris Recoskie Date: Tue, 10 May 2011 18:55:15 +0000 Subject: [PATCH] Bug 133881 - Make refreshing after building optional - changed scheduling rules for refreshes to be the set of resources to be refreshed for a given project --- .../org/eclipse/cdt/make/core/MakeBuilder.java | 5 +++-- .../core/ExternalBuildRunner.java | 5 +++-- .../core/GeneratedMakefileBuilder.java | 5 +++-- .../resources/tests/RefreshScopeTests.java | 3 ++- .../eclipse/cdt/core/resources/Messages.java | 1 + .../core/resources/RefreshScopeManager.java | 18 +++++++++++++++--- .../cdt/core/resources/messages.properties | 1 + 7 files changed, 28 insertions(+), 10 deletions(-) diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java index 1ab1236b374..67dd1564293 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java @@ -299,8 +299,9 @@ public class MakeBuilder extends ACBuilder { // project.refreshLocal(IResource.DEPTH_INFINITE, null); // use the refresh scope manager to refresh - IWorkspaceRunnable runnable = RefreshScopeManager.getInstance().getRefreshRunnable(project); - ResourcesPlugin.getWorkspace().run(runnable, null); + RefreshScopeManager refreshManager = RefreshScopeManager.getInstance(); + IWorkspaceRunnable runnable = refreshManager.getRefreshRunnable(project); + ResourcesPlugin.getWorkspace().run(runnable, refreshManager.getRefreshSchedulingRule(project), IWorkspace.AVOID_UPDATE, null); } catch (CoreException e) { MakeCorePlugin.log(e); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ExternalBuildRunner.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ExternalBuildRunner.java index d40616c2c51..cb4d7279a90 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ExternalBuildRunner.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ExternalBuildRunner.java @@ -202,8 +202,9 @@ public class ExternalBuildRunner extends AbstractBuildRunner { //project.refreshLocal(IResource.DEPTH_INFINITE, null); // use the refresh scope manager to refresh - IWorkspaceRunnable runnable = RefreshScopeManager.getInstance().getRefreshRunnable(project); - ResourcesPlugin.getWorkspace().run(runnable, null); + RefreshScopeManager refreshManager = RefreshScopeManager.getInstance(); + IWorkspaceRunnable runnable = refreshManager.getRefreshRunnable(project); + ResourcesPlugin.getWorkspace().run(runnable, refreshManager.getRefreshSchedulingRule(project), IWorkspace.AVOID_UPDATE, null); } catch (CoreException e) { } } else { diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java index 67b4f40f5c8..6f9849b73ab 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java @@ -1110,8 +1110,9 @@ public class GeneratedMakefileBuilder extends ACBuilder { //currentProject.refreshLocal(IResource.DEPTH_INFINITE, null); // use the refresh scope manager to refresh - IWorkspaceRunnable runnable = RefreshScopeManager.getInstance().getRefreshRunnable(currentProject); - ResourcesPlugin.getWorkspace().run(runnable, null); + RefreshScopeManager refreshManager = RefreshScopeManager.getInstance(); + IWorkspaceRunnable runnable = refreshManager.getRefreshRunnable(currentProject); + ResourcesPlugin.getWorkspace().run(runnable, refreshManager.getRefreshSchedulingRule(currentProject), IWorkspace.AVOID_UPDATE, null); } catch (CoreException e) { monitor.subTask(ManagedMakeMessages .getResourceString(REFRESH_ERROR)); diff --git a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/resources/tests/RefreshScopeTests.java b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/resources/tests/RefreshScopeTests.java index 755533f3c94..c43d92255d1 100644 --- a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/resources/tests/RefreshScopeTests.java +++ b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/resources/tests/RefreshScopeTests.java @@ -33,6 +33,7 @@ import org.eclipse.cdt.internal.core.resources.ResourceExclusion; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; @@ -367,7 +368,7 @@ public class RefreshScopeTests extends TestCase { // now refresh IWorkspaceRunnable runnable = manager.getRefreshRunnable(fProject); try { - ResourcesPlugin.getWorkspace().run(runnable, null); + ResourcesPlugin.getWorkspace().run(runnable, manager.getRefreshSchedulingRule(fProject), IWorkspace.AVOID_UPDATE, null); } catch (CoreException e) { fail(); } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/Messages.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/Messages.java index f45403d29af..150cd3de090 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/Messages.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/Messages.java @@ -23,6 +23,7 @@ public class Messages extends NLS { public static String RefreshScopeManager_1; public static String RefreshScopeManager_2; public static String RefreshScopeManager_3; + public static String RefreshScopeManager_4; public static String ResourceExclusion_name; static { // initialize resource bundle diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshScopeManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshScopeManager.java index 1c3d9db9339..6f98744434d 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshScopeManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/RefreshScopeManager.java @@ -36,6 +36,10 @@ import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.jobs.ISchedulingRule; +import org.eclipse.core.runtime.jobs.MultiRule; + +import com.ibm.icu.text.MessageFormat; /** * The RefreshScopeManager provides access to settings pertaining to refreshes performed during @@ -114,8 +118,8 @@ public class RefreshScopeManager { IProject project = (IProject) delta.getResource(); if (delta.getKind() == IResourceDelta.ADDED - || (delta.getKind() == IResourceDelta.CHANGED && (delta - .getFlags() & IResourceDelta.OPEN) != 0)) { + || (delta.getKind() == IResourceDelta.CHANGED && ((delta.getFlags() & IResourceDelta.OPEN) != 0) + && ((delta.getFlags() & IResourceDelta.REMOVED) != 0))) /* don't load for deleted projects */{ loadSettings(ResourcesPlugin.getWorkspace() .getRoot(), project); return false; @@ -399,6 +403,11 @@ public class RefreshScopeManager { if (project.hasNature(CProjectNature.C_NATURE_ID)) { ICProjectDescription projectDescription = CProjectDescriptionManager.getInstance() .getProjectDescription(project, false); + + if(projectDescription == null) { + throw new CoreException(CCorePlugin.createStatus(MessageFormat.format(Messages.RefreshScopeManager_4, project.getName()))); + } + ICStorageElement storageElement = projectDescription.getStorage( REFRESH_SCOPE_STORAGE_NAME, true); @@ -499,9 +508,12 @@ public class RefreshScopeManager { return factory.createNewExclusionInstance(); } + public synchronized ISchedulingRule getRefreshSchedulingRule(IProject project) { + return new MultiRule(getResourcesToRefresh(project).toArray(new ISchedulingRule[0])); + } + public IWorkspaceRunnable getRefreshRunnable(final IProject project) { - IWorkspaceRunnable runnable = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/messages.properties b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/messages.properties index cb22a7e3c59..744d1b5cfa5 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/messages.properties +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/messages.properties @@ -13,5 +13,6 @@ RefreshScopeManager_0=Error instantiating XML document builder. RefreshScopeManager_1=Error instantiating XML transformer. RefreshScopeManager_2=Error transforming XML. RefreshScopeManager_3=Error parsing refresh settings from project {0} +RefreshScopeManager_4=Error loading refresh settings: no project description for project {0} ResourceExclusion_name=Resource Exclusions