git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5 00/10] The final building block for a faster rebase -i

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jun 14, 2017, 13:06 UTC
Message-ID
<cover.1497444257.git.johannes.schindelin@gmx.de>

This patch series reimplements the expensive pre- and post-processing of the todo script in C.

And it concludes the work I did to accelerate rebase -i so far.

I am still unwilling to replace a compile-time safe way to pass the options to the revision machinery by the alternative (which I am still flabbergasted about) proposed by Junio. This will not change.

Changes since v4:
- replaced the "sha1s" part of the names by "ids", to reflect the
  current effort to move away from the cryptographically unsafe SHA-1
- replaced the confusing term "instruction sheet" in an error message by
  the more commonly used "todo list"
Johannes Schindelin (10):
  t3415: verify that an empty instructionFormat is handled as before
  rebase -i: generate the script via rebase--helper
  rebase -i: remove useless indentation
  rebase -i: do not invent onelines when expanding/collapsing SHA-1s
  rebase -i: also expand/collapse the SHA-1s via the rebase--helper
  t3404: relax rebase.missingCommitsCheck tests
  rebase -i: check for missing commits in the rebase--helper
  rebase -i: skip unnecessary picks using the rebase--helper
  t3415: test fixup with wrapped oneline
  rebase -i: rearrange fixup/squash lines using the rebase--helper
 Documentation/git-rebase.txt  |  16 +-
 builtin/rebase--helper.c      |  29 ++-
 git-rebase--interactive.sh    | 373 ++++-------------------------
 sequencer.c                   | 530 ++++++++++++++++++++++++++++++++++++++++++
 sequencer.h                   |   8 +
 t/t3404-rebase-interactive.sh |  22 +-
 t/t3415-rebase-autosquash.sh  |  28 ++-
 7 files changed, 646 insertions(+), 360 deletions(-)
