import argparse
import os
import subprocess
-import tempfile
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):
- if not filename.endswith('.cc'):
- return
-
- # consider all componenets of a path: gcc/ipa-icf.cc
- while filename:
- for i, line in enumerate(lines):
- if filename in line:
- line = line.replace(filename, filename[:-1])
- lines[i] = line
- return
- parts = filename.split('/')
- if len(parts) == 1:
- return
- filename = '/'.join(parts[1:])
-
+fixup_script = os.path.join(script_folder, 'git-fix-changelog.py')
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Backport a git revision.')
args = parser.parse_args()
subprocess.run('git cherry-pick -x %s' % args.revision, shell=True)
-
- # 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()
-
- todo = [line for line in lines if 'unchanged file mentioned' in line]
- for item in todo:
- filename = item.split()[-1].strip('"')
- replace_file_in_changelog(commit_message, filename)
-
- 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: {len(todo)} .cc file(s) changed.')
+ subprocess.run(fixup_script, shell=True)
--- /dev/null
+#!/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.')