Title: [291292] trunk/Tools
Revision
291292
Author
[email protected]
Date
2022-03-15 08:38:21 -0700 (Tue, 15 Mar 2022)

Log Message

[Merge-Queue] Fail draft PRs
https://bugs.webkit.org/show_bug.cgi?id=237859
<rdar://problem/90277316>

Reviewed by Aakash Jain.

We should never merge a draft pull request.

* Tools/CISupport/ews-build/factories.py:
(MergeQueueFactory.__init__): Verify that provided change is not a draft.
* Tools/CISupport/ews-build/steps.py:
(GitHubMixin._is_pr_draft): Check if pr_json indicates a draft PR.
(ValidateChange.__init__): Accept verifyNoDraft flag.
(ValidateChange.start):
(ValidateChange.fail_build):
(ValidateChange.validate_github): Fail the build if the provided PR is a draft.
* Tools/CISupport/ews-build/steps_unittest.py:

Canonical link: https://commits.webkit.org/248431@main

Modified Paths

Diff

Modified: trunk/Tools/CISupport/ews-build/factories.py (291291 => 291292)


--- trunk/Tools/CISupport/ews-build/factories.py	2022-03-15 15:26:35 UTC (rev 291291)
+++ trunk/Tools/CISupport/ews-build/factories.py	2022-03-15 15:38:21 UTC (rev 291292)
@@ -320,4 +320,4 @@
     def __init__(self, platform, configuration=None, architectures=None, additionalArguments=None, **kwargs):
         factory.BuildFactory.__init__(self)
         self.addStep(ConfigureBuild(platform=platform, configuration=configuration, architectures=architectures, buildOnly=False, triggers=None, remotes=None, additionalArguments=additionalArguments))
-        self.addStep(ValidateChange(verifyMergeQueue=True))
+        self.addStep(ValidateChange(verifyMergeQueue=True, verifyNoDraftForMergeQueue=True))

Modified: trunk/Tools/CISupport/ews-build/steps.py (291291 => 291292)


--- trunk/Tools/CISupport/ews-build/steps.py	2022-03-15 15:26:35 UTC (rev 291291)
+++ trunk/Tools/CISupport/ews-build/steps.py	2022-03-15 15:38:21 UTC (rev 291292)
@@ -216,6 +216,11 @@
                 return 1
         return 0
 
+    def _is_pr_draft(self, pr_json):
+        if pr_json.get('draft', False):
+            return 1
+        return 0
+
     def should_send_email_for_pr(self, pr_number):
         pr_json = self.get_pr_json(pr_number)
         if not pr_json:
@@ -1242,6 +1247,7 @@
         addURLs=True,
         verifycqplus=False,
         verifyMergeQueue=False,
+        verifyNoDraftForMergeQueue=False,
     ):
         self.verifyObsolete = verifyObsolete
         self.verifyBugClosed = verifyBugClosed
@@ -1248,6 +1254,7 @@
         self.verifyReviewDenied = verifyReviewDenied
         self.verifycqplus = verifycqplus
         self.verifyMergeQueue = verifyMergeQueue
+        self.verifyNoDraftForMergeQueue = verifyNoDraftForMergeQueue
         self.addURLs = addURLs
         buildstep.BuildStep.__init__(self)
 
@@ -1266,6 +1273,13 @@
         self.descriptionDone = reason
         self.build.buildFinished([reason], SKIPPED)
 
+    def fail_build(self, reason):
+        self._addToLog('stdio', reason)
+        self.finished(FAILURE)
+        self.build.results = FAILURE
+        self.descriptionDone = reason
+        self.build.buildFinished([reason], FAILURE)
+
     def start(self):
         patch_id = self.getProperty('patch_id', '')
         pr_number = self.getProperty('github.number', '')
@@ -1296,6 +1310,8 @@
         if self.verifycqplus and patch_id:
             self._addToLog('stdio', 'Change is in commit queue.\n')
             self._addToLog('stdio', 'Change has been reviewed.\n')
+        if self.verifyNoDraftForMergeQueue and pr_number:
+            self._addToLog('stdio', 'Change is not a draft.\n')
         if self.verifyMergeQueue and pr_number:
             self._addToLog('stdio', 'Change is in merge queue.\n')
         self.finished(SUCCESS)
@@ -1361,7 +1377,12 @@
             self.skip_build("PR {} does not have a merge queue label".format(pr_number))
             return False
 
