# [PATCH 2/2] Document date formats accepted by parse_date()

6 messages from 2009-12-02 to 2009-12-02. Participants: Miklos Vajna, Nanako Shiraishi, Jeff King, Junio C Hamano.
Thread: https://gitlist.dev/t/21832

## Miklos Vajna, 2009-12-02 22:16

Subject: [PATCH 1/2] builtin-commit: add --date option
Message-ID: <3d547f4e32c026efc76a7dfe1572da617714f8c9.1259791789.git.vmiklos@frugalware.org>
URL: https://gitlist.dev/e/3d547f4e32c026efc76a7dfe1572da617714f8c9.1259791789.git.vmiklos%40frugalware.org
In-Reply-To: <7vpr6xcgki.fsf@alter.siamese.dyndns.org>

```
This is like --author: allow a user to specify a given date without
using the GIT_AUTHOR_DATE environment variable.

Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
---

On Wed, Dec 02, 2009 at 11:38:05AM -0800, Junio C Hamano <gitster@pobox.com> wrote:
> So I do not think --date is something we urgently need, even though it
> might be nice to have it to be consistent with --author.

Changes from the previous version:

* updated the commit message

* rebased on top of current master that has --reset-author

 Documentation/git-commit.txt |    5 ++++-
 builtin-commit.c             |    6 +++++-
 t/t7501-commit.sh            |   15 +++++++++++++++
 3 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index d227cec..cbbbeeb 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -11,7 +11,7 @@ SYNOPSIS
 'git commit' [-a | --interactive] [-s] [-v] [-u<mode>] [--amend] [--dry-run]
 	   [(-c | -C) <commit>] [-F <file> | -m <msg>] [--reset-author]
 	   [--allow-empty] [--no-verify] [-e] [--author=<author>]
-	   [--cleanup=<mode>] [--] [[-i | -o ]<file>...]
+	   [--date=<date>] [--cleanup=<mode>] [--] [[-i | -o ]<file>...]
 
 DESCRIPTION
 -----------
@@ -85,6 +85,9 @@ OPTIONS
 	an existing commit that matches the given string and its author
 	name is used.
 
+--date=<date>::
+	Override the date used in the commit.
+
 -m <msg>::
 --message=<msg>::
 	Use the given <msg> as the commit message.
diff --git a/builtin-commit.c b/builtin-commit.c
index e93a647..9a1264a 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -52,7 +52,7 @@ static char *edit_message, *use_message;
 static char *author_name, *author_email, *author_date;
 static int all, edit_flag, also, interactive, only, amend, signoff;
 static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
-static char *untracked_files_arg;
+static char *untracked_files_arg, *force_date;
 /*
  * The default commit message cleanup mode will remove the lines
  * beginning with # (shell comments) and leading and trailing
@@ -90,6 +90,7 @@ static struct option builtin_commit_options[] = {
 
 	OPT_FILENAME('F', "file", &logfile, "read log from file"),
 	OPT_STRING(0, "author", &force_author, "AUTHOR", "override author for commit"),
+	OPT_STRING(0, "date", &force_date, "DATE", "override date for commit"),
 	OPT_CALLBACK('m', "message", &message, "MESSAGE", "specify commit message", opt_parse_m),
 	OPT_STRING('c', "reedit-message", &edit_message, "COMMIT", "reuse and edit message from specified commit"),
 	OPT_STRING('C', "reuse-message", &use_message, "COMMIT", "reuse message from specified commit"),
@@ -410,6 +411,9 @@ static void determine_author_info(void)
 		email = xstrndup(lb + 2, rb - (lb + 2));
 	}
 
+	if (force_date)
+		date = force_date;
+
 	author_name = name;
 	author_email = email;
 	author_date = date;
diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh
index a603f6d..a529701 100755
--- a/t/t7501-commit.sh
+++ b/t/t7501-commit.sh
@@ -211,6 +211,21 @@ test_expect_success 'amend commit to fix author' '
 
 '
 
+test_expect_success 'amend commit to fix date' '
+
+	test_tick &&
+	newtick=$GIT_AUTHOR_DATE &&
+	git reset --hard &&
+	git cat-file -p HEAD |
+	sed -e "s/author.*/author $author $newtick/" \
+		-e "s/^\(committer.*> \).*$/\1$GIT_COMMITTER_DATE/" > \
+		expected &&
+	git commit --amend --date="$newtick" &&
+	git cat-file -p HEAD > current &&
+	test_cmp expected current
+
+'
+
 test_expect_success 'sign off (1)' '
 
 	echo 1 >positive &&
-- 
1.6.5.2

```

## Miklos Vajna, 2009-12-02 22:16

Subject: [PATCH 2/2] Document date formats accepted by parse_date()
Message-ID: <831fc8f48429d5a21e29d04760b46b2ddfcb7d80.1259791789.git.vmiklos@frugalware.org>
URL: https://gitlist.dev/e/831fc8f48429d5a21e29d04760b46b2ddfcb7d80.1259791789.git.vmiklos%40frugalware.org
In-Reply-To: <3d547f4e32c026efc76a7dfe1572da617714f8c9.1259791789.git.vmiklos@frugalware.org>

