Skip to content

Commit

Permalink
commit: accept more date formats for "--date"
Browse files Browse the repository at this point in the history
Right now we pass off the string found by "--date" straight
to the fmt_ident function, which will use our strict
parse_date to normalize it. However, this means obvious
things like "--date=now" or "--date=2.days.ago" will not
work.

Instead, let's fallback to the approxidate function to
handle this for us. Note that we must try parse_date
ourselves first, even though approxidate will try strict
parsing itself. The reason is that approxidate throws away
any timezone information it sees from the strict parsing,
and we want to preserve it. So asking for:

  git commit --date="@1234567890 -0700"

continues to set the date in -0700, regardless of what the
local timezone is.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed May 2, 2014
1 parent b7242b8 commit 14ac286
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 4 deletions.
27 changes: 25 additions & 2 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -526,10 +526,29 @@ static int sane_ident_split(struct ident_split *person)
return 1;
}

static int parse_force_date(const char *in, char *out, int len)
{
if (len < 1)
return -1;
*out++ = '@';
len--;

if (parse_date(in, out, len) < 0) {
int errors = 0;
unsigned long t = approxidate_careful(in, &errors);
if (errors)
return -1;
snprintf(out, len, "%lu", t);
}

return 0;
}

static void determine_author_info(struct strbuf *author_ident)
{
char *name, *email, *date;
struct ident_split author;
char date_buf[64];

name = getenv("GIT_AUTHOR_NAME");
email = getenv("GIT_AUTHOR_EMAIL");
Expand Down Expand Up @@ -574,8 +593,12 @@ static void determine_author_info(struct strbuf *author_ident)
email = xstrndup(lb + 2, rb - (lb + 2));
}

if (force_date)
date = force_date;
if (force_date) {
if (parse_force_date(force_date, date_buf, sizeof(date_buf)))
die(_("invalid date format: %s"), force_date);
date = date_buf;
}

strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
sane_ident_split(&author)) {
Expand Down
12 changes: 10 additions & 2 deletions t/t7501-commit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -351,8 +351,16 @@ test_expect_success 'commit mentions forced date in output' '
grep "Date: *Sat Jan 2 03:04:05 2010" output
'

test_expect_success 'commit complains about bogus date' '
test_must_fail git commit --amend --date=10.11.2010
test_expect_success 'commit complains about completely bogus dates' '
test_must_fail git commit --amend --date=seventeen
'

test_expect_success 'commit --date allows approxidate' '
git commit --amend \
--date="midnight the 12th of october, anno domini 1979" &&
echo "Fri Oct 12 00:00:00 1979 +0000" >expect &&
git log -1 --format=%ad >actual &&
test_cmp expect actual
'

test_expect_success 'sign off (1)' '
Expand Down

0 comments on commit 14ac286

Please sign in to comment.