diff options
author | Joris Vink <joris@cvs.openbsd.org> | 2005-10-23 04:07:07 +0000 |
---|---|---|
committer | Joris Vink <joris@cvs.openbsd.org> | 2005-10-23 04:07:07 +0000 |
commit | a63d92e86e386815a61d3074fa0feb7c2fd298c6 (patch) | |
tree | ffba29457330f210477f90d5b05a61a3e326082c | |
parent | 45538afa139c3dd50b9f6851eb2e28419c04d973 (diff) |
with recent diff3 support, rcsmerge now works;
-rw-r--r-- | usr.bin/rcs/Makefile | 7 | ||||
-rw-r--r-- | usr.bin/rcs/rcsmerge.c | 56 |
2 files changed, 54 insertions, 9 deletions
diff --git a/usr.bin/rcs/Makefile b/usr.bin/rcs/Makefile index d1f2828400e..780e082ccab 100644 --- a/usr.bin/rcs/Makefile +++ b/usr.bin/rcs/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.20 2005/10/22 17:41:13 joris Exp $ +# $OpenBSD: Makefile,v 1.21 2005/10/23 04:07:06 joris Exp $ .PATH: ${.CURDIR}/../cvs @@ -6,11 +6,12 @@ PROG= rcs MAN= ci.1 co.1 ident.1 rcs.1 rcsclean.1 rcsdiff.1 rcsmerge.1 rlog.1 SRCS= ci.c co.c ident.c rcsclean.c rcsdiff.c rcsmerge.c rcsprog.c rlog.c \ - buf.c date.y diff.c log.c rcs.c rcsnum.c strtab.c util.c + buf.c date.y diff.c diff3.c log.c rcs.c rcsnum.c strtab.c util.c CPPFLAGS+=-I${.CURDIR}/../cvs -DRCSPROG LINKS= ${BINDIR}/rcs ${BINDIR}/ci ${BINDIR}/rcs ${BINDIR}/co \ - ${BINDIR}/rcs ${BINDIR}/rcsclean ${BINDIR}/rcs ${BINDIR}/rcsdiff + ${BINDIR}/rcs ${BINDIR}/rcsclean ${BINDIR}/rcs ${BINDIR}/rcsdiff \ + ${BINDIR}/rcs ${BINDIR}/rcsmerge #MLINKS= rcs.1 ci.1 rcs.1 co.1 rcs.1 rcsclean.1 rcs.1 rcsdiff.1 CFLAGS+= -Wall diff --git a/usr.bin/rcs/rcsmerge.c b/usr.bin/rcs/rcsmerge.c index edcb09e9b5b..d1f5e38b072 100644 --- a/usr.bin/rcs/rcsmerge.c +++ b/usr.bin/rcs/rcsmerge.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rcsmerge.c,v 1.1 2005/10/18 16:16:39 xsa Exp $ */ +/* $OpenBSD: rcsmerge.c,v 1.2 2005/10/23 04:07:06 joris Exp $ */ /* * Copyright (c) 2005 Xavier Santolaria <xsa@openbsd.org> * All rights reserved. @@ -44,13 +44,14 @@ int rcsmerge_main(int argc, char **argv) { int i, ch; - char fpath[MAXPATHLEN]; + char *fcont, fpath[MAXPATHLEN]; RCSFILE *file; - RCSNUM *rev; + RCSNUM *baserev, *rev2, *frev; + BUF *bp; - rev = RCS_HEAD_REV; + baserev = rev2 = RCS_HEAD_REV; - while ((ch = rcs_getopt(argc, argv, "k:qr:TV")) != -1) { + while ((ch = rcs_getopt(argc, argv, "k:p::qr:TV")) != -1) { switch (ch) { case 'k': kflag = rcs_kflag_get(rcs_optarg); @@ -61,11 +62,20 @@ rcsmerge_main(int argc, char **argv) exit(1); } break; + case 'p': + rcs_set_rev(rcs_optarg, &baserev); + pipeout = 1; + break; case 'q': verbose = 0; break; case 'r': - rcs_set_rev(rcs_optarg, &rev); + if (baserev == RCS_HEAD_REV) + rcs_set_rev(rcs_optarg, &baserev); + else if (rev2 == RCS_HEAD_REV) + rcs_set_rev(rcs_optarg, &rev2); + else + cvs_log(LP_WARN, "ignored excessive -r option"); break; case 'T': /* @@ -89,6 +99,12 @@ rcsmerge_main(int argc, char **argv) exit(1); } + if (baserev == RCS_HEAD_REV) { + cvs_log(LP_ERR, "missing base revision"); + (usage)(); + exit(1); + } + for (i = 0; i < argc; i++) { if (rcs_statfile(argv[i], fpath, sizeof(fpath)) < 0) continue; @@ -96,6 +112,34 @@ rcsmerge_main(int argc, char **argv) if ((file = rcs_open(fpath, RCS_READ)) == NULL) continue; + if (rev2 == RCS_HEAD_REV) + frev = file->rf_head; + else + frev = rev2; + + if ((bp = cvs_diff3(file, argv[i], baserev, frev)) == NULL) { + cvs_log(LP_ERR, "failed to merge"); + rcs_close(file); + continue; + } + + if (pipeout == 1) { + if (cvs_buf_putc(bp, '\0') < 0) { + rcs_close(file); + continue; + } + + fcont = cvs_buf_release(bp); + printf("%s", fcont); + free(fcont); + } else { + /* XXX mode */ + if (cvs_buf_write(bp, argv[i], 0644) < 0) + cvs_log(LP_ERR, "failed to write new file"); + + cvs_buf_free(bp); + } + rcs_close(file); } |