git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Alban Gruin <alban.gruin@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>,
	Phillip Wood <phillip.wood@dunelm.org.uk>,
	Junio C Hamano <gitster@pobox.com>,
	Alban Gruin <alban.gruin@gmail.com>
Subject: [PATCH v7 00/16] sequencer: refactor functions working on a todo_list
Date: Sun, 10 Feb 2019 14:26:32 +0100	[thread overview]
Message-ID: <20190210132648.12821-1-alban.gruin@gmail.com> (raw)
In-Reply-To: <20190129150159.10588-1-alban.gruin@gmail.com>

At the center of the "interactive" part of the interactive rebase lies
the todo list.  When the user starts an interactive rebase, a todo list
is generated, presented to the user (who then edits it using a text
editor), read back, and then is checked and processed before the actual
rebase takes place.

Some of this processing includes adding execs commands, reordering
fixup! and squash! commits, and checking if no commits were accidentally
dropped by the user.

Before I converted the interactive rebase in C, these functions were
called by git-rebase--interactive.sh through git-rebase--helper.  Since
the only way to pass around a large amount of data between a shell
script and a C program is to use a file (or any declination of a file),
the functions that checked and processed the todo list were directly
working on a file, the same file that the user edited.

During the conversion, I did not address this issue, which lead to a
complete_action() that reads the todo list file, does some computation
based on its content, and writes it back to the disk, several times in
the same function.

As it is not an efficient way to handle a data structure, this patch
series refactor the functions that processes the todo list to work on a
todo_list structure instead of reading it from the disk.

Some commits consists in modifying edit_todo_list() (initially used by
--edit-todo) to handle the initial edition of the todo list, to increase
code sharing.

