From: Stefan Beller <sbeller@google.com>
To: Johannes Schindelin <johannes.schindelin@gmx.de>
Cc: "git@vger.kernel.org" <git@vger.kernel.org>,
Junio C Hamano <gitster@pobox.com>,
Philip Oakley <philipoakley@iee.org>, Jeff King <peff@peff.net>,
Phillip Wood <phillip.wood@dunelm.org.uk>,
Liam Beguin <liambeguin@gmail.com>
Subject: Re: [PATCH v6 02/10] rebase -i: generate the script via rebase--helper
Date: Fri, 14 Jul 2017 15:50:39 -0700 [thread overview]
Message-ID: <CAGZ79kYFgR_Lo-hWq6_UanvidG6a9H54qop=sg_33FCsA9Z0pQ@mail.gmail.com> (raw)
In-Reply-To: <814284075336e715dd52859e69aeb41226624af7.1500043437.git.johannes.schindelin@gmx.de>
On Fri, Jul 14, 2017 at 7:44 AM, Johannes Schindelin
<johannes.schindelin@gmx.de> wrote:
> The first step of an interactive rebase is to generate the so-called "todo
> script", to be stored in the state directory as "git-rebase-todo" and to
> be edited by the user.
>
> Originally, we adjusted the output of `git log <options>` using a simple
> sed script. Over the course of the years, the code became more
> complicated. We now use shell scripting to edit the output of `git log`
> conditionally, depending whether to keep "empty" commits (i.e. commits
> that do not change any files).
>
> On platforms where shell scripting is not native, this can be a serious
> drag. And it opens the door for incompatibilities between platforms when
> it comes to shell scripting or to Unix-y commands.
>
> Let's just re-implement the todo script generation in plain C, using the
> revision machinery directly.
>
> This is substantially faster, improving the speed relative to the
> shell script version of the interactive rebase from 2x to 3x on Windows.
Thanks for working on this
> +int sequencer_make_script(int keep_empty, FILE *out,
> + int argc, const char **argv)
> +{
> + init_revisions(&revs, NULL);
> + revs.verbose_header = 1;
> + revs.max_parents = 1;
> + revs.cherry_pick = 1;
> + revs.limited = 1;
> + revs.reverse = 1;
> + revs.right_only = 1;
> + revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
> + revs.topo_order = 1;
> +
> + revs.pretty_given = 1;
> + git_config_get_string("rebase.instructionFormat", &format);
> + if (!format || !*format) {
> + free(format);
> + format = xstrdup("%s");
> + }
https://public-inbox.org/git/xmqqvapqo4i8.fsf@gitster.mtv.corp.google.com/
So this is the core part that you and Junio have differing opinions on.
> All of the above feels like inviting unnecessary future breakages by
> knowing too much about the implementation the current version of
> revision.c happens to use. A more careful implementation would be
> to allocate our own av[] and prepare "--reverse", "--left-right",
> "--cherry-pick", etc. to be parsed by setup_revisions() call we see
> below. The parsing is not an expensive part of the operation
> anyway, and that way we do not have to worry about one less thing.
Allow me go through each of the options which may help
us finding a consensus (at least it helps me having a more
informed opinion).
List of options used outside of revision.c, which in the ideal
world of Git are parsed in e.g. handle_revision_opt called
from setup_revisions:
.verbose_header
bisect.c: opt.verbose_header = 1;
builtin/commit.c: rev.verbose_header = 1;
builtin/log.c: rev->verbose_header = 1;
builtin/log.c: rev.verbose_header = 1;
builtin/log.c: rev.verbose_header = 1;
.max_parents
builtin/log.c: check_rev.max_parents = 1;
builtin/log.c: revs.max_parents = 1;
builtin/log.c: rev.max_parents = 1;
builtin/log.c: revs.max_parents = 1;
.cherry_pick
is clean!
.limited
ref-filter.c: revs.limited = 1;
.reverse
seems clean.
.right_only:
.sort_order:
is clean!
.topo_order:
builtin/fast-export.c: revs.topo_order = 1;
builtin/log.c: revs.topo_order = 1;
.pretty_given
builtin/log.c: if (!rev->show_notes_given && (!rev->pretty_given || w.notes))
builtin/log.c: if (rev->pretty_given && rev->commit_format == CMIT_FMT_RAW) {
There are two conflicting messages I get:
* only a few fields seem to be polluted (verbose_header,
max_parents), much fewer than I thought
* we do use these undocumented ways already,
but not at the scale that DScho is trying to here.
In the reply to the cover letter I outlined that we may have
a problem with integrating the repository struct when using
string arrays only.
Thanks,
Stefan
next prev parent reply other threads:[~2017-07-14 22:50 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-14 14:44 [PATCH v6 00/10] The final building block for a faster rebase -i Johannes Schindelin
2017-07-14 14:44 ` [PATCH v6 01/10] t3415: verify that an empty instructionFormat is handled as before Johannes Schindelin
2017-07-14 14:44 ` [PATCH v6 02/10] rebase -i: generate the script via rebase--helper Johannes Schindelin
2017-07-14 22:50 ` Stefan Beller [this message]
2017-07-15 12:56 ` Johannes Schindelin
2017-07-14 14:45 ` [PATCH v6 03/10] rebase -i: remove useless indentation Johannes Schindelin
2017-07-14 14:45 ` [PATCH v6 04/10] rebase -i: do not invent onelines when expanding/collapsing SHA-1s Johannes Schindelin
2017-07-14 14:45 ` [PATCH v6 05/10] rebase -i: also expand/collapse the SHA-1s via the rebase--helper Johannes Schindelin
2017-07-14 14:45 ` [PATCH v6 06/10] t3404: relax rebase.missingCommitsCheck tests Johannes Schindelin
2017-07-14 14:45 ` [PATCH v6 07/10] rebase -i: check for missing commits in the rebase--helper Johannes Schindelin
2017-07-14 14:45 ` [PATCH v6 08/10] rebase -i: skip unnecessary picks using " Johannes Schindelin
2017-07-14 14:45 ` [PATCH v6 09/10] t3415: test fixup with wrapped oneline Johannes Schindelin
2017-07-14 14:45 ` [PATCH v6 10/10] rebase -i: rearrange fixup/squash lines using the rebase--helper Johannes Schindelin
2017-07-14 17:27 ` [PATCH v6 00/10] The final building block for a faster rebase -i Stefan Beller
2017-07-14 20:39 ` Johannes Schindelin
2017-07-20 21:38 ` Junio C Hamano
2017-07-22 11:44 ` Johannes Schindelin
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAGZ79kYFgR_Lo-hWq6_UanvidG6a9H54qop=sg_33FCsA9Z0pQ@mail.gmail.com' \
--to=sbeller@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=johannes.schindelin@gmx.de \
--cc=liambeguin@gmail.com \
--cc=peff@peff.net \
--cc=philipoakley@iee.org \
--cc=phillip.wood@dunelm.org.uk \
/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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).