summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorMoritz Jodeit <moritz@cvs.openbsd.org>2005-10-17 16:16:01 +0000
committerMoritz Jodeit <moritz@cvs.openbsd.org>2005-10-17 16:16:01 +0000
commitc41646bf6f00b3fd173487f9d47f40cfcb4dd1e3 (patch)
tree4c6178b40d2f6b59133b3e41aaee4eecadcd5958 /usr.bin
parent9839ef3092d5236c710b1b5730a6bb5778aacbd1 (diff)
add client support for the `watch' and `watchers' commands. ok joris@ xsa@
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/cvs/proto.c6
-rw-r--r--usr.bin/cvs/proto.h9
-rw-r--r--usr.bin/cvs/watch.c116
3 files changed, 113 insertions, 18 deletions
diff --git a/usr.bin/cvs/proto.c b/usr.bin/cvs/proto.c
index 9be475933dd..42f339b5704 100644
--- a/usr.bin/cvs/proto.c
+++ b/usr.bin/cvs/proto.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: proto.c,v 1.78 2005/10/10 17:51:53 xsa Exp $ */
+/* $OpenBSD: proto.c,v 1.79 2005/10/17 16:16:00 moritz Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -116,6 +116,10 @@ struct cvs_req cvs_requests[] = {
{ CVS_REQ_TAG, "tag", CVS_REQF_RESP },
{ CVS_REQ_ADMIN, "admin", CVS_REQF_RESP },
{ CVS_REQ_WATCHERS, "watchers", CVS_REQF_RESP },
+ { CVS_REQ_WATCH_ON, "watch-on", CVS_REQF_RESP },
+ { CVS_REQ_WATCH_OFF, "watch-off", CVS_REQF_RESP },
+ { CVS_REQ_WATCH_ADD, "watch-add", CVS_REQF_RESP },
+ { CVS_REQ_WATCH_REMOVE, "watch-remove", CVS_REQF_RESP },
{ CVS_REQ_EDITORS, "editors", CVS_REQF_RESP },
};
diff --git a/usr.bin/cvs/proto.h b/usr.bin/cvs/proto.h
index 7f1c771c124..26ca70f791b 100644
--- a/usr.bin/cvs/proto.h
+++ b/usr.bin/cvs/proto.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: proto.h,v 1.7 2005/07/25 11:07:00 xsa Exp $ */
+/* $OpenBSD: proto.h,v 1.8 2005/10/17 16:16:00 moritz Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -108,8 +108,13 @@
#define CVS_REQ_RLOG 67
#define CVS_REQ_RDIFF 68
#define CVS_REQ_VERSION 69
+#define CVS_REQ_WATCH_ON 70
+#define CVS_REQ_WATCH_OFF 71
+#define CVS_REQ_WATCH_ADD 72
+#define CVS_REQ_WATCH_REMOVE 73
-#define CVS_REQ_MAX 69
+
+#define CVS_REQ_MAX 73
/* responses */
diff --git a/usr.bin/cvs/watch.c b/usr.bin/cvs/watch.c
index 068031ea728..9d4601c40d0 100644
--- a/usr.bin/cvs/watch.c
+++ b/usr.bin/cvs/watch.c
@@ -1,6 +1,7 @@
-/* $OpenBSD: watch.c,v 1.6 2005/08/16 06:37:57 xsa Exp $ */
+/* $OpenBSD: watch.c,v 1.7 2005/10/17 16:16:00 moritz Exp $ */
/*
* Copyright (c) 2005 Xavier Santolaria <xsa@openbsd.org>
+ * Copyright (c) 2005 Moritz Jodeit <moritz@openbsd.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -38,10 +39,11 @@
#include "proto.h"
static int cvs_watch_init(struct cvs_cmd *, int, char **, int *);
+static int cvs_watch_pre_exec(struct cvsroot *);
static int cvs_watch_remote(CVSFILE *, void*);
static int cvs_watch_local(CVSFILE *, void*);
-static int cvs_watchers_remote(CVSFILE *, void*);
+static int cvs_watchers_init(struct cvs_cmd *, int, char **, int *);
static int cvs_watchers_local(CVSFILE *, void*);
@@ -52,14 +54,14 @@ struct cvs_cmd cvs_cmd_watch = {
"on | off | add | remove [-lR] [-a action] [file ...]",
"a:lR",
NULL,
- CF_SORT | CF_RECURSE,
+ CF_SORT | CF_IGNORE | CF_RECURSE,
cvs_watch_init,
- NULL,
+ cvs_watch_pre_exec,
cvs_watch_remote,
cvs_watch_local,
NULL,
NULL,
- 0
+ CVS_CMD_SENDDIR | CVS_CMD_ALLOWSPEC | CVS_CMD_SENDARGS2
};
struct cvs_cmd cvs_cmd_watchers = {
@@ -69,10 +71,10 @@ struct cvs_cmd cvs_cmd_watchers = {
"[-lR] [file ...]",
"lR",
NULL,
- CF_SORT | CF_RECURSE,
- cvs_watch_init,
+ CF_SORT | CF_IGNORE | CF_RECURSE,
+ cvs_watchers_init,
NULL,
- cvs_watchers_remote,
+ cvs_watch_remote,
cvs_watchers_local,
NULL,
NULL,
@@ -80,21 +82,51 @@ struct cvs_cmd cvs_cmd_watchers = {
};
+static char *aoptstr = NULL;
+static int watchreq = 0;
static int
cvs_watch_init(struct cvs_cmd *cmd, int argc, char **argv, int *arg)
{
int ch;
+ if (argc < 2)
+ return (CVS_EX_USAGE);
+
+ if (strcmp(argv[1], "on") == 0)
+ watchreq = CVS_REQ_WATCH_ON;
+ else if (strcmp(argv[1], "off") == 0)
+ watchreq = CVS_REQ_WATCH_OFF;
+ else if (strcmp(argv[1], "add") == 0)
+ watchreq = CVS_REQ_WATCH_ADD;
+ else if (strcmp(argv[1], "remove") == 0)
+ watchreq = CVS_REQ_WATCH_REMOVE;
+ else
+ return (CVS_EX_USAGE);
+
+ cmd->cmd_req = watchreq;
+ optind = 2;
+
while ((ch = getopt(argc, argv, cmd->cmd_opts)) != -1) {
switch (ch) {
case 'a':
/*
- * The `watchers' command does not have the
- * -a option. Check which command has been issued.
+ * Only `watch add | remove' support the -a option.
+ * Check which command has been issued.
*/
- if (cvs_cmdop != CVS_OP_WATCH)
+ if (watchreq != CVS_REQ_WATCH_ADD &&
+ watchreq != CVS_REQ_WATCH_REMOVE)
+ return (CVS_EX_USAGE);
+ if (strcmp(optarg, "commit") != 0 &&
+ strcmp(optarg, "edit") != 0 &&
+ strcmp(optarg, "unedit") != 0 &&
+ strcmp(optarg, "all") != 0 &&
+ strcmp(optarg, "none") != 0)
return (CVS_EX_USAGE);
+ if ((aoptstr = strdup(optarg)) == NULL) {
+ cvs_log(LP_ERRNO, "failed to copy action");
+ return (CVS_EX_DATA);
+ }
break;
case 'l':
cmd->file_flags &= ~CF_RECURSE;
@@ -113,12 +145,38 @@ cvs_watch_init(struct cvs_cmd *cmd, int argc, char **argv, int *arg)
/*
- * cvs_watch_remote()
+ * cvs_watch_pre_exec()
*
*/
static int
-cvs_watch_remote(CVSFILE *cf, void *arg)
+cvs_watch_pre_exec(struct cvsroot *root)
{
+ if (root->cr_method != CVS_METHOD_LOCAL) {
+ if (watchreq != CVS_REQ_WATCH_ADD &&
+ watchreq != CVS_REQ_WATCH_REMOVE)
+ return (CVS_EX_OK);
+
+ if (aoptstr == NULL || strcmp(aoptstr, "all") == 0) {
+ /* Defaults to: edit, unedit, commit */
+ if ((cvs_sendarg(root, "-a", 0) < 0) ||
+ (cvs_sendarg(root, "edit", 0) < 0) ||
+ (cvs_sendarg(root, "-a", 0) < 0) ||
+ (cvs_sendarg(root, "unedit", 0) < 0) ||
+ (cvs_sendarg(root, "-a", 0) < 0) ||
+ (cvs_sendarg(root, "commit", 0) < 0)) {
+ free(aoptstr);
+ return (CVS_EX_PROTO);
+ }
+ } else {
+ if ((cvs_sendarg(root, "-a", 0) < 0) ||
+ (cvs_sendarg(root, aoptstr, 0) < 0)) {
+ free(aoptstr);
+ return (CVS_EX_PROTO);
+ }
+ }
+ }
+ free(aoptstr);
+
return (CVS_EX_OK);
}
@@ -135,11 +193,11 @@ cvs_watch_local(CVSFILE *cf, void *arg)
/*
- * cvs_watchers_remote()
+ * cvs_watch_remote()
*
*/
static int
-cvs_watchers_remote(CVSFILE *cf, void *arg)
+cvs_watch_remote(CVSFILE *cf, void *arg)
{
int ret;
struct cvsroot *root;
@@ -184,6 +242,34 @@ cvs_watchers_remote(CVSFILE *cf, void *arg)
return (ret);
}
+
+/*
+ * cvs_watchers_init()
+ *
+ */
+static int
+cvs_watchers_init(struct cvs_cmd *cmd, int argc, char **argv, int *arg)
+{
+ int ch;
+
+ while ((ch = getopt(argc, argv, cmd->cmd_opts)) != -1) {
+ switch (ch) {
+ case 'l':
+ cmd->file_flags &= ~CF_RECURSE;
+ break;
+ case 'R':
+ cmd->file_flags |= CF_RECURSE;
+ break;
+ default:
+ return (CVS_EX_USAGE);
+ }
+ }
+
+ *arg = optind;
+ return (CVS_EX_OK);
+}
+
+
/*
* cvs_watchers_local()
*