git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Caspar Zhang <caspar@casparzhang.com>
To: git@vger.kernel.org
Cc: Gris Ge <fge@redhat.com>, Junio C Hamano <gitster@pobox.com>
Subject: [BUG] incorrect search result returned when using git log with a future date parameter
Date: Wed, 30 Jan 2013 19:30:46 +0800	[thread overview]
Message-ID: <51090466.9070105@casparzhang.com> (raw)

Hi there,

when I'm using the commit limit option `--before/--until` when doing 
`git log` search, I meet a bug when the upper-bound date is 10days later 
in the future. Here is an example:

$ date +%F
2013-01-30
$ git log --oneline --since=2013-01-01 --until=2013-02-01
<several git log entry from 2013-01-01 to 2013-01-30 printed>
$ git log --oneline --since=2013-01-01 --until=2013-02-13
<null>

I debugged into the problem with ./test-date program in git source tree, 
got:

$ ./test-date approxidate 2013-02-01
2013-02-01 -> 2013-02-01 10:47:13 +0000   // correctly parsed
$ ./test-date approxidate 2013-02-13
2013-02-13 -> 2013-01-02 10:47:20 +0000   // incorrectly parsed

When looking into the codes of date.c, in is_date() function, I found:

   382         /* Be it commit time or author time, it does not make
   383          * sense to specify timestamp way into the future.  Make
   384          * sure it is not later than ten days from now...
   385          */
   386         if (now + 10*24*3600 < specified)
   387                  return 0;
   388         tm->tm_mon = r->tm_mon;
   389         tm->tm_mday = r->tm_mday;
   390         if (year != -1)
   391                 tm->tm_year = r->tm_year;
   392         return 1;

If I comment Line 386 & 387 out, the parsing works correctly. So I guess 
here is the cause of the problem.

Then I checked the git history, the change was introduced in commit 
38035cf4 by Junio C Hamano (cc-ed):

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commit 38035cf4a51c48cccf6c5e3977130261bc0c03a7
Author: Junio C Hamano <junkio@cox.net>
Date:   Wed Apr 5 15:31:12 2006 -0700

      date parsing: be friendlier to our European friends.

      This does three things, only applies to cases where the user
      manually tries to override the author/commit time by environment
      variables, with non-ISO, non-2822 format date-string:

       - Refuses to use the interpretation to put the date in the
         future; recent kernel history has a commit made with
         10/03/2006 which is recorded as October 3rd.

       - Adds '.' as the possible year-month-date separator.  We
         learned from our European friends on the #git channel that
         dd.mm.yyyy is the norm there.

       - When the separator is '.', we prefer dd.mm.yyyy over
         mm.dd.yyyy; otherwise mm/dd/yy[yy] takes precedence over
         dd/mm/yy[yy].

      Signed-off-by: Junio C Hamano <junkio@cox.net>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

It seems like the original commit was going to fix European date style, 
but it fixed(?) the future date problem as well. However, this part of 
fix is not perfect:

1) it makes date parsing not working correctly. (see my test examples 
above).

IMO, it should be in another place (maybe in commit.c or somewhere 
else?) we check if commit date is valid or not, instead of in the date 
parsing function. A date parsing function should parse _all dates with 
correctly format_, despite if it's an old date, or the date in the future.

2) from the test example I gave above, in fact the codes don't really 
prevent git from accepting the changes with illegal date, e.g., if there 
is a commit recorded as "2013-02-13", it will be parsed to "2013-01-02", 
which is a legal (old) date, thus, this commit will be accepted, but 
this is wrong.

My suggestion is we might need to revert the first part of commit 
38035cf4 since this part of code doesn't work correctly and causes 
problems; then we should create a new checking mechanism to prevent 
those "future date commits" to be accepted in other functions. I'm not 
able to do the second part since I'm not familiar with git codes yet.. :-(

Thoughts?

Caspar

             reply	other threads:[~2013-01-30 11:31 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-30 11:30 Caspar Zhang [this message]
2013-01-30 19:57 ` [BUG] incorrect search result returned when using git log with a future date parameter Junio C Hamano
2013-01-30 22:15   ` Jonathan Nieder
2013-01-30 22:22     ` Junio C Hamano
  -- strict thread matches above, loose matches on Subject: below --
2013-01-30 11:28 Caspar Zhang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51090466.9070105@casparzhang.com \
    --to=caspar@casparzhang.com \
    --cc=fge@redhat.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).