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

Re: [PATCH v4 3/6] rebase -i: support --committer-date-is-author-date

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
Oct 24, 2019, 13:28 UTC
Message-ID
<103fc38d-48b4-c81f-a0ef-5163a1018e88@gmail.com>
In-Reply-To
<20190907115034.14933-4-rohit.ashiwal265@gmail.com>
Hi Rohit
On 07/09/2019 12:50, Rohit Ashiwal wrote:
Show 29 quoted lines
> rebase am already has this flag to "lie" about the committer date
> by changing it to the author date. Let's add the same for
> interactive machinery.
> [...]> diff --git a/sequencer.c b/sequencer.c
> index adeff2561e..fd925f2d72 100644
> --- a/sequencer.c
> +++ b/sequencer.c
> @@ -147,6 +147,7 @@ static GIT_PATH_FUNC(rebase_path_refs_to_delete, "rebase-merge/refs-to-delete")
>    * command-line.
>    */
>   static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
> +static GIT_PATH_FUNC(rebase_path_cdate_is_adate, "rebase-merge/cdate_is_adate")
>   static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
>   static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
>   static GIT_PATH_FUNC(rebase_path_quiet, "rebase-merge/quiet")
> @@ -879,6 +880,17 @@ static char *get_author(const char *message)
>   	return NULL;
>   }
>   
> +/* Returns a "date" string that needs to be free()'d by the caller */
> +static char *read_author_date_or_null(void)
> +{
> +	char *date;
> +
> +	if (read_author_script(rebase_path_author_script(),
> +			       NULL, NULL, &date, 0))
> +		return NULL;
> +	return date;
> +}

This function and the hunk below are untested according to Stolee's latest test email [1]. We need a test that gets the sequencer to fork 'git commit' rewording a commit should do that.

Best Wishes
Phillip

[1] https://public-inbox.org/git/ed8e65a2-72e8-210c-d4a4-eacdb5c7b0e8@gmail.com/

