Title: [284485] trunk/Tools
Revision
284485
Author
jbed...@apple.com
Date
2021-10-19 13:07:43 -0700 (Tue, 19 Oct 2021)

Log Message

[webkitscmpy] Generate commit message template
https://bugs.webkit.org/show_bug.cgi?id=231023
<rdar://problem/83722871>

Reviewed by Dewei Zhu.

* Tools/Scripts/git-webkit: Use prepare-ChangeLog to generate commit messages.
* Tools/Scripts/hooks/prepare-commit-msg: Added.
* Tools/Scripts/libraries/webkitscmpy/setup.py: Bump version, add jinja.
* Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
* Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py:
(Git.__init__): Add unbound status mock.
* Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/__init__.py:
(main): Pass hooks to sub-programs.
* Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py:
(Setup.git): iterate through the directory of provided hooks and render with jinja2.
* Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/hooks/prepare-commit-msg: Added.
* Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/setup_unittest.py:
(TestSetup.test_commit_message):
Canonical link: https://commits.webkit.org/243242@main

Modified Paths

Added Paths

Diff

Modified: trunk/Tools/ChangeLog (284484 => 284485)


--- trunk/Tools/ChangeLog	2021-10-19 20:05:16 UTC (rev 284484)
+++ trunk/Tools/ChangeLog	2021-10-19 20:07:43 UTC (rev 284485)
@@ -1,3 +1,25 @@
+2021-10-14  Jonathan Bedard  <jbed...@apple.com>
+
+        [webkitscmpy] Generate commit message template
+        https://bugs.webkit.org/show_bug.cgi?id=231023
+        <rdar://problem/83722871>
+
+        Reviewed by Dewei Zhu.
+
+        * Scripts/git-webkit: Use prepare-ChangeLog to generate commit messages.
+        * Scripts/hooks/prepare-commit-msg: Added.
+        * Scripts/libraries/webkitscmpy/setup.py: Bump version, add jinja.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py:
+        (Git.__init__): Add unbound status mock.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/program/__init__.py:
+        (main): Pass hooks to sub-programs.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py:
+        (Setup.git): iterate through the directory of provided hooks and render with jinja2.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/test/hooks/prepare-commit-msg: Added.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/test/setup_unittest.py:
+        (TestSetup.test_commit_message):
+
 2021-10-19  Jonathan Bedard  <jbed...@apple.com>
 
         [webkitscmpy] Filter approvers by status

Modified: trunk/Tools/Scripts/git-webkit (284484 => 284485)


--- trunk/Tools/Scripts/git-webkit	2021-10-19 20:05:16 UTC (rev 284484)
+++ trunk/Tools/Scripts/git-webkit	2021-10-19 20:07:43 UTC (rev 284485)
@@ -71,5 +71,6 @@
         identifier_template=is_webkit_filter('Canonical link: https://commits.webkit.org/{}'),
         subversion=is_webkit_filter('https://svn.webkit.org/repository/webkit'),
         additional_setup=is_webkit_filter(additional_setup),
+        hooks=os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__))), 'hooks'),
     ))
 

Added: trunk/Tools/Scripts/hooks/prepare-commit-msg (0 => 284485)


--- trunk/Tools/Scripts/hooks/prepare-commit-msg	                        (rev 0)
+++ trunk/Tools/Scripts/hooks/prepare-commit-msg	2021-10-19 20:07:43 UTC (rev 284485)
@@ -0,0 +1,76 @@
+#!/usr/bin/env {{ python }}
+
+import os
+import subprocess
+import sys
+
+LOCATION = '{{ location }}'
+SPACING = 8
+SCRIPTS = os.path.dirname(os.path.dirname(LOCATION))
+
+
+def message(source=None, sha=None):
+    dirname = None
+    commit_message = []
+
+    try:
+        for line in subprocess.check_output(
+            [os.path.join(SCRIPTS, 'prepare-ChangeLog'), '--no-write', '--only-files', '--delimiters'],
+            **(dict(encoding='utf-8') if sys.version_info > (3, 0) else dict())
+        ).splitlines():
+            if line == '~':
+                dirname = None
+                continue
+            if line.startswith(' ' * SPACING):
+                if dirname:
+                    line = line.replace('* ', '* {}/'.format(dirname))
+                commit_message.append(line[SPACING:])
+                continue
+            if line.endswith(':'):
+                dirname = line.split(':')[0]
+                continue
+
+        return '''Need a short description (OOPS!).
+Need the bug URL (OOPS!).
+
+Reviewed by NOBODY (OOPS!).
+
+{}
+'''.format('\n'.join(commit_message))
+
+    except subprocess.CalledProcessError:
+        return ''
+
+def main(file_name=None, source=None, sha=None):
+    if source and source != 'commit':
+        return 0
+
+    with open(file_name, 'w') as commit_message_file:
+        if sha:
+            commit_message_file.write(subprocess.check_output(
+                ['{{ git }}', 'log', 'HEAD', '-1', '--pretty=format:%B'],
+                **(dict(encoding='utf-8') if sys.version_info > (3, 5) else dict())
+            ))
+        else:
+            commit_message_file.write(message(source=source, sha=sha))
+
+        commit_message_file.write('''
+# Please populate the above commit message. Lines starting
+# with '#' will be ignored
+
+''')
+        if sha:
+            for line in message(source=source, sha=sha).splitlines():
+                commit_message_file.write('# {}\n'.format(line))
+            commit_message_file.write('\n')
+        for line in subprocess.check_output(
+            ['{{ git }}', 'status'],
+            **(dict(encoding='utf-8') if sys.version_info > (3, 5) else dict())
+        ).splitlines():
+            commit_message_file.write('# {}\n'.format(line))
+
+    return 0
+
+
+if __name__ == '__main__':
+    sys.exit(main(*sys.argv[1:]))

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/setup.py (284484 => 284485)


