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

Re: [PATCH v3 4/4] builtin/rebase: support running "git rebase <upstream>"

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 6, 2018, 21:30 UTC
Message-ID
<xmqqsh4whx21.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<20180706120815.17851-5-predatoramigo@gmail.com>
Pratik Karki <predatoramigo@gmail.com> writes:
Show 25 quoted lines
> +static void add_var(struct strbuf *buf, const char *name, const char *value)
> +{
> +	strbuf_addstr(buf, name);
> +	strbuf_addstr(buf, "=");
> +	sq_quote_buf(buf, value);
> +	strbuf_addstr(buf, "; ");
> +}
> +
> +static int run_specific_rebase(struct rebase_options *opts)
> +{
> +	const char *argv[] = { NULL, NULL };
> +	struct strbuf script_snippet = STRBUF_INIT;
> +	int status;
> +	const char *backend, *backend_func;
> +
> +	add_var(&script_snippet, "GIT_DIR", absolute_path(get_git_dir()));
> +
> +	add_var(&script_snippet, "upstream_name", opts->upstream_name);
> +	add_var(&script_snippet, "upstream",
> +				 oid_to_hex(&opts->upstream->object.oid));
> +	add_var(&script_snippet, "head_name", opts->head_name);
> +	add_var(&script_snippet, "orig_head", oid_to_hex(&opts->orig_head));
> +	add_var(&script_snippet, "onto", oid_to_hex(&opts->onto->object.oid));
> +	add_var(&script_snippet, "onto_name", opts->onto_name);
> +	add_var(&script_snippet, "revisions", opts->revisions);
Looks alright.
Show 7 quoted lines
> +	switch (opts->type) {
> +	case REBASE_AM:
> +...
> +	default:
> +		BUG("Unhandled rebase type %d", opts->type);
> +		break;
> +	}
Better.
Show 6 quoted lines
> +	strbuf_addf(&script_snippet,
> +		    ". git-rebase--common && . %s && %s",
> +		    backend, backend_func);
> +	argv[0] = script_snippet.buf;
> +
> +	status = run_command_v_opt(argv, RUN_USING_SHELL);

This used to use run_command_v_opt_cd_env() to pass extra environment but now we can do a simpler one. As cmd_rebase() has called setup_git_directory() to chdir to the top level of the working tree, we just want to .-source the backend within the current working directory, so loss of cd is also good ;-)

