summaryrefslogtreecommitdiffstats
path: root/contrib/cvs/src/watch.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/cvs/src/watch.c')
-rw-r--r--contrib/cvs/src/watch.c522
1 files changed, 0 insertions, 522 deletions
diff --git a/contrib/cvs/src/watch.c b/contrib/cvs/src/watch.c
deleted file mode 100644
index 0ef987c..0000000
--- a/contrib/cvs/src/watch.c
+++ /dev/null
@@ -1,522 +0,0 @@
-/* Implementation for "cvs watch add", "cvs watchers", and related commands
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details. */
-
-#include "cvs.h"
-#include "edit.h"
-#include "fileattr.h"
-#include "watch.h"
-
-const char *const watch_usage[] =
-{
- "Usage: %s %s {on|off|add|remove} [-lR] [-a <action>]... [<path>]...\n",
- "on/off: Turn on/off read-only checkouts of files.\n",
- "add/remove: Add or remove notification on actions.\n",
- "-l (on/off/add/remove): Local directory only, not recursive.\n",
- "-R (on/off/add/remove): Process directories recursively (default).\n",
- "-a (add/remove): Specify what actions, one of: `edit', `unedit',\n",
- " `commit', `all', or `none' (defaults to `all').\n",
- "(Specify the --help global option for a list of other help options.)\n",
- NULL
-};
-
-static struct addremove_args the_args;
-
-void
-watch_modify_watchers (file, what)
- const char *file;
- struct addremove_args *what;
-{
- char *curattr = fileattr_get0 (file, "_watchers");
- char *p;
- char *pend;
- char *nextp;
- char *who;
- int who_len;
- char *mycurattr;
- char *mynewattr;
- size_t mynewattr_size;
-
- int add_edit_pending;
- int add_unedit_pending;
- int add_commit_pending;
- int remove_edit_pending;
- int remove_unedit_pending;
- int remove_commit_pending;
- int add_tedit_pending;
- int add_tunedit_pending;
- int add_tcommit_pending;
-
- who = getcaller ();
- who_len = strlen (who);
-
- /* Look for current watcher types for this user. */
- mycurattr = NULL;
- if (curattr != NULL)
- {
- p = curattr;
- while (1) {
- if (strncmp (who, p, who_len) == 0
- && p[who_len] == '>')
- {
- /* Found this user. */
- mycurattr = p + who_len + 1;
- }
- p = strchr (p, ',');
- if (p == NULL)
- break;
- ++p;
- }
- }
- if (mycurattr != NULL)
- {
- mycurattr = xstrdup (mycurattr);
- p = strchr (mycurattr, ',');
- if (p != NULL)
- *p = '\0';
- }
-
- /* Now copy mycurattr to mynewattr, making the requisite modifications.
- Note that we add a dummy '+' to the start of mynewattr, to reduce
- special cases (but then we strip it off when we are done). */
-
- mynewattr_size = sizeof "+edit+unedit+commit+tedit+tunedit+tcommit";
- if (mycurattr != NULL)
- mynewattr_size += strlen (mycurattr);
- mynewattr = xmalloc (mynewattr_size);
- mynewattr[0] = '\0';
-
- add_edit_pending = what->adding && what->edit;
- add_unedit_pending = what->adding && what->unedit;
- add_commit_pending = what->adding && what->commit;
- remove_edit_pending = !what->adding && what->edit;
- remove_unedit_pending = !what->adding && what->unedit;
- remove_commit_pending = !what->adding && what->commit;
- add_tedit_pending = what->add_tedit;
- add_tunedit_pending = what->add_tunedit;
- add_tcommit_pending = what->add_tcommit;
-
- /* Copy over existing watch types, except those to be removed. */
- p = mycurattr;
- while (p != NULL)
- {
- pend = strchr (p, '+');
- if (pend == NULL)
- {
- pend = p + strlen (p);
- nextp = NULL;
- }
- else
- nextp = pend + 1;
-
- /* Process this item. */
- if (pend - p == 4 && strncmp ("edit", p, 4) == 0)
- {
- if (!remove_edit_pending)
- strcat (mynewattr, "+edit");
- add_edit_pending = 0;
- }
- else if (pend - p == 6 && strncmp ("unedit", p, 6) == 0)
- {
- if (!remove_unedit_pending)
- strcat (mynewattr, "+unedit");
- add_unedit_pending = 0;
- }
- else if (pend - p == 6 && strncmp ("commit", p, 6) == 0)
- {
- if (!remove_commit_pending)
- strcat (mynewattr, "+commit");
- add_commit_pending = 0;
- }
- else if (pend - p == 5 && strncmp ("tedit", p, 5) == 0)
- {
- if (!what->remove_temp)
- strcat (mynewattr, "+tedit");
- add_tedit_pending = 0;
- }
- else if (pend - p == 7 && strncmp ("tunedit", p, 7) == 0)
- {
- if (!what->remove_temp)
- strcat (mynewattr, "+tunedit");
- add_tunedit_pending = 0;
- }
- else if (pend - p == 7 && strncmp ("tcommit", p, 7) == 0)
- {
- if (!what->remove_temp)
- strcat (mynewattr, "+tcommit");
- add_tcommit_pending = 0;
- }
- else
- {
- char *mp;
-
- /* Copy over any unrecognized watch types, for future
- expansion. */
- mp = mynewattr + strlen (mynewattr);
- *mp++ = '+';
- strncpy (mp, p, pend - p);
- *(mp + (pend - p)) = '\0';
- }
-
- /* Set up for next item. */
- p = nextp;
- }
-
- /* Add in new watch types. */
- if (add_edit_pending)
- strcat (mynewattr, "+edit");
- if (add_unedit_pending)
- strcat (mynewattr, "+unedit");
- if (add_commit_pending)
- strcat (mynewattr, "+commit");
- if (add_tedit_pending)
- strcat (mynewattr, "+tedit");
- if (add_tunedit_pending)
- strcat (mynewattr, "+tunedit");
- if (add_tcommit_pending)
- strcat (mynewattr, "+tcommit");
-
- {
- char *curattr_new;
-
- curattr_new =
- fileattr_modify (curattr,
- who,
- mynewattr[0] == '\0' ? NULL : mynewattr + 1,
- '>',
- ',');
- /* If the attribute is unchanged, don't rewrite the attribute file. */
- if (!((curattr_new == NULL && curattr == NULL)
- || (curattr_new != NULL
- && curattr != NULL
- && strcmp (curattr_new, curattr) == 0)))
- fileattr_set (file,
- "_watchers",
- curattr_new);
- if (curattr_new != NULL)
- free (curattr_new);
- }
-
- if (curattr != NULL)
- free (curattr);
- if (mycurattr != NULL)
- free (mycurattr);
- if (mynewattr != NULL)
- free (mynewattr);
-}
-
-static int addremove_fileproc PROTO ((void *callerdat,
- struct file_info *finfo));
-
-static int
-addremove_fileproc (callerdat, finfo)
- void *callerdat;
- struct file_info *finfo;
-{
- watch_modify_watchers (finfo->file, &the_args);
- return 0;
-}
-
-
-
-static int addremove_filesdoneproc PROTO ((void *, int, const char *,
- const char *, List *));
-
-static int
-addremove_filesdoneproc (callerdat, err, repository, update_dir, entries)
- void *callerdat;
- int err;
- const char *repository;
- const char *update_dir;
- List *entries;
-{
- if (the_args.setting_default)
- watch_modify_watchers (NULL, &the_args);
- return err;
-}
-
-static int watch_addremove PROTO ((int argc, char **argv));
-
-static int
-watch_addremove (argc, argv)
- int argc;
- char **argv;
-{
- int c;
- int local = 0;
- int err;
- int a_omitted;
-
- a_omitted = 1;
- the_args.commit = 0;
- the_args.edit = 0;
- the_args.unedit = 0;
- optind = 0;
- while ((c = getopt (argc, argv, "+lRa:")) != -1)
- {
- switch (c)
- {
- case 'l':
- local = 1;
- break;
- case 'R':
- local = 0;
- break;
- case 'a':
- a_omitted = 0;
- if (strcmp (optarg, "edit") == 0)
- the_args.edit = 1;
- else if (strcmp (optarg, "unedit") == 0)
- the_args.unedit = 1;
- else if (strcmp (optarg, "commit") == 0)
- the_args.commit = 1;
- else if (strcmp (optarg, "all") == 0)
- {
- the_args.edit = 1;
- the_args.unedit = 1;
- the_args.commit = 1;
- }
- else if (strcmp (optarg, "none") == 0)
- {
- the_args.edit = 0;
- the_args.unedit = 0;
- the_args.commit = 0;
- }
- else
- usage (watch_usage);
- break;
- case '?':
- default:
- usage (watch_usage);
- break;
- }
- }
- argc -= optind;
- argv += optind;
-
- if (a_omitted)
- {
- the_args.edit = 1;
- the_args.unedit = 1;
- the_args.commit = 1;
- }
-
-#ifdef CLIENT_SUPPORT
- if (current_parsed_root->isremote)
- {
- start_server ();
- ign_setup ();
-
- if (local)
- send_arg ("-l");
- /* FIXME: copes poorly with "all" if server is extended to have
- new watch types and client is still running an old version. */
- if (the_args.edit)
- option_with_arg ("-a", "edit");
- if (the_args.unedit)
- option_with_arg ("-a", "unedit");
- if (the_args.commit)
- option_with_arg ("-a", "commit");
- if (!the_args.edit && !the_args.unedit && !the_args.commit)
- option_with_arg ("-a", "none");
- send_arg ("--");
- send_files (argc, argv, local, 0, SEND_NO_CONTENTS);
- send_file_names (argc, argv, SEND_EXPAND_WILD);
- send_to_server (the_args.adding ?
- "watch-add\012" : "watch-remove\012",
- 0);
- return get_responses_and_close ();
- }
-#endif /* CLIENT_SUPPORT */
-
- the_args.setting_default = (argc <= 0);
-
- lock_tree_for_write (argc, argv, local, W_LOCAL, 0);
-
- err = start_recursion (addremove_fileproc, addremove_filesdoneproc,
- (DIRENTPROC) NULL, (DIRLEAVEPROC) NULL, NULL,
- argc, argv, local, W_LOCAL, 0, CVS_LOCK_NONE,
- (char *) NULL, 1, (char *) NULL);
-
- Lock_Cleanup ();
- return err;
-}
-
-int
-watch_add (argc, argv)
- int argc;
- char **argv;
-{
- the_args.adding = 1;
- return watch_addremove (argc, argv);
-}
-
-int
-watch_remove (argc, argv)
- int argc;
- char **argv;
-{
- the_args.adding = 0;
- return watch_addremove (argc, argv);
-}
-
-int
-watch (argc, argv)
- int argc;
- char **argv;
-{
- if (argc <= 1)
- usage (watch_usage);
- if (strcmp (argv[1], "on") == 0)
- {
- --argc;
- ++argv;
- return watch_on (argc, argv);
- }
- else if (strcmp (argv[1], "off") == 0)
- {
- --argc;
- ++argv;
- return watch_off (argc, argv);
- }
- else if (strcmp (argv[1], "add") == 0)
- {
- --argc;
- ++argv;
- return watch_add (argc, argv);
- }
- else if (strcmp (argv[1], "remove") == 0)
- {
- --argc;
- ++argv;
- return watch_remove (argc, argv);
- }
- else
- usage (watch_usage);
- return 0;
-}
-
-static const char *const watchers_usage[] =
-{
- "Usage: %s %s [-lR] [<file>]...\n",
- "-l\tProcess this directory only (not recursive).\n",
- "-R\tProcess directories recursively (default).\n",
- "(Specify the --help global option for a list of other help options.)\n",
- NULL
-};
-
-static int watchers_fileproc PROTO ((void *callerdat,
- struct file_info *finfo));
-
-static int
-watchers_fileproc (callerdat, finfo)
- void *callerdat;
- struct file_info *finfo;
-{
- char *them;
- char *p;
-
- them = fileattr_get0 (finfo->file, "_watchers");
- if (them == NULL)
- return 0;
-
- cvs_output (finfo->fullname, 0);
-
- p = them;
- while (1)
- {
- cvs_output ("\t", 1);
- while (*p != '>' && *p != '\0')
- cvs_output (p++, 1);
- if (*p == '\0')
- {
- /* Only happens if attribute is misformed. */
- cvs_output ("\n", 1);
- break;
- }
- ++p;
- cvs_output ("\t", 1);
- while (1)
- {
- while (*p != '+' && *p != ',' && *p != '\0')
- cvs_output (p++, 1);
- if (*p == '\0')
- {
- cvs_output ("\n", 1);
- goto out;
- }
- if (*p == ',')
- {
- ++p;
- break;
- }
- ++p;
- cvs_output ("\t", 1);
- }
- cvs_output ("\n", 1);
- }
- out:;
- free (them);
- return 0;
-}
-
-int
-watchers (argc, argv)
- int argc;
- char **argv;
-{
- int local = 0;
- int c;
-
- if (argc == -1)
- usage (watchers_usage);
-
- optind = 0;
- while ((c = getopt (argc, argv, "+lR")) != -1)
- {
- switch (c)
- {
- case 'l':
- local = 1;
- break;
- case 'R':
- local = 0;
- break;
- case '?':
- default:
- usage (watchers_usage);
- break;
- }
- }
- argc -= optind;
- argv += optind;
-
-#ifdef CLIENT_SUPPORT
- if (current_parsed_root->isremote)
- {
- start_server ();
- ign_setup ();
-
- if (local)
- send_arg ("-l");
- send_arg ("--");
- send_files (argc, argv, local, 0, SEND_NO_CONTENTS);
- send_file_names (argc, argv, SEND_EXPAND_WILD);
- send_to_server ("watchers\012", 0);
- return get_responses_and_close ();
- }
-#endif /* CLIENT_SUPPORT */
-
- return start_recursion (watchers_fileproc, (FILESDONEPROC) NULL,
- (DIRENTPROC) NULL, (DIRLEAVEPROC) NULL, NULL,
- argc, argv, local, W_LOCAL, 0, CVS_LOCK_READ,
- (char *) NULL, 1, (char *) NULL);
-}
OpenPOWER on IntegriCloud