blob: 9e7fd7a707c2a29807d8089b9fc0e80ea4a5ca88 [file] [log] [blame]
#!/usr/bin/env {{ python }}
import os
import subprocess
import sys
LOCATION = r'{{ location }}'
SPACING = 8
SCRIPTS = os.path.dirname(os.path.dirname(LOCATION))
sys.path.append(SCRIPTS)
from webkitpy.common.checkout.diff_parser import DiffParser
def message_from_staged_changelogs():
try:
diff = subprocess.check_output(['git', 'diff', '--staged'])
except subprocess.CalledProcessError:
return ''
modified_files = DiffParser(diff.splitlines()).files
message = ''
for path, parsed_diff in modified_files.items():
if not path.endswith('ChangeLog'):
continue
# Ignore first line (date, name, email) and second line (empty).
diff_lines = parsed_diff.lines[2:]
# Get added lines and strip leading 8 characters indentation.
lines = [line[2][SPACING:] for line in diff_lines if not line[0]]
message += '\n'.join(lines)
return message
def message(source=None, sha=None):
msg = message_from_staged_changelogs()
if msg:
return msg
dirname = None
commit_message = []
try:
for line in subprocess.check_output(
['perl', 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 '''{title}
{bugs}
Reviewed by NOBODY (OOPS!).
{content}
'''.format(
title=os.environ.get('COMMIT_MESSAGE_TITLE', '') or 'Need a short description (OOPS!).',
bugs=os.environ.get('COMMIT_MESSAGE_BUG', '') or 'Need the bug URL (OOPS!).',
content='\n'.join(commit_message) + os.environ.get('COMMIT_MESSAGE_CONTENT', ''),
)
except subprocess.CalledProcessError:
return ''
def main(file_name=None, source=None, sha=None):
with open(file_name, 'r') as commit_message_file:
content = commit_message_file.read()
if source not in (None, 'commit', 'template', 'merge'):
return 0
if source == 'merge' and not content.startswith('Revert'):
return 0
if os.environ.get('GIT_EDITOR', '') == ':':
# When there's no editor being launched, do nothing.
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:]))