Show 20 quoted lines
> +	if (status == 0)
> +		finish_rebase(opts);
> +	else if (status == 2) {
> +		struct strbuf dir = STRBUF_INIT;
> +
> +		apply_autostash();
> +		strbuf_addstr(&dir, opts->state_dir);
> +		remove_dir_recursively(&dir, 0);
> +		strbuf_release(&dir);
> +		die("Nothing to do");
> +	}
> +
> +	strbuf_release(&script_snippet);
> +
> +	return status ? -1 : 0;
> +}
> +
>  int cmd_rebase(int argc, const char **argv, const char *prefix)
>  {
> +	struct rebase_options options = { -1 };

The first field of this struct is "enum rebase_type" defined without "REBASE_TYPE_UNSPECIFIED = -1" in it. It probably makes sense to add that constant there so that you can spell this value out.

Show 16 quoted lines
> @@ -52,5 +194,98 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>  	trace_repo_setup(prefix);
>  	setup_work_tree();
>  
> -	die("TODO");
> +	options.type = REBASE_AM;
> +
> +	switch (options.type) {
> +	case REBASE_AM:
> +		options.state_dir = apply_dir();
> +		break;
> +	case REBASE_MERGE:
> +	case REBASE_INTERACTIVE:
> +	case REBASE_PRESERVE_MERGES:
> +		options.state_dir = merge_dir();
> +		break;

Have "default:" here that barfs with BUG() to help future introduction of bugs as the code to set options.type grows complexity over time.

Show 31 quoted lines
> +	}
> +	if (!options.root) {
> +		if (argc != 2)
> +			die("TODO: handle @{upstream}");
> +		else {
> +			options.upstream_name = argv[1];
> +			argc--;
> +			argv++;
> +			if (!strcmp(options.upstream_name, "-"))
> +				options.upstream_name = "@{-1}";
> +		}
> +		options.upstream = peel_committish(options.upstream_name);
> +		if (!options.upstream)
> +			die(_("invalid upstream '%s'"), options.upstream_name);
> +	} else
> +		die("TODO: upstream for --root");
> +
> +	/* Make sure the branch to rebase onto is valid. */
> +	if (!options.onto_name)
> +		options.onto_name = options.upstream_name;
> +	if (strstr(options.onto_name, "...")) {
> +		die("TODO");
> +	} else {
> +		options.onto = peel_committish(options.onto_name);
> +		if (!options.onto)
> +			die(_("Does not point to a valid commit '%s'"),
> +				options.onto_name);
> +	}
> +
> +	/*
> +	* If the branch to rebase is given, that is the branch we will rebase
Style: align asterisks.
Show 6 quoted lines
> +	* branch_name -- branch/commit being rebased, or HEAD (already detached)
> +	* orig_head -- commit object name of tip of the branch before rebasing
> +	* head_name -- refs/heads/<that-branch> or "detached HEAD"
> +	*/
> +	if (argc > 1)
> +		 die ("TODO: handle switch_to");
Style: no SP between "die" and "("
Previous: Pratik KarkiNext: Christian Couder
Message 31 of 61 in “rebase: rewrite rebase in C”
  1. Pratik KarkiJun 28, 2018
  2. 1/5 Start TODO-rebase.shPratik Karki, Jun 28, 2018
  3. Pratik KarkiJun 28, 2018
  4. 2/5 rebase: start implementing it as a builtinPratik Karki, Jun 28, 2018
  5. Christian CouderJun 28, 2018
  6. Stefan BellerJun 28, 2018
  7. 3/5 rebase: refactor common shell functions into their own filePratik Karki, Jun 28, 2018
  8. Christian CouderJun 28, 2018
  9. Stefan BellerJun 28, 2018
  10. 4/5 sequencer: refactor the code to detach HEAD to checkout.cPratik Karki, Jun 28, 2018
  11. Christian CouderJun 28, 2018
  12. Stefan BellerJun 28, 2018
  13. 5/5 builtin/rebase: support running "git rebase <upstream>"Pratik Karki, Jun 28, 2018
  14. Stefan BellerJun 28, 2018
  15. [GSoC] [PATCH v2 0/4] rebase: rewrite rebase in CPratik Karki, Jul 2, 2018
  16. 1/4 rebase: start implementing it as a builtinPratik Karki, Jul 2, 2018
  17. Junio C HamanoJul 3, 2018
  18. 2/4 rebase: refactor common shell functions into their own filePratik Karki, Jul 2, 2018
  19. Junio C HamanoJul 3, 2018
  20. 3/4 sequencer: refactor the code to detach HEAD to checkout.cPratik Karki, Jul 2, 2018
  21. Junio C HamanoJul 3, 2018
  22. 4/4 builtin/rebase: support running "git rebase <upstream>"Pratik Karki, Jul 2, 2018
  23. Junio C HamanoJul 3, 2018
  24. [GSoC] [PATCH v3 0/4] rebase: rewrite rebase in CPratik Karki, Jul 6, 2018
  25. 1/4 rebase: start implementing it as a builtinPratik Karki, Jul 6, 2018
  26. Junio C HamanoJul 6, 2018
  27. 2/4 rebase: refactor common shell functions into their own filePratik Karki, Jul 6, 2018
  28. Johannes SchindelinJul 6, 2018
  29. 3/4 sequencer: refactor the code to detach HEAD to checkout.cPratik Karki, Jul 6, 2018
  30. 4/4 builtin/rebase: support running "git rebase <upstream>"Pratik Karki, Jul 6, 2018
  31. Junio C HamanoJul 6, 2018
  32. Christian CouderJul 7, 2018
  33. Johannes SchindelinJul 7, 2018
  34. Junio C HamanoJul 7, 2018
  35. Beat BolliJul 17, 2018
  36. Beat BolliJul 17, 2018
  37. [GSoC] [PATCH v4 0/4] rebase: rewrite rebase in CPratik Karki, Jul 8, 2018
  38. 1/4 rebase: start implementing it as a builtinPratik Karki, Jul 8, 2018
  39. Andrei RybakJul 9, 2018
  40. Eric SunshineJul 9, 2018
  41. Pratik KarkiJul 9, 2018
  42. Duy NguyenJul 22, 2018
  43. 2/4 rebase: refactor common shell functions into their own filePratik Karki, Jul 8, 2018
  44. 3/4 sequencer: refactor the code to detach HEAD to checkout.cPratik Karki, Jul 8, 2018
  45. Johannes SchindelinJul 8, 2018
  46. Pratik KarkiJul 9, 2018
  47. Junio C HamanoJul 9, 2018
  48. Pratik KarkiJul 9, 2018
  49. 4/4 builtin/rebase: support running "git rebase <upstream>"Pratik Karki, Jul 8, 2018
  50. Johannes SchindelinJul 8, 2018
  51. Johannes SchindelinJul 8, 2018
  52. [GSoC] [PATCH v5 0/3] rebase: rewrite rebase in CPratik Karki, Jul 30, 2018
  53. 1/3 rebase: start implementing it as a builtinPratik Karki, Jul 30, 2018
  54. 2/3 rebase: refactor common shell functions into their own filePratik Karki, Jul 30, 2018
  55. 3/3 builtin/rebase: support running "git rebase <upstream>"Pratik Karki, Jul 30, 2018
  56. Pratik KarkiAug 1, 2018
  57. [GSoC] [PATCH v6 0/3] rebase: rewrite rebase in CPratik Karki, Aug 6, 2018
  58. [GSoC] [PATCH v6 3/3] builtin/rebase: support running "git rebase <upstream>"Pratik Karki, Aug 6, 2018
  59. Junio C HamanoAug 16, 2018
  60. [GSoC] [PATCH v6 2/3] rebase: refactor common shell functions into their own filePratik Karki, Aug 6, 2018
  61. [GSoC] [PATCH v6 1/3] rebase: start implementing it as a builtinPratik Karki, Aug 6, 2018

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.