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

Re: [PATCH v4 5/5] sequencer: directly call pick_commits() from complete_action()

From
Alban Gruin <alban.gruin@gmail.com>
Date
Nov 27, 2019, 19:56 UTC
Message-ID
<aa162f9c-9ae8-9844-6829-7fc0d9c50f9c@gmail.com>
In-Reply-To
<20191126184103.146421-1-jonathantanmy@google.com>
Hi Jonathan,
Le 26/11/2019 à 19:41, Jonathan Tan a écrit :
Show 11 quoted lines
>> Currently, complete_action(), used by builtin/rebase.c to start a new
>> rebase, calls sequencer_continue() to do it.  Before the former calls
>> pick_commits(), it
>>
>>  - calls read_and_refresh_cache() -- this is unnecessary here as we've
>>    just called require_clean_work_tree() in complete_action()
> 
> require_clean_work_tree() and read_and_refresh_cache() seem to be
> different functions - can you explain why running the former is a good
> substitute for running the latter?
> 
They both refresh the index.

require_clean_work_tree(), called when starting a new rebase, will also check if there are any unstaged or uncommitted changes, in which case we do not want to start a rebase.

This is not what we want when resuming a rebase (with `rebase --continue'), because the changes might be the result of a conflict resolution. In this case, the last commit is amended, and the rebase is resumed.

Show 15 quoted lines
>>  - calls read_populate_opts() -- this is unnecessary as we're starting a
>>    new rebase, so `opts' is fully populated
> 
> My comment from [1] has not been addressed. Quoting it here:
> 
>> So complete_action() (the function modified in this commit) is called
>> only by do_interactive_rebase() (in builtin/rebase.c), which is only
>> called by run_rebase_interactive() (in builtin/rebase.c) when command is
>> ACTION_NONE, so indeed, we're starting a new rebase. But where the
>> options fully populated? I see that in do_interactive_rebase(), it is
>> initialized with get_replay_opts(), but that seems different from
>> read_populate_opts().
> 
> [1] https://lore.kernel.org/git/20191119204146.168001-1-jonathantanmy@google.com/
> 
Sorry.

For the first part of your comment, I added a comment at the beginning of the message, although I did _not_ include an analysis on when complete_action() is used.

get_replay_opts() converts a `struct rebase_options' (which contains the arguments passed to `git rebase') into a `struct replay_opts' which can be used by the sequencer, whereas read_populate_opts() loads the options from the disk.

So, when are they written to the disk? In do_interactive_rebase() (builtin/rebase.c), after using get_replay_opts() to convert `opts' to `replay', init_basic_state() is called, which calls write_basic_state(), which write the options to the disk.

Then, until complete_action() is called, `opts' is not modified.
Show 7 quoted lines
>>  - loads the todo list -- this is unnecessary as we've just populated
>>    the todo list in complete_action()
> 
> Both functions indeed have their own todo lists that they pass to
> pick_commits(), but I don't see (at least, by glancing at the code) that
> both these todo lists are identical.
> 
Near the end of complete_action(), the todo list is written to the disk.
 The destination is obtained with rebase_path_todo().

read_populate_todo() will read a file and parse it. In the case of `rebase -i', the location is obtained with rebase_path_todo(), and only `total_nr' will be modified to contain the number of commands done and todo.

In the case of a new rebase, the done list might not be empty after tajjimh skip_unnecessary_picks() from complete_action(). Skipped commands are moved from the todo list to the done list. As `total_nr' is not changed by skip_unnecessary_picks(), it is also equal to the number of commands remaining in the todo list and in the done list. So, when read_populate_todo() reads the list and the done list from the disk, as they should not have been modified, `total_nr' should remain the same, too.

The only thing that can change is the internal buffer (`buf'), because skip_unnecessary_picks() don’t change it. Since ag/sequencer-reduce-rewriting-todo, it is no longer a textual representation of the todo list. Each command contains a pointer to a location in the buffer and a length to represent its argument.

Show 8 quoted lines
>>  - commits any staged changes -- this is unnecessary as we're starting a
>>    new rebase, so there are no staged changes
>>  - calls record_in_rewritten() -- this is unnecessary as we're starting
>>    a new rebase.
> 
> OK - I don't know enough about the rebase mechanism to verify these, but
> these seem reasonable to me.
> 

Cheers, Alban

Previous: Jonathan TanNext: Alban Gruin
Message 49 of 50 in “sequencer: update `total_nr' when adding an item to a todo list”
  1. 1/5 sequencer: update `total_nr' when adding an item to a todo listAlban Gruin, Sep 25, 2019
  2. Junio C HamanoOct 2, 2019
  3. Johannes SchindelinOct 2, 2019
  4. Junio C HamanoOct 2, 2019
  5. Johannes SchindelinOct 2, 2019
  6. Alban GruinOct 2, 2019
  7. 2/5 sequencer: update `done_nr' when skipping commands in a todo listAlban Gruin, Sep 25, 2019
  8. 3/5 sequencer: move the code writing total_nr on the disk to a new functionAlban Gruin, Sep 25, 2019
  9. 4/5 rebase: fill `squash_onto' in get_replay_opts()Alban Gruin, Sep 25, 2019
  10. Phillip WoodSep 27, 2019
  11. Johannes SchindelinOct 2, 2019
  12. Phillip WoodOct 2, 2019
  13. Johannes SchindelinOct 2, 2019
  14. 5/5 sequencer: directly call pick_commits() from complete_action()Alban Gruin, Sep 25, 2019
  15. Phillip WoodSep 27, 2019
  16. Johannes SchindelinOct 2, 2019
  17. Alban GruinOct 2, 2019
  18. Junio C HamanoOct 2, 2019
  19. Alban GruinOct 2, 2019
  20. René ScharfeOct 26, 2019
  21. Alban GruinOct 26, 2019
  22. Junio C HamanoOct 28, 2019
  23. Junio C HamanoOct 28, 2019
  24. 0/5 Use complete_action's todo list to do the rebaseAlban Gruin, Sep 25, 2019
  25. Phillip WoodSep 27, 2019
  26. 0/5 Use complete_action's todo list to do the rebaseAlban Gruin, Oct 7, 2019
  27. 1/5 sequencer: update `total_nr' when adding an item to a todo listAlban Gruin, Oct 7, 2019
  28. 2/5 sequencer: update `done_nr' when skipping commands in a todo listAlban Gruin, Oct 7, 2019
  29. 3/5 sequencer: move the code writing total_nr on the disk to a new functionAlban Gruin, Oct 7, 2019
  30. 4/5 rebase: fill `squash_onto' in get_replay_opts()Alban Gruin, Oct 7, 2019
  31. 5/5 sequencer: directly call pick_commits() from complete_action()Alban Gruin, Oct 7, 2019
  32. Junio C HamanoOct 8, 2019
  33. Alban GruinOct 8, 2019
  34. Johannes SchindelinOct 14, 2019
  35. 0/5 Use complete_action's todo list to do the rebaseAlban Gruin, Nov 23, 2019
  36. 1/5 sequencer: update `total_nr' when adding an item to a todo listAlban Gruin, Nov 23, 2019
  37. 4/5 rebase: fill `squash_onto' in get_replay_opts()Alban Gruin, Nov 23, 2019
  38. 5/5 sequencer: directly call pick_commits() from complete_action()Alban Gruin, Nov 23, 2019
  39. 3/5 sequencer: move the code writing total_nr on the disk to a new functionAlban Gruin, Nov 23, 2019
  40. 2/5 sequencer: update `done_nr' when skipping commands in a todo listAlban Gruin, Nov 23, 2019
  41. 0/5 Use complete_action's todo list to do the rebaseAlban Gruin, Nov 24, 2019
  42. 1/5 sequencer: update `total_nr' when adding an item to a todo listAlban Gruin, Nov 24, 2019
  43. 2/5 sequencer: update `done_nr' when skipping commands in a todo listAlban Gruin, Nov 24, 2019
  44. 4/5 rebase: fill `squash_onto' in get_replay_opts()Alban Gruin, Nov 24, 2019
  45. Jonathan TanNov 26, 2019
  46. 3/5 sequencer: move the code writing total_nr on the disk to a new functionAlban Gruin, Nov 24, 2019
  47. 5/5 sequencer: directly call pick_commits() from complete_action()Alban Gruin, Nov 24, 2019
  48. Jonathan TanNov 26, 2019
  49. Alban GruinNov 27, 2019
  50. Alban GruinNov 27, 2019

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.