public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: "Martin Liška" <mliska@suse.cz>
To: Harald Anlauf <anlauf@gmx.de>, fortran@gcc.gnu.org
Cc: gcc@gcc.gnu.org, gcc-patches@gcc.gnu.org
Subject: Re: [PATCH] git-backport: support renamed .cc files in commit message.
Date: Wed, 19 Jan 2022 09:07:45 +0100	[thread overview]
Message-ID: <5a6b02d8-daed-bc5e-0f0d-c863265fbe2a@suse.cz> (raw)
In-Reply-To: <1bf6bb05-a51b-ccb1-2b36-e883d56b69b3@gmx.de>

[-- Attachment #1: Type: text/plain, Size: 1031 bytes --]

On 1/18/22 20:10, Harald Anlauf via Fortran wrote:
> Am 17.01.22 um 22:26 schrieb Martin Liška:
>> On 1/12/22 16:54, Martin Liška wrote:
>>>
>>> There's a patch that enhances git-backport so that it updates commit
>>> messages for files which name ends now with .cc and is still .c on a branch.
>>
>> The patch has been installed as I've made the renaming now.
>>
>> Cheers,
>> Martin
>>
> 
> I just made a "git rebase" and had to manually fix the filenames
> in the commit message.  Otherwise gcc-verify would complain.

Sure and I'm adding a new script that basically follows all the 'did you mean'
in gcc-verify and fixes that:

ERR: unchanged file mentioned in a ChangeLog (did you mean "contrib/gcc-git-customization.sh"?): "contrib/gcc2-git-customization.sh"
...

> 
> Would it make sense to have something that is clever enough for
> rebase to do similar things as git-backport?

Yes, a new git alias 'gcc-fix-changelog' is going to be available with the patch.

Martin

> 
> Thanks,
> Harald
> 

[-- Attachment #2: 0001-Come-up-with-git-fix-changelog.py-script.patch --]
[-- Type: text/x-patch, Size: 7804 bytes --]

From 4f502745c8e2562ae192181bf2585bad42414d45 Mon Sep 17 00:00:00 2001
From: Martin Liska <mliska@suse.cz>
Date: Wed, 19 Jan 2022 07:57:05 +0100
Subject: [PATCH] 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.
---
 contrib/gcc-git-customization.sh |  1 +
 contrib/git-backport.py          | 47 +---------------
 contrib/git-fix-changelog.py     | 92 ++++++++++++++++++++++++++++++++
 3 files changed, 95 insertions(+), 45 deletions(-)
 create mode 100755 contrib/git-fix-changelog.py

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.')
-- 
2.34.1


  reply	other threads:[~2022-01-19  8:07 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-07 10:25 Mass rename of C++ .c files to .cc suffix? Martin Jambor
2022-01-07 10:33 ` Richard Sandiford
2022-01-07 10:44   ` Andrew Pinski
2022-01-07 10:51 ` Jonathan Wakely
2022-01-07 10:51 ` Jakub Jelinek
2022-01-07 11:05   ` Jonathan Wakely
2022-01-07 12:55     ` Martin Liška
2022-01-07 14:42       ` Iain Sandoe
2022-01-07 14:49 ` Jeff Law
2022-01-07 15:45   ` Jeff Law
2022-01-07 15:59 ` David Malcolm
2022-01-07 17:31   ` Jonathan Wakely
2022-01-10  9:11   ` Martin Liška
2022-01-07 18:33 ` Alexandre Oliva
2022-01-07 19:01   ` Jakub Jelinek
2022-01-11 12:56 ` [PATCH] Mass rename of C++ .c files to .cc suffix Martin Liška
2022-01-11 15:48   ` Toon Moene
2022-01-11 15:50     ` Martin Liška
2022-01-11 15:56       ` Jakub Jelinek
2022-01-11 16:03         ` Martin Liška
2022-01-11 16:16           ` Jakub Jelinek
2022-01-12  8:58             ` Martin Liška
2022-01-12 15:54               ` [PATCH] git-backport: support renamed .cc files in commit message Martin Liška
2022-01-14  7:44                 ` Bernhard Reutner-Fischer
2022-01-14 15:26                   ` Martin Liška
2022-01-17 21:26                 ` Martin Liška
2022-01-18 19:10                   ` Harald Anlauf
2022-01-19  8:07                     ` Martin Liška [this message]
2022-01-11 18:00       ` [PATCH] Mass rename of C++ .c files to .cc suffix Harald Anlauf
2022-01-11 18:00         ` Harald Anlauf
2022-01-11 18:23         ` Jonathan Wakely
2022-01-11 18:36           ` Jakub Jelinek
2022-01-13 11:01     ` [ANNOUNCEMENT] Mass rename of C++ .c files to .cc suffix is going to happen on Jan 17 evening UTC TZ Martin Liška
2022-01-17 21:41       ` Martin Liška
2022-01-18  8:36         ` Eric Botcazou
2022-01-18  8:39           ` Martin Liška
2022-01-18  8:46             ` Eric Botcazou
2022-01-18  8:53               ` Richard Biener
2022-01-18  9:08                 ` Martin Liška
2022-01-18  9:13                   ` Jakub Jelinek
2022-01-18  9:43                     ` Martin Liška
2022-01-18 13:10         ` Richard Earnshaw
2022-01-18 13:16           ` Martin Liška

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5a6b02d8-daed-bc5e-0f0d-c863265fbe2a@suse.cz \
    --to=mliska@suse.cz \
    --cc=anlauf@gmx.de \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=gcc@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).