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; }