mbox series

[v3,0/1] Teach the builtin rebase about the builtin interactive rebase

Message ID pull.23.v3.git.gitgitgadget@gmail.com (mailing list archive)
Headers show
Series Teach the builtin rebase about the builtin interactive rebase | expand

Message

Linus Arver via GitGitGadget Oct. 5, 2018, 3:54 p.m. UTC
The builtin rebase and the builtin interactive rebase have been developed
independently, on purpose: Google Summer of Code rules specifically state
that students have to work on independent projects, they cannot collaborate
on the same project.

The reason is probably the very fine tradition in academia to prohibit
teamwork, which makes grading easier (at the expense of not exactly
preparing the students for the real world, unless they want to stay in
academia).

One fallout is that the rebase-in-c and rebase-i-in-c patches cause no merge
conflicts but a royal number of tests in the test suite to fail.

It is easy to explain why: rebase-in-c was developed under the assumption
that all rebase backends are implemented in Unix shell script and can be
sourced via . git-rebase--<backend>, which is no longer true with 
rebase-i-in-c, where git-rebase--interactive is a hard-linked builtin.

This patch fixes that.

Note: while this patch targets pk/rebase-in-c-6-final, it will not work
correctly without ag/rebase-i-in-c. So my suggestion is to rewrite the 
pk/rebas-in-c-6-final branch by first merging ag/rebase-i-in-c, then
applying this here patch, and only then cherry-pick "rebase: default to
using the builtin rebase".

Changes since v2:

 * Prepare for the break command, by skipping the call to finish_rebase() 
   for interactive rebases altogether (the built-in interactive rebase
   already takes care of that).
 * Remove a no-longer-used case arm (skipped by the newly-introduced code).

Changes since v1:

 * replaced the too-terse commit message by a copy-edited version of this
   cover letter (leaving out only the rant about disallowing teamwork).

Johannes Schindelin (1):
  builtin rebase: prepare for builtin rebase -i

 builtin/rebase.c | 87 +++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 83 insertions(+), 4 deletions(-)


base-commit: 67e0df2f391ec4177942a4d8b70e530aa5653c0d
Published-As: https://github.com/gitgitgadget/git/releases/tags/pr-23%2Fdscho%2Frebase-in-c-6-final-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-23/dscho/rebase-in-c-6-final-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/23

Range-diff vs v2:

 1:  5403014be7 ! 1:  db1652ef3e builtin rebase: prepare for builtin rebase -i
     @@ -18,6 +18,15 @@
      
          This patch fixes that.
      
     +    Please note that we also skip the finish_rebase() call for interactive
     +    rebases because the built-in interactive rebase already takes care of
     +    that. This is needed to support the upcoming `break` command that wants
     +    to interrupt the rebase with exit code 0 (and naturally wants to keep
     +    the state directory intact when doing so).
     +
     +    While at it, remove the `case` arm for the interactive rebase that is
     +    now skipped in favor of the short-cut to the built-in rebase.
     +
          Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
      
      diff --git a/builtin/rebase.c b/builtin/rebase.c
     @@ -117,6 +126,17 @@
       	add_var(&script_snippet, "GIT_DIR", absolute_path(get_git_dir()));
       	add_var(&script_snippet, "state_dir", opts->state_dir);
       
     +@@
     + 		backend = "git-rebase--am";
     + 		backend_func = "git_rebase__am";
     + 		break;
     +-	case REBASE_INTERACTIVE:
     +-		backend = "git-rebase--interactive";
     +-		backend_func = "git_rebase__interactive";
     +-		break;
     + 	case REBASE_MERGE:
     + 		backend = "git-rebase--merge";
     + 		backend_func = "git_rebase__merge";
      @@
       	argv[0] = script_snippet.buf;
       
     @@ -124,4 +144,8 @@
      +finished_rebase:
       	if (opts->dont_finish_rebase)
       		; /* do nothing */
     ++	else if (opts->type == REBASE_INTERACTIVE)
     ++		; /* interactive rebase cleans up after itself */
       	else if (status == 0) {
     + 		if (!file_exists(state_dir_path("stopped-sha", opts)))
     + 			finish_rebase(opts);

Comments

Junio C Hamano Oct. 6, 2018, 11:50 p.m. UTC | #1
"Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
writes:

> Note: while this patch targets pk/rebase-in-c-6-final, it will not work
> correctly without ag/rebase-i-in-c. So my suggestion is to rewrite the 
> pk/rebas-in-c-6-final branch by first merging ag/rebase-i-in-c, then
> applying this here patch, and only then cherry-pick "rebase: default to
> using the builtin rebase".

Is this a stale comment in the context of v3, where we pretty much
know how the resulting topic should intertwine with other topics?  I
am trying to see if I have do to anything differently this time, or
just replacing the single commit while keeping the structure around
that commit the same is fine.

Also, I see there is a new iteration v8 of ag/rebase-i-in-c on the
list, sent on Sep 27th (you were CC'ed but I suspect it was before
you came back).  Are you happy with that update?  Otherwise, we
should make sure that topic is solid enough before extending
(meaning: I'd replace this one while keeping ag/rebase-i-in-c that
has been cooking in 'pu', without updating the latter).

> Changes since v2:
>
>  * Prepare for the break command, by skipping the call to finish_rebase() 
>    for interactive rebases altogether (the built-in interactive rebase
>    already takes care of that).

Thanks.
Johannes Schindelin Oct. 12, 2018, 7:59 a.m. UTC | #2
Hi Junio,

On Sun, 7 Oct 2018, Junio C Hamano wrote:

> "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
> writes:
> 
> > Note: while this patch targets pk/rebase-in-c-6-final, it will not work
> > correctly without ag/rebase-i-in-c. So my suggestion is to rewrite the 
> > pk/rebas-in-c-6-final branch by first merging ag/rebase-i-in-c, then
> > applying this here patch, and only then cherry-pick "rebase: default to
> > using the builtin rebase".
> 
> Is this a stale comment in the context of v3, where we pretty much
> know how the resulting topic should intertwine with other topics?  I
> am trying to see if I have do to anything differently this time, or
> just replacing the single commit while keeping the structure around
> that commit the same is fine.

Just replacing the single commit. For technical reasons, I still have to
target pk/rebase-in-c-6-final in my branch.

> Also, I see there is a new iteration v8 of ag/rebase-i-in-c on the
> list, sent on Sep 27th (you were CC'ed but I suspect it was before
> you came back).  Are you happy with that update?

To be quite honest, I did not yet have time to look over it, but I
verified that it has my suggested fix for the -S option.

Ciao,
Dscho