-        if -1 in (obsolete, pr_closed, blocked, merge_queue):
+        draft = self._is_pr_draft(pr_json) if self.verifyNoDraftForMergeQueue else 0
+        if draft == 1:
+            self.fail_build("PR {} is a draft pull request".format(pr_number))
+            return False
+
+        if -1 in (obsolete, pr_closed, blocked, merge_queue, draft):
             self.finished(WARNINGS)
             return False
 

Modified: trunk/Tools/CISupport/ews-build/steps_unittest.py (291291 => 291292)


--- trunk/Tools/CISupport/ews-build/steps_unittest.py	2022-03-15 15:26:35 UTC (rev 291291)
+++ trunk/Tools/CISupport/ews-build/steps_unittest.py	2022-03-15 15:38:21 UTC (rev 291292)
@@ -5021,12 +5021,13 @@
                      "is_patch": 1,
                      "summary": "{}"}}'''.format(obsolete, title))
 
-    def get_pr(self, pr_number, title='Sample pull request', closed=False, labels=None):
+    def get_pr(self, pr_number, title='Sample pull request', closed=False, labels=None, draft=False):
         return dict(
             number=pr_number,
             state='closed' if closed else 'open',
             title=title,
             user=dict(login='JonWBedard'),
+            draft=draft,
             head=dict(
                 sha='7496f8ecc4cc8011f19c8cc1bc7b18fe4a88ad5c',
                 ref='eng/pull-request',
@@ -5133,7 +5134,29 @@
         self.assertEqual(self.getProperty('fast_commit_queue'), None, 'fast_commit_queue is unexpectedly set')
         return rc
 
+    def test_draft(self):
+        self.setupStep(ValidateChange(verifyNoDraftForMergeQueue=True))
+        ValidateChange.get_pr_json = lambda x, pull_request, repository_url=None, retry=None: self.get_pr(pr_number=pull_request, draft=True)
+        self.setProperty('github.number', '1234')
+        self.setProperty('repository', 'https://github.com/WebKit/WebKit')
+        self.setProperty('github.head.sha', '7496f8ecc4cc8011f19c8cc1bc7b18fe4a88ad5c')
+        self.expectOutcome(result=FAILURE, state_string='PR 1234 is a draft pull request')
+        rc = self.runStep()
+        self.assertEqual(self.getProperty('fast_commit_queue'), None, 'fast_commit_queue is unexpectedly set')
+        return rc
 
+    def test_no_draft(self):
+        self.setupStep(ValidateChange(verifyNoDraftForMergeQueue=True))
+        ValidateChange.get_pr_json = lambda x, pull_request, repository_url=None, retry=None: self.get_pr(pr_number=pull_request, draft=False)
+        self.setProperty('github.number', '1234')
+        self.setProperty('repository', 'https://github.com/WebKit/WebKit')
+        self.setProperty('github.head.sha', '7496f8ecc4cc8011f19c8cc1bc7b18fe4a88ad5c')
+        self.expectOutcome(result=SUCCESS, state_string='Validated change')
+        rc = self.runStep()
+        self.assertEqual(self.getProperty('fast_commit_queue'), None, 'fast_commit_queue is unexpectedly set')
+        return rc
+
+
 class TestValidateCommiterAndReviewer(BuildStepMixinAdditions, unittest.TestCase):
     def setUp(self):
         self.longMessage = True

Modified: trunk/Tools/ChangeLog (291291 => 291292)


--- trunk/Tools/ChangeLog	2022-03-15 15:26:35 UTC (rev 291291)
+++ trunk/Tools/ChangeLog	2022-03-15 15:38:21 UTC (rev 291292)
@@ -1,3 +1,23 @@
+2022-03-14  Jonathan Bedard  <[email protected]>
+
+        [Merge-Queue] Fail draft PRs
+        https://bugs.webkit.org/show_bug.cgi?id=237859
+        <rdar://problem/90277316>
+
+        Reviewed by Aakash Jain.
+
+        We should never merge a draft pull request.
+
+        * CISupport/ews-build/factories.py:
+        (MergeQueueFactory.__init__): Verify that provided change is not a draft.
+        * CISupport/ews-build/steps.py:
+        (GitHubMixin._is_pr_draft): Check if pr_json indicates a draft PR.
+        (ValidateChange.__init__): Accept verifyNoDraft flag.
+        (ValidateChange.start):
+        (ValidateChange.fail_build):
+        (ValidateChange.validate_github): Fail the build if the provided PR is a draft.
+        * CISupport/ews-build/steps_unittest.py:
+
 2022-03-15  Youenn Fablet  <[email protected]>
 
         Mark permission as denied if system forbids access to camera and/or microphone
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to