aboutsummaryrefslogtreecommitdiff
path: root/contrib/git-fix-changelog.py
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2022-01-19 07:57:05 +0100
committerMartin Liska <mliska@suse.cz>2022-01-19 09:08:51 +0100
commit03b0bf783084d010f289eb42defafab82c4f9eb0 (patch)
treece7fde1bbbd06b0cc78ef1b089c6540e29dd1858 /contrib/git-fix-changelog.py
parent2aea19bdb12308aac1519ffc5ecc9d1ec24f9cc5 (diff)
downloadgcc-03b0bf783084d010f289eb42defafab82c4f9eb0.zip
gcc-03b0bf783084d010f289eb42defafab82c4f9eb0.tar.gz
gcc-03b0bf783084d010f289eb42defafab82c4f9eb0.tar.bz2
Come up with git-fix-changelog.py script.
contrib/ChangeLog: * git-backport.py: Use it. * git-fix-changelog.py: New file. * gcc-git-customization.sh: Add new alias git gcc-fix-changelog.
Diffstat (limited to 'contrib/git-fix-changelog.py')
-rwxr-xr-xcontrib/git-fix-changelog.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/contrib/git-fix-changelog.py b/contrib/git-fix-changelog.py
new file mode 100755
index 0000000..c15e45c
--- /dev/null
+++ b/contrib/git-fix-changelog.py
@@ -0,0 +1,92 @@
+#!/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.')