git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Kevin Daudt <me@ikke.info>,
	Dennis Kaarsemaker <dennis@kaarsemaker.net>
Subject: Re: [PATCH v2 07/34] sequencer (rebase -i): add support for the 'fixup' and 'squash' commands
Date: Mon, 19 Dec 2016 17:58:10 +0100 (CET)	[thread overview]
Message-ID: <alpine.DEB.2.20.1612191548090.54750@virtualbox> (raw)
In-Reply-To: <xmqqlgvhuj82.fsf@gitster.mtv.corp.google.com>

Hi Junio,

On Thu, 15 Dec 2016, Junio C Hamano wrote:

> Johannes Schindelin <johannes.schindelin@gmx.de> writes:
> 
> > diff --git a/sequencer.c b/sequencer.c
> > index f6e20b142a..271c21581d 100644
> > --- a/sequencer.c
> > +++ b/sequencer.c
> > @@ -45,6 +45,35 @@ static GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
> >   */
> >  static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
> >  /*
> > + * The commit message that is planned to be used for any changes that
> > + * need to be committed following a user interaction.
> > + */
> > +static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
> > +/*
> > + * The file into which is accumulated the suggested commit message for
> > + * squash/fixup commands. When the first of a series of squash/fixups
> 
> The same comment as 03/34 applies here, regarding blank line to
> separate logical unit.

Same rationale here: the path functions are one big continuous block, with
comments obviously applying to the immediately following line only.

> > +static int update_squash_messages(enum todo_command command,
> > +		struct commit *commit, struct replay_opts *opts)
> > +{
> > +	struct strbuf buf = STRBUF_INIT;
> > +	int count, res;
> > +	const char *message, *body;
> > +
> > +	if (file_exists(rebase_path_squash_msg())) {
> > +		char *p, *p2;
> > +
> > +		if (strbuf_read_file(&buf, rebase_path_squash_msg(), 2048) <= 0)
> > +			return error(_("could not read '%s'"),
> > +				rebase_path_squash_msg());
> > +
> > +		if (buf.buf[0] != comment_line_char ||
> > +		    !skip_prefix(buf.buf + 1, " This is a combination of ",
> > +				 (const char **)&p))
> > +			return error(_("unexpected 1st line of squash message:"
> > +				       "\n\n\t%.*s"),
> > +				     (int)(strchrnul(buf.buf, '\n') - buf.buf),
> > +				     buf.buf);
> > +		count = strtol(p, &p2, 10);
> > +
> > +		if (count < 1 || *p2 != ' ')
> > +			return error(_("invalid 1st line of squash message:\n"
> > +				       "\n\t%.*s"),
> > +				     (int)(strchrnul(buf.buf, '\n') - buf.buf),
> > +				     buf.buf);
> > +
> > +		sprintf((char *)p, "%d", ++count);
> 
> Do we know the area pointed at p (which is inside buf) long enough
> not to overflow?

Yes, we know that: p2 points to the byte after the parsed number, and said
byte is a space (ASCII 0x20), as verified by the if() above.

> If the original were 9 and you incremented to get 10, you would need one
> extra byte.

Exactly. That extra byte (if needed) is 0x20, as verified above, and can
be overwritten.

If that extra byte (to which p2 points) is *not* overwritten, i.e. if the
new count requires the same amount of space in decimal representation as
the previous count, it is now NUL, as tested here:

> > +		if (!*p2)
> > +			*p2 = ' ';
> > +		else {
> > +			*(++p2) = 'c';
> 
> p2 points into buf; do we know this increment does not step beyond
> its end?  What is the meaning of a letter 'c' here (I do not see a
> corresponding one in the scripted update_squash_messages)?

This clause is entered only when the space needed by the previous count
was not sufficient to hold the new count, at which point we know that not
only the space after the old count was overwritten, but also the 'c' of
the "commits" string.

Therefore, this clause reinstates the 'c' and inserts the space, so that
everything is groovy again:

> > +			strbuf_insert(&buf, p2 - buf.buf, " ", 1);
> > +		}

Having said that, I just realized that this code was only safe as long as
the squash messages were not localized.

I changed the code to imitate more closely what the shell script does. It
made the code a little more verbose, but it should work better as a
consequence, and I am pretty certain you will find it easier to verify
that it is correct.

> > +	}
> > +	else {
> 
> Style: "} else {" (I won't repeat this, as it will become too noisy).

It is not necessary to repeat this, either, as I took the first such
comment as a strong hint to look at the entire patch series and fix it
appropriately.

> 
> > +		unsigned char head[20];
> > +		struct commit *head_commit;
> > +		const char *head_message, *body;
> > +
> > +		if (get_sha1("HEAD", head))
> > +			return error(_("need a HEAD to fixup"));
> > +		if (!(head_commit = lookup_commit_reference(head)))
> > +			return error(_("could not read HEAD"));
> > +		if (!(head_message = get_commit_buffer(head_commit, NULL)))
> > +			return error(_("could not read HEAD's commit message"));
> > +
> > +		body = strstr(head_message, "\n\n");
> > +		if (!body)
> > +			body = "";
> > +		else
> > +			body = skip_blank_lines(body + 2);
> 
> I think I saw you used a helper function find_commit_subject() to do
> the above in an earlier patch for "edit" in this series.  Would it
> make this part (and another one for "commit" we have after this
> if/else) shorter?

Right, and by using the helper function, I also fixed a bug handling funny
commit objects that had more than one empty line separating header from
the message.

Of course, there is a third location in sequencer.c (predating my patches)
that uses the very same idiom. Yet another patch added to this growing
patch series...

> >  static int do_pick_commit(enum todo_command command, struct commit *commit,
> > -		struct replay_opts *opts)
> > +		struct replay_opts *opts, int final_fixup)
> >  {
> > +	int edit = opts->edit, cleanup_commit_message = 0;
> > +	const char *msg_file = edit ? NULL : git_path_merge_msg();
> >  	unsigned char head[20];
> >  	struct commit *base, *next, *parent;
> >  	const char *base_label, *next_label;
> >  	struct commit_message msg = { NULL, NULL, NULL, NULL };
> >  	struct strbuf msgbuf = STRBUF_INIT;
> > -	int res, unborn = 0, allow;
> > +	int res, unborn = 0, amend = 0, allow;
> >  
> >  	if (opts->no_commit) {
> >  		/*
> > @@ -749,7 +885,7 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
> >  	else
> >  		parent = commit->parents->item;
> >  
> > -	if (opts->allow_ff &&
> > +	if (opts->allow_ff && !is_fixup(command) &&
> >  	    ((parent && !hashcmp(parent->object.oid.hash, head)) ||
> >  	     (!parent && unborn)))
> >  		return fast_forward_to(commit->object.oid.hash, head, unborn, opts);
> > @@ -813,6 +949,28 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,
> >  		}
> >  	}
> >  
> > +	if (is_fixup(command)) {
> > +		if (update_squash_messages(command, commit, opts))
> > +			return -1;
> > +		amend = 1;
> > +		if (!final_fixup)
> > +			msg_file = rebase_path_squash_msg();
> > +		else if (file_exists(rebase_path_fixup_msg())) {
> > +			cleanup_commit_message = 1;
> > +			msg_file = rebase_path_fixup_msg();
> > +		}
> > +		else {
> > +			const char *dest = git_path("SQUASH_MSG");
> > +			unlink(dest);
> > +			if (copy_file(dest, rebase_path_squash_msg(), 0666))
> > +				return error(_("could not rename '%s' to '%s'"),
> > +					     rebase_path_squash_msg(), dest);
> 
> Perhaps an error from unlink(dest) before copy_file() should also
> result in an error return?

No, because the most likely cause for that `unlink()` to fail is that the
destination does not exist, and it is fine if it does not exist yet.

No worries, copy_file() will fail if we could not remove any existing file
and we still error out in that case.

> > +			unlink(git_path("MERGE_MSG"));
> 
> Errors from this and other unlink() that emulates "rm -f" were
> unchecked in the scripted original, so not checking for errors is
> not a regression.  I would check for an error if I were writing
> this, however, because I know I would forget updating these after I
> am done with the series.

The problem is that these files do not necessarily exist. We only unlink()
them to make sure that they do not exist afterwards.

In any case, I am still more interested in a faithful translation than
already starting to improve the code at this stage.

> > @@ -1475,6 +1660,21 @@ static int do_exec(const char *command_line)
> >  	return status;
> >  }
> >  
> > +static int is_final_fixup(struct todo_list *todo_list)
> > +{
> > +	int i = todo_list->current;
> > +
> > +	if (!is_fixup(todo_list->items[i].command))
> > +		return 0;
> > +
> > +	while (++i < todo_list->nr)
> > +		if (is_fixup(todo_list->items[i].command))
> > +			return 0;
> > +		else if (todo_list->items[i].command < TODO_NOOP)
> > +			break;
> 
> What follows NOOP are comment and "drop" which is another comment in
> disguise, so this one is excluding all the no-op commands in various
> shapes, which makes sense but is clear only to a reader who bothered
> to go back to "enum todo_command" and checked that fact.  If a check
> for "is it one of the no-op commands?" appears only here, a single
> liner comment may be sufficient (but necessary) to help readers.
> Otherwise a single-liner helper function (similar to is_fixup() you
> have) with a descriptive name would be better than a single liner
> comment.

True. I introduced is_noop().

Ciao,
Dscho

  parent reply	other threads:[~2016-12-19 16:59 UTC|newest]

Thread overview: 212+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-31  8:53 [PATCH 00/34] Teach the sequencer to act as rebase -i's backend Johannes Schindelin
2016-08-31  8:54 ` [PATCH 01/34] sequencer: support a new action: 'interactive rebase' Johannes Schindelin
2016-09-02 21:13   ` Kevin Daudt
2016-09-03  6:57     ` Johannes Schindelin
2016-08-31  8:54 ` [PATCH 02/34] sequencer (rebase -i): implement the 'noop' command Johannes Schindelin
2016-08-31  8:54 ` [PATCH 03/34] sequencer (rebase -i): implement the 'edit' command Johannes Schindelin
2016-08-31  8:54 ` [PATCH 04/34] sequencer (rebase -i): implement the 'exec' command Johannes Schindelin
2016-08-31  8:54 ` [PATCH 05/34] sequencer (rebase -i): learn about the 'verbose' mode Johannes Schindelin
2016-08-31 18:39   ` Dennis Kaarsemaker
2016-08-31 20:36     ` Johannes Schindelin
2016-08-31  8:54 ` [PATCH 06/34] sequencer (rebase -i): write the 'done' file Johannes Schindelin
2016-08-31 18:39   ` Dennis Kaarsemaker
2016-09-01  8:51     ` Johannes Schindelin
2016-08-31  8:54 ` [PATCH 07/34] sequencer (rebase -i): add support for the 'fixup' and 'squash' commands Johannes Schindelin
2016-09-01  8:33   ` Dennis Kaarsemaker
2016-09-01 15:17     ` Johannes Schindelin
2016-09-01 16:19       ` Dennis Kaarsemaker
2016-09-02  7:13         ` Johannes Schindelin
2016-09-02 12:06           ` Dennis Kaarsemaker
2016-09-02 14:22             ` Johannes Schindelin
2016-09-02 17:04               ` Dennis Kaarsemaker
2016-09-01 18:15     ` Junio C Hamano
2016-09-02  7:15       ` Johannes Schindelin
2016-08-31  8:54 ` [PATCH 08/34] sequencer (rebase -i): implement the short commands Johannes Schindelin
2016-08-31  8:54 ` [PATCH 09/34] sequencer (rebase -i): write an author-script file Johannes Schindelin
2016-08-31  8:54 ` [PATCH 10/34] sequencer (rebase -i): allow continuing with staged changes Johannes Schindelin
2016-08-31  8:54 ` [PATCH 11/34] sequencer (rebase -i): remove CHERRY_PICK_HEAD when no longer needed Johannes Schindelin
2016-08-31  8:55 ` [PATCH 12/34] sequencer (rebase -i): skip some revert/cherry-pick specific code path Johannes Schindelin
2016-08-31  8:55 ` [PATCH 13/34] sequencer (rebase -i): the todo can be empty when continuing Johannes Schindelin
2016-08-31  8:55 ` [PATCH 14/34] sequencer (rebase -i): update refs after a successful rebase Johannes Schindelin
2016-08-31  8:55 ` [PATCH 15/34] sequencer (rebase -i): leave a patch upon error Johannes Schindelin
2016-08-31 18:39   ` Dennis Kaarsemaker
2016-09-01 13:03     ` Johannes Schindelin
2016-08-31  8:55 ` [PATCH 16/34] sequencer (rebase -i): implement the 'reword' command Johannes Schindelin
2016-08-31  8:55 ` [PATCH 17/34] sequencer (rebase -i): allow fast-forwarding for edit/reword Johannes Schindelin
2016-08-31  8:55 ` [PATCH 18/34] sequencer (rebase -i): refactor setting the reflog message Johannes Schindelin
2016-08-31  8:55 ` [PATCH 19/34] sequencer (rebase -i): set the reflog message consistently Johannes Schindelin
2016-08-31  8:55 ` [PATCH 20/34] sequencer (rebase -i): copy commit notes at end Johannes Schindelin
2016-09-01  7:20   ` Dennis Kaarsemaker
2016-09-01 14:57     ` Johannes Schindelin
2016-08-31  8:55 ` [PATCH 21/34] sequencer (rebase -i): record interrupted commits in rewritten, too Johannes Schindelin
2016-08-31  8:55 ` [PATCH 22/34] sequencer (rebase -i): run the post-rewrite hook, if needed Johannes Schindelin
2016-08-31  8:55 ` [PATCH 23/34] sequencer (rebase -i): respect the rebase.autostash setting Johannes Schindelin
2016-08-31  8:55 ` [PATCH 24/34] sequencer (rebase -i): respect strategy/strategy_opts settings Johannes Schindelin
2016-08-31  8:56 ` [PATCH 25/34] sequencer (rebase -i): allow rescheduling commands Johannes Schindelin
2016-08-31  8:56 ` [PATCH 26/34] sequencer (rebase -i): implement the 'drop' command Johannes Schindelin
2016-08-31  8:56 ` [PATCH 27/34] sequencer (rebase -i): differentiate between comments and 'noop' Johannes Schindelin
2016-09-01  8:33   ` Dennis Kaarsemaker
2016-09-01 15:32     ` Johannes Schindelin
2016-09-01 16:15       ` Dennis Kaarsemaker
2016-09-02  7:32         ` Johannes Schindelin
2016-08-31  8:56 ` [PATCH 28/34] run_command_opt(): optionally hide stderr when the command succeeds Johannes Schindelin
2016-08-31  8:56 ` [PATCH 29/34] sequencer (rebase -i): show only failed `git commit`'s output Johannes Schindelin
2016-08-31  8:56 ` [PATCH 30/34] sequencer (rebase -i): show only failed cherry-picks' output Johannes Schindelin
2016-08-31  8:56 ` [PATCH 31/34] sequencer (rebase -i): suggest --edit-todo upon unknown command Johannes Schindelin
2016-08-31  8:56 ` [PATCH 32/34] sequencer (rebase -i): show the progress Johannes Schindelin
2016-09-01  8:33   ` Dennis Kaarsemaker
2016-09-01 15:19     ` Johannes Schindelin
2016-08-31  8:56 ` [PATCH 33/34] sequencer (rebase -i): write the progress into files Johannes Schindelin
2016-08-31  8:56 ` [PATCH 34/34] sequencer (rebase -i): write out the final message Johannes Schindelin
2016-08-31 18:39 ` [PATCH 00/34] Teach the sequencer to act as rebase -i's backend Dennis Kaarsemaker
2016-09-01 13:05   ` Johannes Schindelin
2016-12-13 15:29 ` [PATCH v2 " Johannes Schindelin
2016-12-13 15:29   ` [PATCH v2 01/34] sequencer: support a new action: 'interactive rebase' Johannes Schindelin
2016-12-13 20:32     ` Junio C Hamano
2016-12-19 13:33       ` Johannes Schindelin
2016-12-14 19:29     ` Junio C Hamano
2016-12-17 20:23       ` Stephan Beyer
2016-12-19 14:25         ` Johannes Schindelin
2016-12-19 21:27           ` Stephan Beyer
2016-12-13 15:29   ` [PATCH v2 02/34] sequencer (rebase -i): implement the 'noop' command Johannes Schindelin
2016-12-13 20:38     ` Junio C Hamano
2016-12-13 20:48       ` Linus Torvalds
2016-12-13 21:54         ` Junio C Hamano
2016-12-19 12:51           ` Johannes Schindelin
2016-12-19 18:31             ` Junio C Hamano
2016-12-19 13:37       ` Johannes Schindelin
2016-12-13 15:29   ` [PATCH v2 03/34] sequencer (rebase -i): implement the 'edit' command Johannes Schindelin
2016-12-13 21:30     ` Junio C Hamano
2016-12-19 13:46       ` Johannes Schindelin
2016-12-19 18:47         ` Junio C Hamano
2016-12-19 18:48         ` Junio C Hamano
2016-12-13 15:29   ` [PATCH v2 04/34] sequencer (rebase -i): implement the 'exec' command Johannes Schindelin
2016-12-13 21:35     ` Junio C Hamano
2016-12-19 14:06       ` Johannes Schindelin
2016-12-13 15:29   ` [PATCH v2 05/34] sequencer (rebase -i): learn about the 'verbose' mode Johannes Schindelin
2016-12-13 21:51     ` Junio C Hamano
2016-12-14  6:59       ` Junio C Hamano
2017-01-02 15:11       ` Johannes Schindelin
2017-01-07 21:48         ` Junio C Hamano
2017-01-08  1:57           ` Junio C Hamano
2016-12-13 15:29   ` [PATCH v2 06/34] sequencer (rebase -i): write the 'done' file Johannes Schindelin
2016-12-13 21:52     ` Junio C Hamano
2016-12-13 15:30   ` [PATCH v2 07/34] sequencer (rebase -i): add support for the 'fixup' and 'squash' commands Johannes Schindelin
2016-12-15 18:42     ` Junio C Hamano
2016-12-15 18:56       ` Jeff King
2016-12-19 16:59         ` Johannes Schindelin
2016-12-19 17:19           ` Jeff King
2016-12-19 16:58       ` Johannes Schindelin [this message]
2016-12-15 19:03     ` Jeff King
2016-12-15 19:07       ` Stefan Beller
2016-12-15 19:20         ` Jeff King
2016-12-15 19:27           ` Stefan Beller
2016-12-19 17:14       ` Johannes Schindelin
2016-12-13 15:30   ` [PATCH v2 08/34] sequencer (rebase -i): implement the short commands Johannes Schindelin
2016-12-15 18:43     ` Junio C Hamano
2016-12-13 15:30   ` [PATCH v2 09/34] sequencer (rebase -i): write an author-script file Johannes Schindelin
2016-12-15 18:50     ` Junio C Hamano
2016-12-19 17:06       ` Johannes Schindelin
2016-12-20  1:32         ` Junio C Hamano
2016-12-20 23:46           ` Junio C Hamano
2016-12-13 15:30   ` [PATCH v2 10/34] sequencer (rebase -i): allow continuing with staged changes Johannes Schindelin
2016-12-15 19:08     ` Junio C Hamano
2016-12-13 15:30   ` [PATCH v2 11/34] sequencer (rebase -i): remove CHERRY_PICK_HEAD when no longer needed Johannes Schindelin
2016-12-16 19:13     ` Junio C Hamano
2016-12-19 17:22       ` Johannes Schindelin
2016-12-13 15:30   ` [PATCH v2 12/34] sequencer (rebase -i): skip some revert/cherry-pick specific code path Johannes Schindelin
2016-12-13 15:30   ` [PATCH v2 13/34] sequencer (rebase -i): the todo can be empty when continuing Johannes Schindelin
2016-12-13 15:30   ` [PATCH v2 14/34] sequencer (rebase -i): update refs after a successful rebase Johannes Schindelin
2016-12-16 19:19     ` Junio C Hamano
2016-12-19 17:33       ` Johannes Schindelin
2016-12-13 15:31   ` [PATCH v2 15/34] sequencer (rebase -i): leave a patch upon error Johannes Schindelin
2016-12-16 19:23     ` Junio C Hamano
2016-12-13 15:31   ` [PATCH v2 16/34] sequencer (rebase -i): implement the 'reword' command Johannes Schindelin
2016-12-13 15:31   ` [PATCH v2 17/34] sequencer (rebase -i): allow fast-forwarding for edit/reword Johannes Schindelin
2016-12-13 15:31   ` [PATCH v2 18/34] sequencer (rebase -i): refactor setting the reflog message Johannes Schindelin
2016-12-16 19:28     ` Junio C Hamano
2016-12-13 15:31   ` [PATCH v2 19/34] sequencer (rebase -i): set the reflog message consistently Johannes Schindelin
2016-12-13 15:31   ` [PATCH v2 20/34] sequencer (rebase -i): copy commit notes at end Johannes Schindelin
2016-12-16 19:38     ` Junio C Hamano
2017-01-02 14:51       ` Johannes Schindelin
2016-12-13 15:31   ` [PATCH v2 21/34] sequencer (rebase -i): record interrupted commits in rewritten, too Johannes Schindelin
2016-12-13 15:31   ` [PATCH v2 22/34] sequencer (rebase -i): run the post-rewrite hook, if needed Johannes Schindelin
2016-12-13 15:31   ` [PATCH v2 23/34] sequencer (rebase -i): respect the rebase.autostash setting Johannes Schindelin
2016-12-13 15:31   ` [PATCH v2 24/34] sequencer (rebase -i): respect strategy/strategy_opts settings Johannes Schindelin
2016-12-19 18:58     ` Junio C Hamano
2016-12-13 15:31   ` [PATCH v2 25/34] sequencer (rebase -i): allow rescheduling commands Johannes Schindelin
2016-12-13 15:31   ` [PATCH v2 26/34] sequencer (rebase -i): implement the 'drop' command Johannes Schindelin
2016-12-13 15:31   ` [PATCH v2 27/34] sequencer (rebase -i): differentiate between comments and 'noop' Johannes Schindelin
2016-12-19 19:04     ` Junio C Hamano
2016-12-13 15:32   ` [PATCH v2 28/34] run_command_opt(): optionally hide stderr when the command succeeds Johannes Schindelin
2016-12-14  8:34     ` Johannes Sixt
2016-12-14 12:53       ` Jeff King
2016-12-14 13:06         ` Jeff King
2016-12-14 19:17           ` Johannes Sixt
2017-01-02 14:38             ` Johannes Schindelin
2016-12-13 15:32   ` [PATCH v2 29/34] sequencer (rebase -i): show only failed `git commit`'s output Johannes Schindelin
2016-12-13 15:32   ` [PATCH v2 30/34] sequencer (rebase -i): show only failed cherry-picks' output Johannes Schindelin
2016-12-13 15:32   ` [PATCH v2 31/34] sequencer (rebase -i): suggest --edit-todo upon unknown command Johannes Schindelin
2016-12-13 15:32   ` [PATCH v2 32/34] sequencer (rebase -i): show the progress Johannes Schindelin
2016-12-19 19:18     ` Junio C Hamano
2016-12-13 15:32   ` [PATCH v2 33/34] sequencer (rebase -i): write the progress into files Johannes Schindelin
2016-12-13 15:32   ` [PATCH v2 34/34] sequencer (rebase -i): write out the final message Johannes Schindelin
2016-12-13 19:42   ` [PATCH v2 00/34] Teach the sequencer to act as rebase -i's backend Junio C Hamano
2016-12-19 13:05     ` Johannes Schindelin
2016-12-14  7:08   ` Johannes Sixt
2016-12-19 14:09     ` Johannes Schindelin
2017-01-02 15:25   ` [PATCH v3 00/38] " Johannes Schindelin
2017-01-02 15:26     ` [PATCH v3 01/38] sequencer: avoid unnecessary curly braces Johannes Schindelin
2017-01-12 18:35       ` Junio C Hamano
2017-01-14 17:57         ` Johannes Schindelin
2017-01-14 18:05           ` Jeff King
2017-01-16  4:10             ` Jacob Keller
2017-01-02 15:26     ` [PATCH v3 02/38] sequencer: move "else" keyword onto the same line as preceding brace Johannes Schindelin
2017-01-12 18:49       ` Junio C Hamano
2017-01-02 15:26     ` [PATCH v3 03/38] sequencer: use a helper to find the commit message Johannes Schindelin
2017-01-12 18:36       ` Junio C Hamano
2017-01-02 15:26     ` [PATCH v3 04/38] sequencer: support a new action: 'interactive rebase' Johannes Schindelin
2017-01-02 15:26     ` [PATCH v3 05/38] sequencer (rebase -i): implement the 'noop' command Johannes Schindelin
2017-01-02 15:26     ` [PATCH v3 06/38] sequencer (rebase -i): implement the 'edit' command Johannes Schindelin
2017-01-12 19:00       ` Junio C Hamano
2017-01-14 17:56         ` Johannes Schindelin
2017-01-02 15:26     ` [PATCH v3 07/38] sequencer (rebase -i): implement the 'exec' command Johannes Schindelin
2017-01-02 15:26     ` [PATCH v3 08/38] sequencer (rebase -i): learn about the 'verbose' mode Johannes Schindelin
2017-01-02 15:27     ` [PATCH v3 09/38] sequencer (rebase -i): write the 'done' file Johannes Schindelin
2017-01-02 15:27     ` [PATCH v3 10/38] sequencer (rebase -i): add support for the 'fixup' and 'squash' commands Johannes Schindelin
2017-01-02 15:27     ` [PATCH v3 11/38] sequencer (rebase -i): implement the short commands Johannes Schindelin
2017-01-02 15:27     ` [PATCH v3 12/38] sequencer (rebase -i): write an author-script file Johannes Schindelin
2017-01-02 15:27     ` [PATCH v3 13/38] sequencer (rebase -i): allow continuing with staged changes Johannes Schindelin
2017-01-02 15:27     ` [PATCH v3 14/38] sequencer (rebase -i): remove CHERRY_PICK_HEAD when no longer needed Johannes Schindelin
2017-01-02 15:27     ` [PATCH v3 15/38] sequencer (rebase -i): skip some revert/cherry-pick specific code path Johannes Schindelin
2017-01-02 15:27     ` [PATCH v3 16/38] sequencer (rebase -i): the todo can be empty when continuing Johannes Schindelin
2017-01-02 15:27     ` [PATCH v3 17/38] sequencer (rebase -i): update refs after a successful rebase Johannes Schindelin
2017-01-02 15:27     ` [PATCH v3 18/38] sequencer (rebase -i): leave a patch upon error Johannes Schindelin
2017-01-02 15:28     ` [PATCH v3 19/38] sequencer (rebase -i): implement the 'reword' command Johannes Schindelin
2017-01-02 15:28     ` [PATCH v3 20/38] sequencer (rebase -i): allow fast-forwarding for edit/reword Johannes Schindelin
2017-01-02 15:28     ` [PATCH v3 21/38] sequencer (rebase -i): refactor setting the reflog message Johannes Schindelin
2017-01-02 15:28     ` [PATCH v3 22/38] sequencer (rebase -i): set the reflog message consistently Johannes Schindelin
2017-01-02 15:28     ` [PATCH v3 23/38] sequencer (rebase -i): copy commit notes at end Johannes Schindelin
2017-01-02 15:28     ` [PATCH v3 24/38] sequencer (rebase -i): record interrupted commits in rewritten, too Johannes Schindelin
2017-01-02 15:28     ` [PATCH v3 25/38] sequencer (rebase -i): run the post-rewrite hook, if needed Johannes Schindelin
2017-01-02 15:28     ` [PATCH v3 26/38] sequencer (rebase -i): respect the rebase.autostash setting Johannes Schindelin
2017-01-02 15:28     ` [PATCH v3 27/38] sequencer (rebase -i): respect strategy/strategy_opts settings Johannes Schindelin
2017-01-02 15:28     ` [PATCH v3 28/38] sequencer (rebase -i): allow rescheduling commands Johannes Schindelin
2017-01-02 15:34     ` [PATCH v3 29/38] sequencer (rebase -i): implement the 'drop' command Johannes Schindelin
2017-01-02 15:34     ` [PATCH v3 30/38] sequencer (rebase -i): differentiate between comments and 'noop' Johannes Schindelin
2017-01-02 15:35     ` [PATCH v3 31/38] sequencer: make reading author-script more elegant Johannes Schindelin
2017-01-02 15:35     ` [PATCH v3 32/38] sequencer: use run_command() directly Johannes Schindelin
2017-01-02 15:35     ` [PATCH v3 33/38] sequencer (rebase -i): show only failed `git commit`'s output Johannes Schindelin
2017-01-02 15:35     ` [PATCH v3 34/38] sequencer (rebase -i): show only failed cherry-picks' output Johannes Schindelin
2017-01-02 15:35     ` [PATCH v3 35/38] sequencer (rebase -i): suggest --edit-todo upon unknown command Johannes Schindelin
2017-01-02 15:35     ` [PATCH v3 36/38] sequencer (rebase -i): show the progress Johannes Schindelin
2017-01-02 15:36     ` [PATCH v3 37/38] sequencer (rebase -i): write the progress into files Johannes Schindelin
2017-01-02 15:36     ` [PATCH v3 38/38] sequencer (rebase -i): write out the final message Johannes Schindelin
2017-01-09 22:26     ` [PATCH v3 00/38] Teach the sequencer to act as rebase -i's backend Junio C Hamano
2017-01-09 23:02       ` Junio C Hamano
2017-01-14 18:04       ` Johannes Schindelin
2017-01-15  2:50         ` Junio C Hamano
2017-01-14 18:08       ` Johannes Schindelin
2017-01-15  7:47         ` Junio C Hamano
2017-01-16 10:45           ` Johannes Schindelin
2017-01-17 19:50             ` Junio C Hamano

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.DEB.2.20.1612191548090.54750@virtualbox \
    --to=johannes.schindelin@gmx.de \
    --cc=dennis@kaarsemaker.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=me@ikke.info \
    /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.
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 NNTP newsgroup(s).