summaryrefslogtreecommitdiffstats
path: root/usr.bin/rcs/rcsprog.c
diff options
context:
space:
mode:
authorray <ray@openbsd.org>2006-04-01 06:19:29 +0000
committerray <ray@openbsd.org>2006-04-01 06:19:29 +0000
commitd660bd8f039cff5fd8785b36511a6e6244595b7b (patch)
tree11b38be0d96c454269bc1da3729fdf9ae2fd16da /usr.bin/rcs/rcsprog.c
parentKeep cvs flags in `flags', rcs flags in `rcsflags' in rcsprog.h. (diff)
downloadwireguard-openbsd-d660bd8f039cff5fd8785b36511a6e6244595b7b.tar.xz
wireguard-openbsd-d660bd8f039cff5fd8785b36511a6e6244595b7b.zip
Add rcs -l, rcs -u, and regression tests.
``put it all in'' joris@
Diffstat (limited to 'usr.bin/rcs/rcsprog.c')
-rw-r--r--usr.bin/rcs/rcsprog.c70
1 files changed, 64 insertions, 6 deletions
diff --git a/usr.bin/rcs/rcsprog.c b/usr.bin/rcs/rcsprog.c
index 9dbcd9b44f5..99c43786ca8 100644
--- a/usr.bin/rcs/rcsprog.c
+++ b/usr.bin/rcs/rcsprog.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rcsprog.c,v 1.91 2006/04/01 05:58:17 ray Exp $ */
+/* $OpenBSD: rcsprog.c,v 1.92 2006/04/01 06:19:29 ray Exp $ */
/*
* Copyright (c) 2005 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -29,7 +29,7 @@
#include "rcsprog.h"
#define RCS_CMD_MAXARG 128
-#define RCSPROG_OPTSTRING "A:a:b::c:e::hik:Lm:Mn:N:qt::TUVx::z:"
+#define RCSPROG_OPTSTRING "A:a:b::c:e::hik:Ll::m:Mn:N:qt::TUu::Vx::z:"
#define DESC_PROMPT "enter description, terminated with single '.' " \
"or end of file:\nNOTE: This is NOT the log message!" \
@@ -421,8 +421,8 @@ rcs_usage(void)
{
fprintf(stderr,
"usage: rcs [-ehIiLMqTUV] [-Aoldfile] [-ausers] [-b[rev]]\n"
- " [-cstring] [-e[users]] [-kmode] [-mrev:msg]\n"
- " [-orev] [-sstate[:rev]] [-tfile|str]\n"
+ " [-cstring] [-e[users]] [-kmode] [-l[rev]] [-mrev:msg]\n"
+ " [-orev] [-sstate[:rev]] [-tfile|str] [-u[rev]]\n"
" [-xsuffixes] file ...\n");
}
@@ -438,7 +438,7 @@ rcs_main(int argc, char **argv)
int i, j, ch, kflag, lkmode;
char fpath[MAXPATHLEN], ofpath[MAXPATHLEN];
char *logstr, *logmsg, *nflag, *descfile;
- char *alist, *comment, *elist;
+ char *alist, *comment, *elist, *lrev, *urev;
mode_t fmode;
RCSFILE *file, *oldfile;
RCSNUM *logrev;
@@ -448,7 +448,7 @@ rcs_main(int argc, char **argv)
kflag = lkmode = -1;
fmode = S_IRUSR|S_IRGRP|S_IROTH;
flags = RCS_RDWR|RCS_PARSE_FULLY;
- descfile = nflag = NULL;
+ lrev = urev = descfile = nflag = NULL;
logstr = alist = comment = elist = NULL;
while ((ch = rcs_getopt(argc, argv, RCSPROG_OPTSTRING)) != -1) {
@@ -489,6 +489,11 @@ rcs_main(int argc, char **argv)
cvs_log(LP_WARN, "-U overriden by -L");
lkmode = RCS_LOCK_STRICT;
break;
+ case 'l':
+ /* XXX - Check with -u flag. */
+ lrev = rcs_optarg;
+ rcsflags |= RCSPROG_LFLAG;
+ break;
case 'm':
logstr = xstrdup(rcs_optarg);
break;
@@ -517,6 +522,11 @@ rcs_main(int argc, char **argv)
cvs_log(LP_WARN, "-L overriden by -U");
lkmode = RCS_LOCK_LOOSE;
break;
+ case 'u':
+ /* XXX - Check with -l flag. */
+ urev = rcs_optarg;
+ rcsflags |= RCSPROG_UFLAG;
+ break;
case 'V':
printf("%s\n", rcs_version);
exit(0);
@@ -647,6 +657,54 @@ rcs_main(int argc, char **argv)
if (lkmode != -1)
(void)rcs_lock_setmode(file, lkmode);
+ if (rcsflags & RCSPROG_LFLAG) {
+ RCSNUM *rev;
+ const char *username;
+
+ if ((username = getlogin()) == NULL)
+ fatal("could not get username");
+ if (lrev == NULL) {
+ rev = rcsnum_alloc();
+ rcsnum_cpy(file->rf_head, rev, 0);
+ } else if ((rev = rcsnum_parse(lrev)) == NULL) {
+ cvs_log(LP_ERR, "unable to unlock file");
+ rcs_close(file);
+ continue;
+ }
+ /* Make sure revision exists. */
+ if (rcs_findrev(file, rev) == NULL)
+ fatal("revision does not exist");
+ if (rcs_lock_add(file, username, rev) == -1) {
+ rcs_close(file);
+ fatal("unable to lock file");
+ }
+ rcsnum_free(rev);
+ }
+
+ if (rcsflags & RCSPROG_UFLAG) {
+ RCSNUM *rev;
+ const char *username;
+
+ if ((username = getlogin()) == NULL)
+ fatal("could not get username");
+ if (urev == NULL) {
+ rev = rcsnum_alloc();
+ rcsnum_cpy(file->rf_head, rev, 0);
+ } else if ((rev = rcsnum_parse(urev)) == NULL) {
+ cvs_log(LP_ERR, "unable to unlock file");
+ rcs_close(file);
+ continue;
+ }
+ /* Make sure revision exists. */
+ if (rcs_findrev(file, rev) == NULL)
+ fatal("revision does not exist");
+ if (rcs_lock_remove(file, username, rev) == -1) {
+ rcs_close(file);
+ fatal("unable to unlock file");
+ }
+ rcsnum_free(rev);
+ }
+
rcs_close(file);
if (rcsflags & PRESERVETIME)