summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorNiall O'Higgins <niallo@cvs.openbsd.org>2005-09-30 16:37:28 +0000
committerNiall O'Higgins <niallo@cvs.openbsd.org>2005-09-30 16:37:28 +0000
commitbff7c2fddfa530273b20f870e81d244c1cba549e (patch)
tree87691f1db55de34ef42b4d192ad757afd3fa116c /usr.bin
parent01f9816c65f7be13d83489f6de7ecb9e0f9ae3c1 (diff)
add a basic ci.c as a starting point. requires more changes to rcs api
to work properly. ok joris@
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/rcs/Makefile4
-rw-r--r--usr.bin/rcs/ci.c157
2 files changed, 159 insertions, 2 deletions
diff --git a/usr.bin/rcs/Makefile b/usr.bin/rcs/Makefile
index cec1a558101..5befc65fb59 100644
--- a/usr.bin/rcs/Makefile
+++ b/usr.bin/rcs/Makefile
@@ -1,11 +1,11 @@
-# $OpenBSD: Makefile,v 1.4 2005/09/29 15:16:26 joris Exp $
+# $OpenBSD: Makefile,v 1.5 2005/09/30 16:37:27 niallo Exp $
.PATH: ${.CURDIR}/../cvs
PROG= rcs
MAN= rcs.1
-SRCS= co.c rcsprog.c buf.c log.c rcs.c rcsnum.c strtab.c
+SRCS= ci.c 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/ci.c b/usr.bin/rcs/ci.c
new file mode 100644
index 00000000000..0b60360df8a
--- /dev/null
+++ b/usr.bin/rcs/ci.c
@@ -0,0 +1,157 @@
+/* $OpenBSD: ci.c,v 1.1 2005/09/30 16:37:27 niallo Exp $ */
+/*
+ * Copyright (c) 2005 Niall O'Higgins <niallo@openbsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following cinditions
+ * are met:
+ *
+ * 1. Redistributions of source cide must retain the above cipyright
+ * notice, this list of cinditions 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/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+
+#include <err.h>
+#include <pwd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <string.h>
+
+#include "log.h"
+#include "rcs.h"
+#include "rcsprog.h"
+
+extern char *__progname;
+
+void
+checkin_usage(void)
+{
+ fprintf(stderr,
+ "usage: %s [-jlMNqu] [-d date | -r rev] [-m msg] [-k mode] "
+ "file ...\n", __progname);
+}
+
+/*
+ * checkin_main()
+ *
+ * Handler for the `ci' program.
+ * Returns 0 on success, or >0 on error.
+ */
+/*
+Options:
+
+-r | -r[rev]: check in revision rev
+-l[rev]: ", but do co -l
+-u[rev]: ", bt do co -u
+-f[rev]: force a deposit (check in?)
+-k[rev]: ?
+-q[rev]: quiet mode
+-i[rev]: initial check in, errors if RCS file already exists.
+-j[rev]: just checkin and do not initialize, errors if RCS file already exists.
+-I[rev]: user is prompted even if stdin is not a tty
+-d[date]: uses date for checkin dat and time.
+-M[rev]: set modification time on any new working file to be that of the retrieved version.
+-mmsg: msg is the log message, don't start editor. log messages with #are comments.
+*/
+int
+checkin_main(int argc, char **argv)
+{
+ int i, ch, dflag, flags, lkmode;
+ mode_t fmode;
+ RCSFILE *file;
+ char fpath[MAXPATHLEN];
+ char *rcs_msg, *rev;
+
+ lkmode = -1;
+ flags = RCS_RDWR;
+ file = NULL;
+ rev = rcs_msg = NULL;
+ fmode = dflag = 0;
+
+ cvs_log_init(LD_STD, 0);
+
+ while ((ch = getopt(argc, argv, "j:l:M:N:qu:d:r::m:k:")) != -1) {
+ switch (ch) {
+ case 'h':
+ (usage)();
+ exit(0);
+ case 'l':
+ lkmode = RCS_LOCK_STRICT;
+ break;
+ case 'm':
+ rcs_msg = optarg;
+ break;
+ case 'r':
+ rev = optarg;
+ break;
+ case 'V':
+ printf("%s\n", rcs_version);
+ exit(0);
+ 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;
+
+ flags = RCS_RDWR;
+ file = rcs_open(fpath, flags, fmode);
+ if (file == NULL) {
+ exit(1);
+ }
+ if (rcs_msg == NULL) {
+ cvs_log(LP_ERR, "no log message");
+ exit(1);
+ }
+ if (rev != NULL ) {
+ /* XXX */
+ } else {
+ if (dflag) {
+ /* XXX */
+ } else {
+ if (rcs_rev_add(file, RCS_HEAD_REV, rcs_msg, -1)
+ != 0) {
+ cvs_log(LP_ERR,
+ "rcs_rev_add() failure");
+ exit(1);
+ }
+ }
+ }
+ rcs_close(file);
+ }
+
+ exit(0);
+}