Title: [292402] trunk/Tools
Revision
292402
Author
jbed...@apple.com
Date
2022-04-05 10:57:55 -0700 (Tue, 05 Apr 2022)

Log Message

[Merge-Queue] Add author to commit message
https://bugs.webkit.org/show_bug.cgi?id=238752
<rdar://problem/91254339>

Reviewed by Aakash Jain.

svn.webkit.org will attribute a change to a specific author
if "Patch by" is in the commit message.

* Tools/CISupport/ews-build/factories.py:
(MergeQueueFactory.__init__): Add AddAuthorToCommitMessage step.
* Tools/CISupport/ews-build/factories_unittest.py:
(TestExpectedBuildSteps): Ditto.
* Tools/CISupport/ews-build/master.cfg: Determine commit author from github.head.user.login.
* Tools/CISupport/ews-build/steps.py:
(AddAuthorToCommitMessage):
(AddAuthorToCommitMessage.__init__):
(AddAuthorToCommitMessage.author): Return commit author's name and email, falling back
to the committers name and email if those cannot be determined.
(AddAuthorToCommitMessage.start): Insert "Patch by" into commit message.
(AddAuthorToCommitMessage.getResultSummary):
(AddAuthorToCommitMessage.doStepIf): Only do step if the author can be determined.
(AddAuthorToCommitMessage.hideStepIf): Hide step if skipped.
* Tools/CISupport/ews-build/steps_unittest.py:

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

Modified Paths

Diff

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


--- trunk/Tools/CISupport/ews-build/factories.py	2022-04-05 17:38:45 UTC (rev 292401)
+++ trunk/Tools/CISupport/ews-build/factories.py	2022-04-05 17:57:55 UTC (rev 292402)
@@ -24,8 +24,8 @@
 from buildbot.process import factory
 from buildbot.steps import trigger
 
-from steps import (AddReviewerToCommitMessage, AddReviewerToChangeLog, ApplyPatch, ApplyWatchList, Canonicalize, CheckOutPullRequest,
-                   CheckOutSource, CheckOutSpecificRevision, CheckChangeRelevance,
+from steps import (AddAuthorToCommitMessage, AddReviewerToCommitMessage, AddReviewerToChangeLog, ApplyPatch, ApplyWatchList, Canonicalize,
+                   CheckOutPullRequest, CheckOutSource, CheckOutSpecificRevision, CheckChangeRelevance,
                    CheckPatchStatusOnEWSQueues, CheckStyle, CleanGitRepo, CompileJSC, CompileWebKit, ConfigureBuild, CreateLocalGITCommit,
                    DownloadBuiltProduct, ExtractBuiltProduct, FetchBranches, FindModifiedChangeLogs, FindModifiedLayoutTests,
                    InstallGtkDependencies, InstallWpeDependencies, KillOldProcesses, PrintConfiguration, PushCommitToWebKitRepo, PushPullRequestBranch,
@@ -333,6 +333,7 @@
         self.addStep(CheckOutPullRequest())
         self.addStep(ValidateSquashed())
         self.addStep(AddReviewerToCommitMessage())
+        self.addStep(AddAuthorToCommitMessage())
         self.addStep(AddReviewerToChangeLog())
         self.addStep(ValidateCommitMessage())
         self.addStep(ValidateChangeLogAndReviewer())

Modified: trunk/Tools/CISupport/ews-build/factories_unittest.py (292401 => 292402)


--- trunk/Tools/CISupport/ews-build/factories_unittest.py	2022-04-05 17:38:45 UTC (rev 292401)
+++ trunk/Tools/CISupport/ews-build/factories_unittest.py	2022-04-05 17:57:55 UTC (rev 292402)
@@ -640,6 +640,7 @@
             'checkout-pull-request',
             'validate-squashed',
             'add-reviewer-to-commit-message',
+            'add-author-to-commit-message',
             'add-reviewer-to-changelog',
             'validate-commit-message',
             'validate-changelog-and-reviewer',

Modified: trunk/Tools/CISupport/ews-build/master.cfg (292401 => 292402)


--- trunk/Tools/CISupport/ews-build/master.cfg	2022-04-05 17:38:45 UTC (rev 292401)
+++ trunk/Tools/CISupport/ews-build/master.cfg	2022-04-05 17:57:55 UTC (rev 292402)
@@ -56,6 +56,7 @@
                 'github.base.ref',
                 'github.base.sha',
                 'github.head.repo.full_name',
+                'github.head.user.login',
             ], 'token': load_password('GITHUB_COM_ACCESS_TOKEN'),
         },
     )

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


