1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #!/usr/bin/env python3
- # Copyright (C) 2020 Free Software Foundation, Inc.
- #
- # This file is part of GCC.
- #
- # GCC is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 3, or (at your option)
- # any later version.
- #
- # GCC is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with GCC; see the file COPYING. If not, write to
- # the Free Software Foundation, 51 Franklin Street, Fifth Floor,
- # Boston, MA 02110-1301, USA.
- #
- # The script tries to fix commit message where ChangeLog entries
- # can point to .cc renamed files.
- import argparse
- import os
- import subprocess
- import tempfile
- DESCRIPTION = 'Fix up ChangeLog of the current commit.'
- script_folder = os.path.dirname(os.path.abspath(__file__))
- verify_script = os.path.join(script_folder,
- 'gcc-changelog/git_check_commit.py')
- def replace_file_in_changelog(lines, filename, fixed):
- # consider all componenets of a path: gcc/ipa-icf.cc
- while filename:
- for i, line in enumerate(lines):
- if filename in line:
- lines[i] = line.replace(filename, fixed)
- return
- parts = filename.split('/')
- if len(parts) == 1:
- return
- filename = '/'.join(parts[1:])
- fixed = '/'.join(fixed.split('/')[1:])
- if __name__ == '__main__':
- parser = argparse.ArgumentParser(description=DESCRIPTION)
- args = parser.parse_args()
- # Update commit message if change for a .cc file was taken
- r = subprocess.run(f'{verify_script} HEAD', shell=True, encoding='utf8',
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- if r.returncode != 0:
- lines = r.stdout.splitlines()
- cmd = 'git show -s --format=%B'
- commit_message = subprocess.check_output(cmd, shell=True,
- encoding='utf8').strip()
- commit_message = commit_message.splitlines()
- # Parse the following lines:
- # ERR: unchanged file mentioned in a ChangeLog \
- # (did you mean "gcc/ipa-icf.cc"?): "gcc/ipa-icf.c"
- replaced = 0
- for line in lines:
- if ('unchanged file mentioned' in line and
- 'did you mean' in line):
- filename = line.split()[-1].strip('"')
- fixed = line[line.index('did you mean'):]
- fixed = fixed[fixed.index('"') + 1:]
- fixed = fixed[:fixed.index('"')]
- if filename.count('/') == fixed.count('/'):
- replace_file_in_changelog(commit_message, filename, fixed)
- replaced += 1
- if replaced:
- with tempfile.NamedTemporaryFile('w', encoding='utf8',
- delete=False) as w:
- w.write('\n'.join(commit_message))
- w.close()
- subprocess.check_output(f'git commit --amend -F {w.name}',
- shell=True, encoding='utf8')
- os.unlink(w.name)
- print(f'Commit message updated: {replaced} file(s) renamed.')
- else:
- print('Commit message has not been updated.')
|