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/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',