This is based on nd/the-index (cde555480b, "Merge branch
'nd/the-index'").

Changes since v6:

 - The series has been rebased onto cde555480b (this affects the patch
   10/16).

 - [07/16] rebase--interactive does no longer check if the last command
   is empty before decrementing the size of the command list, and frees
   the list before exiting.

 - [07/16] `insert' (in todo_list_add_exec_commands()) is treated as a
   flag instead of an integer.

 - [07/16] Styling change (++i -> i++).

 - [07/16] `exec' commands are inserted before comments, not after.

 - [11/16] Renaming `output_oid' to `base_oid'.

 - [14/16] Better error handling in edit_todo_list() and
   edit_todo_file().

 - [16/16] Move sequencer_add_exec_commands() and
   rearrange_squash_in_todo_file() to rebase--interactive.c.

The tip of this series is tagged as "refactor-todo-list-v7" in
https://github.com/agrn/git.

The range diff is included below.

Alban Gruin (16):
  sequencer: changes in parse_insn_buffer()
  sequencer: make the todo_list structure public
  sequencer: remove the 'arg' field from todo_item
  sequencer: refactor transform_todos() to work on a todo_list
  sequencer: introduce todo_list_write_to_file()
  sequencer: refactor check_todo_list() to work on a todo_list
  sequencer: refactor sequencer_add_exec_commands() to work on a
    todo_list
  sequencer: refactor rearrange_squash() to work on a todo_list
  sequencer: make sequencer_make_script() write its script to a strbuf
  sequencer: change complete_action() to use the refactored functions
  sequencer: refactor skip_unnecessary_picks() to work on a todo_list
  rebase-interactive: use todo_list_write_to_file() in edit_todo_list()
  rebase-interactive: append_todo_help() changes
  rebase-interactive: rewrite edit_todo_list() to handle the initial
    edit
  sequencer: use edit_todo_list() in complete_action()
  rebase--interactive: move several functions to rebase--interactive.c

 builtin/rebase--interactive.c | 141 ++++++--
 rebase-interactive.c          | 141 ++++++--
 rebase-interactive.h          |   9 +-
 sequencer.c                   | 650 ++++++++++++----------------------
 sequencer.h                   |  81 ++++-
 5 files changed, 539 insertions(+), 483 deletions(-)

Range-diff against v6:
 1:  f5d6bb72fa =  1:  0bc5f714e5 sequencer: changes in parse_insn_buffer()
 2:  68dcdd233b =  2:  34d149ff25 sequencer: make the todo_list structure public
 3:  74152c4d60 =  3:  8200f7a6be sequencer: remove the 'arg' field from todo_item
 4:  aff98ea435 =  4:  ce8ca23ee0 sequencer: refactor transform_todos() to work on a todo_list
 5:  e4c85dd743 =  5:  67ebea475e sequencer: introduce todo_list_write_to_file()
 6:  5b1735671b =  6:  370c153ebe sequencer: refactor check_todo_list() to work on a todo_list
 7:  f0734897af !  7:  66e7b65509 sequencer: refactor sequencer_add_exec_commands() to work on a todo_list
    @@ -60,8 +60,7 @@
      
     +	if (cmd && *cmd) {
     +		string_list_split(&commands, cmd, '\n', -1);
    -+		if (strlen(commands.items[commands.nr - 1].string) == 0)
    -+			--commands.nr;
    ++		--commands.nr;
     +	}
     +
      	switch (command) {
    @@ -85,18 +84,19 @@
      		break;
      	default:
      		BUG("invalid command '%d'", command);
    + 	}
    + 
    ++	string_list_clear(&commands, 1);
    + 	return !!ret;
    + }
     
      diff --git a/sequencer.c b/sequencer.c
      --- a/sequencer.c
      +++ b/sequencer.c
     @@
    - 	return 0;
    - }
    - 
    --/*
    -- * Add commands after pick and (series of) squash/fixup commands
    -- * in the todo list.
    -- */
    +  * 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,
    @@ -115,7 +115,7 @@
     -	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) {
    ++	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)) {
    @@ -134,9 +134,10 @@
      
      	/*
     @@
    + 	 * are considered part of the pick, so we insert the commands *after*
      	 * those chains if there are any.
      	 */
    - 	insert = -1;
    +-	insert = -1;
     -	for (i = 0; i < todo_list.nr; i++) {
     -		enum todo_command command = todo_list.items[i].command;
     -
    @@ -152,21 +153,25 @@
     -				      todo_list.items[insert].offset_in_buf +
     -				      offset, commands, commands_len);
     -			offset += commands_len;
    +-			insert = -1;
    ++	insert = 0;
     +	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)) {
    ++		if (insert && !is_fixup(command)) {
     +			ALLOC_GROW(items, nr + commands->nr, alloc);
     +			COPY_ARRAY(items + nr, base_items, commands->nr);
     +			nr += commands->nr;
    - 			insert = -1;
    ++
    ++			insert = 0;
      		}
      
     -		if (command == TODO_PICK || command == TODO_MERGE)
    +-			insert = i + 1;
     +		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 = 1;
      	}
      
      	/* insert or append final <commands> */
    @@ -175,7 +180,7 @@
     -			      offset, commands, commands_len);
     -	else if (insert >= 0 || !offset)
     -		strbuf_add(buf, commands, commands_len);
    -+	if (insert >= 0 || nr == todo_list->nr) {
    ++	if (insert || nr == todo_list->nr) {
     +		ALLOC_GROW(items, nr + commands->nr, alloc);
     +		COPY_ARRAY(items + nr, base_items, commands->nr);
     +		nr += commands->nr;
    @@ -189,10 +194,6 @@
     +}
      
     -	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)
     +{
 8:  ecc684c833 =  8:  640cb7aa54 sequencer: refactor rearrange_squash() to work on a todo_list
 9:  4de36e9e76 =  9:  bef1970c88 sequencer: make sequencer_make_script() write its script to a strbuf
10:  d5af79282c ! 10:  48ee37a32a sequencer: change complete_action() to use the refactored functions
    @@ -197,14 +197,6 @@
      
      	if (opts->allow_ff && skip_unnecessary_picks(r, &oid))
      		return error(_("could not skip unnecessary pick commands"));
    - 
    - 	if (checkout_onto(opts, onto_name, oid_to_hex(&oid), orig_head))
    - 		return -1;
    --;
    -+
    - 	if (require_clean_work_tree(r, "rebase", "", 1, 1))
    - 		return -1;
    - 
     
      diff --git a/sequencer.h b/sequencer.h
      --- a/sequencer.h
11:  b04e1fc692 ! 11:  bc89fbfea6 sequencer: refactor skip_unnecessary_picks() to work on a todo_list
    @@ -38,7 +38,7 @@
     -static int skip_unnecessary_picks(struct repository *r, struct object_id *output_oid)
     +static int skip_unnecessary_picks(struct repository *r,
     +				  struct todo_list *todo_list,
    -+				  struct object_id *output_oid)
    ++				  struct object_id *base_oid)
      {
     -	const char *todo_file = rebase_path_todo();
     -	struct strbuf buf = STRBUF_INIT;
    @@ -77,7 +77,14 @@
      				oid_to_hex(&item->commit->object.oid));
      		}
     @@
    - 		oidcpy(output_oid, &item->commit->object.oid);
    + 		if (item->commit->parents->next)
    + 			break; /* merge commit */
    + 		parent_oid = &item->commit->parents->item->object.oid;
    +-		if (!oideq(parent_oid, output_oid))
    ++		if (!oideq(parent_oid, base_oid))
    + 			break;
    +-		oidcpy(output_oid, &item->commit->object.oid);
    ++		oidcpy(base_oid, &item->commit->object.oid);
      	}
      	if (i > 0) {
     -		int offset = get_item_line_offset(&todo_list, i);
    @@ -112,7 +119,7 @@
     -		if (is_fixup(peek_command(&todo_list, 0)))
     -			record_in_rewritten(output_oid, peek_command(&todo_list, 0));
     +		if (is_fixup(peek_command(todo_list, 0)))
    -+			record_in_rewritten(output_oid, peek_command(todo_list, 0));
    ++			record_in_rewritten(base_oid, peek_command(todo_list, 0));
      	}
      
     -	todo_list_release(&todo_list);
