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

Re: [PATCH v2 08/11] rebase: remove redundant strbuf

From
René Scharfe <l.s.r@web.de>
Date
Sep 13, 2021, 18:34 UTC
Message-ID
<3c7c5560-2cae-a4cf-a298-6d77a3fb9226@web.de>
In-Reply-To
<ad3c4efc0272be8eee052a08731656a406f8f90b.1631546362.git.gitgitgadget@gmail.com>
Am 13.09.21 um 17:19 schrieb Phillip Wood via GitGitGadget:
> From: Phillip Wood <phillip.wood@dunelm.org.uk>
>
> There is already an strbuf that can be reused for creating messages.

Reminds me of a terrible joke from elementary school: In Peter's class everybody is called Klaus, except Franz -- his name is Michael.

Why would we want to use the same variable for multiple purposes? This makes the code harder to read. And the allocation overhead for these few cases should be negligible.

The most important question: Is this patch really needed to support tags (the purpose of this series)?

> msg is not freed if there is an error and there is a logic error where
> we call strbuf_release(&msg) followed by strbuf_reset(&msg) and
> strbuf_addf(&msg).
strbuf_reset() after strbuf_release() is redundant but legal.
Show 56 quoted lines
>
> Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
> ---
>  builtin/rebase.c | 14 ++++++--------
>  1 file changed, 6 insertions(+), 8 deletions(-)
>
> diff --git a/builtin/rebase.c b/builtin/rebase.c
> index 6138009d6e4..69a67ab1252 100644
> --- a/builtin/rebase.c
> +++ b/builtin/rebase.c
> @@ -1299,7 +1299,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>  	int ret, flags, total_argc, in_progress = 0;
>  	int keep_base = 0;
>  	int ok_to_skip_pre_rebase = 0;
> -	struct strbuf msg = STRBUF_INIT;
>  	struct strbuf revisions = STRBUF_INIT;
>  	struct strbuf buf = STRBUF_INIT;
>  	struct object_id merge_base;
> @@ -2063,30 +2062,29 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>  		printf(_("First, rewinding head to replay your work on top of "
>  			 "it...\n"));
>
> -	strbuf_addf(&msg, "%s: checkout %s",
> +	strbuf_reset(&buf);
> +	strbuf_addf(&buf, "%s: checkout %s",
>  		    getenv(GIT_REFLOG_ACTION_ENVIRONMENT), options.onto_name);
>  	if (reset_head(the_repository, &options.onto->object.oid, "checkout", NULL,
>  		       RESET_HEAD_DETACH | RESET_ORIG_HEAD |
>  		       RESET_HEAD_RUN_POST_CHECKOUT_HOOK,
> -		       NULL, msg.buf, DEFAULT_REFLOG_ACTION))
> +		       NULL, buf.buf, DEFAULT_REFLOG_ACTION))
>  		die(_("Could not detach HEAD"));
> -	strbuf_release(&msg);
>
>  	/*
>  	 * If the onto is a proper descendant of the tip of the branch, then
>  	 * we just fast-forwarded.
>  	 */
> -	strbuf_reset(&msg);
> +	strbuf_reset(&buf);
>  	if (oideq(&merge_base, &options.orig_head)) {
>  		printf(_("Fast-forwarded %s to %s.\n"),
>  			branch_name, options.onto_name);
> -		strbuf_addf(&msg, "rebase finished: %s onto %s",
> +		strbuf_addf(&buf, "rebase finished: %s onto %s",
>  			options.head_name ? options.head_name : "detached HEAD",
>  			oid_to_hex(&options.onto->object.oid));
>  		reset_head(the_repository, NULL, "Fast-forwarded", options.head_name,
> -			   RESET_HEAD_REFS_ONLY, "HEAD", msg.buf,
> +			   RESET_HEAD_REFS_ONLY, "HEAD", buf.buf,
>  			   DEFAULT_REFLOG_ACTION);
> -		strbuf_release(&msg);
>  		ret = !!finish_rebase(&options);
>  		goto cleanup;
>  	}
>

msg is not released if die() is called, but that's OK; in all other cases it _is_ released in the old code.

I'd rather see the use of that multi-purpose "buf" reduced, e.g. we could simplify path-building like this in a few cases:

-       strbuf_reset(&buf);
-       strbuf_addf(&buf, "%s/applying", apply_dir());
-       if(file_exists(buf.buf))
+       if (file_exists(mkpath("%s/applying", apply_dir())))

Sure, this looks a bit lispy, but still better than the old code because there is no state to carry around and reset when "buf" is repurposed.

René
Previous: Phillip Wood via GitGitGadgetNext: Junio C Hamano
Message 29 of 55 in “rebase: dereference tags”
  1. 00/11 rebase: dereference tagsPhillip Wood via GitGitGadget, Sep 8, 2021
  2. 01/11 t3407: run tests in $TEST_DIRECTORYPhillip Wood via GitGitGadget, Sep 8, 2021
  3. Ævar Arnfjörð BjarmasonSep 8, 2021
  4. 02/11 t3407: use test_commitPhillip Wood via GitGitGadget, Sep 8, 2021
  5. Ævar Arnfjörð BjarmasonSep 8, 2021
  6. 03/11 t3407: use test_cmp_revPhillip Wood via GitGitGadget, Sep 8, 2021
  7. Ævar Arnfjörð BjarmasonSep 8, 2021
  8. Phillip WoodSep 8, 2021
  9. 04/11 t3407: rename a variablePhillip Wood via GitGitGadget, Sep 8, 2021
  10. 06/11 t3407: strengthen rebase --abort testsPhillip Wood via GitGitGadget, Sep 8, 2021
  11. Ævar Arnfjörð BjarmasonSep 8, 2021
  12. 05/11 t3407: use test_path_is_missingPhillip Wood via GitGitGadget, Sep 8, 2021
  13. 07/11 t3407: rework rebase --quit testsPhillip Wood via GitGitGadget, Sep 8, 2021
  14. 08/11 rebase: remove redundant strbufPhillip Wood via GitGitGadget, Sep 8, 2021
  15. Johannes SchindelinSep 9, 2021
  16. 09/11 rebase: use our standard error return valuePhillip Wood via GitGitGadget, Sep 8, 2021
  17. 11/11 rebase: dereference tagsPhillip Wood via GitGitGadget, Sep 8, 2021
  18. Ævar Arnfjörð BjarmasonSep 8, 2021
  19. 10/11 rebase: use lookup_commit_reference_by_name()Phillip Wood via GitGitGadget, Sep 8, 2021
  20. 00/11 rebase: dereference tagsPhillip Wood via GitGitGadget, Sep 13, 2021
  21. 01/11 t3407: run tests in $TEST_DIRECTORYPhillip Wood via GitGitGadget, Sep 13, 2021
  22. 02/11 t3407: use test_commitPhillip Wood via GitGitGadget, Sep 13, 2021
  23. 03/11 t3407: use test_cmp_revPhillip Wood via GitGitGadget, Sep 13, 2021
  24. 04/11 t3407: rename a variablePhillip Wood via GitGitGadget, Sep 13, 2021
  25. 05/11 t3407: use test_path_is_missingPhillip Wood via GitGitGadget, Sep 13, 2021
  26. 06/11 t3407: strengthen rebase --abort testsPhillip Wood via GitGitGadget, Sep 13, 2021
  27. 07/11 t3407: rework rebase --quit testsPhillip Wood via GitGitGadget, Sep 13, 2021
  28. 08/11 rebase: remove redundant strbufPhillip Wood via GitGitGadget, Sep 13, 2021
  29. René ScharfeSep 13, 2021
  30. Junio C HamanoSep 13, 2021
  31. Phillip WoodSep 14, 2021
  32. Phillip WoodSep 14, 2021
  33. 09/11 rebase: use our standard error return valuePhillip Wood via GitGitGadget, Sep 13, 2021
  34. 11/11 rebase: dereference tagsPhillip Wood via GitGitGadget, Sep 13, 2021
  35. Junio C HamanoSep 13, 2021
  36. Phillip WoodSep 14, 2021
  37. Phillip WoodSep 14, 2021
  38. Junio C HamanoSep 14, 2021
  39. Elijah NewrenSep 14, 2021
  40. Sergey OrganovSep 14, 2021
  41. Phillip WoodSep 14, 2021
  42. 10/11 rebase: use lookup_commit_reference_by_name()Phillip Wood via GitGitGadget, Sep 13, 2021
  43. Elijah NewrenSep 14, 2021
  44. 00/10 rebase: dereference tagsPhillip Wood via GitGitGadget, Sep 21, 2021
  45. 01/10 t3407: run tests in $TEST_DIRECTORYPhillip Wood via GitGitGadget, Sep 21, 2021
  46. 02/10 t3407: use test_commitPhillip Wood via GitGitGadget, Sep 21, 2021
  47. 03/10 t3407: use test_cmp_revPhillip Wood via GitGitGadget, Sep 21, 2021
  48. 04/10 t3407: rename a variablePhillip Wood via GitGitGadget, Sep 21, 2021
  49. 05/10 t3407: use test_path_is_missingPhillip Wood via GitGitGadget, Sep 21, 2021
  50. 06/10 t3407: strengthen rebase --abort testsPhillip Wood via GitGitGadget, Sep 21, 2021
  51. 07/10 t3407: rework rebase --quit testsPhillip Wood via GitGitGadget, Sep 21, 2021
  52. 08/10 rebase: use our standard error return valuePhillip Wood via GitGitGadget, Sep 21, 2021
  53. 09/10 rebase: use lookup_commit_reference_by_name()Phillip Wood via GitGitGadget, Sep 21, 2021
  54. 10/10 rebase: dereference tagsPhillip Wood via GitGitGadget, Sep 21, 2021
  55. Elijah NewrenSep 24, 2021

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.