public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-6724] Come up with git-fix-changelog.py script.
@ 2022-01-19  8:09 Martin Liska
  0 siblings, 0 replies; only message in thread
From: Martin Liska @ 2022-01-19  8:09 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:03b0bf783084d010f289eb42defafab82c4f9eb0

commit r12-6724-g03b0bf783084d010f289eb42defafab82c4f9eb0
Author: Martin Liska <mliska@suse.cz>
Date:   Wed Jan 19 07:57:05 2022 +0100

    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.

Diff:
---
 contrib/gcc-git-customization.sh |  1 +
 contrib/git-backport.py          | 47 +-------------------
 contrib/git-fix-changelog.py     | 92 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 95 insertions(+), 45 deletions(-)

diff --git a/contrib/gcc-git-customization.sh b/contrib/gcc-git-customization.sh
index aca61b781ff..2eec17937af 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 83189a2b5c7..fc369d97754 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 00000000000..c15e45c11fa
--- /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.')


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-01-19  8:09 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-19  8:09 [gcc r12-6724] Come up with git-fix-changelog.py script Martin Liska

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).