diff options
author | Moritz Jodeit <moritz@cvs.openbsd.org> | 2005-10-17 16:16:01 +0000 |
---|---|---|
committer | Moritz Jodeit <moritz@cvs.openbsd.org> | 2005-10-17 16:16:01 +0000 |
commit | c41646bf6f00b3fd173487f9d47f40cfcb4dd1e3 (patch) | |
tree | 4c6178b40d2f6b59133b3e41aaee4eecadcd5958 /usr.bin/cvs/watch.c | |
parent | 9839ef3092d5236c710b1b5730a6bb5778aacbd1 (diff) |
add client support for the `watch' and `watchers' commands. ok joris@ xsa@
Diffstat (limited to 'usr.bin/cvs/watch.c')
-rw-r--r-- | usr.bin/cvs/watch.c | 116 |
1 files changed, 101 insertions, 15 deletions
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() * |