diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java
index 72eb72b6aaef7ca306de069d491d53d77c97547d..a5a23010f9240f2e59e7cd8ddc1e0383604d090d 100644
--- a/core/src/main/java/hudson/model/AbstractProject.java
+++ b/core/src/main/java/hudson/model/AbstractProject.java
@@ -1014,7 +1014,7 @@ public abstract class AbstractProject
,R extends A
for (SubTaskContributor euc : SubTaskContributor.all())
r.addAll(euc.forProject(this));
for (JobProperty super P> p : properties)
- r.addAll(p.getMemberExecutionUnits());
+ r.addAll(p.getSubTasks());
return r;
}
diff --git a/core/src/main/java/hudson/model/JobProperty.java b/core/src/main/java/hudson/model/JobProperty.java
index 4f22e0905262746f91dda7e84c840ab405335e9e..05ff01f3d96011e8b7e642fe10030eccd2e7a9d6 100644
--- a/core/src/main/java/hudson/model/JobProperty.java
+++ b/core/src/main/java/hudson/model/JobProperty.java
@@ -170,7 +170,7 @@ public abstract class JobProperty> implements Describable getMemberExecutionUnits() {
+ public Collection extends SubTask> getSubTasks() {
return Collections.emptyList();
}
}
diff --git a/core/src/main/java/hudson/model/queue/WideJobProperty.java b/core/src/main/java/hudson/model/queue/WideJobProperty.java
new file mode 100644
index 0000000000000000000000000000000000000000..58e0e597749cf18cea088f5e1ee115aac8ac377c
--- /dev/null
+++ b/core/src/main/java/hudson/model/queue/WideJobProperty.java
@@ -0,0 +1,102 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2010, InfraDNA, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package hudson.model.queue;
+
+import hudson.Extension;
+import hudson.model.AbstractProject;
+import hudson.model.JobProperty;
+import hudson.model.JobPropertyDescriptor;
+import hudson.model.Queue.Executable;
+import hudson.model.Queue.Task;
+import org.kohsuke.stapler.DataBoundConstructor;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ *
+ * @author Kohsuke Kawaguchi
+ */
+public class WideJobProperty extends JobProperty> {
+ public final int weight;
+
+ @DataBoundConstructor
+ public WideJobProperty(int weight) {
+ this.weight = weight;
+ }
+
+ @Override
+ public List getSubTasks() {
+ List r = new ArrayList();
+ for (int i=1; i< weight; i++)
+ r.add(new AbstractSubTask() {
+ private final AbstractSubTask outerThis = this;
+ public Executable createExecutable() throws IOException {
+ return new Executable() {
+ public SubTask getParent() {
+ return outerThis;
+ }
+
+ public void run() {
+ // nothing. we just waste time
+ }
+ };
+ }
+
+ @Override
+ public Object getSameNodeConstraint() {
+ // must occupy the same node as the project itself
+ return getProject();
+ }
+
+ @Override
+ public long getEstimatedDuration() {
+ return getProject().getEstimatedDuration();
+ }
+
+ public Task getOwnerTask() {
+ return getProject();
+ }
+
+ public String getDisplayName() {
+ return "place holder for "+getProject().getDisplayName();
+ }
+
+ private AbstractProject, ?> getProject() {
+ return WideJobProperty.this.owner;
+ }
+ });
+ return r;
+ }
+
+ @Extension
+ public static class DescriptorImpl extends JobPropertyDescriptor {
+ @Override
+ public String getDisplayName() {
+ return "This project occupies multiple executors";
+ }
+ }
+}
diff --git a/core/src/main/resources/hudson/model/queue/WideJobProperty/config.jelly b/core/src/main/resources/hudson/model/queue/WideJobProperty/config.jelly
new file mode 100644
index 0000000000000000000000000000000000000000..59ec549999883d6ed3b5d370661b3c7d0fd394ef
--- /dev/null
+++ b/core/src/main/resources/hudson/model/queue/WideJobProperty/config.jelly
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..99b6b860c2626afc1c704438d230614cc0da626e
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1,3 @@
+TODO:
+ If a subtask is interrupted, all the executors should be aborted.
+ executor rendering
\ No newline at end of file