All of lore.kernel.org
 help / color / mirror / Atom feed
From: Phillip Wood <phillip.wood123@gmail.com>
To: Elijah Newren <newren@gmail.com>,
	Phillip Wood <phillip.wood@dunelm.org.uk>
Cc: Git Mailing List <git@vger.kernel.org>,
	Johannes Schindelin <Johannes.Schindelin@gmx.de>,
	Junio C Hamano <gitster@pobox.com>,
	Rohit Ashiwal <rohit.ashiwal265@gmail.com>,
	Jonathan Nieder <jrnieder@gmail.com>
Subject: Re: [PATCH 4/6] rebase -i: fix --committer-date-is-author-date
Date: Tue, 7 Apr 2020 19:11:20 +0100	[thread overview]
Message-ID: <33f0ee87-7b6a-d48a-fd40-9c513a626a22@gmail.com> (raw)
In-Reply-To: <CABPp-BFu0mgNnxcuZZ_kBJ3WWXxCNSZAFdmq9zKT4H9i47sNsA@mail.gmail.com>

Hi Elijah

On 07/04/2020 16:05, Elijah Newren wrote:
> On Tue, Apr 7, 2020 at 7:11 AM Phillip Wood <phillip.wood123@gmail.com> wrote:
>>
>> From: Phillip Wood <phillip.wood@dunelm.org.uk>
>>
>> Johanathan Nieder reported that `rebase --committer-date-is-author-date`
>> failed with the error "invalid date format: @@2592000 +0000" when the
>> backend was switched to use the sequencer [1]. This is because when we
>> read the date from the author script file is already prefixed by '@' so
>> we do not need to add one. This did not show up in our tests
>> because once match_object_header_date() fails to match because of the
>> extra '@' parse_date_basic() strips the prefix and a date with more than
>> 8 digits is parsed as a number of seconds by match_digit().
>>
>> While fixing this I also noticed that we were not setting
>> GIT_COMMITTER_DATE in the environment when forking `git merge`. This was
>> untested. The tests we did have used commits where the author date was
>> the same as the current value $GIT_COMMITTER_DATE in the environment so
>> they did not test that we were actually using the author date when
>> creating the commit.
>>
>> As we have already read GIT_AUTHOR_DATE into cmd.env_array we now use
>> that rather than re-reading the author-script file. I've moved the code
>> that handles opts->ignore date so that all the code setting the child
>> environment is together and changed it so we no longer set
>> GIT_COMMITTER_DATE twice when --ignore-date is combined with
>> --committer-date-is-author-date.
>>
>> [1] https://lore.kernel.org/git/<20200110231436.GA24315@google.com>
>>
>> Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
>> ---
>>  sequencer.c                             | 68 ++++++++++---------------
>>  t/t3433-rebase-options-compatibility.sh | 29 +++++++++--
>>  2 files changed, 52 insertions(+), 45 deletions(-)
>>
>> diff --git a/sequencer.c b/sequencer.c
>> index 763ccbbc45..56f6e49289 100644
>> --- a/sequencer.c
>> +++ b/sequencer.c
>> @@ -880,17 +880,6 @@ 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;
>> -}
>> -
>>  /* Construct a free()able author string with current time as the author date */
>>  static char *ignore_author_date(const char *author)
>>  {
>> @@ -909,16 +898,20 @@ static char *ignore_author_date(const char *author)
>>         return strbuf_detach(&new_author, NULL);
>>  }
>>
>> -static void push_dates(struct child_process *child, int change_committer_date)
>> +static const char *author_date_from_env_array(const struct argv_array *env)
>>  {
>> -       time_t now = time(NULL);
>> -       struct strbuf date = STRBUF_INIT;
>> +       int i;
>> +       const char *date;
>>
>> -       strbuf_addf(&date, "@%"PRIuMAX, (uintmax_t)now);
>> -       argv_array_pushf(&child->env_array, "GIT_AUTHOR_DATE=%s", date.buf);
>> -       if (change_committer_date)
>> -               argv_array_pushf(&child->env_array, "GIT_COMMITTER_DATE=%s", date.buf);
>> -       strbuf_release(&date);
>> +       for (i = 0; i < env->argc; i++)
>> +               if (skip_prefix(env->argv[i],
>> +                               "GIT_AUTHOR_DATE=", &date))
>> +                       return date;
> 
> Is there any risk that GIT_AUTHOR_DATE=<somedate> will appear twice in
> @child->env_array ?  If there is, should we read through the whole
> list to make sure we take the last one?

read_author_script() errors out if GIT_AUTHOR_DATE is missing or given
more than once

Best Wishes

Phillip

> 
>> +       /*
>> +        * If GIT_AUTHOR_DATE is missing we should have already errored out when
>> +        * reading the script
>> +        */
>> +       BUG("GIT_AUTHOR_DATE missing from author script");
>>  }
>>
>>  static const char staged_changes_advice[] =
>> @@ -980,31 +973,19 @@ 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",
>> -                            opts->ignore_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);
>>
>>                 return error(_(staged_changes_advice),
>>                              gpg_opt, gpg_opt);
>>         }
>> +       if (opts->committer_date_is_author_date)
>> +               argv_array_pushf(&cmd.env_array, "GIT_COMMITTER_DATE=%s",
>> +                                opts->ignore_date ?
>> +                                "" :
>> +                                author_date_from_env_array(&cmd.env_array));
>> +       if (opts->ignore_date)
>> +               argv_array_push(&cmd.env_array, "GIT_AUTHOR_DATE=");
>>
>>         argv_array_push(&cmd.args, "commit");
>>
>> @@ -1014,8 +995,6 @@ static int run_git_commit(struct repository *r,
>>                 argv_array_push(&cmd.args, "--amend");
>>         if (opts->gpg_sign)
>>                 argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
>> -       if (opts->ignore_date)
>> -               push_dates(&cmd, opts->committer_date_is_author_date);
>>         if (defmsg)
>>                 argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
>>         else if (!(flags & EDIT_MSG))
>> @@ -3615,6 +3594,13 @@ static int do_merge(struct repository *r,
>>                         ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
>>                         goto leave_merge;
>>                 }
>> +               if (opts->committer_date_is_author_date)
>> +                       argv_array_pushf(&cmd.env_array, "GIT_COMMITTER_DATE=%s",
>> +                                        opts->ignore_date ?
>> +                                        "" :
>> +                                        author_date_from_env_array(&cmd.env_array));
>> +               if (opts->ignore_date)
>> +                       argv_array_push(&cmd.env_array, "GIT_AUTHOR_DATE=");
>>
>>                 cmd.git_cmd = 1;
>>                 argv_array_push(&cmd.args, "merge");
>> @@ -3635,8 +3621,6 @@ static int do_merge(struct repository *r,
>>                 argv_array_push(&cmd.args, git_path_merge_msg(r));
>>                 if (opts->gpg_sign)
>>                         argv_array_push(&cmd.args, opts->gpg_sign);
>> -               if (opts->ignore_date)
>> -                       push_dates(&cmd, opts->committer_date_is_author_date);
>>
>>                 /* Add the tips to be merged */
>>                 for (j = to_merge; j; j = j->next)
>> diff --git a/t/t3433-rebase-options-compatibility.sh b/t/t3433-rebase-options-compatibility.sh
>> index 132f577fc9..8247d01442 100755
>> --- a/t/t3433-rebase-options-compatibility.sh
>> +++ b/t/t3433-rebase-options-compatibility.sh
>> @@ -71,15 +71,15 @@ test_expect_success '--ignore-whitespace works with interactive backend' '
>>  '
>>
>>  test_expect_success '--committer-date-is-author-date works with am backend' '
>> -       git commit --amend &&
>> +       GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author &&
>>         git rebase --committer-date-is-author-date HEAD^ &&
>>         git log -1 --pretty="format:%ai" >authortime &&
>>         git log -1 --pretty="format:%ci" >committertime &&
>>         test_cmp authortime committertime
>>  '
>>
>>  test_expect_success '--committer-date-is-author-date works with interactive backend' '
>> -       git commit --amend &&
>> +       GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author &&
>>         git rebase -i --committer-date-is-author-date HEAD^ &&
>>         git log -1 --pretty="format:%ai" >authortime &&
>>         git log -1 --pretty="format:%ci" >committertime &&
>> @@ -88,13 +88,36 @@ test_expect_success '--committer-date-is-author-date works with interactive back
>>
>>  test_expect_success '--committer-date-is-author-date works with rebase -r' '
>>         git checkout side &&
>> -       git merge --no-ff commit3 &&
>> +       GIT_AUTHOR_DATE="@1234 +0300" git merge --no-ff commit3 &&
>>         git rebase -r --root --committer-date-is-author-date &&
>>         git log --pretty="format:%ai" >authortime &&
>>         git log --pretty="format:%ci" >committertime &&
>>         test_cmp authortime committertime
>>  '
>>
>> +test_expect_success '--committer-date-is-author-date works when forking merge' '
>> +       git checkout side &&
>> +       GIT_AUTHOR_DATE="@1234 +0300" git merge --no-ff commit3 &&
>> +       git rebase -r --root --strategy=resolve --committer-date-is-author-date &&
>> +       git log --pretty="format:%ai" >authortime &&
>> +       git log --pretty="format:%ci" >committertime &&
>> +       test_cmp authortime committertime
>> +
>> +'
>> +
>> +test_expect_success '--committer-date-is-author-date works when committing conflict resolution' '
>> +       git checkout commit2 &&
>> +       GIT_AUTHOR_DATE="@1980 +0000" git commit --amend --only --reset-author &&
>> +       git log -1 --format=%at HEAD >expect &&
>> +       test_must_fail git rebase -i --committer-date-is-author-date \
>> +               --onto HEAD^^ HEAD^ &&
>> +       echo resolved > foo &&
>> +       git add foo &&
>> +       git rebase --continue &&
>> +       git log -1 --format=%ct HEAD >actual &&
>> +       test_cmp expect actual
>> +'
>> +
>>  # Checking for +0000 in author time is enough since default
>>  # timezone is UTC, but the timezone used while committing
>>  # sets to +0530.
>> --
>> 2.26.0
>>


  reply	other threads:[~2020-04-07 18:11 UTC|newest]

Thread overview: 130+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-07 14:11 [PATCH 0/6] fixup ra/rebase-i-more-options Phillip Wood
2020-04-07 14:11 ` [PATCH 1/6] Revert "Revert "Merge branch 'ra/rebase-i-more-options'"" Phillip Wood
2020-04-07 15:16   ` Elijah Newren
2020-04-07 18:01     ` Phillip Wood
2020-04-07 21:04     ` Junio C Hamano
2020-04-07 21:31       ` Junio C Hamano
2020-04-12 17:47         ` Johannes Schindelin
2020-04-13  9:58           ` Phillip Wood
2020-04-13 22:05             ` Junio C Hamano
2020-04-07 14:11 ` [PATCH 2/6] t3433: remove loops from tests Phillip Wood
2020-04-07 14:30   ` Elijah Newren
2020-04-07 14:11 ` [PATCH 3/6] t3433: only compare commit dates Phillip Wood
2020-04-07 14:11 ` [PATCH 4/6] rebase -i: fix --committer-date-is-author-date Phillip Wood
2020-04-07 15:05   ` Elijah Newren
2020-04-07 18:11     ` Phillip Wood [this message]
2020-04-07 14:11 ` [PATCH 5/6] Revert "sequencer: allow callers of read_author_script() to ignore fields" Phillip Wood
2020-04-07 15:06   ` Elijah Newren
2020-04-07 14:11 ` [PATCH 6/6] t3433: improve coverage Phillip Wood
2020-04-07 15:13   ` Elijah Newren
2020-04-07 18:16     ` Phillip Wood
2020-04-07 15:17 ` [PATCH 0/6] fixup ra/rebase-i-more-options Elijah Newren
2020-04-07 18:18   ` Phillip Wood
2020-04-07 23:04 ` Junio C Hamano
2020-04-29 10:25 ` [PATCH v2 0/5] cleanup ra/rebase-i-more-options Phillip Wood
2020-04-29 10:25   ` [PATCH v2 1/5] rebase -i: add --ignore-whitespace flag Phillip Wood
2020-05-13  3:54     ` Elijah Newren
2020-05-14  9:47       ` Phillip Wood
2020-04-29 10:25   ` [PATCH v2 2/5] rebase -i: support --committer-date-is-author-date Phillip Wood
2020-05-10 11:14     ` Alban Gruin
2020-05-13  4:08     ` Elijah Newren
2020-04-29 10:25   ` [PATCH v2 3/5] sequencer: rename amend_author to author_to_free Phillip Wood
2020-04-29 10:25   ` [PATCH v2 4/5] rebase -i: support --ignore-date Phillip Wood
2020-05-10 11:14     ` Alban Gruin
2020-05-12 14:47       ` Phillip Wood
2020-05-13 15:33         ` Junio C Hamano
2020-05-13  3:54     ` Elijah Newren
2020-04-29 10:25   ` [PATCH v2 5/5] rebase: add --reset-author-date Phillip Wood
2020-04-29 19:59   ` [PATCH v2 0/5] cleanup ra/rebase-i-more-options Junio C Hamano
2020-05-13  3:57     ` Elijah Newren
2020-05-21 10:14 ` [PATCH v3 " Phillip Wood
2020-05-21 10:14   ` [PATCH v3 1/5] rebase -i: add --ignore-whitespace flag Phillip Wood
2020-05-21 10:14   ` [PATCH v3 2/5] rebase -i: support --committer-date-is-author-date Phillip Wood
2020-05-21 10:14   ` [PATCH v3 3/5] sequencer: rename amend_author to author_to_free Phillip Wood
2020-05-21 10:14   ` [PATCH v3 4/5] rebase -i: support --ignore-date Phillip Wood
2020-05-23 12:30     ` Đoàn Trần Công Danh
2020-05-23 15:43       ` Phillip Wood
2020-05-23 15:52         ` Đoàn Trần Công Danh
2020-05-23 18:50           ` Phillip Wood
2020-05-23 23:05             ` Đoàn Trần Công Danh
2020-05-27  9:55               ` Phillip Wood
2020-05-24 16:32           ` Junio C Hamano
2020-05-21 10:14   ` [PATCH v3 5/5] rebase: add --reset-author-date Phillip Wood
2020-05-22 15:54   ` [PATCH v3 0/5] cleanup ra/rebase-i-more-options Elijah Newren
2020-05-23  8:55     ` Phillip Wood
2020-05-23  6:59   ` Johannes Schindelin
2020-05-27 17:33 ` [PATCH v4 " Phillip Wood
2020-05-27 17:33   ` [PATCH v4 1/5] rebase -i: add --ignore-whitespace flag Phillip Wood
2020-05-29  2:38     ` Johannes Schindelin
2020-06-01  9:23       ` Kerry, Richard
2020-06-01 10:26       ` Phillip Wood
2020-06-01 21:03         ` Johannes Schindelin
2020-05-27 17:33   ` [PATCH v4 2/5] rebase -i: support --committer-date-is-author-date Phillip Wood
2020-05-29  2:52     ` Johannes Schindelin
2020-06-01 10:33       ` Phillip Wood
2020-05-27 17:33   ` [PATCH v4 3/5] sequencer: rename amend_author to author_to_free Phillip Wood
2020-05-27 17:33   ` [PATCH v4 4/5] rebase -i: support --ignore-date Phillip Wood
2020-05-27 17:33   ` [PATCH v4 5/5] rebase: add --reset-author-date Phillip Wood
2020-05-27 17:57     ` [PATCH v4 6/5] fixup! " Phillip Wood
2020-05-28 13:17       ` Đoàn Trần Công Danh
2020-05-29  2:59         ` Johannes Schindelin
2020-06-01 10:36           ` Phillip Wood
2020-05-27 21:10   ` [PATCH v4 0/5] cleanup ra/rebase-i-more-options Junio C Hamano
2020-06-26  9:55 ` [PATCH v5 " Phillip Wood
2020-06-26  9:55   ` [PATCH v5 1/5] rebase -i: add --ignore-whitespace flag Phillip Wood
2020-06-26 13:37     ` Đoàn Trần Công Danh
2020-06-26 14:43       ` Phillip Wood
2020-06-26 16:03         ` Junio C Hamano
2020-06-29 14:14         ` Đoàn Trần Công Danh
2020-07-13 10:02           ` Phillip Wood
2020-06-26 15:43     ` Junio C Hamano
2020-06-26  9:55   ` [PATCH v5 2/5] rebase -i: support --committer-date-is-author-date Phillip Wood
2020-06-26  9:55   ` [PATCH v5 3/5] sequencer: rename amend_author to author_to_free Phillip Wood
2020-06-26  9:55   ` [PATCH v5 4/5] rebase -i: support --ignore-date Phillip Wood
2020-06-26 14:09     ` Đoàn Trần Công Danh
2020-06-26 14:38       ` Phillip Wood
2020-06-26 16:29     ` Junio C Hamano
2020-06-26  9:55   ` [PATCH v5 5/5] rebase: add --reset-author-date Phillip Wood
2020-06-26 16:35     ` Junio C Hamano
2020-06-26 18:07       ` Phillip Wood
2020-06-26 15:04   ` [PATCH v5 0/5] cleanup ra/rebase-i-more-options Junio C Hamano
2020-07-13 10:10 ` [PATCH v6 0/5] fixup ra/rebase-i-more-options Phillip Wood
2020-07-13 10:10   ` [PATCH v6 1/5] rebase -i: add --ignore-whitespace flag Phillip Wood
2020-07-13 10:10   ` [PATCH v6 2/5] rebase -i: support --committer-date-is-author-date Phillip Wood
2020-07-15 14:27     ` Đoàn Trần Công Danh
2020-07-16  8:23       ` Phillip Wood
2020-07-16 13:06         ` Đoàn Trần Công Danh
2020-07-16 15:17           ` Phillip Wood
2020-07-16 17:34             ` Phillip Wood
2020-07-17  0:25               ` Đoàn Trần Công Danh
2020-07-13 10:10   ` [PATCH v6 3/5] sequencer: rename amend_author to author_to_free Phillip Wood
2020-07-13 10:10   ` [PATCH v6 4/5] rebase -i: support --ignore-date Phillip Wood
2020-07-13 10:10   ` [PATCH v6 5/5] rebase: add --reset-author-date Phillip Wood
2020-07-13 15:28   ` [PATCH v6 0/5] fixup ra/rebase-i-more-options Junio C Hamano
2020-07-15  8:55     ` Phillip Wood
2020-07-16 17:32 ` [PATCH v7 0/5] cleanup ra/rebase-i-more-options Phillip Wood
2020-07-16 17:32   ` [PATCH v7 1/5] rebase -i: add --ignore-whitespace flag Phillip Wood
2020-07-16 17:32   ` [PATCH v7 2/5] rebase -i: support --committer-date-is-author-date Phillip Wood
2020-08-13 13:46     ` Johannes Schindelin
2020-07-16 17:32   ` [PATCH v7 3/5] sequencer: rename amend_author to author_to_free Phillip Wood
2020-07-16 17:32   ` [PATCH v7 4/5] rebase -i: support --ignore-date Phillip Wood
2020-08-13 14:07     ` Johannes Schindelin
2020-07-16 17:32   ` [PATCH v7 5/5] rebase: add --reset-author-date Phillip Wood
2020-07-16 17:39   ` [PATCH v7 0/5] cleanup ra/rebase-i-more-options Junio C Hamano
2020-08-13 14:24   ` Johannes Schindelin
2020-08-13 17:46     ` Junio C Hamano
2020-08-13 19:51       ` Phillip Wood
2020-08-17 17:39 ` [PATCH v8 " Phillip Wood
2020-08-17 17:40   ` [PATCH v8 1/5] rebase -i: add --ignore-whitespace flag Phillip Wood
2020-08-17 17:40   ` [PATCH v8 2/5] am: stop exporting GIT_COMMITTER_DATE Phillip Wood
2020-08-17 19:12     ` Junio C Hamano
2020-08-19 10:20       ` Phillip Wood
2020-08-19 15:51         ` Junio C Hamano
2020-08-20 15:23           ` Phillip Wood
2020-08-17 17:40   ` [PATCH v8 3/5] rebase -i: support --committer-date-is-author-date Phillip Wood
2020-08-26 21:41     ` Junio C Hamano
2020-08-17 17:40   ` [PATCH v8 4/5] rebase -i: support --ignore-date Phillip Wood
2020-08-19 10:22     ` Phillip Wood
2020-08-19 22:20       ` Junio C Hamano
2020-08-20 15:16         ` Phillip Wood
2020-08-17 17:40   ` [PATCH v8 5/5] rebase: add --reset-author-date Phillip Wood

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=33f0ee87-7b6a-d48a-fd40-9c513a626a22@gmail.com \
    --to=phillip.wood123@gmail.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    --cc=newren@gmail.com \
    --cc=phillip.wood@dunelm.org.uk \
    --cc=rohit.ashiwal265@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.