[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] getdate add a week when the wday is the same as the current
Re: [PATCH] getdate add a week when the wday is the same as the current one
Fri, 01 May 2009 14:38:18 +0200
Giuseppe Scrivano wrote:
> This patch includes all your suggestions and new tests for
Thanks for the quick test addition!
I want the summary line to start with "getdate: "
and do be "high-level descriptive" so I moved your
"add a week..." sentence into the body of the log.
Also, I kept the TAB-oriented indentation and made
Bruno's simplification (Thanks, Bruno!).
Regarding the test, I added a "const" and tweaked formatting
so the continued expression starts with "&&" rather than
leaving the operator at the end of the preceding line.
That is the prevailing and recommended style.
However, there is a problem.
With this change, today (a Friday), ./date -d fri
prints the date for a week from today.
Without the patch, it prints today's date.
That is a regression, and shows that we'll need
several more tests.
If you make further changes, please use the following
as a basis, so I don't have to change your spaces to TABs
again or to adjust the content or formatting of the commit log.
>From 664db25a03246f510793d74fce674b68f32d1dc3 Mon Sep 17 00:00:00 2001
From: Giuseppe Scrivano <address@hidden>
Date: Fri, 1 May 2009 09:23:20 +0200
Subject: [PATCH] getdate: correctly interpret "next monday" when run on a Monday
Content-Type: text/plain; charset=utf-8
* lib/getdate.y (get_date): Correct the calculation of tm_mday so
that e.g., "next tues" (when run on a tuesday) results in a date
that is one week in the future, and not today's date.
I.e., add a week when the wday is the same as the current one.
Reported by Tom Broadhurst in http://savannah.gnu.org/bugs/?25406,
and earlier by Martin Bernreuther and Jan Minář.
* tests/test-getdate.c (main): Check that "next DAY" is always in
lib/getdate.y | 6 ++++--
tests/test-getdate.c | 30 ++++++++++++++++++++++++++++++
2 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/lib/getdate.y b/lib/getdate.y
index 877b264..48bf391 100644
@@ -1,7 +1,7 @@
/* Parse a string into an internal time stamp.
- Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+ Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
@@ -1435,7 +1435,9 @@ get_date (struct timespec *result, char const *p, struct
timespec const *now)
if (pc.days_seen && ! pc.dates_seen)
tm.tm_mday += ((pc.day_number - tm.tm_wday + 7) % 7
- + 7 * (pc.day_ordinal - (0 < pc.day_ordinal)));
+ + 7 * (pc.day_ordinal
+ - (0 < pc.day_ordinal
+ && tm.tm_wday != pc.day_number)));
tm.tm_isdst = -1;
Start = mktime (&tm);
if (Start == (time_t) -1)
diff --git a/tests/test-getdate.c b/tests/test-getdate.c
index 7dfb09e..9cee073 100644
@@ -48,6 +48,22 @@
#define LOG(str, now, res) (void) 0
+static const char* const day_table =
main (int argc, char **argv)
@@ -55,6 +71,7 @@ main (int argc, char **argv)
struct timespec result2;
struct timespec now;
const char *p;
+ int i;
@@ -211,5 +228,18 @@ main (int argc, char **argv)
ASSERT (result.tv_sec == result2.tv_sec
&& result.tv_nsec == result2.tv_nsec);
+ /* Check that every 'next DAY' is in the future. */
+ for (i = 0; day_table[i]; i++)
+ char tmp;
+ sprintf (tmp, "NEXT %s", day_table[i]);
+ now.tv_sec = 4711;
+ now.tv_nsec = 1267;
+ ASSERT (get_date (&result, tmp, &now));
+ LOG (tmp, now, result);
+ ASSERT (result.tv_sec > now.tv_sec
+ && result.tv_nsec == 0);