version 1.43, 2006/05/09 14:03:55 |
version 1.44, 2006/05/10 12:05:33 |
|
|
int |
int |
rcsmerge_main(int argc, char **argv) |
rcsmerge_main(int argc, char **argv) |
{ |
{ |
int fd, i, ch, flags, kflag, status; |
int fd, ch, flags, kflag, status; |
char *fcont, fpath[MAXPATHLEN], r1[16], r2[16], *rev_str1, *rev_str2; |
char *fcont, fpath[MAXPATHLEN], r1[16], r2[16], *rev_str1, *rev_str2; |
RCSFILE *file; |
RCSFILE *file; |
RCSNUM *rev1, *rev2; |
RCSNUM *rev1, *rev2; |
|
|
|
|
flags = 0; |
flags = 0; |
kflag = RCS_KWEXP_ERR; |
kflag = RCS_KWEXP_ERR; |
status = 0; |
status = D_ERROR; |
rev1 = rev2 = NULL; |
rev1 = rev2 = NULL; |
rev_str1 = rev_str2 = NULL; |
rev_str1 = rev_str2 = NULL; |
|
|
|
|
argc -= rcs_optind; |
argc -= rcs_optind; |
argv += rcs_optind; |
argv += rcs_optind; |
|
|
if (argc < 1) { |
if (rev_str1 == NULL) { |
warnx("no input file"); |
warnx("no base revision number given"); |
(usage)(); |
(usage)(); |
exit(D_ERROR); |
exit(D_ERROR); |
} |
} |
|
|
if (rev_str1 == NULL) { |
if (argc < 1) { |
warnx("no base revision number given"); |
warnx("no input file"); |
(usage)(); |
(usage)(); |
exit(D_ERROR); |
exit(D_ERROR); |
} |
} |
|
|
for (i = 0; i < argc; i++) { |
if (argc > 2 || (argc == 2 && argv[1] != NULL)) |
fd = rcs_statfile(argv[i], fpath, sizeof(fpath), flags); |
warnx("warning: excess arguments ignored"); |
if (fd < 0) |
|
continue; |
|
|
|
if ((file = rcs_open(fpath, fd, RCS_READ)) == NULL) |
if ((fd = rcs_statfile(argv[0], fpath, sizeof(fpath), flags)) < 0) |
continue; |
return (status); |
|
|
if (!(flags & QUIET)) |
if (!(flags & QUIET)) |
fprintf(stderr, "RCS file: %s\n", fpath); |
(void)fprintf(stderr, "RCS file: %s\n", fpath); |
|
|
if (rev1 != NULL) { |
if ((file = rcs_open(fpath, fd, RCS_READ)) == NULL) |
rcsnum_free(rev1); |
return (status); |
rev1 = NULL; |
|
} |
|
if (rev2 != NULL) { |
|
rcsnum_free(rev2); |
|
rev2 = NULL; |
|
} |
|
|
|
if (strcmp(rev_str1, "") == 0) { |
if (strcmp(rev_str1, "") == 0) { |
rev1 = rcsnum_alloc(); |
rev1 = rcsnum_alloc(); |
rcsnum_cpy(file->rf_head, rev1, 0); |
rcsnum_cpy(file->rf_head, rev1, 0); |
} else if ((rev1 = rcs_getrevnum(rev_str1, file)) == NULL) |
} else if ((rev1 = rcs_getrevnum(rev_str1, file)) == NULL) |
errx(D_ERROR, "invalid revision: %s", rev_str1); |
errx(D_ERROR, "invalid revision: %s", rev_str1); |
|
|
if (rev_str2 != NULL && strcmp(rev_str2, "") != 0) { |
if (rev_str2 != NULL && strcmp(rev_str2, "") != 0) { |
if ((rev2 = rcs_getrevnum(rev_str2, file)) == NULL) |
if ((rev2 = rcs_getrevnum(rev_str2, file)) == NULL) |
errx(D_ERROR, "invalid revision: %s", rev_str2); |
errx(D_ERROR, "invalid revision: %s", rev_str2); |
} else { |
} else { |
rev2 = rcsnum_alloc(); |
rev2 = rcsnum_alloc(); |
rcsnum_cpy(file->rf_head, rev2, 0); |
rcsnum_cpy(file->rf_head, rev2, 0); |
} |
} |
|
|
if (rcsnum_cmp(rev1, rev2, 0) == 0) { |
if (rcsnum_cmp(rev1, rev2, 0) == 0) |
rcs_close(file); |
goto out; |
continue; |
|
} |
|
|
|
if (!(flags & QUIET)) { |
if ((bp = rcs_diff3(file, argv[0], rev1, rev2, |
(void)rcsnum_tostr(rev1, r1, sizeof(r1)); |
!(flags & QUIET))) == NULL) { |
(void)rcsnum_tostr(rev2, r2, sizeof(r2)); |
warnx("failed to merge"); |
|
goto out; |
|
} |
|
|
fprintf(stderr, "Merging differences between %s and " |
if (!(flags & QUIET)) { |
"%s into %s%s\n", r1, r2, argv[i], |
(void)rcsnum_tostr(rev1, r1, sizeof(r1)); |
(flags & PIPEOUT) ? "; result to stdout":""); |
(void)rcsnum_tostr(rev2, r2, sizeof(r2)); |
} |
|
|
|
if ((bp = rcs_diff3(file, argv[i], rev1, rev2, |
(void)fprintf(stderr, "Merging differences between %s and " |
!(flags & QUIET))) == NULL) { |
"%s into %s%s\n", r1, r2, argv[0], |
warnx("failed to merge"); |
(flags & PIPEOUT) ? "; result to stdout":""); |
rcs_close(file); |
} |
continue; |
|
} |
|
|
|
if (diff3_conflicts != 0) |
if (diff3_conflicts != 0) |
status = D_OVERLAPS; |
status = D_OVERLAPS; |
|
else |
|
status = 0; |
|
|
if (flags & PIPEOUT) { |
if (flags & PIPEOUT) { |
rcs_buf_putc(bp, '\0'); |
rcs_buf_putc(bp, '\0'); |
fcont = rcs_buf_release(bp); |
fcont = rcs_buf_release(bp); |
printf("%s", fcont); |
printf("%s", fcont); |
xfree(fcont); |
xfree(fcont); |
} else { |
} else { |
/* XXX mode */ |
/* XXX mode */ |
if (rcs_buf_write(bp, argv[i], 0644) < 0) |
if (rcs_buf_write(bp, argv[0], 0644) < 0) |
warnx("rcs_buf_write failed"); |
warnx("rcs_buf_write failed"); |
|
|
rcs_buf_free(bp); |
rcs_buf_free(bp); |
} |
|
rcs_close(file); |
|
} |
} |
|
|
|
out: |
|
rcs_close(file); |
|
|
|
if (rev1 != NULL) |
|
rcsnum_free(rev1); |
|
if (rev2 != NULL) |
|
rcsnum_free(rev2); |
|
|
return (status); |
return (status); |
} |
} |