cherry-pick: handle root commits with external strategies
[gitweb.git] / date.c
diff --git a/date.c b/date.c
index 3c981f7eb5ebaed1ba621f3d4cd960f14145b97a..896fbb48060c673b8dc2f2aa6ea3de3c1042fbd2 100644 (file)
--- a/date.c
+++ b/date.c
@@ -129,8 +129,9 @@ const char *show_date_relative(unsigned long time, int tz,
        }
        /* Give years and months for 5 years or so */
        if (diff < 1825) {
-               unsigned long years = diff / 365;
-               unsigned long months = (diff % 365 + 15) / 30;
+               unsigned long totalmonths = (diff * 12 * 2 + 365) / (365 * 2);
+               unsigned long years = totalmonths / 12;
+               unsigned long months = totalmonths % 12;
                int n;
                n = snprintf(timebuf, timebuf_size, "%lu year%s",
                                years, (years > 1 ? "s" : ""));
@@ -586,7 +587,7 @@ static int date_string(unsigned long date, int offset, char *buf, int len)
 
 /* Gr. strptime is crap for this; it doesn't have a way to require RFC2822
    (i.e. English) day/month names, and it doesn't work correctly with %z. */
-int parse_date_toffset(const char *date, unsigned long *timestamp, int *offset)
+int parse_date_basic(const char *date, unsigned long *timestamp, int *offset)
 {
        struct tm tm;
        int tm_gmt;
@@ -642,17 +643,16 @@ int parse_date_toffset(const char *date, unsigned long *timestamp, int *offset)
 
        if (!tm_gmt)
                *timestamp -= *offset * 60;
-       return 1; /* success */
+       return 0; /* success */
 }
 
 int parse_date(const char *date, char *result, int maxlen)
 {
        unsigned long timestamp;
        int offset;
-       if (parse_date_toffset(date, &timestamp, &offset) > 0)
-               return date_string(timestamp, offset, result, maxlen);
-       else
+       if (parse_date_basic(date, &timestamp, &offset))
                return -1;
+       return date_string(timestamp, offset, result, maxlen);
 }
 
 enum date_mode parse_date_format(const char *format)
@@ -1004,9 +1004,8 @@ unsigned long approxidate_relative(const char *date, const struct timeval *tv)
        int offset;
        int errors = 0;
 
-       if (parse_date_toffset(date, &timestamp, &offset) > 0)
+       if (!parse_date_basic(date, &timestamp, &offset))
                return timestamp;
-
        return approxidate_str(date, tv, &errors);
 }
 
@@ -1019,7 +1018,7 @@ unsigned long approxidate_careful(const char *date, int *error_ret)
        if (!error_ret)
                error_ret = &dummy;
 
-       if (parse_date_toffset(date, &timestamp, &offset) > 0) {
+       if (!parse_date_basic(date, &timestamp, &offset)) {
                *error_ret = 0;
                return timestamp;
        }