git@vger.kernel.org list mirror (unofficial, one of many)
 help / color / Atom feed
From: Phillip Wood <phillip.wood@talktalk.net>
To: Alban Gruin <alban.gruin@gmail.com>, git@vger.kernel.org
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>,
	Phillip Wood <phillip.wood@dunelm.org.uk>,
	Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH v6 07/16] sequencer: refactor sequencer_add_exec_commands() to work on a todo_list
Date: Thu, 31 Jan 2019 14:30:19 +0000
Message-ID: <434cf0f7-1df6-7966-b460-e69e8f8b5e99@talktalk.net> (raw)
In-Reply-To: <20190129150159.10588-8-alban.gruin@gmail.com>

Hi Alban

On 29/01/2019 15:01, Alban Gruin wrote:
> This refactors sequencer_add_exec_commands() to work on a todo_list to
> avoid redundant reads and writes to the disk.
> 
> Instead of inserting the `exec' commands between the other commands and
> re-parsing the buffer at the end, they are appended to the buffer once,
> and a new list of items is created.  Items from the old list are copied
> across and new `exec' items are appended when necessary.  This
> eliminates the need to reparse the buffer, but this also means we have
> to use todo_list_write_to_disk() to write the file.
> 
> todo_list_add_exec_commands() and sequencer_add_exec_commands() are
> modified to take a string list instead of a string -- one item for each
> command.  This makes it easier to insert a new command to the todo list
> for each command to execute.
> 
> sequencer_add_exec_commands() still reads the todo list from the disk,
> as it is needed by rebase -p.
> 
> complete_action() still uses sequencer_add_exec_commands() for now.
> This will be changed in a future commit.
> 
> Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
> ---
>  builtin/rebase--interactive.c |  15 +++--
>  sequencer.c                   | 110 +++++++++++++++++++++-------------
>  sequencer.h                   |   5 +-
>  3 files changed, 82 insertions(+), 48 deletions(-)
> 
> diff --git a/builtin/rebase--interactive.c b/builtin/rebase--interactive.c
> index df19ccaeb9..53056ee713 100644
> --- a/builtin/rebase--interactive.c
> +++ b/builtin/rebase--interactive.c
> @@ -65,7 +65,7 @@ static int do_interactive_rebase(struct replay_opts *opts, unsigned flags,
>  				 const char *onto, const char *onto_name,
>  				 const char *squash_onto, const char *head_name,
>  				 const char *restrict_revision, char *raw_strategies,
> -				 const char *cmd, unsigned autosquash)
> +				 struct string_list *commands, unsigned autosquash)
>  {
>  	int ret;
>  	const char *head_hash = NULL;
> @@ -116,7 +116,7 @@ static int do_interactive_rebase(struct replay_opts *opts, unsigned flags,
>  		discard_cache();
>  		ret = complete_action(the_repository, opts, flags,
>  				      shortrevisions, onto_name, onto,
> -				      head_hash, cmd, autosquash);
> +				      head_hash, commands, autosquash);
>  	}
>  
>  	free(revisions);
> @@ -139,6 +139,7 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
>  	const char *onto = NULL, *onto_name = NULL, *restrict_revision = NULL,
>  		*squash_onto = NULL, *upstream = NULL, *head_name = NULL,
>  		*switch_to = NULL, *cmd = NULL;
> +	struct string_list commands = STRING_LIST_INIT_DUP;
>  	char *raw_strategies = NULL;
>  	enum {
>  		NONE = 0, CONTINUE, SKIP, EDIT_TODO, SHOW_CURRENT_PATCH,
> @@ -221,6 +222,12 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
>  		warning(_("--[no-]rebase-cousins has no effect without "
>  			  "--rebase-merges"));
>  
> +	if (cmd && *cmd) {
> +		string_list_split(&commands, cmd, '\n', -1);

This whole splitting and later skipping 'exec ' is a bit of a shame - it 
would be much nicer if we could just have one exec command per -x option 
but I think that is outside the scope of this series (If I have time I'd 
like to look at calling do_interactive_rebase() directly from 
builtin/rebase.c without forking rebase--interactive).

> +		if (strlen(commands.items[commands.nr - 1].string) == 0)

I'd be tempted just to test the string using !* rather than calling 
strlen. Also is there ever a case where the last string isn't empty?

> +			--commands.nr;
> +	}
> +
>  	switch (command) {
>  	case NONE:
>  		if (!onto && !upstream)
> @@ -228,7 +235,7 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
>  
>  		ret = do_interactive_rebase(&opts, flags, switch_to, upstream, onto,
>  					    onto_name, squash_onto, head_name, restrict_revision,
> -					    raw_strategies, cmd, autosquash);
> +					    raw_strategies, &commands, autosquash);
>  		break;
>  	case SKIP: {
>  		struct string_list merge_rr = STRING_LIST_INIT_DUP;
> @@ -262,7 +269,7 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix)
>  		ret = rearrange_squash(the_repository);
>  		break;
>  	case ADD_EXEC:
> -		ret = sequencer_add_exec_commands(the_repository, cmd);
> +		ret = sequencer_add_exec_commands(the_repository, &commands);
>  		break;
>  	default:
>  		BUG("invalid command '%d'", command);
> diff --git a/sequencer.c b/sequencer.c
> index 266f80d704..3a90b419d7 100644
> --- a/sequencer.c
> +++ b/sequencer.c
> @@ -4446,25 +4446,27 @@ int sequencer_make_script(struct repository *r, FILE *out,
>  	return 0;
>  }
>  
> -/*
> - * Add commands after pick and (series of) squash/fixup commands
> - * in the todo list.
> - */
> -int sequencer_add_exec_commands(struct repository *r,
> -				const char *commands)
> +static void todo_list_add_exec_commands(struct todo_list *todo_list,
> +					struct string_list *commands)
>  {
> -	const char *todo_file = rebase_path_todo();
> -	struct todo_list todo_list = TODO_LIST_INIT;
> -	struct strbuf *buf = &todo_list.buf;
> -	size_t offset = 0, commands_len = strlen(commands);
> -	int i, insert;
> +	struct strbuf *buf = &todo_list->buf;
> +	size_t base_offset = buf->len;
> +	int i, insert, nr = 0, alloc = 0;
> +	struct todo_item *items = NULL, *base_items = NULL;
>  
> -	if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
> -		return error(_("could not read '%s'."), todo_file);
> +	base_items = xcalloc(commands->nr, sizeof(struct todo_item));
> +	for (i = 0; i < commands->nr; ++i) {
> +		size_t command_len = strlen(commands->items[i].string);
>  
> -	if (todo_list_parse_insn_buffer(r, todo_list.buf.buf, &todo_list)) {
> -		todo_list_release(&todo_list);
> -		return error(_("unusable todo list: '%s'"), todo_file);
> +		strbuf_addstr(buf, commands->items[i].string);
> +		strbuf_addch(buf, '\n');
> +
> +		base_items[i].command = TODO_EXEC;
> +		base_items[i].offset_in_buf = base_offset;
> +		base_items[i].arg_offset = base_offset + strlen("exec ");
> +		base_items[i].arg_len = command_len - strlen("exec ");
> +
> +		base_offset += command_len + 1;
>  	}
>  
>  	/*
> @@ -4473,38 +4475,62 @@ int sequencer_add_exec_commands(struct repository *r,
>  	 * those chains if there are any.
>  	 */
>  	insert = -1;
> -	for (i = 0; i < todo_list.nr; i++) {
> -		enum todo_command command = todo_list.items[i].command;
> -
> -		if (insert >= 0) {
> -			/* skip fixup/squash chains */
> -			if (command == TODO_COMMENT)
> -				continue;
> -			else if (is_fixup(command)) {
> -				insert = i + 1;
> -				continue;
> -			}
> -			strbuf_insert(buf,
> -				      todo_list.items[insert].offset_in_buf +
> -				      offset, commands, commands_len);

In a todo list that looks like
pick abc message
#pick cde empty commit
This inserts the exec command for the first pick above the commented out 
pick. I think your translation puts it below the commented out pick as 
it ignores the value of insert. I think it's probably easiest to add an 
INSERT_ARRAY macro to insert it in the right place. An alternative might 
be to track the last insert position and only copy commands across when 
there is another exec to insert but that might get complicated in cases 
such as

pick abc message
#squash cde squash! message //empty commit for rewording
fixup 123 fixup! message
#pick 456 empty commit

Best Wishes

Phillip

> -			offset += commands_len;
> +	for (i = 0; i < todo_list->nr; i++) {
> +		enum todo_command command = todo_list->items[i].command;
> +		if (insert >= 0 && command != TODO_COMMENT && !is_fixup(command)) {
> +			ALLOC_GROW(items, nr + commands->nr, alloc);
> +			COPY_ARRAY(items + nr, base_items, commands->nr);
> +			nr += commands->nr;
>  			insert = -1;
>  		}
>  
> -		if (command == TODO_PICK || command == TODO_MERGE)
> +		ALLOC_GROW(items, nr + 1, alloc);
> +		items[nr++] = todo_list->items[i];
> +
> +		if (command == TODO_PICK || command == TODO_MERGE || is_fixup(command))
>  			insert = i + 1;
>  	}
>  
>  	/* insert or append final <commands> */
> -	if (insert >= 0 && insert < todo_list.nr)
> -		strbuf_insert(buf, todo_list.items[insert].offset_in_buf +
> -			      offset, commands, commands_len);
> -	else if (insert >= 0 || !offset)
> -		strbuf_add(buf, commands, commands_len);
> +	if (insert >= 0 || nr == todo_list->nr) {
> +		ALLOC_GROW(items, nr + commands->nr, alloc);
> +		COPY_ARRAY(items + nr, base_items, commands->nr);
> +		nr += commands->nr;
> +	}
> +
> +	free(base_items);
> +	FREE_AND_NULL(todo_list->items);
> +	todo_list->items = items;
> +	todo_list->nr = nr;
> +	todo_list->alloc = alloc;> +}
>  
> -	i = write_message(buf->buf, buf->len, todo_file, 0);
> +/*
> + * Add commands after pick and (series of) squash/fixup commands
> + * in the todo list.
> + */
> +int sequencer_add_exec_commands(struct repository *r,
> +				struct string_list *commands)
> +{
> +	const char *todo_file = rebase_path_todo();
> +	struct todo_list todo_list = TODO_LIST_INIT;
> +	int res;
> +
> +	if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
> +		return error_errno(_("could not read '%s'."), todo_file);
> +
> +	if (todo_list_parse_insn_buffer(r, todo_list.buf.buf, &todo_list)) {
> +		todo_list_release(&todo_list);
> +		return error(_("unusable todo list: '%s'"), todo_file);
> +	}
> +
> +	todo_list_add_exec_commands(&todo_list, commands);
> +	res = todo_list_write_to_file(r, &todo_list, todo_file, NULL, NULL, -1, 0);
>  	todo_list_release(&todo_list);
> -	return i;
> +
> +	if (res)
> +		return error_errno(_("could not write '%s'."), todo_file);
> +	return 0;
>  }
>  
>  static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_list,
> @@ -4735,7 +4761,7 @@ static int skip_unnecessary_picks(struct repository *r, struct object_id *output
>  
>  int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags,
>  		    const char *shortrevisions, const char *onto_name,
> -		    const char *onto, const char *orig_head, const char *cmd,
> +		    const char *onto, const char *orig_head, struct string_list *commands,
>  		    unsigned autosquash)
>  {
>  	const char *shortonto, *todo_file = rebase_path_todo();
> @@ -4754,8 +4780,8 @@ int complete_action(struct repository *r, struct replay_opts *opts, unsigned fla
>  	if (autosquash && rearrange_squash(r))
>  		return -1;
>  
> -	if (cmd && *cmd)
> -		sequencer_add_exec_commands(r, cmd);
> +	if (commands->nr)
> +		sequencer_add_exec_commands(r, commands);
>  
>  	if (strbuf_read_file(buf, todo_file, 0) < 0)
>  		return error_errno(_("could not read '%s'."), todo_file);
> diff --git a/sequencer.h b/sequencer.h
> index 1de97f188d..e79f03e213 100644
> --- a/sequencer.h
> +++ b/sequencer.h
> @@ -146,12 +146,13 @@ int sequencer_make_script(struct repository *r, FILE *out, int argc,
>  			  const char **argv,
>  			  unsigned flags);
>  
> -int sequencer_add_exec_commands(struct repository *r, const char *command);
> +int sequencer_add_exec_commands(struct repository *r,
> +				struct string_list *commands);
>  int transform_todo_file(struct repository *r, unsigned flags);
>  int check_todo_list_from_file(struct repository *r);
>  int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags,
>  		    const char *shortrevisions, const char *onto_name,
> -		    const char *onto, const char *orig_head, const char *cmd,
> +		    const char *onto, const char *orig_head, struct string_list *commands,
>  		    unsigned autosquash);
>  int rearrange_squash(struct repository *r);
>  
> 


  reply index

Thread overview: 190+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-07 19:54 [PATCH 00/15] sequencer: refactor functions working " Alban Gruin
2018-10-07 19:54 ` [PATCH 01/15] sequencer: clear the number of items of a todo_list before parsing Alban Gruin
2018-10-07 19:54 ` [PATCH 02/15] sequencer: make the todo_list structure public Alban Gruin
2018-10-07 19:54 ` [PATCH 03/15] sequencer: refactor check_todo_list() to work on a todo_list Alban Gruin
2018-10-11 11:23   ` Phillip Wood
2018-10-07 19:54 ` [PATCH 04/15] sequencer: refactor sequencer_add_exec_commands() " Alban Gruin
2018-10-11 11:25   ` Phillip Wood
2018-10-11 16:57     ` Alban Gruin
2018-10-12  9:54       ` Phillip Wood
2018-10-12 12:23         ` Alban Gruin
2018-10-07 19:54 ` [PATCH 05/15] sequencer: refactor rearrange_squash() " Alban Gruin
2018-10-07 19:54 ` [PATCH 06/15] sequencer: refactor transform_todos() " Alban Gruin
2018-10-07 19:54 ` [PATCH 07/15] sequencer: make sequencer_make_script() write its script to a strbuf Alban Gruin
2018-10-12 10:01   ` SZEDER Gábor
2018-10-19  8:16     ` Junio C Hamano
2018-10-19  9:27       ` SZEDER Gábor
2018-10-07 19:54 ` [PATCH 08/15] sequencer: change complete_action() to use the refactored functions Alban Gruin
2018-10-11 13:51   ` Phillip Wood
2018-10-11 17:06     ` Alban Gruin
2018-10-07 19:54 ` [PATCH 09/15] sequencer: refactor skip_unnecessary_picks() to work on a todo_list Alban Gruin
2018-10-07 19:54 ` [PATCH 10/15] rebase-interactive: use todo_list_transform() in edit_todo_list() Alban Gruin
2018-10-11 15:16   ` Phillip Wood
2018-10-11 19:58     ` Alban Gruin
2018-10-07 19:54 ` [PATCH 11/15] rebase-interactive: append_todo_help() changes Alban Gruin
2018-10-07 19:54 ` [PATCH 12/15] rebase-interactive: rewrite edit_todo_list() to handle the initial edit Alban Gruin
2018-10-07 19:54 ` [PATCH 13/15] sequencer: use edit_todo_list() in complete_action() Alban Gruin
2018-10-07 19:54 ` [PATCH 14/15] sequencer: fix a call to error() in transform_todo_file() Alban Gruin
2018-10-07 19:54 ` [PATCH 15/15] rebase--interactive: move transform_todo_file() to rebase--interactive.c Alban Gruin
2018-10-07 20:51 ` [PATCH 00/15] sequencer: refactor functions working on a todo_list Alban Gruin
2018-10-27 21:29 ` [PATCH v2 00/16] " Alban Gruin
2018-10-27 21:29   ` [PATCH v2 01/16] sequencer: changes in parse_insn_buffer() Alban Gruin
2018-10-27 21:29   ` [PATCH v2 02/16] sequencer: make the todo_list structure public Alban Gruin
2018-10-27 21:29   ` [PATCH v2 03/16] sequencer: refactor transform_todos() to work on a todo_list Alban Gruin
2018-10-27 21:29   ` [PATCH v2 04/16] sequencer: introduce todo_list_write_to_file() Alban Gruin
2018-10-30 16:28     ` Phillip Wood
2018-11-01 23:31       ` Alban Gruin
2018-10-27 21:29   ` [PATCH v2 05/16] sequencer: refactor check_todo_list() to work on a todo_list Alban Gruin
2018-10-27 21:29   ` [PATCH v2 06/16] sequencer: refactor sequencer_add_exec_commands() " Alban Gruin
2018-10-30 16:47     ` Phillip Wood
2018-11-01 23:31       ` Alban Gruin
2018-11-02 10:09         ` Phillip Wood
2018-11-02 16:26           ` Alban Gruin
2018-11-02 17:09             ` Phillip Wood
2018-10-27 21:29   ` [PATCH v2 07/16] sequencer: refactor rearrange_squash() " Alban Gruin
2018-10-27 21:29   ` [PATCH v2 08/16] sequencer: make sequencer_make_script() write its script to a strbuf Alban Gruin
2018-10-27 21:29   ` [PATCH v2 09/16] sequencer: change complete_action() to use the refactored functions Alban Gruin
2018-10-27 21:29   ` [PATCH v2 10/16] sequencer: refactor skip_unnecessary_picks() to work on a todo_list Alban Gruin
2018-10-27 21:29   ` [PATCH v2 11/16] rebase-interactive: use todo_list_write_to_file() in edit_todo_list() Alban Gruin
2018-10-27 21:29   ` [PATCH v2 12/16] rebase-interactive: append_todo_help() changes Alban Gruin
2018-10-27 21:29   ` [PATCH v2 13/16] rebase-interactive: rewrite edit_todo_list() to handle the initial edit Alban Gruin
2018-10-27 21:29   ` [PATCH v2 14/16] sequencer: use edit_todo_list() in complete_action() Alban Gruin
2018-10-27 21:29   ` [PATCH v2 15/16] sequencer: fix a call to error() in transform_todo_file() Alban Gruin
2018-10-27 21:29   ` [PATCH v2 16/16] rebase--interactive: move transform_todo_file() to rebase--interactive.c Alban Gruin
2018-10-29  3:05   ` [PATCH v2 00/16] sequencer: refactor functions working on a todo_list Junio C Hamano
2018-10-29 15:34     ` Alban Gruin
2018-11-09  8:07   ` [PATCH v3 " Alban Gruin
2018-11-09  8:07     ` [PATCH v3 01/16] sequencer: changes in parse_insn_buffer() Alban Gruin
2018-11-09  8:07     ` [PATCH v3 02/16] sequencer: make the todo_list structure public Alban Gruin
2018-11-09  8:07     ` [PATCH v3 03/16] sequencer: refactor transform_todos() to work on a todo_list Alban Gruin
2018-11-09  8:07     ` [PATCH v3 04/16] sequencer: introduce todo_list_write_to_file() Alban Gruin
2018-11-09  8:07     ` [PATCH v3 05/16] sequencer: refactor check_todo_list() to work on a todo_list Alban Gruin
2018-11-09  8:07     ` [PATCH v3 06/16] sequencer: refactor sequencer_add_exec_commands() " Alban Gruin
2018-11-30 17:02       ` Phillip Wood
2018-11-30 19:06         ` Johannes Schindelin
2018-12-10 14:33           ` Phillip Wood
2018-12-28 19:42             ` Alban Gruin
2018-11-09  8:07     ` [PATCH v3 07/16] sequencer: refactor rearrange_squash() " Alban Gruin
2018-11-09  8:07     ` [PATCH v3 08/16] sequencer: make sequencer_make_script() write its script to a strbuf Alban Gruin
2018-11-09  8:07     ` [PATCH v3 09/16] sequencer: change complete_action() to use the refactored functions Alban Gruin
2018-11-09  8:07     ` [PATCH v3 10/16] sequencer: refactor skip_unnecessary_picks() to work on a todo_list Alban Gruin
2018-11-09  8:08     ` [PATCH v3 11/16] rebase-interactive: use todo_list_write_to_file() in edit_todo_list() Alban Gruin
2018-11-09  8:08     ` [PATCH v3 12/16] rebase-interactive: append_todo_help() changes Alban Gruin
2018-11-09  8:08     ` [PATCH v3 13/16] rebase-interactive: rewrite edit_todo_list() to handle the initial edit Alban Gruin
2018-11-09  8:08     ` [PATCH v3 14/16] sequencer: use edit_todo_list() in complete_action() Alban Gruin
2018-11-09  8:08     ` [PATCH v3 15/16] sequencer: fix a call to error() in transform_todo_file() Alban Gruin
2018-11-09  8:08     ` [PATCH v3 16/16] rebase--interactive: move transform_todo_file() to rebase--interactive.c Alban Gruin
2018-12-29 16:03     ` [PATCH v4 00/16] sequencer: refactor functions working on a todo_list Alban Gruin
2018-12-29 16:03       ` [PATCH v4 01/16] sequencer: changes in parse_insn_buffer() Alban Gruin
2018-12-29 16:03       ` [PATCH v4 02/16] sequencer: make the todo_list structure public Alban Gruin
2018-12-29 16:04       ` [PATCH v4 03/16] sequencer: remove the 'arg' field from todo_item Alban Gruin
2019-01-21 14:59         ` Phillip Wood
2019-01-22 15:27           ` Johannes Schindelin
2018-12-29 16:04       ` [PATCH v4 04/16] sequencer: refactor transform_todos() to work on a todo_list Alban Gruin
2018-12-29 16:04       ` [PATCH v4 05/16] sequencer: introduce todo_list_write_to_file() Alban Gruin
2018-12-29 16:04       ` [PATCH v4 06/16] sequencer: refactor check_todo_list() to work on a todo_list Alban Gruin
2018-12-29 16:04       ` [PATCH v4 07/16] sequencer: refactor sequencer_add_exec_commands() " Alban Gruin
2018-12-29 16:04       ` [PATCH v4 08/16] sequencer: refactor rearrange_squash() " Alban Gruin
2018-12-29 16:04       ` [PATCH v4 09/16] sequencer: make sequencer_make_script() write its script to a strbuf Alban Gruin
2018-12-29 16:04       ` [PATCH v4 10/16] sequencer: change complete_action() to use the refactored functions Alban Gruin
2018-12-29 16:04       ` [PATCH v4 11/16] sequencer: refactor skip_unnecessary_picks() to work on a todo_list Alban Gruin
2018-12-29 16:04       ` [PATCH v4 12/16] rebase-interactive: use todo_list_write_to_file() in edit_todo_list() Alban Gruin
2018-12-29 16:04       ` [PATCH v4 13/16] rebase-interactive: append_todo_help() changes Alban Gruin
2018-12-29 16:04       ` [PATCH v4 14/16] rebase-interactive: rewrite edit_todo_list() to handle the initial edit Alban Gruin
2018-12-29 16:04       ` [PATCH v4 15/16] sequencer: use edit_todo_list() in complete_action() Alban Gruin
2018-12-29 16:04       ` [PATCH v4 16/16] rebase--interactive: move transform_todo_file() to rebase--interactive.c Alban Gruin
2019-01-23 20:58       ` [PATCH v5 00/16] sequencer: refactor functions working on a todo_list Alban Gruin
2019-01-23 20:58         ` [PATCH v5 01/16] sequencer: changes in parse_insn_buffer() Alban Gruin
2019-01-23 20:58         ` [PATCH v5 02/16] sequencer: make the todo_list structure public Alban Gruin
2019-01-23 20:58         ` [PATCH v5 03/16] sequencer: remove the 'arg' field from todo_item Alban Gruin
2019-01-23 20:58         ` [PATCH v5 04/16] sequencer: refactor transform_todos() to work on a todo_list Alban Gruin
2019-01-23 20:58         ` [PATCH v5 05/16] sequencer: introduce todo_list_write_to_file() Alban Gruin
2019-01-23 20:58         ` [PATCH v5 06/16] sequencer: refactor check_todo_list() to work on a todo_list Alban Gruin
2019-01-23 20:58         ` [PATCH v5 07/16] sequencer: refactor sequencer_add_exec_commands() " Alban Gruin
2019-01-23 20:58         ` [PATCH v5 08/16] sequencer: refactor rearrange_squash() " Alban Gruin
2019-01-23 20:58         ` [PATCH v5 09/16] sequencer: make sequencer_make_script() write its script to a strbuf Alban Gruin
2019-01-23 20:58         ` [PATCH v5 10/16] sequencer: change complete_action() to use the refactored functions Alban Gruin
2019-01-23 20:58         ` [PATCH v5 11/16] sequencer: refactor skip_unnecessary_picks() to work on a todo_list Alban Gruin
2019-01-23 20:58         ` [PATCH v5 12/16] rebase-interactive: use todo_list_write_to_file() in edit_todo_list() Alban Gruin
2019-01-23 20:58         ` [PATCH v5 13/16] rebase-interactive: append_todo_help() changes Alban Gruin
2019-01-23 20:58         ` [PATCH v5 14/16] rebase-interactive: rewrite edit_todo_list() to handle the initial edit Alban Gruin
2019-01-23 20:58         ` [PATCH v5 15/16] sequencer: use edit_todo_list() in complete_action() Alban Gruin
2019-01-23 20:58         ` [PATCH v5 16/16] rebase--interactive: move transform_todo_file() to rebase--interactive.c Alban Gruin
2019-01-24 21:54         ` [PATCH v5 00/16] sequencer: refactor functions working on a todo_list Junio C Hamano
2019-01-24 22:43           ` Alban Gruin
2019-01-29 15:01         ` [PATCH v6 " Alban Gruin
2019-01-29 15:01           ` [PATCH v6 01/16] sequencer: changes in parse_insn_buffer() Alban Gruin
2019-01-29 15:01           ` [PATCH v6 02/16] sequencer: make the todo_list structure public Alban Gruin
2019-01-29 15:01           ` [PATCH v6 03/16] sequencer: remove the 'arg' field from todo_item Alban Gruin
2019-01-29 15:01           ` [PATCH v6 04/16] sequencer: refactor transform_todos() to work on a todo_list Alban Gruin
2019-01-29 15:01           ` [PATCH v6 05/16] sequencer: introduce todo_list_write_to_file() Alban Gruin
2019-01-29 15:01           ` [PATCH v6 06/16] sequencer: refactor check_todo_list() to work on a todo_list Alban Gruin
2019-01-29 15:01           ` [PATCH v6 07/16] sequencer: refactor sequencer_add_exec_commands() " Alban Gruin
2019-01-31 14:30             ` Phillip Wood [this message]
2019-01-31 20:37               ` Alban Gruin
2019-01-31 20:46                 ` Phillip Wood
2019-02-01 14:51               ` Phillip Wood
2019-02-02 15:09                 ` Alban Gruin
2019-02-07 11:09             ` Phillip Wood
2019-01-29 15:01           ` [PATCH v6 08/16] sequencer: refactor rearrange_squash() " Alban Gruin
2019-01-29 15:01           ` [PATCH v6 09/16] sequencer: make sequencer_make_script() write its script to a strbuf Alban Gruin
2019-01-29 15:01           ` [PATCH v6 10/16] sequencer: change complete_action() to use the refactored functions Alban Gruin
2019-01-29 20:14             ` Junio C Hamano
2019-01-29 20:33               ` Alban Gruin
2019-01-29 21:55                 ` Junio C Hamano
2019-01-29 15:01           ` [PATCH v6 11/16] sequencer: refactor skip_unnecessary_picks() to work on a todo_list Alban Gruin
2019-02-07 11:06             ` Phillip Wood
2019-01-29 15:01           ` [PATCH v6 12/16] rebase-interactive: use todo_list_write_to_file() in edit_todo_list() Alban Gruin
2019-01-29 15:01           ` [PATCH v6 13/16] rebase-interactive: append_todo_help() changes Alban Gruin
2019-01-29 15:01           ` [PATCH v6 14/16] rebase-interactive: rewrite edit_todo_list() to handle the initial edit Alban Gruin
2019-02-01 11:03             ` Phillip Wood
2019-02-02 14:40               ` Alban Gruin
2019-02-06 21:11               ` Alban Gruin
2019-02-08 10:56                 ` Phillip Wood
2019-01-29 15:01           ` [PATCH v6 15/16] sequencer: use edit_todo_list() in complete_action() Alban Gruin
2019-01-29 15:01           ` [PATCH v6 16/16] rebase--interactive: move transform_todo_file() to rebase--interactive.c Alban Gruin
2019-02-01 11:15             ` Phillip Wood
2019-02-02 15:05               ` Alban Gruin
2019-02-10 13:26           ` [PATCH v7 00/16] sequencer: refactor functions working on a todo_list Alban Gruin
2019-02-10 13:26             ` [PATCH v7 01/16] sequencer: changes in parse_insn_buffer() Alban Gruin
2019-02-10 13:26             ` [PATCH v7 02/16] sequencer: make the todo_list structure public Alban Gruin
2019-02-10 13:26             ` [PATCH v7 03/16] sequencer: remove the 'arg' field from todo_item Alban Gruin
2019-02-10 13:26             ` [PATCH v7 04/16] sequencer: refactor transform_todos() to work on a todo_list Alban Gruin
2019-02-10 13:26             ` [PATCH v7 05/16] sequencer: introduce todo_list_write_to_file() Alban Gruin
2019-02-10 13:26             ` [PATCH v7 06/16] sequencer: refactor check_todo_list() to work on a todo_list Alban Gruin
2019-02-10 13:26             ` [PATCH v7 07/16] sequencer: refactor sequencer_add_exec_commands() " Alban Gruin
2019-02-12 10:52               ` Phillip Wood
2019-02-12 15:21                 ` Alban Gruin
2019-02-13 10:03                   ` Phillip Wood
2019-02-10 13:26             ` [PATCH v7 08/16] sequencer: refactor rearrange_squash() " Alban Gruin
2019-02-10 13:26             ` [PATCH v7 09/16] sequencer: make sequencer_make_script() write its script to a strbuf Alban Gruin
2019-02-10 13:26             ` [PATCH v7 10/16] sequencer: change complete_action() to use the refactored functions Alban Gruin
2019-02-10 13:26             ` [PATCH v7 11/16] sequencer: refactor skip_unnecessary_picks() to work on a todo_list Alban Gruin
2019-02-13 10:05               ` Phillip Wood
2019-02-10 13:26             ` [PATCH v7 12/16] rebase-interactive: use todo_list_write_to_file() in edit_todo_list() Alban Gruin
2019-02-10 13:26             ` [PATCH v7 13/16] rebase-interactive: append_todo_help() changes Alban Gruin
2019-02-10 13:26             ` [PATCH v7 14/16] rebase-interactive: rewrite edit_todo_list() to handle the initial edit Alban Gruin
2019-02-13 10:10               ` Phillip Wood
2019-02-10 13:26             ` [PATCH v7 15/16] sequencer: use edit_todo_list() in complete_action() Alban Gruin
2019-02-10 13:26             ` [PATCH v7 16/16] rebase--interactive: move several functions to rebase--interactive.c Alban Gruin
2019-02-13 10:17               ` Phillip Wood
2019-03-05 19:17             ` [PATCH v8 00/18] sequencer: refactor functions working on a todo_list Alban Gruin
2019-03-05 19:17               ` [PATCH v8 01/18] sequencer: changes in parse_insn_buffer() Alban Gruin
2019-03-05 19:17               ` [PATCH v8 02/18] sequencer: make the todo_list structure public Alban Gruin
2019-03-05 19:17               ` [PATCH v8 03/18] sequencer: remove the 'arg' field from todo_item Alban Gruin
2019-03-05 19:17               ` [PATCH v8 04/18] sequencer: refactor transform_todos() to work on a todo_list Alban Gruin
2019-03-05 19:17               ` [PATCH v8 05/18] sequencer: introduce todo_list_write_to_file() Alban Gruin
2019-03-05 19:17               ` [PATCH v8 06/18] sequencer: refactor check_todo_list() to work on a todo_list Alban Gruin
2019-03-05 19:17               ` [PATCH v8 07/18] sequencer: refactor sequencer_add_exec_commands() " Alban Gruin
2019-03-05 19:17               ` [PATCH v8 08/18] sequencer: refactor rearrange_squash() " Alban Gruin
2019-03-05 19:17               ` [PATCH v8 09/18] sequencer: make sequencer_make_script() write its script to a strbuf Alban Gruin
2019-03-05 19:17               ` [PATCH v8 10/18] sequencer: change complete_action() to use the refactored functions Alban Gruin
2019-03-05 19:17               ` [PATCH v8 11/18] rebase--interactive: move sequencer_add_exec_commands() Alban Gruin
2019-03-05 19:17               ` [PATCH v8 12/18] rebase--interactive: move rearrange_squash_in_todo_file() Alban Gruin
2019-03-05 19:18               ` [PATCH v8 13/18] sequencer: refactor skip_unnecessary_picks() to work on a todo_list Alban Gruin
2019-03-05 19:18               ` [PATCH v8 14/18] rebase-interactive: use todo_list_write_to_file() in edit_todo_list() Alban Gruin
2019-03-05 19:18               ` [PATCH v8 15/18] rebase-interactive: append_todo_help() changes Alban Gruin
2019-03-05 19:18               ` [PATCH v8 16/18] rebase-interactive: rewrite edit_todo_list() to handle the initial edit Alban Gruin
2019-03-05 19:18               ` [PATCH v8 17/18] sequencer: use edit_todo_list() in complete_action() Alban Gruin
2019-03-05 19:18               ` [PATCH v8 18/18] rebase--interactive: move transform_todo_file() Alban Gruin
2019-03-13 10:45               ` [PATCH v8 00/18] sequencer: refactor functions working on a todo_list Phillip Wood

Reply instructions:

You may reply publically 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=434cf0f7-1df6-7966-b460-e69e8f8b5e99@talktalk.net \
    --to=phillip.wood@talktalk.net \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=alban.gruin@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --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

git@vger.kernel.org list mirror (unofficial, one of many)

Archives are clonable:
	git clone --mirror https://public-inbox.org/git
	git clone --mirror http://ou63pmih66umazou.onion/git
	git clone --mirror http://czquwvybam4bgbro.onion/git
	git clone --mirror http://hjrcffqmbrq6wope.onion/git

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.version-control.git
	nntp://ou63pmih66umazou.onion/inbox.comp.version-control.git
	nntp://czquwvybam4bgbro.onion/inbox.comp.version-control.git
	nntp://hjrcffqmbrq6wope.onion/inbox.comp.version-control.git
	nntp://news.gmane.org/gmane.comp.version-control.git

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/ public-inbox