base-commit: 02a2850ad58eff6de70eb2dc5f96345c463857ac
Based-On: rebase--helper at https://github.com/dscho/git
Fetch-Base-Via: git fetch https://github.com/dscho/git rebase--helper
Published-As: https://github.com/dscho/git/releases/tag/rebase-i-extra-v5
Fetch-It-Via: git fetch https://github.com/dscho/git rebase-i-extra-v5
Interdiff vs v4:
 diff --git a/builtin/rebase--helper.c b/builtin/rebase--helper.c
 index e6591f01112..64b36d429fa 100644
 --- a/builtin/rebase--helper.c
 +++ b/builtin/rebase--helper.c
 @@ -25,9 +25,9 @@ int cmd_rebase__helper(int argc, const char **argv, const char *prefix)
  				ABORT),
  		OPT_CMDMODE(0, "make-script", &command,
  			N_("make rebase script"), MAKE_SCRIPT),
 -		OPT_CMDMODE(0, "shorten-sha1s", &command,
 +		OPT_CMDMODE(0, "shorten-ids", &command,
  			N_("shorten SHA-1s in the todo list"), SHORTEN_SHA1S),
 -		OPT_CMDMODE(0, "expand-sha1s", &command,
 +		OPT_CMDMODE(0, "expand-ids", &command,
  			N_("expand SHA-1s in the todo list"), EXPAND_SHA1S),
  		OPT_CMDMODE(0, "check-todo-list", &command,
  			N_("check the todo list"), CHECK_TODO_LIST),
 diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
 index 71d190766cf..3b0340e7cc9 100644
 --- a/git-rebase--interactive.sh
 +++ b/git-rebase--interactive.sh
 @@ -714,11 +714,11 @@ do_rest () {
  }
  
  expand_todo_ids() {
 -	git rebase--helper --expand-sha1s
 +	git rebase--helper --expand-ids
  }
  
  collapse_todo_ids() {
 -	git rebase--helper --shorten-sha1s
 +	git rebase--helper --shorten-ids
  }
  
  # Add commands after a pick or after a squash/fixup serie
 diff --git a/sequencer.c b/sequencer.c
 index 6373f20a019..06c97e12267 100644
 --- a/sequencer.c
 +++ b/sequencer.c
 @@ -2464,7 +2464,7 @@ int sequencer_make_script(int keep_empty, FILE *out,
  }
  
  
 -int transform_todo_ids(int shorten_sha1s)
 +int transform_todo_ids(int shorten_ids)
  {
  	const char *todo_file = rebase_path_todo();
  	struct todo_list todo_list = TODO_LIST_INIT;
 @@ -2484,7 +2484,7 @@ int transform_todo_ids(int shorten_sha1s)
  	res = parse_insn_buffer(todo_list.buf.buf, &todo_list);
  	if (res) {
  		todo_list_release(&todo_list);
 -		return error(_("unusable instruction sheet: '%s'"), todo_file);
 +		return error(_("unusable todo list: '%s'"), todo_file);
  	}
  
  	out = fopen(todo_file, "w");
 @@ -2503,7 +2503,7 @@ int transform_todo_ids(int shorten_sha1s)
  		if (item->command >= TODO_EXEC && item->command != TODO_DROP)
  			fwrite(p, eol - bol, 1, out);
  		else {
 -			const char *sha1 = shorten_sha1s ?
 +			const char *id = shorten_ids ?
  				short_commit_name(item->commit) :
  				oid_to_hex(&item->commit->object.oid);
  			int len;
 @@ -2512,7 +2512,7 @@ int transform_todo_ids(int shorten_sha1s)
  			len = strcspn(p, " \t"); /* length of command */
  
  			fprintf(out, "%.*s %s %.*s\n",
 -				len, p, sha1, item->arg_len, item->arg);
 +				len, p, id, item->arg_len, item->arg);
  		}
  	}
  	fclose(out);
 @@ -2762,9 +2762,9 @@ static int subject2item_cmp(const struct subject2item_entry *a,
  }
  
  /*
 - * Rearrange the todo list that has both "pick sha1 msg" and "pick sha1
 - * fixup!/squash! msg" in it so that the latter is put immediately after the
 - * former, and change "pick" to "fixup"/"squash".
 + * Rearrange the todo list that has both "pick commit-id msg" and "pick
 + * commit-id fixup!/squash! msg" in it so that the latter is put immediately
 + * after the former, and change "pick" to "fixup"/"squash".
   *
   * Note that if the config has specified a custom instruction format, each log
   * message will have to be retrieved from the commit (as the oneline in the
 diff --git a/sequencer.h b/sequencer.h
 index 1c94bec7622..6f3d3df82c0 100644
 --- a/sequencer.h
 +++ b/sequencer.h
 @@ -48,7 +48,7 @@ int sequencer_remove_state(struct replay_opts *opts);
  int sequencer_make_script(int keep_empty, FILE *out,
  		int argc, const char **argv);
  
 -int transform_todo_ids(int shorten_sha1s);
 +int transform_todo_ids(int shorten_ids);
  int check_todo_list(void);
  int skip_unnecessary_picks(void);
  int rearrange_squash(void);
-- 
2.13.1.windows.1.1.ga36e14b3aaa
Next: Johannes Schindelin
Message 1 of 20 in “The final building block for a faster rebase -i”
  1. 00/10 The final building block for a faster rebase -iJohannes Schindelin, Jun 14, 2017
  2. 02/10 rebase -i: generate the script via rebase--helperJohannes Schindelin, Jun 14, 2017
  3. 01/10 t3415: verify that an empty instructionFormat is handled as beforeJohannes Schindelin, Jun 14, 2017
  4. 03/10 rebase -i: remove useless indentationJohannes Schindelin, Jun 14, 2017
  5. 04/10 rebase -i: do not invent onelines when expanding/collapsing SHA-1sJohannes Schindelin, Jun 14, 2017
  6. 05/10 rebase -i: also expand/collapse the SHA-1s via the rebase--helperJohannes Schindelin, Jun 14, 2017
  7. 06/10 t3404: relax rebase.missingCommitsCheck testsJohannes Schindelin, Jun 14, 2017
  8. 07/10 rebase -i: check for missing commits in the rebase--helperJohannes Schindelin, Jun 14, 2017
  9. 08/10 rebase -i: skip unnecessary picks using the rebase--helperJohannes Schindelin, Jun 14, 2017
  10. Liam BeguinJun 16, 2017
  11. Johannes SchindelinJun 16, 2017
  12. Liam BeguinJun 17, 2017
  13. Johannes SchindelinJun 19, 2017
  14. Jeff KingJun 19, 2017
  15. Junio C HamanoJun 19, 2017
  16. Liam BeguinJun 20, 2017
  17. 09/10 t3415: test fixup with wrapped onelineJohannes Schindelin, Jun 14, 2017
  18. 10/10 rebase -i: rearrange fixup/squash lines using the rebase--helperJohannes Schindelin, Jun 14, 2017
  19. Junio C HamanoJun 15, 2017
  20. Johannes SchindelinJun 16, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.