Re: how to force a commit date matching info from a mbox ?
Nanako Shiraishi <nanako3@lavabit.com> writes:
Show 5 quoted lines
> Quoting Junio C Hamano <gitster@pobox.com>:
>
>> Correct. I did not run that new test, let alone existing ones ;-)
>
> I applied your patch and run the test suite, including the new one, and they passed.
> I tried to write a new option I said that I wanted in my previous message. Here is a patch.
>
> --->8---
> Subject: [PATCH] git-am: Add --ignore-date option
Good.
Leaving "Subject: " in saves me typing, because I do not have to insert it manually when editing the submitted patch in my MUA to chop off everything before the scissors.
Show 10 quoted lines
> This new option makes the command ignore the date header field recorded in
> the format-patch output. The commits will have the timestamp when they
> are created instead.
>
> You can work a lot in one day to accumulate many changes, but apply and
> push to the public repository only some of them at the end of the first
> day. Then next day you can spend all your working hours reading comics or
> chatting with your coworkers, and apply your remaining patches from the
> previous day using this option to pretend that you have been working at
> the end of the day.
LOL. A slacker option is a tough sell to a serious management, though.
I think it would work equally well if you somehow manage to pass this through "git-rebase", but this won't work with "git-rebase --interactive".
Show 12 quoted lines
> @@ -379,7 +383,13 @@ do
>
> GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' "$dotest/info")"
> GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' "$dotest/info")"
> - GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$dotest/info")"
> + case "$ignore_date" in
> + t)
> + GIT_AUTHOR_DATE="$(date -R)"
> + ;;
> + '')
> + GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$dotest/info")"
> + esac
Please align case arm labels with case/esac; iow, do not indent t) and '') by four spaces, when you write your next case/esac statement.
"date -R" is a GNU extension; avoid it (I'll show you how at the end).
Show 16 quoted lines
> diff --git a/t/t4150-am.sh b/t/t4150-am.sh
> index 8d3fb00..5ecf456 100755
> --- a/t/t4150-am.sh
> +++ b/t/t4150-am.sh
> @@ -277,4 +277,13 @@ test_expect_success 'am without --committer-date-is-author-date' '
> test "$at" != "$ct"
> '
>
> +test_expect_success 'am --ignore-date' '
> + git checkout first &&
> + test_tick &&
> + git am --ignore-date patch1 &&
> + git cat-file commit HEAD | sed -e "/^$/q" >head1 &&
> + at=$(sed -ne "/^author /s/.*> //p" head1) &&
> + echo "$at" | grep "+0000"
> +'
This is a convoluted logic.
The committer and author dates are set to -0700 timezone by test_tick, while TZ is set to UTC (+0000) by test-lib.sh, and you are taking advantage of them to see which one is being used.
But I do not think of a better way to do this offhand, so I'll let it pass.
Regarding the "date -R" thing, I think we can take advantage of the fact that an empty GIT_AUTHOR_DATE (and GIT_COMMITTER_DATE) means "do not use this environment variable, but use the current date instead". Something like this patch on top of yours, whose first hunk reverts your change to use "date -R", and sets GIT_AUTHOR_DATE to empty when --ignore-date is asked for.
No, I didn't test it.
diff --git i/git-am.sh w/git-am.sh
index eb88d90..f935178 100755
--- i/git-am.sh
+++ w/git-am.sh
@@ -383,13 +383,7 @@ do
GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' "$dotest/info")"
GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' "$dotest/info")"
- case "$ignore_date" in
- t)
- GIT_AUTHOR_DATE="$(date -R)"
- ;;
- '')
- GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$dotest/info")"
- esac
+ GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$dotest/info")"
if test -z "$GIT_AUTHOR_EMAIL"
then
@@ -536,6 +530,10 @@ do
tree=$(git write-tree) &&
parent=$(git rev-parse --verify HEAD) &&
commit=$(
+ if test -n "$ignore_date"
+ then
+ GIT_AUTHOR_DATE=
+ fi
if test -n "$committer_date_is_author_date"
then
GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"