3
3
import hashlib
4
4
import hmac
5
5
import json
6
+ from functools import namedtuple
6
7
import logging
7
8
import re
8
9
56
57
BITBUCKET_PUSH = 'repo:push'
57
58
58
59
60
+ ExternalVersionData = namedtuple (
61
+ 'ExternalVersionData' ,
62
+ ['id' , 'source_branch' , 'base_branch' , 'commit' ],
63
+ )
64
+
65
+
59
66
class WebhookMixin :
60
67
61
68
"""Base class for Webhook mixins."""
@@ -227,20 +234,20 @@ def get_external_version_response(self, project):
227
234
:param project: Project instance
228
235
:type project: readthedocs.projects.models.Project
229
236
"""
230
- identifier , verbose_name = self .get_external_version_data ()
237
+ version_data = self .get_external_version_data ()
231
238
# create or get external version object using `verbose_name`.
232
- external_version = get_or_create_external_version (
233
- project , identifier , verbose_name
234
- )
239
+ external_version = get_or_create_external_version (project , version_data )
235
240
# returns external version verbose_name (pull/merge request number)
236
241
to_build = build_external_version (
237
- project = project , version = external_version , commit = identifier
242
+ project = project ,
243
+ version = external_version ,
244
+ version_data = version_data ,
238
245
)
239
246
240
247
return {
241
- 'build_triggered' : True ,
248
+ 'build_triggered' : bool ( to_build ) ,
242
249
'project' : project .slug ,
243
- 'versions' : [to_build ],
250
+ 'versions' : [to_build ] if to_build else [] ,
244
251
}
245
252
246
253
def get_delete_external_version_response (self , project ):
@@ -258,11 +265,9 @@ def get_delete_external_version_response(self, project):
258
265
:param project: Project instance
259
266
:type project: Project
260
267
"""
261
- identifier , verbose_name = self .get_external_version_data ()
268
+ version_data = self .get_external_version_data ()
262
269
# Delete external version
263
- deleted_version = delete_external_version (
264
- project , identifier , verbose_name
265
- )
270
+ deleted_version = delete_external_version (project , version_data )
266
271
return {
267
272
'version_deleted' : deleted_version is not None ,
268
273
'project' : project .slug ,
@@ -320,13 +325,16 @@ def get_data(self):
320
325
def get_external_version_data (self ):
321
326
"""Get Commit Sha and pull request number from payload."""
322
327
try :
323
- identifier = self .data ['pull_request' ]['head' ]['sha' ]
324
- verbose_name = str (self .data ['number' ])
325
-
326
- return identifier , verbose_name
328
+ data = ExternalVersionData (
329
+ id = str (self .data ['number' ]),
330
+ commit = self .data ['pull_request' ]['head' ]['sha' ],
331
+ source_branch = self .data ['pull_request' ]['head' ]['ref' ],
332
+ base_branch = self .data ['pull_request' ]['base' ]['ref' ],
333
+ )
334
+ return data
327
335
328
336
except KeyError :
329
- raise ParseError ('Parameters "sha" and "number" are required ' )
337
+ raise ParseError ('Invalid payload ' )
330
338
331
339
def is_payload_valid (self ):
332
340
"""
@@ -530,13 +538,16 @@ def is_payload_valid(self):
530
538
def get_external_version_data (self ):
531
539
"""Get commit SHA and merge request number from payload."""
532
540
try :
533
- identifier = self .data ['object_attributes' ]['last_commit' ]['id' ]
534
- verbose_name = str (self .data ['object_attributes' ]['iid' ])
535
-
536
- return identifier , verbose_name
541
+ data = ExternalVersionData (
542
+ id = str (self .data ['object_attributes' ]['iid' ]),
543
+ commit = self .data ['object_attributes' ]['last_commit' ]['id' ],
544
+ source_branch = self .data ['object_attributes' ]['source_branch' ],
545
+ base_branch = self .data ['object_attributes' ]['target_branch' ],
546
+ )
547
+ return data
537
548
538
549
except KeyError :
539
- raise ParseError ('Parameters "id" and "iid" are required ' )
550
+ raise ParseError ('Invalid payload ' )
540
551
541
552
def handle_webhook (self ):
542
553
"""
0 commit comments