diff options
-rw-r--r-- | builtin/commit.c | 6 | ||||
-rw-r--r-- | date.c | 3 | ||||
-rw-r--r-- | git-sh-setup.sh | 2 | ||||
-rwxr-xr-x | t/t3400-rebase.sh | 23 |
4 files changed, 32 insertions, 2 deletions
diff --git a/builtin/commit.c b/builtin/commit.c index cbc9613ec6..bcb0db2db5 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -534,6 +534,7 @@ static void determine_author_info(struct strbuf *author_ident) if (author_message) { const char *a, *lb, *rb, *eol; + size_t len; a = strstr(author_message_buffer, "\nauthor "); if (!a) @@ -554,6 +555,11 @@ static void determine_author_info(struct strbuf *author_ident) (a + strlen("\nauthor ")))); email = xmemdupz(lb + strlen("<"), rb - (lb + strlen("<"))); date = xmemdupz(rb + strlen("> "), eol - (rb + strlen("> "))); + len = eol - (rb + strlen("> ")); + date = xmalloc(len + 2); + *date = '@'; + memcpy(date + 1, rb + strlen("> "), len); + date[len + 1] = '\0'; } if (force_author) { @@ -637,7 +637,8 @@ int parse_date_basic(const char *date, unsigned long *timestamp, int *offset) *offset = -1; tm_gmt = 0; - if (!match_object_header_date(date, timestamp, offset)) + if (*date == '@' && + !match_object_header_date(date + 1, timestamp, offset)) return 0; /* success */ for (;;) { int match = 0; diff --git a/git-sh-setup.sh b/git-sh-setup.sh index 8e427dab31..015fe6e336 100644 --- a/git-sh-setup.sh +++ b/git-sh-setup.sh @@ -200,7 +200,7 @@ get_author_ident_from_commit () { s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p g - s/^author [^<]* <[^>]*> \(.*\)$/\1/ + s/^author [^<]* <[^>]*> \(.*\)$/@\1/ s/.*/GIT_AUTHOR_DATE='\''&'\''/p q diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh index 6eaecec906..e26e14dd53 100755 --- a/t/t3400-rebase.sh +++ b/t/t3400-rebase.sh @@ -218,4 +218,27 @@ test_expect_success 'rebase -m can copy notes' ' test "a note" = "$(git notes show HEAD)" ' +test_expect_success 'rebase commit with an ancient timestamp' ' + git reset --hard && + + >old.one && git add old.one && test_tick && + git commit --date="@12345 +0400" -m "Old one" && + >old.two && git add old.two && test_tick && + git commit --date="@23456 +0500" -m "Old two" && + >old.three && git add old.three && test_tick && + git commit --date="@34567 +0600" -m "Old three" && + + git cat-file commit HEAD^^ >actual && + grep "author .* 12345 +0400$" actual && + git cat-file commit HEAD^ >actual && + grep "author .* 23456 +0500$" actual && + git cat-file commit HEAD >actual && + grep "author .* 34567 +0600$" actual && + + git rebase --onto HEAD^^ HEAD^ && + + git cat-file commit HEAD >actual && + grep "author .* 34567 +0600$" actual +' + test_done |