Index: src/main/java/hudson/scm/RevisionParameterAction.java =================================================================== --- src/main/java/hudson/scm/RevisionParameterAction.java (revision 37442) +++ src/main/java/hudson/scm/RevisionParameterAction.java (working copy) @@ -1,12 +1,17 @@ package hudson.scm; import hudson.model.InvisibleAction; +import hudson.model.Action; +import hudson.model.Queue; +import hudson.model.Queue.Task; +import hudson.model.queue.FoldableAction; import hudson.scm.SubversionSCM.SvnInfo; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.logging.Logger; import org.tmatesoft.svn.core.wc.SVNRevision; @@ -15,8 +20,10 @@ * * @author Tom Huybrechts */ -public class RevisionParameterAction extends InvisibleAction implements Serializable { +public class RevisionParameterAction extends InvisibleAction implements Serializable, FoldableAction { + private static final long serialVersionUID = 1L; + private static final Logger LOGGER = Logger.getLogger(RevisionParameterAction.class.getName()); private final List revisions; public RevisionParameterAction(List revisions) { @@ -24,6 +31,11 @@ this.revisions = revisions; } + public RevisionParameterAction(RevisionParameterAction action) { + super(); + this.revisions = new ArrayList(action.revisions); + } + public RevisionParameterAction(SvnInfo... revisions) { this.revisions = new ArrayList(Arrays.asList(revisions)); } @@ -40,5 +52,43 @@ } return null; } + + public void foldIntoExisting(Queue.Item item, Task owner, List otherActions) { + RevisionParameterAction existing = item.getAction(RevisionParameterAction.class); + if (existing!=null) { + existing.mergeRevisions(this.revisions); + return; + } + // no RevisionParameterAction found, so add a copy of this one + item.getActions().add(new RevisionParameterAction(this)); + } + + private void mergeRevisions(List newRevisions) { + + for(SvnInfo newRev : newRevisions) { + Boolean found = false; + for(SvnInfo oldRev : this.revisions) { + if(oldRev.url.equals(newRev.url)) { + LOGGER.info("Updating revision parameter for " + oldRev.url + " from " + oldRev.revision + " to " + newRev.revision); + + this.revisions.add(new SvnInfo(oldRev.url, newRev.revision)); + this.revisions.remove(oldRev); + found = true; + break; + } + } + if(!found) + this.revisions.add(newRev); + } + } + + @Override + public String toString() { + String result = "[RevisionParameterAction "; + for(SvnInfo i : revisions) { + result += i.url + "(" + i.revision + ") "; + } + return result + "]"; + } }