=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/cvs/diff.c,v retrieving revision 1.136 retrieving revision 1.137 diff -c -r1.136 -r1.137 *** src/usr.bin/cvs/diff.c 2008/05/30 10:12:12 1.136 --- src/usr.bin/cvs/diff.c 2008/05/30 11:06:17 1.137 *************** *** 1,4 **** ! /* $OpenBSD: diff.c,v 1.136 2008/05/30 10:12:12 tobias Exp $ */ /* * Copyright (c) 2008 Tobias Stoeckmann * Copyright (c) 2006 Joris Vink --- 1,4 ---- ! /* $OpenBSD: diff.c,v 1.137 2008/05/30 11:06:17 tobias Exp $ */ /* * Copyright (c) 2008 Tobias Stoeckmann * Copyright (c) 2006 Joris Vink *************** *** 36,41 **** --- 36,43 ---- static char *koptstr; static char *rev1 = NULL; static char *rev2 = NULL; + static time_t date1 = -1; + static time_t date2 = -1; struct cvs_cmd cvs_cmd_diff = { CVS_OP_DIFF, CVS_USE_WDIR, "diff", *************** *** 77,82 **** --- 79,94 ---- strlcat(diffargs, " -c", sizeof(diffargs)); diff_format = D_CONTEXT; break; + case 'D': + if (date1 == -1 && rev1 == NULL) { + date1 = cvs_date_parse(optarg); + } else if (date2 == -1 && rev2 == NULL) { + date2 = cvs_date_parse(optarg); + } else { + fatal("no more than 2 revisions/dates can" + " be specified"); + } + break; case 'f': force_head = 1; break; *************** *** 114,122 **** flags |= CR_RECURSE_DIRS; break; case 'r': ! if (rev1 == NULL) { rev1 = optarg; ! } else if (rev2 == NULL) { rev2 = optarg; } else { fatal("no more than 2 revisions/dates can" --- 126,134 ---- flags |= CR_RECURSE_DIRS; break; case 'r': ! if (date1 == -1 && rev1 == NULL) { rev1 = optarg; ! } else if (date2 == -1 && rev2 == NULL) { rev2 = optarg; } else { fatal("no more than 2 revisions/dates can" *************** *** 232,238 **** int fd1, fd2; struct stat st; struct timeval tv[2], tv2[2]; ! char rbuf[CVS_REV_BUFSZ], *p1, *p2; b1 = NULL; fd1 = fd2 = -1; --- 244,251 ---- int fd1, fd2; struct stat st; struct timeval tv[2], tv2[2]; ! struct tm *datetm; ! char rbuf[CVS_REV_BUFSZ], tbuf[CVS_TIME_BUFSZ], *p1, *p2; b1 = NULL; fd1 = fd2 = -1; *************** *** 286,292 **** cf->file_path); return; } - break; if (cf->file_rcs == NULL) { cvs_log(LP_ERR, "cannot find RCS file for %s", cf->file_path); --- 299,304 ---- *************** *** 296,302 **** } } ! if (cf->file_status == FILE_UPTODATE && rev1 == NULL && rev2 == NULL) return; if (kflag && cf->file_rcs != NULL) --- 308,315 ---- } } ! if (cf->file_status == FILE_UPTODATE && rev1 == NULL && rev2 == NULL && ! date1 == -1 && date2 == -1) return; if (kflag && cf->file_rcs != NULL) *************** *** 304,314 **** if (cf->file_rcs == NULL) diff_rev1 = NULL; ! else if (rev1 != NULL) { diff_rev1 = rcs_translate_tag(rev1, cf->file_rcs); if (diff_rev1 == NULL && cvs_cmdop == CVS_OP_DIFF) { ! cvs_log(LP_ERR, "tag %s not in file %s", rev1, ! cf->file_path); goto cleanup; } else if (diff_rev1 == NULL && cvs_cmdop == CVS_OP_RDIFF && force_head) { --- 317,336 ---- if (cf->file_rcs == NULL) diff_rev1 = NULL; ! else if (rev1 != NULL || date1 != -1) { ! cvs_specified_date = date1; diff_rev1 = rcs_translate_tag(rev1, cf->file_rcs); if (diff_rev1 == NULL && cvs_cmdop == CVS_OP_DIFF) { ! if (rev1 != NULL) ! cvs_log(LP_ERR, "tag %s not in file %s", rev1, ! cf->file_path); ! else { ! datetm = gmtime(&cvs_specified_date); ! strftime(tbuf, sizeof(tbuf), ! "%Y.%m.%d.%H.%M.%S", datetm); ! cvs_log(LP_ERR, "no revision for date %s in " ! "file %s", tbuf, cf->file_path); ! } goto cleanup; } else if (diff_rev1 == NULL && cvs_cmdop == CVS_OP_RDIFF && force_head) { *************** *** 319,324 **** --- 341,347 ---- diff_rev1 = cf->file_rcs->rf_head; } + cvs_specified_date = -1; } else if (cvs_cmdop == CVS_OP_DIFF) { if (cf->file_ent->ce_status == CVS_ENT_ADDED) diff_rev1 = NULL; *************** *** 328,338 **** if (cf->file_rcs == NULL) diff_rev2 = NULL; ! else if (rev2 != NULL) { diff_rev2 = rcs_translate_tag(rev2, cf->file_rcs); if (diff_rev2 == NULL && cvs_cmdop == CVS_OP_DIFF) { ! cvs_log(LP_ERR, "tag %s not in file %s", rev2, ! cf->file_path); goto cleanup; } else if (diff_rev2 == NULL && cvs_cmdop == CVS_OP_RDIFF && force_head) { --- 351,370 ---- if (cf->file_rcs == NULL) diff_rev2 = NULL; ! else if (rev2 != NULL || date2 != -1) { ! cvs_specified_date = date2; diff_rev2 = rcs_translate_tag(rev2, cf->file_rcs); if (diff_rev2 == NULL && cvs_cmdop == CVS_OP_DIFF) { ! if (rev2 != NULL) { ! cvs_log(LP_ERR, "tag %s not in file %s", rev2, ! cf->file_path); ! } else { ! datetm = gmtime(&cvs_specified_date); ! strftime(tbuf, sizeof(tbuf), ! "%Y.%m.%d.%H.%M.%S", datetm); ! cvs_log(LP_ERR, "no revision for date %s in " ! "file %s", tbuf, cf->file_path); ! } goto cleanup; } else if (diff_rev2 == NULL && cvs_cmdop == CVS_OP_RDIFF && force_head) { *************** *** 343,348 **** --- 375,381 ---- diff_rev2 = cf->file_rcs->rf_head; } + cvs_specified_date = -1; } else if (cvs_cmdop == CVS_OP_RDIFF) diff_rev2 = cf->file_rcs->rf_head; else if (cf->file_ent->ce_status == CVS_ENT_REMOVED)