Jeff King <[email protected]> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html