88import com .dabsquared .gitlabjenkins .gitlab .api .model .BuildState ;
99import com .dabsquared .gitlabjenkins .publisher .GitLabCommitStatusPublisher ;
1010import com .dabsquared .gitlabjenkins .util .LoggerUtil ;
11- import hudson .model .AbstractProject ;
12- import hudson .model .Cause ;
13- import hudson .model .Job ;
14- import hudson .model .Queue ;
11+ import hudson .model .*;
1512import jenkins .model .Jenkins ;
1613import org .apache .commons .lang .StringUtils ;
1714import org .jenkinsci .plugins .displayurlapi .DisplayURLProvider ;
@@ -24,7 +21,7 @@ public class PendingBuildsHandler {
2421
2522 private static final Logger LOGGER = Logger .getLogger (PendingBuildsHandler .class .getName ());
2623
27- public void cancelPendingBuilds (Job <?, ?> job , Integer projectId , String branch ) {
24+ public void cancelPendingBuilds (Job <?, ?> job , Integer projectId , String sourceBranch ) {
2825 Queue queue = Jenkins .getInstance ().getQueue ();
2926 for (Queue .Item item : queue .getItems ()) {
3027 if (!job .getName ().equals (item .task .getName ())) {
@@ -38,11 +35,28 @@ public void cancelPendingBuilds(Job<?, ?> job, Integer projectId, String branch)
3835 if (!projectId .equals (queueItemCauseData .getSourceProjectId ())) {
3936 continue ;
4037 }
41- if (branch .equals (queueItemCauseData .getBranch ())) {
42- cancel (item , queue , branch );
38+ if (sourceBranch .equals (queueItemCauseData .getBranch ())) {
39+ cancel (item , queue , sourceBranch );
4340 setCommitStatusCancelledIfNecessary (queueItemCauseData , job );
4441 }
4542 }
43+ stopRunningBuilds (job , sourceBranch );
44+ }
45+
46+ private void stopRunningBuilds (Job <?, ?> job , String sourceBranch ) {
47+ for (Run <?, ?> build : job .getBuilds ()) {
48+ if (build .isBuilding () && runsCausedByMergeToSourceBranch (build , sourceBranch )) {
49+ Executor executor = build .getExecutor ();
50+ if (executor != null ) executor .doStop ();
51+ GitLabWebHookCause cause = build .getCause (GitLabWebHookCause .class );
52+ if (cause != null ) setCommitStatusCancelledIfNecessary (cause .getData (), job );
53+ }
54+ }
55+ }
56+
57+ private boolean runsCausedByMergeToSourceBranch (Run <?, ?> build , String sourceBranch ) {
58+ GitLabWebHookCause cause = build .getCause (GitLabWebHookCause .class );
59+ return cause != null && cause .getData ().getSourceBranch ().equals (sourceBranch );
4660 }
4761
4862 private GitLabWebHookCause getGitLabWebHookCauseData (Queue .Item item ) {
0 commit comments