Hi,

Brings log a bit more inline with its GNU counterpart
by attempting to parse the date range early on, killing
extra output from date.y and having a proper fatal message.

Any caller of date_parse() already displays its own error
messages anyway if it fails.

Additionally lets not return -1 from a function that is
declared to return an unsigned int.

.joris

Index: date.y
===================================================================
RCS file: /cvs/src/usr.bin/cvs/date.y,v
retrieving revision 1.25
diff -u -p -r1.25 date.y
--- date.y      5 Nov 2015 09:48:21 -0000       1.25
+++ date.y      22 Jun 2016 09:52:04 -0000
@@ -483,16 +483,8 @@ static TABLE const MilitaryTable[] = {
 static int
 yyerror(const char *s)
 {
-#if !defined(TEST)
-       char *str;
-
-       (void)xasprintf(&str, "parsing date string: %s", s);
-       cvs_log(LP_ERR, "%s", str);
-       free(str);
-#endif
        return (0);
 }
-
 
 static time_t
 ToSeconds(time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridian)
Index: getlog.c
===================================================================
RCS file: /cvs/src/usr.bin/cvs/getlog.c,v
retrieving revision 1.98
diff -u -p -r1.98 getlog.c
--- getlog.c    1 Dec 2014 21:58:46 -0000       1.98
+++ getlog.c    22 Jun 2016 09:52:04 -0000
@@ -40,7 +40,7 @@
 void            cvs_log_local(struct cvs_file *);
 static void     log_rev_print(struct rcs_delta *);
 static char    *push_date(char *dest, const char *);
-static u_int    date_select(RCSFILE *, char *);
+static int     date_select(RCSFILE *, char *, u_int *);
 
 int     runflags = 0;
 char   *logrev = NULL;
@@ -210,6 +210,14 @@ cvs_log_local(struct cvs_file *cf)
 
        cvs_file_classify(cf, cvs_directory_tag);
 
+       if (logrev != NULL)
+               nrev = cvs_revision_select(cf->file_rcs, logrev);
+       else if (logdate != NULL) {
+               if (date_select(cf->file_rcs, logdate, &nrev) == -1)
+                       fatal("Can't parse date/time: %s", logdate);
+       } else
+               nrev = cf->file_rcs->rf_ndelta;
+
        if (cf->file_type == CVS_DIR) {
                if (verbosity > 1)
                        cvs_log(LP_ERR, "Logging %s", cf->file_path);
@@ -230,16 +238,6 @@ cvs_log_local(struct cvs_file *cf)
                return;
        }
 
-       if (logrev != NULL)
-               nrev = cvs_revision_select(cf->file_rcs, logrev);
-       else if (logdate != NULL) {
-               if ((nrev = date_select(cf->file_rcs, logdate)) == -1) {
-                       cvs_log(LP_ERR, "invalid date: %s", logdate);
-                       return;
-               }
-       } else
-               nrev = cf->file_rcs->rf_ndelta;
-
        cvs_printf("\nRCS file: %s", cf->file_rpath);
 
        if (cvs_cmdop != CVS_OP_RLOG)
@@ -418,8 +416,8 @@ push_date(char *dest, const char *src)
        return (dest);
 }
 
-static u_int
-date_select(RCSFILE *file, char *date)
+static int
+date_select(RCSFILE *file, char *date, u_int *cnt)
 {
        int i, nrev, flags;
        struct rcs_delta *rdp;
@@ -427,6 +425,7 @@ date_select(RCSFILE *file, char *date)
        char *first, *last, delim;
        time_t firstdate, lastdate, rcsdate;
 
+       *cnt = 0;
        nrev = 0;
        args = cvs_strsplit(date, ";");
 
@@ -566,7 +565,8 @@ date_select(RCSFILE *file, char *date)
                }
        }
 
+       *cnt = nrev;
        cvs_argv_destroy(args);
 
-       return (nrev);
+       return 0;
 }

Reply via email to