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

[PATCH v4 0/6] rebase -i: support more options

From
Rohit Ashiwal <rohit.ashiwal265@gmail.com>
Date
Sep 7, 2019, 11:50 UTC
Message-ID
<20190907115034.14933-1-rohit.ashiwal265@gmail.com>
In-Reply-To
<20190806173638.17510-1-rohit.ashiwal265@gmail.com>

Following the suggestion of Phillip I've rebased my patch on master (745f681289) and cherry-picking b0a3186140.

Base: 745f6812895b31c02b29bdfe4ae8e5498f776c26
      with cherry-picked b0a3186140dbc7bd64cbc6ef733386a0f1eb6a4d
Outline:
  2/6:
      - Change commit message and description
  3/6:
      - add test for rebase -r
      - add strict bounds while pushing ident date
  5/6:
      - bug fix: (following am's code) if --ignore-date is provided,
                 we should setenv GIT_COMMITTER_DATE to "".
      - catch error when ident line is malformed
      - push GIT_AUTHOR_DATE instead of providing it with --date so
        that "git merge" can also use push_dates function
      - add test for rebase -r
Rohit Ashiwal (6):
  rebase -i: add --ignore-whitespace flag
  sequencer: allow callers of read_author_script() to ignore fields
  rebase -i: support --committer-date-is-author-date
  sequencer: rename amend_author to author_to_rename
  rebase -i: support --ignore-date
  rebase: add --reset-author-date
 Documentation/git-rebase.txt            |  26 +++--
 builtin/rebase.c                        |  55 +++++++---
 sequencer.c                             | 134 +++++++++++++++++++++--
 sequencer.h                             |   2 +
 t/t3422-rebase-incompatible-options.sh  |   2 -
 t/t3433-rebase-options-compatibility.sh | 137 ++++++++++++++++++++++++
 6 files changed, 328 insertions(+), 28 deletions(-)
 create mode 100755 t/t3433-rebase-options-compatibility.sh
Range-diff:
--- snip ---
 1:  e82ed8cad5 = 49:  77af1d66db rebase -i: add --ignore-whitespace flag
 2:  209057b361 ! 50:  1f7f1407b2 sequencer: add NULL checks under read_author_script
    @@ -1,19 +1,14 @@
     Author: Rohit Ashiwal <rohit.ashiwal265@gmail.com>
     
    -    sequencer: add NULL checks under read_author_script
    +    sequencer: allow callers of read_author_script() to ignore fields
     
    -    read_author_script reads name, email and author date from the author
    -    script. However, it does not check if the arguments are NULL. Adding
    -    NULL checks will allow us to selectively get the required value, for
    -    example:
    +    The current callers of the read_author_script() function read name,
    +    email and date from the author script.  Allow callers to signal that
    +    they are not interested in some among these three fields by passing
    +    NULL.
     
    -        char *date;
    -        if (read_author_script(_path_, NULL, NULL, &date, _int_))
    -                die(_("failed to read author date"));
    -        /* needs to be free()'d */
    -        return date;
    -
    -    Add NULL checks for better control over the information retrieved.
    +    Note that fields that are ignored still must exist and be formatted
    +    correctly in the author script.
     
         Signed-off-by: Rohit Ashiwal <rohit.ashiwal265@gmail.com>
     
 3:  a4e6644ef8 ! 51:  cc1614154e rebase -i: support --committer-date-is-author-date
    @@ -128,35 +128,34 @@
     +	return date;
     +}
     +
    - /* Read author-script and return an ident line (author <email> timestamp) */
    - static const char *read_author_ident(struct strbuf *buf)
    - {
    + 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"
     @@
    - {
    - 	struct child_process cmd = CHILD_PROCESS_INIT;
      
    -+	if (opts->committer_date_is_author_date) {
    -+		size_t len;
    -+		int res = -1;
    -+		struct strbuf datebuf = STRBUF_INIT;
    -+		char *date = read_author_date_or_null();
    + 	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;
    ++	        if (!date)
    ++	                return -1;
     +
    -+		strbuf_addf(&datebuf, "@%s", date);
    -+		free(date);
    ++	        strbuf_addf(&datebuf, "@%s", date);
    ++	        res = setenv("GIT_COMMITTER_DATE", datebuf.buf, 1);
     +
    -+		date = strbuf_detach(&datebuf, &len);
    -+		res = setenv("GIT_COMMITTER_DATE", date, 1);
    -+		free(date);
    ++		strbuf_release(&datebuf);
    ++	        free(date);
     +
    -+		if (res)
    -+			return -1;
    -+	}
    - 	if ((flags & CREATE_ROOT_COMMIT) && !(flags & AMEND_MSG)) {
    - 		struct strbuf msg = STRBUF_INIT, script = STRBUF_INIT;
    - 		const char *author = NULL;
    ++	        if (res)
    ++	                return -1;
    ++        }
    ++
    + 	if (is_rebase_i(opts) && read_env_script(&cmd.env_array)) {
    + 		const char *gpg_opt = gpg_sign_opt_quoted(opts);
    + 
     @@
      
      	if (parse_head(r, &current_head))
    @@ -174,14 +173,19 @@
     +		struct ident_split ident;
     +		struct strbuf date = STRBUF_INIT;
     +
    -+		split_ident_line(&ident, author, len);
    -+
    ++		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", ident.date_begin);
    -+		setenv("GIT_COMMITTER_DATE", date.buf, 1);
    ++		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)) {
    @@ -256,6 +260,20 @@
      # 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.
    +@@
    + 	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
     @@
      	test_cmp expect file
      '
    @@ -275,5 +293,18 @@
     +	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
 4:  6ac1885c54 = 52:  9e92c79bda sequencer: rename amend_author to author_to_rename
 5:  a69749dd67 ! 53:  fc68e55e78 rebase -i: support --ignore-date
    @@ -83,8 +83,10 @@
      	}
      
     -	if (options.committer_date_is_author_date)
    -+	if (options.ignore_date)
    ++	if (options.ignore_date) {
     +		options.committer_date_is_author_date = 0;
    ++		setenv("GIT_COMMITTER_DATE", "", 1);
    ++	}
     +	if (options.committer_date_is_author_date ||
     +	    options.ignore_date)
      		options.flags |= REBASE_FORCE;
    @@ -110,7 +112,7 @@
      static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
      static GIT_PATH_FUNC(rebase_path_quiet, "rebase-merge/quiet")
     @@
    - 	return buf->buf;
    + 	return date;
      }
      
     +/* Construct a free()able author string with current time as the author date */
    @@ -120,7 +122,10 @@
     +	struct ident_split ident;
     +	struct strbuf new_author = STRBUF_INIT;
     +
    -+	split_ident_line(&ident, author, len);
    ++	if (split_ident_line(&ident, author, len) < 0) {
    ++		error(_("malformed ident line"));
    ++		return NULL;
    ++	}
     +	len = ident.mail_end - ident.name_begin + 1;
     +
     +	strbuf_addf(&new_author, "%.*s ", len, author);
    @@ -134,7 +139,7 @@
     +	struct strbuf date = STRBUF_INIT;
     +
     +	strbuf_addf(&date, "@%"PRIuMAX, (uintmax_t)now);
    -+	argv_array_pushf(&child->args, "--date=%s", date.buf);
    ++	argv_array_pushf(&child->env_array, "GIT_AUTHOR_DATE=%s", date.buf);
     +	argv_array_pushf(&child->env_array, "GIT_COMMITTER_DATE=%s", date.buf);
     +	strbuf_release(&date);
     +}
    @@ -143,28 +148,6 @@
      N_("you have staged changes in your working tree\n"
      "If these changes are meant to be squashed into the previous commit, run:\n"
     @@
    - 
    - 		if (res <= 0)
    - 			res = error_errno(_("could not read '%s'"), defmsg);
    --		else
    -+		else {
    -+			if (opts->ignore_date) {
    -+				char *new_author = ignore_author_date(author);
    -+				if (!author)
    -+					BUG("ignore-date can only be used with "
    -+					    "rebase, which must set the author "
    -+					    "before committing the tree");
    -+				free((void *)author);
    -+				author = new_author;
    -+			}
    - 			res = commit_tree(msg.buf, msg.len, cache_tree_oid,
    - 					  NULL, &root_commit, author,
    - 					  opts->gpg_sign);
    -+		}
    - 
    - 		strbuf_release(&msg);
    - 		strbuf_release(&script);
    -@@
      		argv_array_push(&cmd.args, "--amend");
      	if (opts->gpg_sign)
      		argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
    @@ -179,6 +162,10 @@
      
     +	if (opts->ignore_date) {
     +		author = ignore_author_date(author);
    ++		if (!author) {
    ++			res = -1;
    ++			goto out;
    ++		}
     +		free(author_to_free);
     +		author_to_free = (char *)author;
     +	}
    @@ -242,7 +229,7 @@
      --- a/t/t3433-rebase-options-compatibility.sh
      +++ b/t/t3433-rebase-options-compatibility.sh
     @@
    - 	test_cmp authortime committertime
    + 	done <rev_list
      '
      
     +# Checking for +0000 in author time is enough since default
    @@ -252,13 +239,32 @@
     +	git commit --amend --date="$GIT_AUTHOR_DATE" &&
     +	git rebase --ignore-date HEAD^ &&
     +	git show HEAD --pretty="format:%ai" >authortime &&
    -+	grep "+0000" authortime
    ++	git show HEAD --pretty="format:%ci" >committertime &&
    ++	grep "+0000" authortime &&
    ++	grep "+0000" committertime
     +'
     +
     +test_expect_success '--ignore-date works with interactive backend' '
     +	git commit --amend --date="$GIT_AUTHOR_DATE" &&
     +	git rebase --ignore-date -i HEAD^ &&
     +	git show HEAD --pretty="format:%ai" >authortime &&
    -+	grep "+0000" authortime
    ++	git show HEAD --pretty="format:%ci" >committertime &&
    ++	grep "+0000" authortime &&
    ++	grep "+0000" committertime
     +'
    ++
    ++test_expect_success '--ignore-date works with rebase -r' '
    ++	git checkout side &&
    ++	git merge commit3 &&
    ++	git rebase -r --root --ignore-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
    ++		grep "+0000" authortime
    ++		grep "+0000" committertime
    ++	done <rev_list
    ++'
    ++
      test_done
 6:  210d15cca0 = 54:  396d5f16eb rebase: add --reset-author-date
-- 
2.21.0
Previous: Phillip WoodNext: Rohit Ashiwal
Message 63 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.