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);
+ }
}
+