version 1.3, 2005/10/08 19:20:49 |
version 1.4, 2005/10/08 19:58:04 |
|
|
#include "rcsprog.h" |
#include "rcsprog.h" |
|
|
extern char *__progname; |
extern char *__progname; |
|
|
static int rcsdiff_file(RCSFILE *, RCSNUM *, const char *); |
static int rcsdiff_file(RCSFILE *, RCSNUM *, const char *); |
|
static int rcsdiff_rev(RCSFILE *rfp, RCSNUM *rev, RCSNUM *rev2); |
|
|
int |
int |
rcsdiff_main(int argc, char **argv) |
rcsdiff_main(int argc, char **argv) |
{ |
{ |
int i, ch; |
int i, ch; |
RCSNUM *rev, *frev; |
RCSNUM *rev, *rev2, *frev; |
RCSFILE *file; |
RCSFILE *file; |
char fpath[MAXPATHLEN]; |
char fpath[MAXPATHLEN]; |
|
|
rev = RCS_HEAD_REV; |
rev = RCS_HEAD_REV; |
|
rev2 = NULL; |
|
|
while ((ch = getopt(argc, argv, "cnquV")) != -1) { |
while ((ch = getopt(argc, argv, "cnqr:uV")) != -1) { |
switch (ch) { |
switch (ch) { |
case 'c': |
case 'c': |
diff_format = D_CONTEXT; |
diff_format = D_CONTEXT; |
|
|
case 'V': |
case 'V': |
printf("%s\n", rcs_version); |
printf("%s\n", rcs_version); |
exit(0); |
exit(0); |
|
case 'r': |
|
if (rev == RCS_HEAD_REV) { |
|
if ((rev = rcsnum_parse(optarg)) == NULL) { |
|
cvs_log(LP_ERR, "bad revision number"); |
|
exit(1); |
|
} |
|
} else { |
|
if ((rev2 = rcsnum_parse(optarg)) == NULL) { |
|
cvs_log(LP_ERR, "bad revision number"); |
|
exit(1); |
|
} |
|
} |
|
break; |
default: |
default: |
break; |
break; |
} |
} |
|
|
else |
else |
frev = rev; |
frev = rev; |
|
|
if (rcsdiff_file(file, frev, argv[i]) < 0) { |
if (rev2 == NULL) { |
cvs_log(LP_ERR, "failed to rcsdiff"); |
if (rcsdiff_file(file, frev, argv[i]) < 0) { |
rcs_close(file); |
cvs_log(LP_ERR, "failed to rcsdiff"); |
continue; |
rcs_close(file); |
|
continue; |
|
} |
|
} else { |
|
if (rcsdiff_rev(file, rev, rev2) < 0) { |
|
cvs_log(LP_ERR, "failed to rcsdiff"); |
|
rcs_close(file); |
|
continue; |
|
} |
} |
} |
|
|
rcs_close(file); |
rcs_close(file); |
|
|
void |
void |
rcsdiff_usage(void) |
rcsdiff_usage(void) |
{ |
{ |
fprintf(stderr, "usage %s [-qV] file ...\n", __progname); |
fprintf(stderr, "usage %s [-qV] [-r rev1 [-r rev2]] file ...\n", |
|
__progname); |
} |
} |
|
|
static int |
static int |
|
|
if ((b2 = cvs_buf_load(filename, BUF_AUTOEXT)) == NULL) { |
if ((b2 = cvs_buf_load(filename, BUF_AUTOEXT)) == NULL) { |
cvs_log(LP_ERR, "failed to load file: '%s'", filename); |
cvs_log(LP_ERR, "failed to load file: '%s'", filename); |
cvs_buf_free(b1); |
cvs_buf_free(b1); |
|
return (-1); |
|
} |
|
|
|
strlcpy(path1, "/tmp/diff1.XXXXXXXXXX", sizeof(path1)); |
|
if (cvs_buf_write_stmp(b1, path1, 0600) == -1) { |
|
cvs_log(LP_ERRNO, "could not write temporary file"); |
|
cvs_buf_free(b1); |
|
cvs_buf_free(b2); |
|
return (-1); |
|
} |
|
cvs_buf_free(b1); |
|
|
|
strlcpy(path2, "/tmp/diff2.XXXXXXXXXX", sizeof(path2)); |
|
if (cvs_buf_write_stmp(b2, path2, 0600) == -1) { |
|
cvs_buf_free(b2); |
|
(void)unlink(path1); |
|
return (-1); |
|
} |
|
cvs_buf_free(b2); |
|
|
|
cvs_diffreg(path1, path2, NULL); |
|
(void)unlink(path1); |
|
(void)unlink(path2); |
|
|
|
return (0); |
|
} |
|
|
|
static int |
|
rcsdiff_rev(RCSFILE *rfp, RCSNUM *rev1, RCSNUM *rev2) |
|
{ |
|
char path1[MAXPATHLEN], path2[MAXPATHLEN]; |
|
BUF *b1, *b2; |
|
char rbuf[64]; |
|
|
|
rcsnum_tostr(rev1, rbuf, sizeof(rbuf)); |
|
if (verbose) |
|
printf("retrieving revision %s\n", rbuf); |
|
|
|
if ((b1 = rcs_getrev(rfp, rev1)) == NULL) { |
|
cvs_log(LP_ERR, "failed to retrieve revision"); |
|
return (-1); |
|
} |
|
|
|
rcsnum_tostr(rev2, rbuf, sizeof(rbuf)); |
|
if (verbose) |
|
printf("retrieving revision %s\n", rbuf); |
|
|
|
if ((b2 = rcs_getrev(rfp, rev2)) == NULL) { |
|
cvs_log(LP_ERR, "failed to retrieve revision"); |
return (-1); |
return (-1); |
} |
} |
|
|