Skip to content

Commit d54103f

Browse files
authored
[JENKINS-75691] Add trait to include the ref spec of target branch of pull requests (#1047)
This could be useful if you need perform a changelog or some software need to individuate the new code for example SonarQube PR analysis.
1 parent 7beb98a commit d54103f

19 files changed

+339
-236
lines changed

src/main/java/com/cloudbees/jenkins/plugins/bitbucket/trait/BitbucketBuildStatusNotificationsTrait.java

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,8 @@
2828
import com.cloudbees.jenkins.plugins.bitbucket.Messages;
2929
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
3030
import hudson.Extension;
31-
import jenkins.scm.api.SCMSource;
3231
import jenkins.scm.api.trait.SCMSourceContext;
3332
import jenkins.scm.api.trait.SCMSourceTrait;
34-
import jenkins.scm.api.trait.SCMSourceTraitDescriptor;
3533
import org.jenkinsci.Symbol;
3634
import org.kohsuke.stapler.DataBoundConstructor;
3735
import org.kohsuke.stapler.DataBoundSetter;
@@ -146,7 +144,7 @@ protected void decorateContext(SCMSourceContext<?, ?> context) {
146144
*/
147145
@Symbol("bitbucketBuildStatusNotifications")
148146
@Extension
149-
public static class DescriptorImpl extends SCMSourceTraitDescriptor {
147+
public static class DescriptorImpl extends BitbucketSCMSourceTraitDescriptor {
150148

151149
/**
152150
* {@inheritDoc}
@@ -156,20 +154,5 @@ public String getDisplayName() {
156154
return Messages.BitbucketBuildStatusNotificationsTrait_displayName();
157155
}
158156

159-
/**
160-
* {@inheritDoc}
161-
*/
162-
@Override
163-
public Class<? extends SCMSourceContext> getContextClass() {
164-
return BitbucketSCMSourceContext.class;
165-
}
166-
167-
/**
168-
* {@inheritDoc}
169-
*/
170-
@Override
171-
public Class<? extends SCMSource> getSourceClass() {
172-
return BitbucketSCMSource.class;
173-
}
174157
}
175158
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* The MIT License
3+
*
4+
* Copyright (c) 2025, Falco Nikolas
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in
14+
* all copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22+
* THE SOFTWARE.
23+
*/
24+
package com.cloudbees.jenkins.plugins.bitbucket.trait;
25+
26+
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketGitSCMBuilder;
27+
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSource;
28+
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSourceContext;
29+
import hudson.model.Descriptor;
30+
import hudson.plugins.git.GitSCM;
31+
import hudson.scm.SCM;
32+
import jenkins.scm.api.SCMSource;
33+
import jenkins.scm.api.trait.SCMBuilder;
34+
import jenkins.scm.api.trait.SCMSourceContext;
35+
import jenkins.scm.api.trait.SCMSourceTrait;
36+
import jenkins.scm.api.trait.SCMSourceTraitDescriptor;
37+
38+
/**
39+
* Abstract base class for {@link Descriptor} of {@link SCMSourceTrait}
40+
* implementations specific for bitbucket.
41+
*
42+
* @since 936.3.0
43+
*/
44+
abstract class BitbucketSCMSourceTraitDescriptor extends SCMSourceTraitDescriptor {
45+
46+
/**
47+
* {@inheritDoc}
48+
*/
49+
@SuppressWarnings("rawtypes")
50+
@Override
51+
public Class<? extends SCMSourceContext> getContextClass() {
52+
return BitbucketSCMSourceContext.class;
53+
}
54+
55+
/**
56+
* {@inheritDoc}
57+
*/
58+
@Override
59+
public Class<? extends SCMSource> getSourceClass() {
60+
return BitbucketSCMSource.class;
61+
}
62+
63+
/**
64+
* {@inheritDoc}
65+
*/
66+
@SuppressWarnings("rawtypes")
67+
@Override
68+
public Class<? extends SCMBuilder> getBuilderClass() {
69+
return BitbucketGitSCMBuilder.class;
70+
}
71+
72+
/**
73+
* {@inheritDoc}
74+
*/
75+
@Override
76+
public Class<? extends SCM> getScmClass() {
77+
return GitSCM.class;
78+
}
79+
80+
}

src/main/java/com/cloudbees/jenkins/plugins/bitbucket/trait/BranchDiscoveryTrait.java

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
*/
2424
package com.cloudbees.jenkins.plugins.bitbucket.trait;
2525

26-
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSource;
2726
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSourceContext;
2827
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSourceRequest;
2928
import com.cloudbees.jenkins.plugins.bitbucket.BranchSCMHead;
@@ -38,14 +37,12 @@
3837
import jenkins.scm.api.SCMHeadCategory;
3938
import jenkins.scm.api.SCMHeadOrigin;
4039
import jenkins.scm.api.SCMRevision;
41-
import jenkins.scm.api.SCMSource;
4240
import jenkins.scm.api.trait.SCMHeadAuthority;
4341
import jenkins.scm.api.trait.SCMHeadAuthorityDescriptor;
4442
import jenkins.scm.api.trait.SCMHeadFilter;
4543
import jenkins.scm.api.trait.SCMSourceContext;
4644
import jenkins.scm.api.trait.SCMSourceRequest;
4745
import jenkins.scm.api.trait.SCMSourceTrait;
48-
import jenkins.scm.api.trait.SCMSourceTraitDescriptor;
4946
import jenkins.scm.impl.trait.Discovery;
5047
import org.apache.commons.lang3.StringUtils;
5148
import org.jenkinsci.Symbol;
@@ -158,7 +155,7 @@ public boolean includeCategory(@NonNull SCMHeadCategory category) {
158155
@Symbol("bitbucketBranchDiscovery")
159156
@Extension
160157
@Discovery
161-
public static class DescriptorImpl extends SCMSourceTraitDescriptor {
158+
public static class DescriptorImpl extends BitbucketSCMSourceTraitDescriptor {
162159

163160
/**
164161
* {@inheritDoc}
@@ -168,30 +165,13 @@ public String getDisplayName() {
168165
return Messages.BranchDiscoveryTrait_displayName();
169166
}
170167

171-
/**
172-
* {@inheritDoc}
173-
*/
174-
@Override
175-
public Class<? extends SCMSourceContext> getContextClass() {
176-
return BitbucketSCMSourceContext.class;
177-
}
178-
179-
/**
180-
* {@inheritDoc}
181-
*/
182-
@Override
183-
public Class<? extends SCMSource> getSourceClass() {
184-
return BitbucketSCMSource.class;
185-
}
186-
187168
/**
188169
* Populates the strategy options.
189170
*
190171
* @return the strategy options.
191172
*/
192173
@NonNull
193174
@Restricted(NoExternalUse.class)
194-
@SuppressWarnings("unused") // stapler
195175
public ListBoxModel doFillStrategyIdItems() {
196176
ListBoxModel result = new ListBoxModel();
197177
result.add(Messages.BranchDiscoveryTrait_excludePRs(), "1");

src/main/java/com/cloudbees/jenkins/plugins/bitbucket/trait/DiscardOldBranchTrait.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
*/
2424
package com.cloudbees.jenkins.plugins.bitbucket.trait;
2525

26-
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketGitSCMBuilder;
2726
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSourceRequest;
2827
import com.cloudbees.jenkins.plugins.bitbucket.Messages;
2928
import com.cloudbees.jenkins.plugins.bitbucket.PullRequestSCMHead;
@@ -35,12 +34,10 @@
3534
import java.io.IOException;
3635
import java.time.LocalDate;
3736
import jenkins.scm.api.SCMHead;
38-
import jenkins.scm.api.trait.SCMBuilder;
3937
import jenkins.scm.api.trait.SCMHeadFilter;
4038
import jenkins.scm.api.trait.SCMSourceContext;
4139
import jenkins.scm.api.trait.SCMSourceRequest;
4240
import jenkins.scm.api.trait.SCMSourceTrait;
43-
import jenkins.scm.api.trait.SCMSourceTraitDescriptor;
4441
import org.jenkinsci.Symbol;
4542
import org.kohsuke.stapler.DataBoundConstructor;
4643
import org.kohsuke.stapler.QueryParameter;
@@ -109,11 +106,11 @@ private LocalDate asLocalDate(@NonNull long milliseconds) {
109106
*/
110107
@Symbol("bitbucketDiscardOldBranch")
111108
@Extension
112-
public static class DescriptorImpl extends SCMSourceTraitDescriptor {
109+
public static class DescriptorImpl extends BitbucketSCMSourceTraitDescriptor {
113110

114111
public FormValidation doCheckKeepForDays(@QueryParameter final int keepForDays) {
115112
if (keepForDays <= 0) {
116-
return FormValidation.error("Invalid value. Days must be greater than 0");
113+
return FormValidation.error(Messages.DiscardOldBranchTrait_invalidDays());
117114
}
118115
return FormValidation.ok();
119116
}
@@ -123,13 +120,6 @@ public String getDisplayName() {
123120
return Messages.DiscardOldBranchTrait_displayName();
124121
}
125122

126-
/**
127-
* {@inheritDoc}
128-
*/
129-
@Override
130-
public boolean isApplicableToBuilder(@SuppressWarnings("rawtypes") @NonNull Class<? extends SCMBuilder> builderClass) {
131-
return BitbucketGitSCMBuilder.class.isAssignableFrom(builderClass);
132-
}
133123
}
134124

135125
}

src/main/java/com/cloudbees/jenkins/plugins/bitbucket/trait/DiscardOldTagTrait.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
*/
2424
package com.cloudbees.jenkins.plugins.bitbucket.trait;
2525

26-
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketGitSCMBuilder;
2726
import com.cloudbees.jenkins.plugins.bitbucket.Messages;
2827
import edu.umd.cs.findbugs.annotations.CheckForNull;
2928
import edu.umd.cs.findbugs.annotations.NonNull;
@@ -33,11 +32,9 @@
3332
import jenkins.scm.api.SCMHead;
3433
import jenkins.scm.api.SCMSource;
3534
import jenkins.scm.api.mixin.TagSCMHead;
36-
import jenkins.scm.api.trait.SCMBuilder;
3735
import jenkins.scm.api.trait.SCMHeadPrefilter;
3836
import jenkins.scm.api.trait.SCMSourceContext;
3937
import jenkins.scm.api.trait.SCMSourceTrait;
40-
import jenkins.scm.api.trait.SCMSourceTraitDescriptor;
4138
import org.jenkinsci.Symbol;
4239
import org.kohsuke.stapler.DataBoundConstructor;
4340
import org.kohsuke.stapler.QueryParameter;
@@ -96,11 +93,11 @@ private LocalDate asLocalDate(@NonNull long milliseconds) {
9693

9794
@Symbol("bitbucketDiscardOldTag")
9895
@Extension
99-
public static class DescriptorImpl extends SCMSourceTraitDescriptor {
96+
public static class DescriptorImpl extends BitbucketSCMSourceTraitDescriptor {
10097

10198
public FormValidation doCheckKeepForDays(@QueryParameter int keepForDays) {
10299
if (keepForDays <= 0) {
103-
return FormValidation.error("Invalid value. Days must be greater than 0");
100+
return FormValidation.error(Messages.DiscardOldTagTrait_invalidDays());
104101
}
105102
return FormValidation.ok();
106103
}
@@ -110,10 +107,6 @@ public String getDisplayName() {
110107
return Messages.DiscardOldTagTrait_displayName();
111108
}
112109

113-
@Override
114-
public boolean isApplicableToBuilder(@NonNull Class<? extends SCMBuilder> builderClass) {
115-
return BitbucketGitSCMBuilder.class.isAssignableFrom(builderClass);
116-
}
117110
}
118111

119112
}

src/main/java/com/cloudbees/jenkins/plugins/bitbucket/trait/ForkPullRequestDiscoveryTrait.java

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
*/
2424
package com.cloudbees.jenkins.plugins.bitbucket.trait;
2525

26-
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSource;
2726
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSourceContext;
2827
import com.cloudbees.jenkins.plugins.bitbucket.BitbucketSCMSourceRequest;
2928
import com.cloudbees.jenkins.plugins.bitbucket.Messages;
@@ -39,14 +38,12 @@
3938
import jenkins.scm.api.SCMHeadCategory;
4039
import jenkins.scm.api.SCMHeadOrigin;
4140
import jenkins.scm.api.SCMRevision;
42-
import jenkins.scm.api.SCMSource;
4341
import jenkins.scm.api.mixin.ChangeRequestCheckoutStrategy;
4442
import jenkins.scm.api.mixin.ChangeRequestSCMHead2;
4543
import jenkins.scm.api.trait.SCMHeadAuthority;
4644
import jenkins.scm.api.trait.SCMHeadAuthorityDescriptor;
4745
import jenkins.scm.api.trait.SCMSourceContext;
4846
import jenkins.scm.api.trait.SCMSourceTrait;
49-
import jenkins.scm.api.trait.SCMSourceTraitDescriptor;
5047
import jenkins.scm.impl.ChangeRequestSCMHeadCategory;
5148
import jenkins.scm.impl.trait.Discovery;
5249
import org.apache.commons.lang3.StringUtils;
@@ -166,7 +163,7 @@ public boolean includeCategory(@NonNull SCMHeadCategory category) {
166163
@Symbol("bitbucketForkDiscovery")
167164
@Extension
168165
@Discovery
169-
public static class DescriptorImpl extends SCMSourceTraitDescriptor {
166+
public static class DescriptorImpl extends BitbucketSCMSourceTraitDescriptor {
170167

171168
/**
172169
* {@inheritDoc}
@@ -176,30 +173,13 @@ public String getDisplayName() {
176173
return Messages.ForkPullRequestDiscoveryTrait_displayName();
177174
}
178175

179-
/**
180-
* {@inheritDoc}
181-
*/
182-
@Override
183-
public Class<? extends SCMSourceContext> getContextClass() {
184-
return BitbucketSCMSourceContext.class;
185-
}
186-
187-
/**
188-
* {@inheritDoc}
189-
*/
190-
@Override
191-
public Class<? extends SCMSource> getSourceClass() {
192-
return BitbucketSCMSource.class;
193-
}
194-
195176
/**
196177
* Populates the strategy options.
197178
*
198179
* @return the strategy options.
199180
*/
200181
@NonNull
201182
@Restricted(NoExternalUse.class)
202-
@SuppressWarnings("unused") // stapler
203183
public ListBoxModel doFillStrategyIdItems() {
204184
ListBoxModel result = new ListBoxModel();
205185
result.add(Messages.ForkPullRequestDiscoveryTrait_mergeOnly(), "1");
@@ -213,8 +193,8 @@ public ListBoxModel doFillStrategyIdItems() {
213193
*
214194
* @return the list of appropriate {@link SCMHeadAuthorityDescriptor} instances.
215195
*/
196+
@SuppressWarnings("unchecked")
216197
@NonNull
217-
@SuppressWarnings("unused") // stapler
218198
public List<SCMHeadAuthorityDescriptor> getTrustDescriptors() {
219199
return SCMHeadAuthority._for(
220200
BitbucketSCMSourceRequest.class,
@@ -230,7 +210,6 @@ public List<SCMHeadAuthorityDescriptor> getTrustDescriptors() {
230210
* @return the default trust for new instances of {@link ForkPullRequestDiscoveryTrait}.
231211
*/
232212
@NonNull
233-
@SuppressWarnings("unused") // stapler
234213
public SCMHeadAuthority<?, ?, ?> getDefaultTrust() {
235214
return new TrustTeamForks();
236215
}

0 commit comments

Comments
 (0)