aboutsummaryrefslogtreecommitdiff
path: root/contrib
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
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')
-rwxr-xr-xcontrib/gcc-git-customization.sh1
-rwxr-xr-xcontrib/git-backport.py47
-rwxr-xr-xcontrib/git-fix-changelog.py92
3 files changed, 95 insertions, 45 deletions
diff --git a/contrib/gcc-git-customization.sh b/contrib/gcc-git-customization.sh
index aca61b7..2eec1793 100755
--- a/contrib/gcc-git-customization.sh
+++ b/contrib/gcc-git-customization.sh
@@ -27,6 +27,7 @@ git config alias.gcc-undescr \!"f() { o=\$(git config --get gcc-config.upstream)
git config alias.gcc-verify '!f() { "`git rev-parse --show-toplevel`/contrib/gcc-changelog/git_check_commit.py" $@; } ; f'
git config alias.gcc-backport '!f() { "`git rev-parse --show-toplevel`/contrib/git-backport.py" $@; } ; f'
+git config alias.gcc-fix-changelog '!f() { "`git rev-parse --show-toplevel`/contrib/git-fix-changelog.py" $@; } ; f'
git config alias.gcc-mklog '!f() { "`git rev-parse --show-toplevel`/contrib/mklog.py" $@; } ; f'
git config alias.gcc-commit-mklog '!f() { "`git rev-parse --show-toplevel`/contrib/git-commit-mklog.py" "$@"; }; f'
diff --git a/contrib/git-backport.py b/contrib/git-backport.py
index 83189a2..fc369d9 100755
--- a/contrib/git-backport.py
+++ b/contrib/git-backport.py
@@ -22,29 +22,9 @@
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.')
@@ -52,27 +32,4 @@ if __name__ == '__main__':
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)
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.')