Show 181 quoted lines
>   static const char staged_changes_advice[] =
>   N_("you have staged changes in your working tree\n"
>   "If these changes are meant to be squashed into the previous commit, run:\n"
> @@ -938,6 +950,24 @@ static int run_git_commit(struct repository *r,
>   
>   	cmd.git_cmd = 1;
>   
> +        if (opts->committer_date_is_author_date) {
> +	        int res = -1;
> +	        struct strbuf datebuf = STRBUF_INIT;
> +	        char *date = read_author_date_or_null();
> +
> +	        if (!date)
> +	                return -1;
> +
> +	        strbuf_addf(&datebuf, "@%s", date);
> +	        res = setenv("GIT_COMMITTER_DATE", datebuf.buf, 1);
> +
> +		strbuf_release(&datebuf);
> +	        free(date);
> +
> +	        if (res)
> +	                return -1;
> +        }
> +
>   	if (is_rebase_i(opts) && read_env_script(&cmd.env_array)) {
>   		const char *gpg_opt = gpg_sign_opt_quoted(opts);
>   
> @@ -1331,7 +1361,6 @@ static int try_to_commit(struct repository *r,
>   
>   	if (parse_head(r, &current_head))
>   		return -1;
> -
>   	if (flags & AMEND_MSG) {
>   		const char *exclude_gpgsig[] = { "gpgsig", NULL };
>   		const char *out_enc = get_commit_output_encoding();
> @@ -1359,6 +1388,26 @@ static int try_to_commit(struct repository *r,
>   		commit_list_insert(current_head, &parents);
>   	}
>   
> +	if (opts->committer_date_is_author_date) {
> +		int len = strlen(author);
> +		struct ident_split ident;
> +		struct strbuf date = STRBUF_INIT;
> +
> +		if (split_ident_line(&ident, author, len) < 0)
> +			return error(_("malformed ident line"));
> +		if (!ident.date_begin)
> +			return error(_("corrupted author without date information"));
> +
> +		strbuf_addf(&date, "@%.*s %.*s",
> +			    (int)(ident.date_end - ident.date_begin), ident.date_begin,
> +			    (int)(ident.tz_end - ident.tz_begin), ident.tz_begin);
> +		res = setenv("GIT_COMMITTER_DATE", date.buf, 1);
> +		strbuf_release(&date);
> +
> +		if (res)
> +			goto out;
> +	}
> +
>   	if (write_index_as_tree(&tree, r->index, r->index_file, 0, NULL)) {
>   		res = error(_("git write-tree failed to write a tree"));
>   		goto out;
> @@ -2473,6 +2522,11 @@ static int read_populate_opts(struct replay_opts *opts)
>   			opts->signoff = 1;
>   		}
>   
> +		if (file_exists(rebase_path_cdate_is_adate())) {
> +			opts->allow_ff = 0;
> +			opts->committer_date_is_author_date = 1;
> +		}
> +
>   		if (file_exists(rebase_path_reschedule_failed_exec()))
>   			opts->reschedule_failed_exec = 1;
>   
> @@ -2555,6 +2609,8 @@ int write_basic_state(struct replay_opts *opts, const char *head_name,
>   		write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts->gpg_sign);
>   	if (opts->signoff)
>   		write_file(rebase_path_signoff(), "--signoff\n");
> +	if (opts->committer_date_is_author_date)
> +		write_file(rebase_path_cdate_is_adate(), "%s", "");
>   	if (opts->reschedule_failed_exec)
>   		write_file(rebase_path_reschedule_failed_exec(), "%s", "");
>   
> @@ -3752,7 +3808,8 @@ static int pick_commits(struct repository *r,
>   	setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
>   	if (opts->allow_ff)
>   		assert(!(opts->signoff || opts->no_commit ||
> -				opts->record_origin || opts->edit));
> +				opts->record_origin || opts->edit ||
> +				opts->committer_date_is_author_date));
>   	if (read_and_refresh_cache(r, opts))
>   		return -1;
>   
> diff --git a/sequencer.h b/sequencer.h
> index 6704acbb9c..e3881e9275 100644
> --- a/sequencer.h
> +++ b/sequencer.h
> @@ -43,6 +43,7 @@ struct replay_opts {
>   	int verbose;
>   	int quiet;
>   	int reschedule_failed_exec;
> +	int committer_date_is_author_date;
>   
>   	int mainline;
>   
> diff --git a/t/t3422-rebase-incompatible-options.sh b/t/t3422-rebase-incompatible-options.sh
> index 4342f79eea..7402f7e3da 100755
> --- a/t/t3422-rebase-incompatible-options.sh
> +++ b/t/t3422-rebase-incompatible-options.sh
> @@ -61,7 +61,6 @@ test_rebase_am_only () {
>   }
>   
>   test_rebase_am_only --whitespace=fix
> -test_rebase_am_only --committer-date-is-author-date
>   test_rebase_am_only -C4
>   
>   test_expect_success REBASE_P '--preserve-merges incompatible with --signoff' '
> diff --git a/t/t3433-rebase-options-compatibility.sh b/t/t3433-rebase-options-compatibility.sh
> index 2e16e00a9d..6c1fbab4d8 100755
> --- a/t/t3433-rebase-options-compatibility.sh
> +++ b/t/t3433-rebase-options-compatibility.sh
> @@ -7,6 +7,9 @@ test_description='tests to ensure compatibility between am and interactive backe
>   
>   . ./test-lib.sh
>   
> +GIT_AUTHOR_DATE="1999-04-02T08:03:20+05:30"
> +export GIT_AUTHOR_DATE
> +
>   # This is a special case in which both am and interactive backends
>   # provide the same output. It was done intentionally because
>   # both the backends fall short of optimal behaviour.
> @@ -26,8 +29,13 @@ test_expect_success 'setup' '
>   	EOF
>   	git commit -am "update file" &&
>   	git tag side &&
> +	test_commit commit1 foo foo1 &&
> +	test_commit commit2 foo foo2 &&
> +	test_commit commit3 foo foo3 &&
>   
>   	git checkout --orphan master &&
> +	git rm --cached foo &&
> +	rm foo &&
>   	sed -e "s/^|//" >file <<-\EOF &&
>   	|line 1
>   	|        line 2
> @@ -62,4 +70,33 @@ test_expect_success '--ignore-whitespace works with interactive backend' '
>   	test_cmp expect file
>   '
>   
> +test_expect_success '--committer-date-is-author-date works with am backend' '
> +	git commit --amend &&
> +	git rebase --committer-date-is-author-date HEAD^ &&
> +	git show HEAD --pretty="format:%ai" >authortime &&
> +	git show HEAD --pretty="format:%ci" >committertime &&
> +	test_cmp authortime committertime
> +'
> +
> +test_expect_success '--committer-date-is-author-date works with interactive backend' '
> +	git commit --amend &&
> +	git rebase -i --committer-date-is-author-date HEAD^ &&
> +	git show HEAD --pretty="format:%ai" >authortime &&
> +	git show HEAD --pretty="format:%ci" >committertime &&
> +	test_cmp authortime committertime
> +'
> +
> +test_expect_success '--committer-date-is-author-date works with rebase -r' '
> +	git checkout side &&
> +	git merge commit3 &&
> +	git rebase -r --root --committer-date-is-author-date &&
> +	git rev-list HEAD >rev_list &&
> +	while read HASH
> +	do
> +		git show $HASH --pretty="format:%ai" >authortime
> +		git show $HASH --pretty="format:%ci" >committertime
> +		test_cmp authortime committertime
> +	done <rev_list
> +'
> +
>   test_done
> 
Previous: Rohit AshiwalNext: Rohit Ashiwal
Message 72 of 96 in “[GSoC][PATCHl 0/6] rebase -i: support more options”
  1. Rohit AshiwalAug 6, 2019
  2. [GSoC][PATCHl 1/6] rebase -i: add --ignore-whitespace flagRohit Ashiwal, Aug 6, 2019
  3. Junio C HamanoAug 7, 2019
  4. Rohit AshiwalAug 7, 2019
  5. Phillip WoodAug 8, 2019
  6. Rohit AshiwalAug 12, 2019
  7. [GSoC][PATCHl 3/6] rebase -i: support --committer-date-is-author-dateRohit Ashiwal, Aug 6, 2019
  8. Phillip WoodAug 8, 2019
  9. Junio C HamanoAug 8, 2019
  10. [GSoC][PATCHl 2/6] sequencer: add NULL checks under read_author_scriptRohit Ashiwal, Aug 6, 2019
  11. [GSoC][PATCHl 4/6] sequencer: rename amend_author to author_to_renameRohit Ashiwal, Aug 6, 2019
  12. Phillip WoodAug 8, 2019
  13. [GSoC][PATCHl 5/6] rebase -i: support --ignore-dateRohit Ashiwal, Aug 6, 2019
  14. Johannes SchindelinAug 7, 2019
  15. Junio C HamanoAug 7, 2019
  16. Rohit AshiwalAug 7, 2019
  17. Phillip WoodAug 8, 2019
  18. Phillip WoodAug 8, 2019
  19. [GSoC][PATCHl 6/6] rebase: add --author-date-is-committer-dateRohit Ashiwal, Aug 6, 2019
  20. Phillip WoodAug 8, 2019
  21. [GSoC][PATCH v2 0/6] rebase -i: support more optionsRohit Ashiwal, Aug 12, 2019
  22. [GSoC][PATCH v2 1/6] rebase -i: add --ignore-whitespace flagRohit Ashiwal, Aug 12, 2019
  23. Phillip WoodAug 13, 2019
  24. [GSoC][PATCH v2 2/6] sequencer: add NULL checks under read_author_scriptRohit Ashiwal, Aug 12, 2019
  25. [GSoC][PATCH v2 3/6] rebase -i: support --committer-date-is-author-dateRohit Ashiwal, Aug 12, 2019
  26. Phillip WoodAug 13, 2019
  27. Phillip WoodAug 13, 2019
  28. Junio C HamanoAug 13, 2019
  29. Phillip WoodAug 14, 2019
  30. Phillip WoodAug 13, 2019
  31. [GSoC][PATCH v2 4/6] sequencer: rename amend_author to author_to_renameRohit Ashiwal, Aug 12, 2019
  32. Phillip WoodAug 13, 2019
  33. [GSoC][PATCH v2 5/6] rebase -i: support --ignore-dateRohit Ashiwal, Aug 12, 2019
  34. Phillip WoodAug 13, 2019
  35. Junio C HamanoAug 13, 2019
  36. Phillip WoodAug 14, 2019
  37. Junio C HamanoAug 13, 2019
  38. Phillip WoodAug 14, 2019
  39. Junio C HamanoAug 14, 2019
  40. Phillip WoodAug 17, 2019
  41. [GSoC][PATCH v2 6/6] rebase: add --author-date-is-committer-dateRohit Ashiwal, Aug 12, 2019
  42. Junio C HamanoAug 13, 2019
  43. 0/6 rebase -i: support more optionsRohit Ashiwal, Aug 20, 2019
  44. 1/6 rebase -i: add --ignore-whitespace flagRohit Ashiwal, Aug 20, 2019
  45. Phillip WoodAug 20, 2019
  46. Rohit AshiwalAug 20, 2019
  47. 2/6 sequencer: add NULL checks under read_author_scriptRohit Ashiwal, Aug 20, 2019
  48. Junio C HamanoAug 23, 2019
  49. 3/6 rebase -i: support --committer-date-is-author-dateRohit Ashiwal, Aug 20, 2019
  50. Phillip WoodAug 20, 2019
  51. 4/6 sequencer: rename amend_author to author_to_renameRohit Ashiwal, Aug 20, 2019
  52. 5/6 rebase -i: support --ignore-dateRohit Ashiwal, Aug 20, 2019
  53. Phillip WoodAug 20, 2019
  54. Junio C HamanoAug 20, 2019
  55. Phillip WoodAug 20, 2019
  56. [GSoC][PATCH v2 6/6] rebase: add --author-date-is-committer-dateRohit Ashiwal, Aug 20, 2019
  57. Rohit AshiwalAug 20, 2019
  58. 6/6 rebase: add --reset-author-dateRohit Ashiwal, Aug 20, 2019
  59. Rohit AshiwalAug 20, 2019
  60. Phillip WoodAug 20, 2019
  61. Junio C HamanoAug 20, 2019
  62. Phillip WoodAug 20, 2019
  63. 0/6 rebase -i: support more optionsRohit Ashiwal, Sep 7, 2019
  64. 1/6 rebase -i: add --ignore-whitespace flagRohit Ashiwal, Sep 7, 2019
  65. Phillip WoodOct 4, 2019
  66. Elijah NewrenOct 5, 2019
  67. Rohit AshiwalOct 6, 2019
  68. 2/6 sequencer: allow callers of read_author_script() to ignore fieldsRohit Ashiwal, Sep 7, 2019
  69. 3/6 rebase -i: support --committer-date-is-author-dateRohit Ashiwal, Sep 7, 2019
  70. Phillip WoodOct 4, 2019
  71. Rohit AshiwalOct 6, 2019
  72. Phillip WoodOct 24, 2019
  73. 4/6 sequencer: rename amend_author to author_to_renameRohit Ashiwal, Sep 7, 2019
  74. 5/6 rebase -i: support --ignore-dateRohit Ashiwal, Sep 7, 2019
  75. Rohit AshiwalSep 7, 2019
  76. Phillip WoodSep 27, 2019
  77. Rohit AshiwalOct 6, 2019
  78. Phillip WoodOct 24, 2019
  79. 6/6 rebase: add --reset-author-dateRohit Ashiwal, Sep 7, 2019
  80. Junio C HamanoSep 9, 2019
  81. Phillip WoodSep 9, 2019
  82. Junio C HamanoSep 9, 2019
  83. 0/6 rebase -i: support more optionsRohit Ashiwal, Nov 1, 2019
  84. 1/6 rebase -i: add --ignore-whitespace flagRohit Ashiwal, Nov 1, 2019
  85. 2/6 sequencer: allow callers of read_author_script() to ignore fieldsRohit Ashiwal, Nov 1, 2019
  86. 3/6 rebase -i: support --committer-date-is-author-dateRohit Ashiwal, Nov 1, 2019
  87. 4/6 sequencer: rename amend_author to author_to_renameRohit Ashiwal, Nov 1, 2019
  88. 5/6 rebase -i: support --ignore-dateRohit Ashiwal, Nov 1, 2019
  89. Junio C HamanoNov 2, 2019
  90. Junio C HamanoNov 2, 2019
  91. 6/6 rebase: add --reset-author-dateRohit Ashiwal, Nov 1, 2019
  92. Junio C HamanoNov 2, 2019
  93. Junio C HamanoNov 21, 2019
  94. Alban GruinNov 21, 2019
  95. Junio C HamanoNov 22, 2019
  96. Phillip WoodNov 28, 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.