--- trunk/Tools/Scripts/libraries/webkitscmpy/setup.py	2021-10-19 20:05:16 UTC (rev 284484)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/setup.py	2021-10-19 20:07:43 UTC (rev 284485)
@@ -29,7 +29,7 @@
 
 setup(
     name='webkitscmpy',
-    version='2.2.13',
+    version='2.2.14',
     description='Library designed to interact with git and svn repositories.',
     long_description=readme(),
     classifiers=[
@@ -58,7 +58,7 @@
         'webkitscmpy.test',
     ],
     scripts=['git-webkit'],
-    install_requires=['fasteners', 'inspect2', 'monotonic', 'webkitcorepy', 'xmltodict'],
+    install_requires=['fasteners', 'inspect2', 'jinja2', 'monotonic', 'webkitcorepy', 'xmltodict'],
     include_package_data=True,
     zip_safe=False,
 )

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py (284484 => 284485)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py	2021-10-19 20:05:16 UTC (rev 284484)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py	2021-10-19 20:07:43 UTC (rev 284485)
@@ -46,12 +46,14 @@
         "Please install webkitcorepy with `pip install webkitcorepy --extra-index-url <package index URL>`"
     )
 
-version = Version(2, 2, 13)
+version = Version(2, 2, 14)
 
 AutoInstall.register(Package('fasteners', Version(0, 15, 0)))
+AutoInstall.register(Package('jinja2', Version(2, 11, 3)))
 AutoInstall.register(Package('monotonic', Version(1, 5)))
 AutoInstall.register(Package('whichcraft', Version(0, 6, 1)))
 AutoInstall.register(Package('xmltodict', Version(0, 11, 0)))
