Allow space in git commit-mklog args
Commit Message
Hi.
Motivation example:
$ git commit-mklog -a -b 'PR other/106370,PR other/12345'
Preserving a space from git gcc-mklog hook to contrib/mklog.py seems
pretty challenging. Thus I recommend preserving extra mklog args via
env where it's encoded in JSON format.
Thoughts?
Thanks,
Martin
contrib/ChangeLog:
* git-commit-mklog.py: Do not parse -b argument.
Pass mklog_args as json environment variable.
* mklog.py: Parse GCC_MKLOG_ARGS and append it to sys.argv.
* prepare-commit-msg: Do not append GCC_MKLOG_ARGS to args.
---
contrib/git-commit-mklog.py | 9 +++++----
contrib/mklog.py | 5 +++++
contrib/prepare-commit-msg | 2 +-
3 files changed, 11 insertions(+), 5 deletions(-)
Comments
On Fri, 22 Jul 2022 at 10:38, Martin Liška wrote:
>
> Hi.
>
> Motivation example:
> $ git commit-mklog -a -b 'PR other/106370,PR other/12345'
>
> Preserving a space from git gcc-mklog hook to contrib/mklog.py seems
> pretty challenging. Thus I recommend preserving extra mklog args via
> env where it's encoded in JSON format.
>
> Thoughts?
This solution looks much better than trying to get the shell quoting
and word splitting right.
For the record, my suggestion was to surround each arg in double
quotes within the env var and then ...
> diff --git a/contrib/prepare-commit-msg b/contrib/prepare-commit-msg
> index 5da878458cd..969847df6f4 100755
> --- a/contrib/prepare-commit-msg
> +++ b/contrib/prepare-commit-msg
> @@ -78,4 +78,4 @@ else
> tee="cat"
> fi
>
> -git $cmd | $tee | git gcc-mklog $GCC_MKLOG_ARGS -c "$COMMIT_MSG_FILE"
> +git $cmd | $tee | git gcc-mklog -c "$COMMIT_MSG_FILE"
... change this to:
mklog() {
echo "$GCC_MKLOG_ARGS" | xargs -x git gcc-mklog -c "$COMMIT_MSG_FILE"
}
git $cmd | $tee | mklog
This works because xargs respects quotes within its input and so would
pass them correctly to the git gcc-mklog command.
But avoiding this entirely by storing them as json and then not
retrieving them until the mklog.py step is more reliable.
@@ -24,6 +24,7 @@
# to mklog.py script.
import argparse
+import json
import os
import subprocess
@@ -32,8 +33,7 @@ if __name__ == '__main__':
myenv = os.environ.copy()
parser = argparse.ArgumentParser(description='git-commit-mklog wrapped')
- parser.add_argument('-b', '--pr-numbers', action='store',
- type=lambda arg: arg.split(','), nargs='?',
+ parser.add_argument('-b', '--pr-numbers',
help='Add the specified PRs (comma separated)')
parser.add_argument('-p', '--fill-up-bug-titles', action='store_true',
help='Download title of mentioned PRs')
@@ -44,12 +44,13 @@ if __name__ == '__main__':
myenv['GCC_FORCE_MKLOG'] = '1'
mklog_args = []
if args.pr_numbers:
- mklog_args.append(f'-b {",".join(args.pr_numbers)}')
+ mklog_args += ['-b', args.pr_numbers]
if args.fill_up_bug_titles:
mklog_args.append('-p')
if mklog_args:
- myenv['GCC_MKLOG_ARGS'] = ' '.join(mklog_args)
+ # wrap mklog arguments with JSON
+ myenv['GCC_MKLOG_ARGS'] = json.dumps(mklog_args)
if args.co:
for author in args.co.split(','):
@@ -28,6 +28,7 @@
import argparse
import datetime
+import json
import os
import re
import subprocess
@@ -336,6 +337,10 @@ def skip_line_in_changelog(line):
if __name__ == '__main__':
+ extra_args = os.getenv('GCC_MKLOG_ARGS')
+ if extra_args:
+ sys.argv += json.loads(extra_args)
+
parser = argparse.ArgumentParser(description=help_message)
parser.add_argument('input', nargs='?',
help='Patch file (or missing, read standard input)')
@@ -78,4 +78,4 @@ else
tee="cat"
fi
-git $cmd | $tee | git gcc-mklog $GCC_MKLOG_ARGS -c "$COMMIT_MSG_FILE"
+git $cmd | $tee | git gcc-mklog -c "$COMMIT_MSG_FILE"