summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Santolaria <xsa@cvs.openbsd.org>2007-01-09 17:12:15 +0000
committerXavier Santolaria <xsa@cvs.openbsd.org>2007-01-09 17:12:15 +0000
commitd850478f0cbce12ec0f0f40dd3b8ea32da5b8f9d (patch)
treec8498792a9e5507bb9cb5d20a06425f294b5ea15
parent04a88e2557d02403f0a4bc571e34ed71b28ba7d2 (diff)
add remote handler for the cvs watch command; not linked to the build.
-rw-r--r--usr.bin/cvs/watch.c138
1 files changed, 136 insertions, 2 deletions
diff --git a/usr.bin/cvs/watch.c b/usr.bin/cvs/watch.c
index acc5ca9e255..5ab72ef2ea9 100644
--- a/usr.bin/cvs/watch.c
+++ b/usr.bin/cvs/watch.c
@@ -1,6 +1,6 @@
-/* $OpenBSD: watch.c,v 1.14 2007/01/02 13:51:13 xsa Exp $ */
+/* $OpenBSD: watch.c,v 1.15 2007/01/09 17:12:14 xsa Exp $ */
/*
- * Copyright (c) 2005, 2006 Xavier Santolaria <xsa@openbsd.org>
+ * Copyright (c) 2005-2007 Xavier Santolaria <xsa@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -21,8 +21,31 @@
#include "log.h"
#include "remote.h"
+#define W_COMMIT 0x01
+#define W_EDIT 0x02
+#define W_UNEDIT 0x04
+#define W_ADD 0x08
+#define W_REMOVE 0x10
+#define W_ON 0x20
+#define W_OFF 0x40
+#define W_ALL (W_EDIT|W_COMMIT|W_UNEDIT)
+
+static void cvs_watch_local(struct cvs_file *);
static void cvs_watchers_local(struct cvs_file *);
+static int watch_req = 0;
+static int watch_aflags = 0;
+
+struct cvs_cmd cvs_cmd_watch = {
+ CVS_OP_WATCH, 0, "watch",
+ { },
+ "Set watches",
+ "on | off | add | remove [-lR] [-a action] [file ...]",
+ "a:lR",
+ NULL,
+ cvs_watch
+};
+
struct cvs_cmd cvs_cmd_watchers = {
CVS_OP_WATCHERS, 0, "watchers",
{ },
@@ -34,6 +57,112 @@ struct cvs_cmd cvs_cmd_watchers = {
};
int
+cvs_watch(int argc, char **argv)
+{
+ int ch, flags;
+ struct cvs_recursion cr;
+
+ if (argc < 2)
+ fatal("%s", cvs_cmd_watch.cmd_synopsis);
+
+ if (strcmp(argv[1], "on") == 0)
+ watch_req |= W_ON;
+ else if (strcmp(argv[1], "off") == 0)
+ watch_req |= W_OFF;
+ else if (strcmp(argv[1], "add") == 0)
+ watch_req |= W_ADD;
+ else if (strcmp(argv[1], "remove") == 0)
+ watch_req |= W_REMOVE;
+ else
+ fatal("%s", cvs_cmd_watch.cmd_synopsis);
+
+ --argc;
+ ++argv;
+
+ flags = CR_RECURSE_DIRS;
+
+ while ((ch = getopt(argc, argv, cvs_cmd_watch.cmd_opts)) != -1) {
+ switch (ch) {
+ case 'a':
+ if (!(watch_req & (W_ADD|W_REMOVE)))
+ fatal("%s", cvs_cmd_watch.cmd_synopsis);
+
+ if (strcmp(optarg, "edit") == 0)
+ watch_aflags |= W_EDIT;
+ else if (strcmp(optarg, "unedit") == 0)
+ watch_aflags |= W_UNEDIT;
+ else if (strcmp(optarg, "commit") == 0)
+ watch_aflags |= W_COMMIT;
+ else if (strcmp(optarg, "all") == 0)
+ watch_aflags |= W_ALL;
+ else if (strcmp(optarg, "none") == 0)
+ watch_aflags &= ~W_ALL;
+ else
+ fatal("%s", cvs_cmd_watch.cmd_synopsis);
+ case 'l':
+ flags &= ~CR_RECURSE_DIRS;
+ break;
+ case 'R':
+ break;
+ default:
+ fatal("%s", cvs_cmd_watch.cmd_synopsis);
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if (watch_aflags == 0)
+ watch_aflags |= W_ALL;
+
+ cr.enterdir = NULL;
+ cr.leavedir = NULL;
+
+ if (current_cvsroot->cr_method != CVS_METHOD_LOCAL) {
+ cr.fileproc = cvs_client_sendfile;
+
+ if (watch_req & (W_ADD|W_REMOVE)) {
+ if (watch_aflags & W_EDIT)
+ cvs_client_send_request("Argument -a edit");
+
+ if (watch_aflags & W_UNEDIT)
+ cvs_client_send_request("Argument -a unedit");
+
+ if (watch_aflags & W_COMMIT)
+ cvs_client_send_request("Argument -a commit");
+
+ if (!(watch_aflags & W_ALL))
+ cvs_client_send_request("Argument -a none");
+ }
+
+ if (!(flags & CR_RECURSE_DIRS))
+ cvs_client_send_request("Argument -l");
+ } else {
+ cr.fileproc = cvs_watch_local;
+ }
+
+ cr.flags = flags;
+
+ cvs_file_run(argc, argv, &cr);
+
+ if (current_cvsroot->cr_method != CVS_METHOD_LOCAL) {
+ cvs_client_send_files(argv, argc);
+ cvs_client_senddir(".");
+
+ if (watch_req & (W_ADD|W_REMOVE))
+ cvs_client_send_request("watch-%s",
+ (watch_req & W_ADD) ? "add" : "remove");
+ else
+ cvs_client_send_request("watch-%s",
+ (watch_req & W_ON) ? "on" : "off");
+
+ cvs_client_get_responses();
+ }
+
+ return (0);
+}
+
+int
cvs_watchers(int argc, char **argv)
{
int ch;
@@ -87,6 +216,11 @@ cvs_watchers(int argc, char **argv)
}
static void
+cvs_watch_local(struct cvs_file *cf)
+{
+}
+
+static void
cvs_watchers_local(struct cvs_file *cf)
{
}