+AutoInstall.register(Package('MarkupSafe', Version(1, 1, 1)))
 
 if sys.version_info < (3, 0):
     AutoInstall.register(Package('inspect2', Version(0, 1, 2)))

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py (284484 => 284485)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py	2021-10-19 20:05:16 UTC (rev 284484)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/local/git.py	2021-10-19 20:07:43 UTC (rev 284485)
@@ -442,6 +442,17 @@
                     stderr='usage: git [--version] [--help]...\n',
                 ),
             ), mocks.Subprocess.Route(
+                self.executable, 'status',
+                generator=lambda *args, **kwargs:
+                    mocks.ProcessCompletion(
+                        returncode=0,
+                        stdout=''''On branch {branch}
+Your branch is up to date with 'origin/{branch}'.
+
+nothing to commit, working tree clean
+'''.format(branch=self.branch),
+                    ),
+            ), mocks.Subprocess.Route(
                 self.executable,
                 completion=mocks.ProcessCompletion(
                     returncode=128,

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/__init__.py (284484 => 284485)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/__init__.py	2021-10-19 20:05:16 UTC (rev 284484)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/__init__.py	2021-10-19 20:07:43 UTC (rev 284485)
@@ -44,7 +44,7 @@
 
 def main(
     args=None, path=None, loggers=None, contributors=None,
-    identifier_template=None, subversion=None, additional_setup=None,
+    identifier_template=None, subversion=None, additional_setup=None, hooks=None,
 ):
     logging.basicConfig(level=logging.WARNING)
 
@@ -112,6 +112,8 @@
         identifier_template = identifier_template(repository)
     if callable(subversion):
         subversion = subversion(repository)
+    if callable(hooks):
+        hooks = hooks(repository)
 
     if sys.version_info > (3, 0):
         import inspect
@@ -130,4 +132,5 @@
         identifier_template=identifier_template,
         subversion=subversion,
         additional_setup=additional_setup,
+        hooks=hooks,
     )

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py (284484 => 284485)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py	2021-10-19 20:05:16 UTC (rev 284484)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py	2021-10-19 20:07:43 UTC (rev 284485)
@@ -20,10 +20,12 @@
 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import os
 import requests
 import sys
 
 from .command import Command
+from jinja2 import Template
 from requests.auth import HTTPBasicAuth
 from webkitcorepy import arguments, run, Editor, Terminal
 from webkitscmpy import log, local, remote
@@ -78,7 +80,7 @@
         return result
 
     @classmethod
-    def git(cls, args, repository, additional_setup=None, **kwargs):
+    def git(cls, args, repository, additional_setup=None, hooks=None, **kwargs):
         global_config = local.Git.config()
         result = 0
 
@@ -146,6 +148,26 @@
             sys.stderr.write('Failed to use {} as the merge strategy\n'.format('merge commits' if args.merge else 'rebase'))
             result += 1
 
+        if hooks:
+            for hook in os.listdir(hooks):
+                source_path = os.path.join(hooks, hook)
+                if not os.path.isfile(source_path):
+                    continue
+                log.warning('Configuring and copying hook {}'.format(source_path))
+                with open(source_path, 'r') as f:
+                    contents = Template(f.read()).render(
+                        git=local.Git.executable(),
+                        location=source_path,
+                        python=os.path.basename(sys.executable),
+                    )
+
+                target = os.path.join(repository.root_path, '.git', 'hooks', hook)
+                if not os.path.exists(os.path.dirname(target)):
+                    os.makedirs(os.path.dirname(target))
+                with open(target, 'w') as f:
+                    f.write(contents)
+                    f.write('\n')
+
         log.warning('Setting git editor for {}...'.format(repository.root_path))
         editor_name = 'default' if args.defaults else Terminal.choose(
             'Pick a commit message editor',

Added: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/hooks/prepare-commit-msg (0 => 284485)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/hooks/prepare-commit-msg	                        (rev 0)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/hooks/prepare-commit-msg	2021-10-19 20:07:43 UTC (rev 284485)
@@ -0,0 +1,45 @@
+#!/usr/bin/env {{ python }}
+
+import os
+import subprocess
+import sys
+
+
+def message(source=None, sha=None):
+    return 'Generated commit message'
+
+
+def main(file_name=None, source=None, sha=None):
+    if source and source != 'commit':
+        return 0
+
+    with open(file_name, 'w') as commit_message_file:
+        if sha:
+            commit_message_file.write(subprocess.check_output(
+                ['{{ git }}', 'log', 'HEAD', '-1', '--pretty=format:%B'],
+                **(dict(encoding='utf-8') if sys.version_info > (3, 5) else dict())
+            ))
+        else:
+            commit_message_file.write(message(source=source, sha=sha))
+
+        commit_message_file.write('''
+# Please populate the above commit message. Lines starting
+# with '#' will be ignored
+
+''')
+        if sha:
+            for line in message(source=source, sha=sha).splitlines():
+                commit_message_file.write('# {}\n'.format(line))
+            commit_message_file.write('\n')
+        for line in subprocess.check_output(
+            ['{{ git }}', 'status'],
+            **(dict(encoding='utf-8') if sys.version_info > (3, 5) else dict())
+        ).splitlines():
+            commit_message_file.write('# {}\n'.format(line))
+
+    return 0
+
+
+if __name__ == '__main__':
+    sys.exit(main(*sys.argv[1:]))
+

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/setup_unittest.py (284484 => 284485)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/setup_unittest.py	2021-10-19 20:05:16 UTC (rev 284484)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/setup_unittest.py	2021-10-19 20:07:43 UTC (rev 284485)
@@ -21,6 +21,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import os
+import sys
 
 from webkitcorepy import Editor, OutputCapture, testing
 from webkitcorepy.mocks import Terminal as MockTerminal
@@ -143,3 +144,37 @@
 Fetching 'https://github.example.com/username/WebKit.git'
 '''.format(repository=self.path),
         )
+
+    def test_commit_message(self):
+        with OutputCapture(), mocks.local.Git(self.path) as git, mocks.local.Svn():
+            self.assertEqual(0, program.main(
+                args=('setup', '--defaults'),
+                path=self.path,
+                hooks=os.path.join(os.path.abspath(os.path.dirname(__file__)), 'hooks')
+            ))
+            pcm = os.path.join(self.path, '.git', 'hooks', 'prepare-commit-msg')
+            self.assertTrue(os.path.isfile(pcm))
+            os.rename(pcm, os.path.join(os.path.dirname(pcm), 'prepare_commit_msg.py'))
+
+            sys.path.insert(0, os.path.dirname(pcm))
+
+            try:
+                from prepare_commit_msg import main
+                self.assertEqual(
+                    main(os.path.join(self.path, 'COMMIT_MESSAGE')),
+                    0,
+                )
+                with open(os.path.join(self.path, 'COMMIT_MESSAGE'), 'r') as file:
+                    self.assertEqual(
+                        file.read(),
+                        '''Generated commit message
+# Please populate the above commit message. Lines starting
+# with '#' will be ignored
+
+# 'On branch main
+# Your branch is up to date with 'origin/main'.
+# 
+# nothing to commit, working tree clean
+''')
+            finally:
+                sys.path.remove(os.path.dirname(pcm))
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to