From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1851) id 9BA9B3858032; Wed, 19 Jan 2022 08:14:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9BA9B3858032 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Martin Liska To: gcc-cvs@gcc.gnu.org Subject: [gcc r11-9479] git scripts: sync from master. X-Act-Checkin: gcc X-Git-Author: Martin Liska X-Git-Refname: refs/heads/releases/gcc-11 X-Git-Oldrev: 1b9037dd4ef44b8cabf42324958d42e765caa4ce X-Git-Newrev: 15eae6020dcd3b98577df70e29c0a4e2cb888396 Message-Id: <20220119081416.9BA9B3858032@sourceware.org> Date: Wed, 19 Jan 2022 08:14:16 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Jan 2022 08:14:16 -0000 https://gcc.gnu.org/g:15eae6020dcd3b98577df70e29c0a4e2cb888396 commit r11-9479-g15eae6020dcd3b98577df70e29c0a4e2cb888396 Author: Martin Liska Date: Wed Jan 19 09:13:28 2022 +0100 git scripts: sync from master. contrib/ChangeLog: * git-backport.py: Sync from master. * git-commit-mklog.py: Likewise. * git-fix-changelog.py: New file. Diff: --- contrib/git-backport.py | 50 ++---------------------- contrib/git-commit-mklog.py | 6 +++ contrib/git-fix-changelog.py | 92 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 47 deletions(-) diff --git a/contrib/git-backport.py b/contrib/git-backport.py index f5b487197d9..fc369d97754 100755 --- a/contrib/git-backport.py +++ b/contrib/git-backport.py @@ -22,58 +22,14 @@ 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 and ' - 'stash all ChangeLog files.') + parser = argparse.ArgumentParser(description='Backport a git revision.') parser.add_argument('revision', help='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) diff --git a/contrib/git-commit-mklog.py b/contrib/git-commit-mklog.py index 9c59fb97809..eda3fc4a892 100755 --- a/contrib/git-commit-mklog.py +++ b/contrib/git-commit-mklog.py @@ -37,6 +37,8 @@ if __name__ == '__main__': help='Add the specified PRs (comma separated)') parser.add_argument('-p', '--fill-up-bug-titles', action='store_true', help='Download title of mentioned PRs') + parser.add_argument('--co', + help='Add Co-Authored-By trailer (comma separated)') args, unknown_args = parser.parse_known_args() myenv['GCC_FORCE_MKLOG'] = '1' @@ -49,5 +51,9 @@ if __name__ == '__main__': if mklog_args: myenv['GCC_MKLOG_ARGS'] = ' '.join(mklog_args) + if args.co: + for author in args.co.split(','): + unknown_args.append(f'--trailer "Co-Authored-By: {author}"') + commit_args = ' '.join(unknown_args) subprocess.run(f'git commit {commit_args}', shell=True, env=myenv) 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.')