2626import com .cloudbees .jenkins .plugins .bitbucket .BitbucketSCMSource ;
2727import com .cloudbees .jenkins .plugins .bitbucket .api .BitbucketWebHook ;
2828import com .cloudbees .jenkins .plugins .bitbucket .client .repository .BitbucketRepositoryHook ;
29+ import com .cloudbees .jenkins .plugins .bitbucket .endpoints .AbstractBitbucketEndpoint ;
2930import com .cloudbees .jenkins .plugins .bitbucket .endpoints .BitbucketCloudEndpoint ;
31+ import com .cloudbees .jenkins .plugins .bitbucket .endpoints .BitbucketEndpointConfiguration ;
3032import com .cloudbees .jenkins .plugins .bitbucket .endpoints .BitbucketServerEndpoint ;
33+ import com .cloudbees .jenkins .plugins .bitbucket .server .BitbucketServerVersion ;
3134import com .cloudbees .jenkins .plugins .bitbucket .server .client .repository .BitbucketServerWebhook ;
3235import com .cloudbees .jenkins .plugins .bitbucket .server .client .repository .NativeBitbucketServerWebhook ;
3336import com .damnhandy .uri .template .UriTemplate ;
@@ -56,19 +59,25 @@ public class WebhookConfiguration {
5659 ));
5760
5861 /**
59- * The list of events available in Bitbucket Server.
62+ * The list of events available in Bitbucket Server v7.x .
6063 */
61- private static final List <String > NATIVE_SERVER_EVENTS = Collections .unmodifiableList (Arrays .asList (
64+ private static final List <String > NATIVE_SERVER_EVENTS_v7 = Collections .unmodifiableList (Arrays .asList (
6265 HookEventType .SERVER_REFS_CHANGED .getKey (),
6366 HookEventType .SERVER_PULL_REQUEST_OPENED .getKey (),
6467 HookEventType .SERVER_PULL_REQUEST_MERGED .getKey (),
6568 HookEventType .SERVER_PULL_REQUEST_DECLINED .getKey (),
6669 HookEventType .SERVER_PULL_REQUEST_DELETED .getKey (),
6770 HookEventType .SERVER_PULL_REQUEST_MODIFIED .getKey (),
6871 HookEventType .SERVER_PULL_REQUEST_REVIEWER_UPDATED .getKey (),
72+ // only on v7.x and above
6973 HookEventType .SERVER_PULL_REQUEST_FROM_REF_UPDATED .getKey ()
7074 ));
7175
76+ /**
77+ * The list of events available in Bitbucket Server v6.x.
78+ */
79+ private static final List <String > NATIVE_SERVER_EVENTS_v6 = Collections .unmodifiableList (NATIVE_SERVER_EVENTS_v7 .subList (0 , 6 ));
80+
7281 /**
7382 * The title of the webhook.
7483 */
@@ -131,7 +140,8 @@ boolean updateHook(BitbucketWebHook hook, BitbucketSCMSource owner) {
131140 boolean updated = false ;
132141
133142 NativeBitbucketServerWebhook serverHook = (NativeBitbucketServerWebhook ) hook ;
134- String url = getNativeServerWebhookUrl (owner .getServerUrl (), owner .getEndpointJenkinsRootUrl ());
143+ String serverUrl = owner .getServerUrl ();
144+ String url = getNativeServerWebhookUrl (serverUrl , owner .getEndpointJenkinsRootUrl ());
135145
136146 if (!url .equals (serverHook .getUrl ())) {
137147 serverHook .setUrl (url );
@@ -140,11 +150,11 @@ boolean updateHook(BitbucketWebHook hook, BitbucketSCMSource owner) {
140150
141151 List <String > events = serverHook .getEvents ();
142152 if (events == null ) {
143- serverHook .setEvents (NATIVE_SERVER_EVENTS );
153+ serverHook .setEvents (getNativeServerEvents ( serverUrl ) );
144154 updated = true ;
145- } else if (!events .containsAll (NATIVE_SERVER_EVENTS )) {
155+ } else if (!events .containsAll (getNativeServerEvents ( serverUrl ) )) {
146156 Set <String > newEvents = new TreeSet <>(events );
147- newEvents .addAll (NATIVE_SERVER_EVENTS );
157+ newEvents .addAll (getNativeServerEvents ( serverUrl ) );
148158 serverHook .setEvents (new ArrayList <>(newEvents ));
149159 updated = true ;
150160 }
@@ -158,6 +168,7 @@ boolean updateHook(BitbucketWebHook hook, BitbucketSCMSource owner) {
158168 public BitbucketWebHook getHook (BitbucketSCMSource owner ) {
159169 final String serverUrl = owner .getServerUrl ();
160170 final String rootUrl = owner .getEndpointJenkinsRootUrl ();
171+
161172 if (BitbucketCloudEndpoint .SERVER_URL .equals (serverUrl )) {
162173 BitbucketRepositoryHook hook = new BitbucketRepositoryHook ();
163174 hook .setEvents (CLOUD_EVENTS );
@@ -171,7 +182,7 @@ public BitbucketWebHook getHook(BitbucketSCMSource owner) {
171182 case NATIVE : {
172183 NativeBitbucketServerWebhook hook = new NativeBitbucketServerWebhook ();
173184 hook .setActive (true );
174- hook .setEvents (NATIVE_SERVER_EVENTS );
185+ hook .setEvents (getNativeServerEvents ( serverUrl ) );
175186 hook .setDescription (description );
176187 hook .setUrl (getNativeServerWebhookUrl (serverUrl , rootUrl ));
177188 return hook ;
@@ -189,6 +200,19 @@ public BitbucketWebHook getHook(BitbucketSCMSource owner) {
189200 }
190201 }
191202
203+ private static List <String > getNativeServerEvents (String serverUrl ) {
204+ AbstractBitbucketEndpoint endpoint = BitbucketEndpointConfiguration .get ().findEndpoint (serverUrl );
205+ if (endpoint instanceof BitbucketServerEndpoint ) {
206+ if (((BitbucketServerEndpoint )endpoint ).getServerVersion ().equals (BitbucketServerVersion .VERSION_6 )) {
207+ return NATIVE_SERVER_EVENTS_v6 ;
208+ }
209+ }
210+
211+ // Not specifically v6, use v7.
212+ // Better to give an error than quietly not register some events.
213+ return NATIVE_SERVER_EVENTS_v7 ;
214+ }
215+
192216 private static String getNativeServerWebhookUrl (String serverUrl , String rootUrl ) {
193217 return UriTemplate .buildFromTemplate (rootUrl )
194218 .template (BitbucketSCMSourcePushHookReceiver .FULL_PATH )
0 commit comments