```
---
 Documentation/date-formats.txt    |   23 +++++++++++++++++++++++
 Documentation/git-commit-tree.txt |    1 +
 Documentation/git-commit.txt      |    2 ++
 3 files changed, 26 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/date-formats.txt

diff --git a/Documentation/date-formats.txt b/Documentation/date-formats.txt
new file mode 100644
index 0000000..626c887
--- /dev/null
+++ b/Documentation/date-formats.txt
@@ -0,0 +1,23 @@
+DATE FORMATS
+------------
+
+The GIT_AUTHOR_DATE, GIT_COMMITTER_DATE environment variables
+ifdef::git-commit[]
+and the `--date` option
+endif::git-commit[]
+support the following date formats:
+
+Git native format::
+	It is `<unix timestamp> <timezone offset>`, where `<unix
+	timestamp>` is the number of seconds since the UNIX epoch.
+	`<timezone offset>` is a positive or negative offset from UTC.
+	For example CET (which is 2 hours ahead UTC) is `+0200`.
+
+RFC 2822::
+	The standard email format as described by RFC 2822, for example
+	`Thu, 07 Apr 2005 22:13:13 +0200`.
+
+ISO 8601::
+	Time and date specified by the ISO 8601 standard, for example
+	`2005-04-07T22:13:13`. The parser accepts a space instead of the
+	`T` character as well.
diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.txt
index b8834ba..4fec5d5 100644
--- a/Documentation/git-commit-tree.txt
+++ b/Documentation/git-commit-tree.txt
@@ -73,6 +73,7 @@ A commit comment is read from stdin. If a changelog
 entry is not provided via "<" redirection, 'git-commit-tree' will just wait
 for one to be entered and terminated with ^D.
 
+include::date-formats.txt[]
 
 Diagnostics
 -----------
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index cbbbeeb..17783b4 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -220,6 +220,8 @@ specified.
 	these files are also staged for the next commit on top
 	of what have been staged before.
 
+:git-commit: 1
+include::date-formats.txt[]
 
 EXAMPLES
 --------
-- 
1.6.5.2

```

## Nanako Shiraishi, 2009-12-02 22:33

Subject: Re: [PATCH 2/2] Document date formats accepted by parse_date()
Message-ID: <20091203073313.6117@nanako3.lavabit.com>
URL: https://gitlist.dev/e/20091203073313.6117%40nanako3.lavabit.com
In-Reply-To: <831fc8f48429d5a21e29d04760b46b2ddfcb7d80.1259791789.git.vmiklos@frugalware.org>

```
Quoting Miklos Vajna <vmiklos@frugalware.org>

> ---

I don't think any message needs to be there, but a Signed-Off-By: 
line should be.

> +The GIT_AUTHOR_DATE, GIT_COMMITTER_DATE environment variables
> +ifdef::git-commit[]
> +and the `--date` option
> +endif::git-commit[]
> +support the following date formats:
> +
> +Git native format::
> +	It is `<unix timestamp> <timezone offset>`, where `<unix
> +	timestamp>` is the number of seconds since the UNIX epoch.
> +	`<timezone offset>` is a positive or negative offset from UTC.
> +	For example CET (which is 2 hours ahead UTC) is `+0200`.

It is better to call it 'internal' format, instead of 'native'. 
I think 'native' means the most natural way to Git, and users 
view what 'git show' outputs as 'native'.

  nana.git% git show -s v1.6.5^0 | grep Date
  Date:   Sat Oct 10 00:05:19 2009 -0700
  nana.git% ./test-date parse 'Sat Oct 10 00:05:19 2009 -0700'
  Sat Oct 10 00:05:19 2009 -0700 -> 2009-10-10 07:05:19 +0000

And 'Git native' format is also supported, I think.

> +RFC 2822::
> +	The standard email format as described by RFC 2822, for example
> +	`Thu, 07 Apr 2005 22:13:13 +0200`.
> +
> +ISO 8601::
> +	Time and date specified by the ISO 8601 standard, for example
> +	`2005-04-07T22:13:13`. The parser accepts a space instead of the
> +	`T` character as well.

I didn't know about "T", but it works (^_^).

  nana.git% ./test-date parse '2005-04-07T22:13:13'
  2005-04-07T22:13:13 -> 2005-04-07 13:13:13 +0000

Is there something wrong with 'show'?

  nana.git% ./test-date show '2005-04-07T22:13:13'
  2005-04-07T22:13:13 -> 40 years ago

-- 
Nanako Shiraishi
http://ivory.ap.teacup.com/nanako3/

```

## Jeff King, 2009-12-02 22:42

Subject: Re: [PATCH 2/2] Document date formats accepted by parse_date()
Message-ID: <20091202224206.GC9691@coredump.intra.peff.net>
URL: https://gitlist.dev/e/20091202224206.GC9691%40coredump.intra.peff.net
In-Reply-To: <20091203073313.6117@nanako3.lavabit.com>

