diff --git a/changelog.html b/changelog.html index cdf324b5dd1b8aabff98dcdcdab9283bac437029..31c0003bdab39daace764cf592ef81db4ebc1853 100644 --- a/changelog.html +++ b/changelog.html @@ -66,6 +66,10 @@ Upcoming changes
  • Many messages about RecordReaper IllegalArgumentException (issue 8647) +
  • + Multiple polling events triggering a single build show up as multiple identical BuildActions in the sidebar, since there + is only one polling log file, regardless of how many times polling happened. Should only be the latest polling instance now. + (issue 7649)
  • Lock down maven plugin versions to shut up m3 (issue 7275) diff --git a/core/src/main/java/hudson/triggers/SCMTrigger.java b/core/src/main/java/hudson/triggers/SCMTrigger.java index 0110b03c3a88f3fcd3b053cfb5b4721bf1653cf9..012ff57cf12c3b2a2bd7aa3c50869459000639b4 100644 --- a/core/src/main/java/hudson/triggers/SCMTrigger.java +++ b/core/src/main/java/hudson/triggers/SCMTrigger.java @@ -509,6 +509,11 @@ public class SCMTrigger extends Trigger { @Override public void onAddedTo(AbstractBuild build) { + BuildAction oldAction = build.getAction(BuildAction.class); + if (oldAction != null) { + build.getActions().remove(oldAction); + } + try { BuildAction a = new BuildAction(build); FileUtils.writeStringToFile(a.getPollingLogFile(),pollingLog); diff --git a/test/src/test/java/hudson/triggers/SCMTriggerTest.java b/test/src/test/java/hudson/triggers/SCMTriggerTest.java index 5c33b676a7b833a7e65867169829cddfa307166d..8839619e0d37d84d4de237d27960228e486e3eb0 100644 --- a/test/src/test/java/hudson/triggers/SCMTriggerTest.java +++ b/test/src/test/java/hudson/triggers/SCMTriggerTest.java @@ -35,13 +35,23 @@ import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.Hudson; import hudson.model.TaskListener; +import hudson.model.Cause.UserCause; import hudson.scm.NullSCM; +import hudson.scm.PollingResult; +import hudson.scm.PollingResult.Change; +import hudson.scm.RepositoryBrowser; +import hudson.scm.SCMDescriptor; +import hudson.scm.SCMRevisionState; +import hudson.triggers.SCMTrigger.SCMTriggerCause; +import hudson.triggers.SCMTrigger.BuildAction; import org.jvnet.hudson.test.Bug; import org.jvnet.hudson.test.HudsonTestCase; +import org.jvnet.hudson.test.SingleFileSCM; +import org.jvnet.hudson.test.TestBuilder; import java.io.File; import java.io.IOException; import java.util.concurrent.Future; - +import java.util.List; /** * @author Alan Harder */ @@ -86,4 +96,46 @@ public class SCMTriggerTest extends HudsonTestCase { return super.checkout(build, launcher, remoteDir, listener, changeLogFile); } } + + /** + * Make sure that only one polling result shows up per build. + */ + @Bug(7649) + public void testMultiplePollingOneBuildAction() throws Exception { + final OneShotEvent buildStarted = new OneShotEvent(); + final OneShotEvent buildShouldComplete = new OneShotEvent(); + FreeStyleProject p = createFreeStyleProject(); + // Make build sleep a while so it blocks new builds + p.getBuildersList().add(new TestBuilder() { + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + buildStarted.signal(); + buildShouldComplete.block(); + return true; + } + }); + + SCMTrigger t = new SCMTrigger("@daily"); + t.start(p,true); + p.addTrigger(t); + + // Start one build to block others + assertTrue(p.scheduleBuild(new UserCause())); + buildStarted.block(); // wait for the build to really start + + // Schedule a new build, and trigger it many ways while it sits in queue + Future fb = p.scheduleBuild2(0, new UserCause()); + assertNotNull(fb); + assertFalse(p.scheduleBuild(new SCMTriggerCause("First poll"))); + assertFalse(p.scheduleBuild(new SCMTriggerCause("Second poll"))); + assertFalse(p.scheduleBuild(new SCMTriggerCause("Third poll"))); + + // Wait for 2nd build to finish + buildShouldComplete.signal(); + FreeStyleBuild build = fb.get(); + + List ba = build.getActions(BuildAction.class); + + assertFalse("There should only be one BuildAction.", ba.size()!=1); + } } +