Bug 528258 - Pass command args to resolve Builder's SchedulingRule

Change-Id: Ib8d599bd72a8ddaec63b51bab9c7efe3a7e85e76
Signed-off-by: Mickael Istria <mistria@redhat.com>
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/BuildManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/BuildManager.java
index 2c0f42d..1b2c196 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/BuildManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/events/BuildManager.java
@@ -1122,7 +1122,7 @@
 	/**
 	 * Returns the scheduling rule that is required for building the project.
 	 */
-	public ISchedulingRule getRule(IBuildConfiguration buildConfiguration, int trigger, String builderName, Map<String, String> args) {
+	public ISchedulingRule getRule(IBuildConfiguration buildConfiguration, int trigger, String builderName, Map<String, String> buildArgs) {
 		IProject project = buildConfiguration.getProject();
 		MultiStatus status = new MultiStatus(ResourcesPlugin.PI_RESOURCES, IResourceStatus.INTERNAL_ERROR, Messages.events_errors, null);
 		if (builderName == null) {
@@ -1134,10 +1134,16 @@
 				BuildContext context = new BuildContext(buildConfiguration);
 				for (int i = 0; i < commands.length; i++) {
 					BuildCommand command = (BuildCommand) commands[i];
+					Map<String, String> allArgs = command.getArguments(true);
+					if (allArgs == null) {
+						allArgs = buildArgs;
+					} else if (buildArgs != null) {
+						allArgs.putAll(buildArgs);
+					}
 					try {
 						IncrementalProjectBuilder builder = getBuilder(buildConfiguration, command, i, status, context);
 						if (builder != null) {
-							ISchedulingRule builderRule = builder.getRule(trigger, args);
+							ISchedulingRule builderRule = builder.getRule(trigger, allArgs);
 							if (builderRule != null)
 								rules.add(builderRule);
 							else
@@ -1156,11 +1162,18 @@
 			}
 		} else {
 			// Returns the derived resources for the specified builderName
-			ICommand command = getCommand(project, builderName, args);
+			ICommand command = getCommand(project, builderName, buildArgs);
+			Map<String, String> allArgs = new HashMap<>();
+			if (command.getArguments() != null) {
+				allArgs.putAll(command.getArguments());
+			}
+			if (buildArgs != null) {
+				allArgs.putAll(buildArgs);
+			}
 			try {
 				IncrementalProjectBuilder builder = getBuilder(buildConfiguration, command, -1, status);
 				if (builder != null)
-					return builder.getRule(trigger, args);
+					return builder.getRule(trigger, allArgs);
 
 			} catch (CoreException e) {
 				status.add(e.getStatus());
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ParallelBuildChainTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ParallelBuildChainTest.java
index 5c73963..35463cc 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ParallelBuildChainTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ParallelBuildChainTest.java
@@ -77,10 +77,11 @@
 			Map<String, String> args = command.getArguments();
 			if (args == null) {
 				args = Collections.singletonMap(TimerBuilder.RULE_TYPE_ARG, type.toString());
-				command.setArguments(args);
 			} else {
 				args.put(TimerBuilder.RULE_TYPE_ARG, type.toString());
 			}
+			command.setArguments(args);
+			projectDescription.setBuildSpec(new ICommand[] {command});
 			project.setDescription(projectDescription, getMonitor());
 		}
 	}
@@ -113,4 +114,5 @@
 		setTimerBuilderSchedulingRuleForAllProjects(RuleType.CURRENT_PROJECT, getMonitor());
 		testIndividualProjectBuildsInParallelNoConflict();
 	}
+
 }