| #!/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.') |