Re: [PATCH v2 05/34] sequencer (rebase -i): learn about the 'verbose' mode
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Dec 13, 2016, 21:51 UTC
- Message-ID
- <xmqq37hr1orb.fsf@gitster.mtv.corp.google.com>
- In-Reply-To
- <1d1f8d8b0696769bb85dd8a2269dc281aa91eede.1481642927.git.johannes.schindelin@gmx.de>
Johannes Schindelin <johannes.schindelin@gmx.de> writes:
Show 25 quoted lines
> @@ -1493,9 +1498,26 @@ static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)
> }
>
> if (is_rebase_i(opts)) {
> + struct strbuf buf = STRBUF_INIT;
> +
> /* Stopped in the middle, as planned? */
> if (todo_list->current < todo_list->nr)
> return 0;
> +
> + if (opts->verbose) {
> + const char *argv[] = {
> + "diff-tree", "--stat", NULL, NULL
> + };
> +
> + if (!read_oneliner(&buf, rebase_path_orig_head(), 0))
> + return error(_("could not read '%s'"),
> + rebase_path_orig_head());
> + strbuf_addstr(&buf, "..HEAD");
> + argv[2] = buf.buf;
> + run_command_v_opt(argv, RUN_GIT_CMD);
> + strbuf_reset(&buf);
> + }
> + strbuf_release(&buf);
> }It's a bit curious that the previous step avoided running a separate process and instead did "diff-tree -p" all in C, but this one does not.
I think it is because this one is outside the loop? The original, being a scripted Porcelain, formulates a lazy and loose command line, but you may want to tighten it up a bit if you spawn a process. If your user happens to have a file whose name is $orig_head..HEAD, the command line you are creating (which is identical to the scripted version) will barf with "ambiguous argument".
One good thing about a complete C rewrite is that it won't have an issue like this one because you'd be working with in-core objects.
Show 11 quoted lines
> diff --git a/sequencer.h b/sequencer.h
> index cb21cfddee..f885b68395 100644
> --- a/sequencer.h
> +++ b/sequencer.h
> @@ -24,6 +24,7 @@ struct replay_opts {
> int allow_empty;
> int allow_empty_message;
> int keep_redundant_commits;
> + int verbose;
>
> int mainline;