Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: > bisect.c | 19 +++++++++---------- > builtin/clone.c | 16 ++++++---------- > builtin/difftool.c | 14 ++++++-------- > builtin/gc.c | 22 ++++++++-------------- > builtin/merge.c | 35 ++++++----------------------------- > builtin/remote.c | 10 ++++------ > compat/mingw.c | 8 +++----- > ll-merge.c | 4 +--- > run-command.c | 15 +++++++++++++++ > run-command.h | 13 +++++++++++-- > sequencer.c | 4 +--- > t/helper/test-fake-ssh.c | 4 +--- > 12 files changed, 71 insertions(+), 93 deletions(-) Nice. > @@ -862,11 +858,11 @@ static void write_refspec_config(const char *src_ref_prefix, > > static void dissociate_from_references(void) > { > - static const char* argv[] = { "repack", "-a", "-d", NULL }; Good to see that this one in a wrong scope can now go away. > char *alternates = git_pathdup("objects/info/alternates"); > > if (!access(alternates, F_OK)) { > - if (run_command_v_opt(argv, RUN_GIT_CMD|RUN_COMMAND_NO_STDIN)) > + if (run_command_l_opt(RUN_GIT_CMD|RUN_COMMAND_NO_STDIN, > + "repack", "-a", "-d", NULL)) > die(_("cannot repack to clean up")); > diff --git a/builtin/remote.c b/builtin/remote.c > index 910f7b9316a..1d86c14297b 100644 > --- a/builtin/remote.c > +++ b/builtin/remote.c > @@ -92,13 +92,11 @@ static int verbose; > > static int fetch_remote(const char *name) > { > - const char *argv[] = { "fetch", name, NULL, NULL }; > - if (verbose) { > - argv[1] = "-v"; > - argv[2] = name; > - } > printf_ln(_("Updating %s"), name); > - if (run_command_v_opt(argv, RUN_GIT_CMD)) > + if (verbose && run_command_l_opt(RUN_GIT_CMD, "-v", "fetch", name, > + NULL)) > + return error(_("Could not fetch %s"), name); > + else if (run_command_l_opt(RUN_GIT_CMD, "fetch", name, NULL)) > return error(_("Could not fetch %s"), name); > return 0; > } This, together with the "merge" one that used to be conditional (which I take as a sign that new callers can legitimately wish it to be conditional again), is where the new l_opt() variant is weak. And the above is wrong. If verbose option is given and run command succeeds in running "fetch -v" (another bug is that the updated code is running "git -v fetch <name>"), we will try running "fetch" without "-v" option after that. So, for simplest things (i.e. the majority of places this patch touches), addition of l_opt() is great. Use of it for nontrivial things like this is not. We need to repeat ourselves, and the use of API is error prone. > diff --git a/compat/mingw.c b/compat/mingw.c > index 901375d5841..4f5392c5796 100644 > --- a/compat/mingw.c > +++ b/compat/mingw.c > @@ -196,17 +196,15 @@ static int read_yes_no_answer(void) > static int ask_yes_no_if_possible(const char *format, ...) > { > char question[4096]; > - const char *retry_hook[] = { NULL, NULL, NULL }; Good to see that this one in a wrong scope can now go away. > + char *retry_hook; > va_list args; > > va_start(args, format); > vsnprintf(question, sizeof(question), format, args); > va_end(args); > > - if ((retry_hook[0] = mingw_getenv("GIT_ASK_YESNO"))) { > - retry_hook[1] = question; > - return !run_command_v_opt(retry_hook, 0); > - } > + if ((retry_hook = mingw_getenv("GIT_ASK_YESNO"))) > + return !run_command_l_opt(0, retry_hook, question, NULL); > > if (!isatty(_fileno(stdin)) || !isatty(_fileno(stderr))) > return 0;