--- trunk/Tools/CISupport/ews-build/steps.py	2022-04-05 17:38:45 UTC (rev 292401)
+++ trunk/Tools/CISupport/ews-build/steps.py	2022-04-05 17:57:55 UTC (rev 292402)
@@ -4727,6 +4727,69 @@
         return not self.doStepIf(step)
 
 
+class AddAuthorToCommitMessage(shell.ShellCommand, AddReviewerMixin):
+    name = 'add-author-to-commit-message'
+    haltOnFailure = True
+
+    def __init__(self, **kwargs):
+        super(AddAuthorToCommitMessage, self).__init__(logEnviron=False, timeout=60, **kwargs)
+
+    def author(self):
+        contributors, _ = Contributors.load(use_network=False)
+        username = self.getProperty('github.head.user.login')
+        owners = self.getProperty('owners', [])
+        for candidate in [username, owners[0] if owners else None]:
+            if not candidate:
+                continue
+
+            name = contributors.get(candidate, {}).get('name', None)
+            email = contributors.get(candidate, {}).get('email', None)
+            if name and email:
+                return name, email
+
+        return None, None
+
+    def start(self):
+        base_ref = self.getProperty('github.base.ref', DEFAULT_BRANCH)
+        head_ref = self.getProperty('github.head.ref', DEFAULT_BRANCH)
+
+        gmtoffset = int(time.localtime().tm_gmtoff * 100 / (60 * 60))
+        timestamp = f'{int(time.time())} {gmtoffset}'
+
+        name, email = self.author()
+        patch_by = f"Patch by {name} <{email}> on {date.today().strftime('%Y-%m-%d')}"
+
+        self.command = [
+            'git', 'filter-branch', '-f',
+            '--env-filter', f"GIT_AUTHOR_DATE='{timestamp}';GIT_COMMITTER_DATE='{timestamp}'",
+            '--msg-filter', f'sed "1,/^$/ s/^$/\\n{patch_by}/g"',
+            f'{head_ref}...{base_ref}',
+        ]
+
+        for key, value in self.gitCommitEnvironment().items():
+            self.workerEnvironment[key] = value
+
+        return super(AddAuthorToCommitMessage, self).start()
+
+    def getResultSummary(self):
+        if self.results == FAILURE:
+            return {'step': 'Failed to add author to commit message'}
+        elif self.results == SUCCESS:
+            name, _ = self.author()
+            return {'step': f"Added {name} as author"}
+        return super(AddAuthorToCommitMessage, self).getResultSummary()
+
+    def doStepIf(self, step):
+        if not self.getProperty('github.number'):
+            return False
+
+        name, email = self.author()
+        return name and email
+
+    def hideStepIf(self, results, step):
+        return not self.doStepIf(step)
+
+
 class AddReviewerToChangeLog(steps.ShellSequence, ShellMixin, AddReviewerMixin):
     name = 'add-reviewer-to-changelog'
     haltOnFailure = True

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


--- trunk/Tools/CISupport/ews-build/steps_unittest.py	2022-04-05 17:38:45 UTC (rev 292401)
+++ trunk/Tools/CISupport/ews-build/steps_unittest.py	2022-04-05 17:57:55 UTC (rev 292402)
@@ -35,6 +35,7 @@
 from buildbot.test.util.misc import TestReactorMixin
 from buildbot.test.util.steps import BuildStepMixin
 from buildbot.util import identifiers as buildbot_identifiers
+from datetime import date
 from mock import call, patch
 from twisted.internet import defer, error, reactor
 from twisted.python import failure, log
@@ -41,8 +42,8 @@
 from twisted.trial import unittest
 import send_email
 
