Re: how to force a commit date matching info from a mbox ?
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jan 23, 2009, 09:39 UTC
- Message-ID
- <7vtz7qxsxc.fsf@gitster.siamese.dyndns.org>
- In-Reply-To
- <20090123172646.6117@nanako3.lavabit.com>
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.
Thanks.
> 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"