Jeff King <peff@xxxxxxxx> writes: > On Mon, Aug 01, 2016 at 09:49:37PM +0000, Eric Wong wrote: > > You'd want: > > argv_array_pushf(env, "%.*s", (int)(cp - pager_env), pager_env); > > Also: > >> + strbuf_reset(&buf); > > should this be strbuf_release()? If we didn't follow the conditional > above (because getenv() told us the variable was already set), then we > would not do do the detach/release there, and would finish the loop with > memory still allocated by "buf". All bugs are from my original, I think. Here is a proposed squash. * This shouldn't make much difference for @@PAGER_ENV@@, but not quoting the default assignment, i.e. : "${VAR=VAL}" && export VAR is bad manners. cf. 01247e02 (sh-setup: enclose setting of ${VAR=default} in double-quotes, 2016-06-19) * Again, this shouldn't make much difference for PAGER_ENV, but let's follow the "reset per iteration, release at the end" pattern to avoid repeated allocation. * Let's avoid a hand-rolled "skip blanks" loop and let strspn() do it. git-sh-setup.sh | 2 +- pager.c | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/git-sh-setup.sh b/git-sh-setup.sh index b6b75e9..cda32d0 100644 --- a/git-sh-setup.sh +++ b/git-sh-setup.sh @@ -163,7 +163,7 @@ git_pager() { for vardef in @@PAGER_ENV@@ do var=${vardef%%=*} - eval ": \${$vardef} && export $var" + eval ": \"\${$vardef}\" && export $var" done eval "$GIT_PAGER" '"$@"' diff --git a/pager.c b/pager.c index cd1ac54..7199c31 100644 --- a/pager.c +++ b/pager.c @@ -66,25 +66,22 @@ const char *git_pager(int stdout_is_tty) static void setup_pager_env(struct argv_array *env) { const char *pager_env = PAGER_ENV; + struct strbuf buf = STRBUF_INIT; while (*pager_env) { - struct strbuf buf = STRBUF_INIT; const char *cp = strchrnul(pager_env, '='); if (!*cp) die("malformed build-time PAGER_ENV"); strbuf_add(&buf, pager_env, cp - pager_env); cp = strchrnul(pager_env, ' '); - if (!getenv(buf.buf)) { - strbuf_reset(&buf); - strbuf_add(&buf, pager_env, cp - pager_env); - argv_array_push(env, strbuf_detach(&buf, NULL)); - } + if (!getenv(buf.buf)) + argv_array_pushf(env, "%.*s", + (int)(cp - pager_env), pager_env); + pager_env = cp + strspn(cp, " "); strbuf_reset(&buf); - while (*cp && *cp == ' ') - cp++; - pager_env = cp; } + strbuf_release(&buf); } void prepare_pager_args(struct child_process *pager_process, const char *pager) -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html