-from steps import (AddReviewerToCommitMessage, AddReviewerToChangeLog, AnalyzeAPITestsResults, AnalyzeCompileWebKitResults, AnalyzeJSCTestsResults,
-                   AnalyzeLayoutTestsResults, ApplyPatch, ApplyWatchList, ArchiveBuiltProduct, ArchiveTestResults, BugzillaMixin,
+from steps import (AddAuthorToCommitMessage, AddReviewerToCommitMessage, AddReviewerToChangeLog, AnalyzeAPITestsResults, AnalyzeCompileWebKitResults,
+                   AnalyzeJSCTestsResults, AnalyzeLayoutTestsResults, ApplyPatch, ApplyWatchList, ArchiveBuiltProduct, ArchiveTestResults, BugzillaMixin,
                    Canonicalize, CheckOutPullRequest, CheckOutSource, CheckOutSpecificRevision, CheckChangeRelevance, CheckPatchStatusOnEWSQueues, CheckStyle,
                    CleanBuild, CleanUpGitIndexLock, CleanGitRepo, CleanWorkingDirectory, CompileJSC, CompileJSCWithoutChange,
                    CompileWebKit, CompileWebKitWithoutChange, ConfigureBuild, ConfigureBuild, Contributors, CreateLocalGITCommit,
@@ -5765,6 +5766,122 @@
         return self.runStep()
 
 
+class TestAddAuthorToCommitMessage(BuildStepMixinAdditions, unittest.TestCase):
+    ENV = dict(
+        GIT_COMMITTER_NAME='WebKit Committer',
+        GIT_COMMITTER_EMAIL='commit...@webkit.org',
+        FILTER_BRANCH_SQUELCH_WARNING='1',
+    )
+
+    def setUp(self):
+        self.longMessage = True
+        Contributors.load = mock_load_contributors
+        return self.setUpBuildStep()
+
+    def tearDown(self):
+        return self.tearDownBuildStep()
+
+    def test_skipped_patch(self):
+        self.setupStep(AddAuthorToCommitMessage())
+        self.setProperty('patch_id', '1234')
+        self.expectOutcome(result=SKIPPED, state_string='finished (skipped)')
+        return self.runStep()
+
+    def test_success(self):
+        gmtoffset = int(time.localtime().tm_gmtoff * 100 / (60 * 60))
+        fixed_time = int(time.time())
+        timestamp = f'{int(time.time())} {gmtoffset}'
+        time.time = lambda: fixed_time
+
+        self.setupStep(AddAuthorToCommitMessage())
+        self.setProperty('github.number', '1234')
+        self.setProperty('github.base.ref', 'main')
+        self.setProperty('github.head.ref', 'eng/pull-request-branch')
+        self.setProperty('github.head.user.login', 'webkit-reviewer')
+        self.setProperty('owners', ['webkit-commit-queue'])
+        self.expectRemoteCommands(
+            ExpectShell(workdir='wkdir',
+                        logEnviron=False,
+                        env=self.ENV,
+                        timeout=60,
+                        command=[
+                            'git', 'filter-branch', '-f',
+                            '--env-filter', f"GIT_AUTHOR_DATE='{timestamp}';GIT_COMMITTER_DATE='{timestamp}'",
+                            '--msg-filter', f'sed "1,/^$/ s/^$/\\nPatch by WebKit Reviewer <revie...@apple.com> on {date.today().strftime("%Y-%m-%d")}/g"',
+                            'eng/pull-request-branch...main',
+                        ])
+            + 0
+            + ExpectShell.log('stdio', stdout="Ref 'refs/heads/eng/pull-request-branch' was rewritten\n"),
+        )
+        self.expectOutcome(result=SUCCESS, state_string='Added WebKit Reviewer as author')
+        return self.runStep()
+
+    def test_success_fallback(self):
+        gmtoffset = int(time.localtime().tm_gmtoff * 100 / (60 * 60))
+        fixed_time = int(time.time())
+        timestamp = f'{int(time.time())} {gmtoffset}'
+        time.time = lambda: fixed_time
+
+        self.setupStep(AddAuthorToCommitMessage())
+        self.setProperty('github.number', '1234')
+        self.setProperty('github.base.ref', 'main')
+        self.setProperty('github.head.ref', 'eng/pull-request-branch')
+        self.setProperty('github.head.user.login', 'unregistered-author')
+        self.setProperty('owners', ['webkit-commit-queue'])
+        self.expectRemoteCommands(
+            ExpectShell(workdir='wkdir',
+                        logEnviron=False,
+                        env=self.ENV,
+                        timeout=60,
+                        command=[
+                            'git', 'filter-branch', '-f',
+                            '--env-filter', f"GIT_AUTHOR_DATE='{timestamp}';GIT_COMMITTER_DATE='{timestamp}'",
+                            '--msg-filter', f'sed "1,/^$/ s/^$/\\nPatch by WebKit Committer <commit...@webkit.org> on {date.today().strftime("%Y-%m-%d")}/g"',
+                            'eng/pull-request-branch...main',
+                        ])
+            + 0
+            + ExpectShell.log('stdio', stdout="Ref 'refs/heads/eng/pull-request-branch' was rewritten\n"),
+        )
+        self.expectOutcome(result=SUCCESS, state_string='Added WebKit Committer as author')
+        return self.runStep()
+
+    def test_failure(self):
+        gmtoffset = int(time.localtime().tm_gmtoff * 100 / (60 * 60))
+        fixed_time = int(time.time())
+        timestamp = f'{int(time.time())} {gmtoffset}'
+        time.time = lambda: fixed_time
+
+        self.setupStep(AddAuthorToCommitMessage())
+        self.setProperty('github.number', '1234')
+        self.setProperty('github.base.ref', 'main')
+        self.setProperty('github.head.ref', 'eng/pull-request-branch')
+        self.setProperty('github.head.user.login', 'webkit-commit-queue')
+        self.setProperty('owners', ['webkit-commit-queue'])
+        self.expectRemoteCommands(
+            ExpectShell(workdir='wkdir',
+                        logEnviron=False,
+                        env=self.ENV,
+                        timeout=60,
+                        command=[
+                            'git', 'filter-branch', '-f',
+                            '--env-filter', f"GIT_AUTHOR_DATE='{timestamp}';GIT_COMMITTER_DATE='{timestamp}'",
+                            '--msg-filter', f'sed "1,/^$/ s/^$/\\nPatch by WebKit Committer <commit...@webkit.org> on {date.today().strftime("%Y-%m-%d")}/g"',
+                            'eng/pull-request-branch...main',
+                        ])
+            + 2
+            + ExpectShell.log('stdio', stdout="Failed to rewrite 'refs/heads/eng/pull-request-branch'\n"),
+        )
+        self.expectOutcome(result=FAILURE, state_string='Failed to add author to commit message')
+        return self.runStep()
+
+    def test_no_owner(self):
+        self.setupStep(AddAuthorToCommitMessage())
+        self.setProperty('github.number', '1234')
+        self.setProperty('github.base.ref', 'main')
+        self.expectOutcome(result=SKIPPED, state_string='finished (skipped)')
+        return self.runStep()
+
+
 class TestAddReviewerToChangeLog(BuildStepMixinAdditions, unittest.TestCase):
     ENV = dict(
         GIT_COMMITTER_NAME='WebKit Committer',

Modified: trunk/Tools/ChangeLog (292401 => 292402)


--- trunk/Tools/ChangeLog	2022-04-05 17:38:45 UTC (rev 292401)
+++ trunk/Tools/ChangeLog	2022-04-05 17:57:55 UTC (rev 292402)
@@ -1,3 +1,30 @@
+2022-04-04  Jonathan Bedard  <jbed...@apple.com>
+
+        [Merge-Queue] Add author to commit message
+        https://bugs.webkit.org/show_bug.cgi?id=238752
+        <rdar://problem/91254339>
+
+        Reviewed by Aakash Jain.
+
+        svn.webkit.org will attribute a change to a specific author
+        if "Patch by" is in the commit message.
+
+        * CISupport/ews-build/factories.py:
+        (MergeQueueFactory.__init__): Add AddAuthorToCommitMessage step.
+        * CISupport/ews-build/factories_unittest.py:
+        (TestExpectedBuildSteps): Ditto.
+        * CISupport/ews-build/master.cfg: Determine commit author from github.head.user.login.
+        * CISupport/ews-build/steps.py:
+        (AddAuthorToCommitMessage):
+        (AddAuthorToCommitMessage.__init__):
+        (AddAuthorToCommitMessage.author): Return commit author's name and email, falling back
+        to the committers name and email if those cannot be determined.
+        (AddAuthorToCommitMessage.start): Insert "Patch by" into commit message.
+        (AddAuthorToCommitMessage.getResultSummary):
+        (AddAuthorToCommitMessage.doStepIf): Only do step if the author can be determined.
+        (AddAuthorToCommitMessage.hideStepIf): Hide step if skipped.
+        * CISupport/ews-build/steps_unittest.py:
+
 2022-04-05  Eric Carlson  <eric.carl...@apple.com>
 
         5 Media API tests are flakily timing out on iOS14
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to