Re: [PATCH v5 5/6] rebase -i: support --ignore-date

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Rohit Ashiwal <rohit.ashiwal265@xxxxxxxxx> writes:

>  --ignore-date::
> +	Instead of using the given author date, reset it to the
> +	current time. This implies --force-rebase.

The first sentence is unclear and puzzles me with "for what?".  IOW,
you are saying that by default the command uses the given (I presume
that you meant what is recorded in the original commits being
rebased---but we should find a way to explain it more clearly)
author date, but with this option what is used is reset to the
current time.  It is left unspecified what the command is using that
time for.

Perhaps (I am writing this paragraph after writing the rest of the
message, i.e. after reading the patch through):

	By default, the author date recorded in the commit being
	rebased as the author date is used as the author date of the
	rebased commits.  The option tells Git to use the current
	timestamp as the author date of the rebased commits instead.
	This implies `--force-rebase`.

The committer-date-is-author-date is indirectly also affected by
this option, because it (re)uses the "author date", but by making it
clear where the "author date" comes from in the description of this
option, it would make the interaction between these two options
obvious, hopefully ;-)

>  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_ignore_date, "rebase-merge/ignore_date")

It probably is a good idea to use dash not underscore for
cdate-is-adata and ignore-date, the two files you are adding.

It would be good to eventually fix the existing gpg-sign-opt to
follow suit, but not as a part of this series.

> +static void push_dates(struct child_process *child, int change_committer_date)
> +{
> +	time_t now = time(NULL);
> +	struct strbuf date = STRBUF_INIT;

I am tempted to suggest adding a /* NEEDSWORK */ comment to remind
us that we'd want to eventually use date.c::get_time() here, but not
as part of this series.  But grepping for "\<time(" is easy enough
so I can live without it.

> +	strbuf_addf(&date, "@%"PRIuMAX, (uintmax_t)now);
> +	argv_array_pushf(&child->env_array, "GIT_AUTHOR_DATE=%s", date.buf);

OK, so we get author-date of "now" (which we do not do normally)
when the caller decides to call us (which is, under
"--ignore-date").

> +	if (change_committer_date)
> +		argv_array_pushf(&child->env_array, "GIT_COMMITTER_DATE=%s", date.buf);

And when we are using --committer-date-is-author-date, we muck with
the committer-date as well.

Makes sense.

> @@ -958,7 +989,8 @@ static int run_git_commit(struct repository *r,
>  	                return -1;
>  
>  	        strbuf_addf(&datebuf, "@%s", date);
> -	        res = setenv("GIT_COMMITTER_DATE", datebuf.buf, 1);
> +		res = setenv("GIT_COMMITTER_DATE",
> +			     opts->ignore_date ? "" : datebuf.buf, 1);

This is the codepath that handles committer-date-is-author-date
option.  We read the author date into "date", and used to
unconditionally use it as the committer date.  With --ignore-date,
we behave differently.

It may happen that an empty string in GIT_COMMITTER_DATE is treated
the same way as missing GIT_COMMITTER_DATE, i.e. unspecified.

	if (opts->ignore_date)
		res = unsetenv("GIT_COMMITTER_DATE");
	else
        	res = setenv(...);

would be conceptually clearer.

But then we would notice that there is no reason to even read the
author-date into date if ignore-date is set, no?  So the whole thing
now becomes

	-	if (opts->committer_date_is_author_date) {
	+	if (!opts->ignore_date && opts->committer_date_is_author_date) {

which feels even cleaner.  Am I missing some subtleties (e.g. are we
worried about the case where the user has GIT_COMMITTER_DATE set and
exported to the environment of the shell that starts "git rebase", or
something like that?)???

> @@ -982,6 +1014,8 @@ 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))
> @@ -1404,7 +1438,8 @@ static int try_to_commit(struct repository *r,
>  		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);
> +		res = setenv("GIT_COMMITTER_DATE",
> +			     opts->ignore_date ? "" : date.buf, 1);

The same comment as the early half of the above, on relying on the
empty date string instead of an explicit unsetenv().

> @@ -1454,6 +1489,15 @@ static int try_to_commit(struct repository *r,
>  
>  	reset_ident_date();
>  
> +	if (opts->ignore_date) {
> +		author = ignore_author_date(author);

The helper function called here begins with this comment:

"Construct a free()able author string with current time as the author date"

but without reading (and memorizing) it, ignore_author_date()
function sounds like a boolean that tells us "are we told to
ignore the author date?"

It sorely wants a better name to tell the reader that it is the
author ident with current timestamp.

> +		if (!author) {
> +			res = -1;
> +			goto out;
> +		}
> +		free(author_to_free);
> +		author_to_free = (char *)author;
> +	}

> @@ -2538,6 +2582,11 @@ static int read_populate_opts(struct replay_opts *opts)
>  			opts->committer_date_is_author_date = 1;
>  		}
>  
> +		if (file_exists(rebase_path_ignore_date())) {
> +			opts->allow_ff = 0;
> +			opts->ignore_date = 1;
> +		}

OK.

> @@ -3557,6 +3608,8 @@ 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);

OK, we've seen the callee above already and we know what this does.

> @@ -3830,7 +3883,8 @@ static int pick_commits(struct repository *r,
>  	if (opts->allow_ff)
>  		assert(!(opts->signoff || opts->no_commit ||
>  				opts->record_origin || opts->edit ||
> -				opts->committer_date_is_author_date));
> +				opts->committer_date_is_author_date ||
> +				opts->ignore_date));

We may want to switch this assert(...) and others to "if (!(...))
BUG()" someday, but not as part of this patch.




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux