From: Andrew Pleeter <andrewpleeter@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, phillip.wood@dunelm.org.uk,
ben.knoble@gmail.com, peff@peff.net,
sandals@crustytoothpaste.net
Subject: [PATCH v9 1/4] var: represent multi-valued variables with a string_list
Date: Sat, 26 Sep 2026 12:20:45 -0400 [thread overview]
Message-ID: <20260926162048.30853-2-andrewpleeter@gmail.com> (raw)
In-Reply-To: <xmqq33va1lcg.fsf@gitster.g>
A variable whose value is a list, of which GIT_CONFIG_GLOBAL is
currently the only one, is read into a single string whose elements are
joined with newlines, and "git var -l" splits that string apart again
before showing each element. Round-tripping through a delimiter that
can legitimately appear in a value is fragile, and it forces every
future caller to know which variables need splitting.
Give "struct git_var" a separate "multiread" function that appends the
elements to a string_list, and let the single "read" function stay for
the variables that have exactly one value. A variable uses one or the
other, never both, so which one is set also says whether the variable
is multi-valued.
The output is unchanged. While at it, say in the documentation that
GIT_CONFIG_GLOBAL can have multiple values, so that callers know when
to expect a list.
Signed-off-by: Andrew Pleeter <andrewpleeter@gmail.com>
---
Documentation/git-var.adoc | 1 +
builtin/var.c | 79 +++++++++++++++++++++-----------------
2 files changed, 44 insertions(+), 36 deletions(-)
diff --git a/Documentation/git-var.adoc b/Documentation/git-var.adoc
index 697c10aded..de3007732d 100644
--- a/Documentation/git-var.adoc
+++ b/Documentation/git-var.adoc
@@ -83,6 +83,7 @@ endif::git-default-pager[]
`GIT_CONFIG_GLOBAL`::
The path to the global (per-user) configuration files, if any.
+ This variable can have multiple values.
Most path values contain only one value. However, some can contain multiple
values, which are separated by newlines, and are listed in order from highest to
diff --git a/builtin/var.c b/builtin/var.c
index cc3a43cde2..9f7c8a6113 100644
--- a/builtin/var.c
+++ b/builtin/var.c
@@ -14,10 +14,11 @@
#include "environment.h"
#include "ident.h"
#include "pager.h"
-#include "refs.h"
#include "path.h"
-#include "strbuf.h"
+#include "refs.h"
#include "run-command.h"
+#include "strbuf.h"
+#include "string-list.h"
static const char var_usage[] = "git var (-l | <variable>)";
@@ -90,35 +91,27 @@ static char *git_config_val_system(int ident_flag UNUSED)
return NULL;
}
-static char *git_config_val_global(int ident_flag UNUSED)
+static void git_config_val_global(struct string_list *list)
{
- struct strbuf buf = STRBUF_INIT;
char *user, *xdg;
- size_t unused;
git_global_config_paths(&user, &xdg);
if (xdg && *xdg) {
normalize_path_copy(xdg, xdg);
- strbuf_addf(&buf, "%s\n", xdg);
+ string_list_append(list, xdg);
}
if (user && *user) {
normalize_path_copy(user, user);
- strbuf_addf(&buf, "%s\n", user);
+ string_list_append(list, user);
}
free(xdg);
free(user);
- strbuf_trim_trailing_newline(&buf);
- if (buf.len == 0) {
- strbuf_release(&buf);
- return NULL;
- }
- return strbuf_detach(&buf, &unused);
}
struct git_var {
const char *name;
char *(*read)(int);
- int multivalued;
+ void (*multiread)(struct string_list *);
};
static struct git_var git_vars[] = {
{
@@ -163,8 +156,7 @@ static struct git_var git_vars[] = {
},
{
.name = "GIT_CONFIG_GLOBAL",
- .read = git_config_val_global,
- .multivalued = 1,
+ .multiread = git_config_val_global,
},
{
.name = "",
@@ -175,28 +167,30 @@ static struct git_var git_vars[] = {
static void list_vars(void)
{
struct git_var *ptr;
- char *val;
-
- for (ptr = git_vars; ptr->read; ptr++)
- if ((val = ptr->read(0))) {
- if (ptr->multivalued && *val) {
- struct string_list list = STRING_LIST_INIT_DUP;
-
- string_list_split(&list, val, "\n", -1);
- for (size_t i = 0; i < list.nr; i++)
- printf("%s=%s\n", ptr->name, list.items[i].string);
- string_list_clear(&list, 0);
- } else {
+
+ for (ptr = git_vars; ptr->read || ptr->multiread; ptr++) {
+ if (ptr->read) {
+ char *val = ptr->read(0);
+
+ if (val) {
printf("%s=%s\n", ptr->name, val);
+ free(val);
}
- free(val);
+ } else {
+ struct string_list list = STRING_LIST_INIT_DUP;
+
+ ptr->multiread(&list);
+ for (size_t i = 0; i < list.nr; i++)
+ printf("%s=%s\n", ptr->name, list.items[i].string);
+ string_list_clear(&list, 0);
}
+ }
}
static const struct git_var *get_git_var(const char *var)
{
struct git_var *ptr;
- for (ptr = git_vars; ptr->read; ptr++) {
+ for (ptr = git_vars; ptr->read || ptr->multiread; ptr++) {
if (strcmp(var, ptr->name) == 0) {
return ptr;
}
@@ -220,7 +214,6 @@ int cmd_var(int argc,
struct repository *repo UNUSED)
{
const struct git_var *git_var;
- char *val;
show_usage_if_asked(argc, argv, var_usage);
if (argc != 2)
@@ -237,12 +230,26 @@ int cmd_var(int argc,
if (!git_var)
usage(var_usage);
- val = git_var->read(IDENT_STRICT);
- if (!val)
- return 1;
+ if (git_var->read) {
+ char *val = git_var->read(IDENT_STRICT);
+
+ if (!val)
+ return 1;
- printf("%s\n", val);
- free(val);
+ printf("%s\n", val);
+ free(val);
+ } else {
+ struct string_list list = STRING_LIST_INIT_DUP;
+
+ git_var->multiread(&list);
+ if (!list.nr) {
+ string_list_clear(&list, 0);
+ return 1;
+ }
+ for (size_t i = 0; i < list.nr; i++)
+ printf("%s\n", list.items[i].string);
+ string_list_clear(&list, 0);
+ }
return 0;
}
--
2.54.0 (Apple Git-157)
next prev parent reply other threads:[~2026-09-26 16:20 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-25 20:46 [PATCH] builtin/whoami: add new 'whoami' command Andrew Pleeter via GitGitGadget
2026-08-25 21:24 ` brian m. carlson
2026-08-25 21:41 ` Junio C Hamano
2026-08-31 23:59 ` [PATCH v2] builtin/ident: add new 'ident' command Andrew Pleeter via GitGitGadget
2026-09-01 4:39 ` Jeff King
2026-09-01 5:00 ` Junio C Hamano
2026-09-03 2:49 ` [PATCH v3] var: support broken-down idents, default key, multiple args, and -z Andrew Pleeter via GitGitGadget
2026-09-03 17:40 ` Junio C Hamano
2026-09-03 18:22 ` Ben Knoble
2026-09-04 9:11 ` Phillip Wood
2026-09-04 15:57 ` Junio C Hamano
2026-09-08 9:07 ` Phillip Wood
2026-09-08 4:09 ` [PATCH v4] var: support broken-down idents, signing " Andrew Pleeter via GitGitGadget
2026-09-08 13:54 ` Phillip Wood
2026-09-08 20:43 ` [PATCH v5] " Andrew Pleeter via GitGitGadget
2026-09-08 21:53 ` Junio C Hamano
2026-09-09 1:24 ` [PATCH v6] " Andrew Pleeter via GitGitGadget
2026-09-09 15:36 ` Phillip Wood
2026-09-09 16:42 ` Junio C Hamano
2026-09-10 3:09 ` [PATCH v7] " Andrew Pleeter via GitGitGadget
2026-09-14 19:34 ` Junio C Hamano
2026-09-14 22:50 ` [PATCH v8] " Andrew Pleeter via GitGitGadget
2026-09-15 17:21 ` Junio C Hamano
2026-09-15 22:02 ` Andrew Pleeter
2026-09-22 14:57 ` Phillip Wood
2026-09-26 16:19 ` Andrew Pleeter
2026-09-26 16:20 ` [PATCH v9 0/4] var: -z output, multiple variables, and broken-out idents Andrew Pleeter
2026-10-02 14:11 ` Phillip Wood
2026-10-02 17:41 ` Andrew Pleeter
2026-09-26 16:20 ` Andrew Pleeter [this message]
2026-09-26 16:20 ` [PATCH v9 2/4] var: add "-z" output mode Andrew Pleeter
2026-09-26 16:20 ` [PATCH v9 3/4] var: accept more than one variable Andrew Pleeter
2026-10-02 14:11 ` Phillip Wood
2026-09-26 16:20 ` [PATCH v9 4/4] var: add broken-out identity variables Andrew Pleeter
2026-10-02 14:11 ` Phillip Wood
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=20260926162048.30853-2-andrewpleeter@gmail.com \
--to=andrewpleeter@gmail.com \
--cc=ben.knoble@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
--cc=phillip.wood@dunelm.org.uk \
--cc=sandals@crustytoothpaste.net \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.