Re: [PATCH v8] var: support broken-down idents, signing key, multiple args, and -z
- From
- Andrew Pleeter <andrewpleeter@gmail.com>
- Date
- Sep 26, 2026, 16:19 UTC
- Message-ID
- <20260926161951.30531-1-andrewpleeter@gmail.com>
- In-Reply-To
- <ddfd5232-b832-476c-8614-268f8e4bbe28@gmail.com>
Hi Phillip,
Sorry for the silence. I was replying on the GitGitGadget PR and did not realise those comments never reach the list. That is also why v6 switched to get_signing_key() without a word from me about your question.
You were right to keep asking about GIT_SIGNING_KEY. I am dropping it from the series. get_signing_key() returns a string whose meaning depends on gpg.format, and the variable gives the caller no way to tell which kind it got:
gpg.format=openpgp, user.signingkey unset
$ git var GIT_SIGNING_KEY
C O Mitter <committer@example.com> gpg.format=openpgp, user.signingkey=DEADBEEF
$ git var GIT_SIGNING_KEY
DEADBEEF gpg.format=ssh, user.signingkey=/path/to/key.pub
$ git var GIT_SIGNING_KEY
/path/to/key.pubSo no, the key alone does not tell a caller whether to use gpg or ssh; they would have to read gpg.format as well. And in the default case the value is a committer ident rather than a key, because that is what get_signing_key() hands to gpg to look up. Better to drop it than ship a GIT_SIGNING_KEY that sometimes isn't one. I will revisit it when I can name a caller it serves.
On the exit code, your GIT_CONFIG_NOSYSTEM example convinced me. In v9, asking for several variables omits the ones with no value and exits 0. Non-zero is reserved for real errors such as an unknown variable name, so callers can detect those from the exit code alone. A single variable still exits 1 when it has no value.
The string_list conversion is split out as you suggested:
1/4 var: represent multi-valued variables with a string_list 2/4 var: add "-z" output mode 3/4 var: accept more than one variable 4/4 var: add broken-out identity variables
parse_options() sits in 2/4, since "-z" is what requires it. GIT_CONFIG_GLOBAL is now documented as multi-valued, and the tests use nul_to_q instead of test_cmp over files containing NUL.
One place I did not follow you: instead of a trailing delimiter for a multi-valued variable when argc > 1, each value gets its own entry:
$ git var GIT_AUTHOR_IDENT GIT_CONFIG_GLOBAL GIT_AUTHOR_IDENT=A U Thor <author@example.com> 1112912053 -0700 GIT_CONFIG_GLOBAL=/home/me/.config/git/config GIT_CONFIG_GLOBAL=/home/me/.gitconfig
Same shape as "git var -l", so one parser handles both. Happy to switch if you prefer the trailing delimiter. I should have raised it last time instead of just changing it.
Thanks, Andrew