version 1.6, 2005/08/16 06:37:57 |
version 1.7, 2005/10/17 16:16:00 |
|
|
/* $OpenBSD$ */ |
/* $OpenBSD$ */ |
/* |
/* |
* Copyright (c) 2005 Xavier Santolaria <xsa@openbsd.org> |
* Copyright (c) 2005 Xavier Santolaria <xsa@openbsd.org> |
|
* Copyright (c) 2005 Moritz Jodeit <moritz@openbsd.org> |
* All rights reserved. |
* All rights reserved. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
|
|
#include "proto.h" |
#include "proto.h" |
|
|
static int cvs_watch_init(struct cvs_cmd *, int, char **, int *); |
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_remote(CVSFILE *, void*); |
static int cvs_watch_local(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*); |
static int cvs_watchers_local(CVSFILE *, void*); |
|
|
|
|
|
|
"on | off | add | remove [-lR] [-a action] [file ...]", |
"on | off | add | remove [-lR] [-a action] [file ...]", |
"a:lR", |
"a:lR", |
NULL, |
NULL, |
CF_SORT | CF_RECURSE, |
CF_SORT | CF_IGNORE | CF_RECURSE, |
cvs_watch_init, |
cvs_watch_init, |
NULL, |
cvs_watch_pre_exec, |
cvs_watch_remote, |
cvs_watch_remote, |
cvs_watch_local, |
cvs_watch_local, |
NULL, |
NULL, |
NULL, |
NULL, |
0 |
CVS_CMD_SENDDIR | CVS_CMD_ALLOWSPEC | CVS_CMD_SENDARGS2 |
}; |
}; |
|
|
struct cvs_cmd cvs_cmd_watchers = { |
struct cvs_cmd cvs_cmd_watchers = { |
|
|
"[-lR] [file ...]", |
"[-lR] [file ...]", |
"lR", |
"lR", |
NULL, |
NULL, |
CF_SORT | CF_RECURSE, |
CF_SORT | CF_IGNORE | CF_RECURSE, |
cvs_watch_init, |
cvs_watchers_init, |
NULL, |
NULL, |
cvs_watchers_remote, |
cvs_watch_remote, |
cvs_watchers_local, |
cvs_watchers_local, |
NULL, |
NULL, |
NULL, |
NULL, |
|
|
}; |
}; |
|
|
|
|
|
static char *aoptstr = NULL; |
|
static int watchreq = 0; |
|
|
static int |
static int |
cvs_watch_init(struct cvs_cmd *cmd, int argc, char **argv, int *arg) |
cvs_watch_init(struct cvs_cmd *cmd, int argc, char **argv, int *arg) |
{ |
{ |
int ch; |
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) { |
while ((ch = getopt(argc, argv, cmd->cmd_opts)) != -1) { |
switch (ch) { |
switch (ch) { |
case 'a': |
case 'a': |
/* |
/* |
* The `watchers' command does not have the |
* Only `watch add | remove' support the -a option. |
* -a option. Check which command has been issued. |
* 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); |
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; |
break; |
case 'l': |
case 'l': |
cmd->file_flags &= ~CF_RECURSE; |
cmd->file_flags &= ~CF_RECURSE; |
|
|
|
|
|
|
/* |
/* |
* cvs_watch_remote() |
* cvs_watch_pre_exec() |
* |
* |
*/ |
*/ |
static int |
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); |
return (CVS_EX_OK); |
} |
} |
|
|
|
|
|
|
|
|
/* |
/* |
* cvs_watchers_remote() |
* cvs_watch_remote() |
* |
* |
*/ |
*/ |
static int |
static int |
cvs_watchers_remote(CVSFILE *cf, void *arg) |
cvs_watch_remote(CVSFILE *cf, void *arg) |
{ |
{ |
int ret; |
int ret; |
struct cvsroot *root; |
struct cvsroot *root; |
|
|
|
|
return (ret); |
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() |
* cvs_watchers_local() |