```
On Thu, Dec 03, 2009 at 07:33:13AM +0900, Nanako Shiraishi wrote:

> Is there something wrong with 'show'?
> 
>   nana.git% ./test-date show '2005-04-07T22:13:13'
>   2005-04-07T22:13:13 -> 40 years ago

No. It doesn't call parse_date, but instead accepts a time_t-like
"seconds since epoch". I intentionally didn't use parse_date because I
didn't want bugs in parse_date to affect 'show' output, to keep testing
simple.

-Peff

```

## Junio C Hamano, 2009-12-02 22:54

Subject: Re: [PATCH 2/2] Document date formats accepted by parse_date()
Message-ID: <7v638p9ebz.fsf@alter.siamese.dyndns.org>
URL: https://gitlist.dev/e/7v638p9ebz.fsf%40alter.siamese.dyndns.org
In-Reply-To: <20091203073313.6117@nanako3.lavabit.com>

```
Nanako Shiraishi <nanako3@lavabit.com> writes:

> Is there something wrong with 'show'?
>
>   nana.git% ./test-date show '2005-04-07T22:13:13'
>   2005-04-07T22:13:13 -> 40 years ago

Heh, you fooled me, and Peff is right.  "test-date show" does not
interpret its input any way other than as seconds-since-epoch.

I agree with the "native->internal" part of the suggestion.  What see by
default in "git show" output is merely the ctime(3) format followed by
timezone.  I don't mind if we call that "git native", even though I
suspect we do _not have to_ invent new word for that.

Also "test-date parse" seems to accept things like these:

    '2009.04.07 20:21:22 -0000'
    '04/07/2009 20:21:22 -0000'
    '07.04.2009 20:21:22 -0000'

```

## Miklos Vajna, 2009-12-02 23:49

Subject: [PATCH 2/2 v2] Document date formats accepted by parse_date()
Message-ID: <465359e7bb6f00b622a1a5df5bc178eee019f4a2.1259797598.git.vmiklos@frugalware.org>
URL: https://gitlist.dev/e/465359e7bb6f00b622a1a5df5bc178eee019f4a2.1259797598.git.vmiklos%40frugalware.org
In-Reply-To: <7v638p9ebz.fsf@alter.siamese.dyndns.org>

```
---

On Wed, Dec 02, 2009 at 02:54:40PM -0800, Junio C Hamano <gitster@pobox.com> wrote:
> I agree with the "native->internal" part of the suggestion.

Changed.

> Also "test-date parse" seems to accept things like these:
>
>     '2009.04.07 20:21:22 -0000'
>     '04/07/2009 20:21:22 -0000'
>     '07.04.2009 20:21:22 -0000'

Ah OK, I just tried 2009.04.07 (without the time part) and thought it
was about approxidate() as well. I added them.

 Documentation/date-formats.txt    |   26 ++++++++++++++++++++++++++
 Documentation/git-commit-tree.txt |    1 +
 Documentation/git-commit.txt      |    2 ++
 3 files changed, 29 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/date-formats.txt

diff --git a/Documentation/date-formats.txt b/Documentation/date-formats.txt
new file mode 100644
index 0000000..c000f08
--- /dev/null
+++ b/Documentation/date-formats.txt
@@ -0,0 +1,26 @@
+DATE FORMATS
+------------
+
+The GIT_AUTHOR_DATE, GIT_COMMITTER_DATE environment variables
+ifdef::git-commit[]
+and the `--date` option
+endif::git-commit[]
+support the following date formats:
+
+Git internal format::
+	It is `<unix timestamp> <timezone offset>`, where `<unix
+	timestamp>` is the number of seconds since the UNIX epoch.
+	`<timezone offset>` is a positive or negative offset from UTC.
+	For example CET (which is 2 hours ahead UTC) is `+0200`.
+
+RFC 2822::
+	The standard email format as described by RFC 2822, for example
+	`Thu, 07 Apr 2005 22:13:13 +0200`.
+
+ISO 8601::
+	Time and date specified by the ISO 8601 standard, for example
+	`2005-04-07T22:13:13`. The parser accepts a space instead of the
+	`T` character as well.
++
+NOTE: In addition, the date part is accepted in the following formats:
+`YYYY.MM.DD`, `MM/DD/YYYY` and `DD.MM.YYYY`.
diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.txt
index b8834ba..4fec5d5 100644
--- a/Documentation/git-commit-tree.txt
+++ b/Documentation/git-commit-tree.txt
@@ -73,6 +73,7 @@ A commit comment is read from stdin. If a changelog
 entry is not provided via "<" redirection, 'git-commit-tree' will just wait
 for one to be entered and terminated with ^D.
 
+include::date-formats.txt[]
 
 Diagnostics
 -----------
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index cbbbeeb..17783b4 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -220,6 +220,8 @@ specified.
 	these files are also staged for the next commit on top
 	of what have been staged before.
 
+:git-commit: 1
+include::date-formats.txt[]
 
 EXAMPLES
 --------
-- 
1.6.5.2

```
