diff options
Diffstat (limited to 'usr.bin/cvs')
-rw-r--r-- | usr.bin/cvs/cvs.h | 3 | ||||
-rw-r--r-- | usr.bin/cvs/diff.c | 79 |
2 files changed, 53 insertions, 29 deletions
diff --git a/usr.bin/cvs/cvs.h b/usr.bin/cvs/cvs.h index 7b13e2dc8d4..19ad84c73c1 100644 --- a/usr.bin/cvs/cvs.h +++ b/usr.bin/cvs/cvs.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cvs.h,v 1.107 2006/05/27 18:04:46 joris Exp $ */ +/* $OpenBSD: cvs.h,v 1.108 2006/05/27 20:57:42 joris Exp $ */ /* * Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -105,6 +105,7 @@ #define CVS_DESCR_FILE_EXT ",t" /* server-side paths */ +#define CVS_PATH_DEVNULL "/dev/null" #define CVS_PATH_ROOT "CVSROOT" #define CVS_PATH_EMPTYDIR CVS_PATH_ROOT "/Emptydir" #define CVS_PATH_COMMITINFO CVS_PATH_ROOT "/commitinfo" diff --git a/usr.bin/cvs/diff.c b/usr.bin/cvs/diff.c index d9b7813f83d..b21ba147460 100644 --- a/usr.bin/cvs/diff.c +++ b/usr.bin/cvs/diff.c @@ -1,4 +1,4 @@ -/* $OpenBSD: diff.c,v 1.93 2006/05/27 17:52:27 joris Exp $ */ +/* $OpenBSD: diff.c,v 1.94 2006/05/27 20:57:42 joris Exp $ */ /* * Copyright (c) 2006 Joris Vink <joris@openbsd.org> * @@ -25,6 +25,8 @@ int cvs_diff(int, char **); void cvs_diff_local(struct cvs_file *); +int include_added_files = 0; + struct cvs_cmd cvs_cmd_diff = { CVS_OP_DIFF, CVS_REQ_DIFF, "diff", { "di", "dif" }, @@ -60,6 +62,10 @@ cvs_diff(int argc, char **argv) strlcat(diffargs, " -n", sizeof(diffargs)); diff_format = D_RCSDIFF; break; + case 'N': + strlcat(diffargs, " -N", sizeof(diffargs)); + include_added_files = 1; + break; case 'r': if (diff_rev1 == NULL) { diff_rev1 = rcsnum_parse(optarg); @@ -126,31 +132,38 @@ cvs_diff_local(struct cvs_file *cf) } else if (cf->file_status == FILE_UNKNOWN) { cvs_log(LP_ERR, "I know nothing about %s", cf->file_path); return; - } else if (cf->file_status == FILE_UPTODATE && diff_rev2 == NULL) + } else if (cf->file_status == FILE_ADDED && include_added_files == 0) { + cvs_log(LP_ERR, "%s is a new entry, no comparison available", + cf->file_path); return; + } else if (cf->file_status == FILE_UPTODATE && diff_rev2 == NULL) { + return; + } diff_file = cf->file_path; cvs_printf("Index: %s\n%s\nRCS file: %s\n", cf->file_path, RCS_DIFF_DIV, cf->file_rpath); - if (diff_rev1 != NULL) - r1 = diff_rev1; - else - r1 = cf->file_ent->ce_rev; + if (cf->file_status != FILE_ADDED) { + if (diff_rev1 != NULL) + r1 = diff_rev1; + else + r1 = cf->file_ent->ce_rev; - diff_rev1 = r1; - rcsnum_tostr(r1, rbuf , sizeof(rbuf)); - cvs_printf("retrieving revision %s\n", rbuf); - if ((b1 = rcs_getrev(cf->file_rcs, r1)) == NULL) - fatal("failed to retrieve revision %s", rbuf); + diff_rev1 = r1; + rcsnum_tostr(r1, rbuf , sizeof(rbuf)); + cvs_printf("retrieving revision %s\n", rbuf); + if ((b1 = rcs_getrev(cf->file_rcs, r1)) == NULL) + fatal("failed to retrieve revision %s", rbuf); - b1 = rcs_kwexp_buf(b1, cf->file_rcs, r1); + b1 = rcs_kwexp_buf(b1, cf->file_rcs, r1); - tv[0].tv_sec = rcs_rev_getdate(cf->file_rcs, r1); - tv[0].tv_usec = 0; - tv[1] = tv[0]; + tv[0].tv_sec = rcs_rev_getdate(cf->file_rcs, r1); + tv[0].tv_usec = 0; + tv[1] = tv[0]; + } - if (diff_rev2 != NULL) { + if (diff_rev2 != NULL && cf->file_status != FILE_ADDED) { rcsnum_tostr(diff_rev2, rbuf, sizeof(rbuf)); cvs_printf("retrieving revision %s\n", rbuf); if ((b2 = rcs_getrev(cf->file_rcs, diff_rev2)) == NULL) @@ -178,26 +191,34 @@ cvs_diff_local(struct cvs_file *cf) cvs_printf("%s", diffargs); - rcsnum_tostr(r1, rbuf, sizeof(rbuf)); - cvs_printf(" -r%s", rbuf); - - if (diff_rev2 != NULL) { - rcsnum_tostr(diff_rev2, rbuf, sizeof(rbuf)); + if (cf->file_status != FILE_ADDED) { + rcsnum_tostr(r1, rbuf, sizeof(rbuf)); cvs_printf(" -r%s", rbuf); + + if (diff_rev2 != NULL) { + rcsnum_tostr(diff_rev2, rbuf, sizeof(rbuf)); + cvs_printf(" -r%s", rbuf); + } } cvs_printf(" %s\n", cf->file_path); - len = strlcpy(p1, cvs_tmpdir, sizeof(p1)); - if (len >= sizeof(p1)) + if (cf->file_status != FILE_ADDED) { + len = strlcpy(p1, cvs_tmpdir, sizeof(p1)); + if (len >= sizeof(p1)) fatal("cvs_diff_local: truncation"); - len = strlcat(p1, "/diff1.XXXXXXXXXX", sizeof(p1)); - if (len >= sizeof(p1)) - fatal("cvs_diff_local: truncation"); + len = strlcat(p1, "/diff1.XXXXXXXXXX", sizeof(p1)); + if (len >= sizeof(p1)) + fatal("cvs_diff_local: truncation"); - cvs_buf_write_stmp(b1, p1, 0600, tv); - cvs_buf_free(b1); + cvs_buf_write_stmp(b1, p1, 0600, tv); + cvs_buf_free(b1); + } else { + len = strlcpy(p1, CVS_PATH_DEVNULL, sizeof(p1)); + if (len >= sizeof(p1)) + fatal("cvs_diff_local: truncation"); + } len = strlcpy(p2, cvs_tmpdir, sizeof(p2)); if (len >= sizeof(p2)) @@ -212,4 +233,6 @@ cvs_diff_local(struct cvs_file *cf) cvs_diffreg(p1, p2, NULL); cvs_worklist_run(&temp_files, cvs_worklist_unlink); + + diff_rev1 = diff_rev2 = NULL; } |