diff options
author | Joris Vink <joris@cvs.openbsd.org> | 2005-09-29 15:16:27 +0000 |
---|---|---|
committer | Joris Vink <joris@cvs.openbsd.org> | 2005-09-29 15:16:27 +0000 |
commit | 1fc576ee23edae739b8391293bdf0b8e9df2a7da (patch) | |
tree | eb2bbbf77610909c592ba1fc3e1f637017072ba7 /usr.bin/rcs | |
parent | 683d36c7f7fa09c81a804da2caee62de599602d1 (diff) |
put it basic checkout code
Diffstat (limited to 'usr.bin/rcs')
-rw-r--r-- | usr.bin/rcs/Makefile | 4 | ||||
-rw-r--r-- | usr.bin/rcs/co.c | 108 |
2 files changed, 110 insertions, 2 deletions
diff --git a/usr.bin/rcs/Makefile b/usr.bin/rcs/Makefile index e9b7ef279e2..cec1a558101 100644 --- a/usr.bin/rcs/Makefile +++ b/usr.bin/rcs/Makefile @@ -1,11 +1,11 @@ -# $OpenBSD: Makefile,v 1.3 2005/09/19 15:45:33 niallo Exp $ +# $OpenBSD: Makefile,v 1.4 2005/09/29 15:16:26 joris Exp $ .PATH: ${.CURDIR}/../cvs PROG= rcs MAN= rcs.1 -SRCS= rcsprog.c buf.c log.c rcs.c rcsnum.c strtab.c +SRCS= co.c rcsprog.c buf.c log.c rcs.c rcsnum.c strtab.c CFLAGS+=-I${.CURDIR}/../cvs # Don't build the links until we actually support those commands diff --git a/usr.bin/rcs/co.c b/usr.bin/rcs/co.c new file mode 100644 index 00000000000..1c96e2a3cb2 --- /dev/null +++ b/usr.bin/rcs/co.c @@ -0,0 +1,108 @@ +/* $OpenBSD: co.c,v 1.1 2005/09/29 15:16:26 joris Exp $ */ +/* + * Copyright (c) 2005 Joris Vink <joris@openbsd.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/param.h> +#include <sys/stat.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "log.h" +#include "rcs.h" +#include "rcsprog.h" + +extern char *__progname; + +int +checkout_main(int argc, char **argv) +{ + int i, ch; + RCSNUM *rev; + RCSFILE *file; + BUF *bp; + char buf[16]; + char *s, fpath[MAXPATHLEN]; + + rev = RCS_HEAD_REV; + while ((ch = getopt(argc, argv, "r:")) != -1) { + switch (ch) { + case 'r': + if ((rev = rcsnum_parse(optarg)) == NULL) { + cvs_log(LP_ERR, "bad revision number"); + exit(1); + } + break; + default: + (usage)(); + exit(1); + } + } + + argc -= optind; + argv += optind; + + if (argc == 0) { + cvs_log(LP_ERR, "no input file"); + (usage)(); + exit (1); + } + + for (i = 0; i < argc; i++) { + if (rcs_statfile(argv[i], fpath, sizeof(fpath)) < 0) + continue; + + if ((file = rcs_open(fpath, RCS_READ)) == NULL) + continue; + + if ((s = strrchr(fpath, ',')) != NULL) + *s = '\0'; + + if ((bp = rcs_getrev(file, rev)) == NULL) { + cvs_log(LP_ERR, "cannot find '%s' in %s", + rcsnum_tostr(rev, buf, sizeof(buf)), fpath); + rcs_close(file); + continue; + } + + if (cvs_buf_write(bp, fpath, 0644) < 0) + cvs_log(LP_ERR, "failed to write revision to file"); + + cvs_buf_free(bp); + rcs_close(file); + } + + if (rev != RCS_HEAD_REV) + rcsnum_free(rev); + + return (0); +} + +void +checkout_usage(void) +{ + fprintf(stderr, "usage %s\n", __progname); +} |