12:  7cc97f77a8 = 12:  a754d0da96 rebase-interactive: use todo_list_write_to_file() in edit_todo_list()
13:  77056f58a2 = 13:  031e4de856 rebase-interactive: append_todo_help() changes
14:  3591e06b7d ! 14:  268998924b rebase-interactive: rewrite edit_todo_list() to handle the initial edit
    @@ -24,21 +24,21 @@
     +	const char *todo_file = rebase_path_todo();
     +	struct todo_list todo_list = TODO_LIST_INIT,
     +		new_todo = TODO_LIST_INIT;
    ++	int res = 0;
     +
     +	if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
     +		return error_errno(_("could not read '%s'."), todo_file);
     +
     +	strbuf_stripspace(&todo_list.buf, 1);
    -+	if (!edit_todo_list(the_repository, &todo_list,
    -+			    &new_todo, NULL, NULL, flags) &&
    -+	    todo_list_write_to_file(the_repository, &new_todo, todo_file, NULL, NULL,
    -+				    -1, flags & ~(TODO_LIST_SHORTEN_IDS)) < 0)
    -+		return error_errno(_("could not write '%s'"), todo_file);
    ++	res = edit_todo_list(the_repository, &todo_list, &new_todo, NULL, NULL, flags);
    ++	if (!res && todo_list_write_to_file(the_repository, &new_todo, todo_file,
    ++					    NULL, NULL, -1, flags & ~(TODO_LIST_SHORTEN_IDS)))
    ++		res = error_errno(_("could not write '%s'"), todo_file);
     +
     +	todo_list_release(&todo_list);
     +	todo_list_release(&new_todo);
     +
    -+	return 0;
    ++	return res;
     +}
     +
      static int get_revision_ranges(const char *upstream, const char *onto,
    @@ -79,40 +79,39 @@
     -				    flags | TODO_LIST_SHORTEN_IDS | TODO_LIST_APPEND_TODO_HELP)) {
     -		todo_list_release(&todo_list);
     -		return -1;
    +-	}
     +	unsigned initial = shortrevisions && shortonto;
    -+
    -+	if (initial) {
    -+		todo_list_write_to_file(r, todo_list, todo_file, shortrevisions, shortonto,
    -+					-1, flags | TODO_LIST_SHORTEN_IDS | TODO_LIST_APPEND_TODO_HELP);
    -+
    -+		if (copy_file(rebase_path_todo_backup(), todo_file, 0666))
    -+			return error(_("could not copy '%s' to '%s'."), todo_file,
    -+				     rebase_path_todo_backup());
    -+	} else {
    -+		todo_list_parse_insn_buffer(r, todo_list->buf.buf, todo_list);
    -+		todo_list_write_to_file(r, todo_list, todo_file, NULL, NULL, -1,
    -+					flags | TODO_LIST_SHORTEN_IDS | TODO_LIST_APPEND_TODO_HELP);
    - 	}
      
     -	strbuf_reset(&todo_list.buf);
     -	if (launch_sequence_editor(todo_file, &todo_list.buf, NULL)) {
     -		todo_list_release(&todo_list);
     -		return -1;
     -	}
    -+	if (launch_sequence_editor(todo_file, &new_todo->buf, NULL))
    -+		return -2;
    ++	if (!initial)
    ++		todo_list_parse_insn_buffer(r, todo_list->buf.buf, todo_list);
      
     -	if (!todo_list_parse_insn_buffer(r, todo_list.buf.buf, &todo_list))
     -		res = todo_list_write_to_file(r, &todo_list, todo_file, NULL, NULL, -1,
     -					      flags & ~(TODO_LIST_SHORTEN_IDS));
    -+	strbuf_stripspace(&new_todo->buf, 1);
    -+	if (initial && new_todo->buf.len == 0)
    -+		return -3;
    ++	if (todo_list_write_to_file(r, todo_list, todo_file, shortrevisions, shortonto,
    ++				    -1, flags | TODO_LIST_SHORTEN_IDS | TODO_LIST_APPEND_TODO_HELP))
    ++		return error_errno(_("could not write '%s'"), todo_file);
      
     -	todo_list_release(&todo_list);
     -	return res;
    ++	if (initial && copy_file(rebase_path_todo_backup(), todo_file, 0666))
    ++		return error(_("could not copy '%s' to '%s'."), todo_file,
    ++			     rebase_path_todo_backup());
    ++
    ++	if (launch_sequence_editor(todo_file, &new_todo->buf, NULL))
    ++		return -2;
    ++
    ++	strbuf_stripspace(&new_todo->buf, 1);
    ++	if (initial && new_todo->buf.len == 0)
    ++		return -3;
    ++
     +	if (!initial)
    -+		todo_list_parse_insn_buffer(r, new_todo->buf.buf, new_todo);
    ++		return todo_list_parse_insn_buffer(r, new_todo->buf.buf, new_todo);
     +
     +	return 0;
      }
15:  0b29fca27f = 15:  6f1274a33c sequencer: use edit_todo_list() in complete_action()
16:  5ab34416af <  -:  ---------- rebase--interactive: move transform_todo_file() to rebase--interactive.c
 -:  ---------- > 16:  f57a7405d0 rebase--interactive: move several functions to rebase--interactive.c
-- 
2.20.1


  parent reply	other threads:[~2019-02-10 13:27 UTC|newest]

Thread overview: 190+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-07 19:54 [PATCH 00/15] sequencer: refactor functions working on a todo_list 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
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           ` Alban Gruin [this message]
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 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=20190210132648.12821-1-alban.gruin@gmail.com \
    --to=alban.gruin@gmail.com \
    --cc=Johannes.Schindelin@gmx.de \
    --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
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).