From eaf4925a25eb2d32716a8b2a0ba75dc254cb1a22 Mon Sep 17 00:00:00 2001 From: "David E. O'Brien" Date: Sat, 4 Dec 1999 01:23:26 +0000 Subject: [PATCH] Support the environtmental var "CVS_OPTIONS". Which can hold a set of default options for cvs. These options are interpreted first and can be overwritten by explicit command line parameters. Obtained from: GNU Grep 2.3 --- contrib/cvs/man/cvs.1 | 18 ++++++- contrib/cvs/src/main.c | 5 ++ contrib/cvs/src/prepend_args.c | 87 ++++++++++++++++++++++++++++++ contrib/cvs/src/prepend_args.h | 26 +++++++++ gnu/usr.bin/cvs/cvs/Makefile | 3 +- gnu/usr.bin/cvs/cvs/prepend_args.c | 87 ++++++++++++++++++++++++++++++ gnu/usr.bin/cvs/cvs/prepend_args.h | 26 +++++++++ 7 files changed, 250 insertions(+), 2 deletions(-) create mode 100644 contrib/cvs/src/prepend_args.c create mode 100644 contrib/cvs/src/prepend_args.h create mode 100644 gnu/usr.bin/cvs/cvs/prepend_args.c create mode 100644 gnu/usr.bin/cvs/cvs/prepend_args.h diff --git a/contrib/cvs/man/cvs.1 b/contrib/cvs/man/cvs.1 index 1b3046848bb5..37145280d2da 100644 --- a/contrib/cvs/man/cvs.1 +++ b/contrib/cvs/man/cvs.1 @@ -233,7 +233,10 @@ environment variable is set. .B \-R Turns on read-only repository mode. This allows one to check out from a read-only repository, such as within an anoncvs server, or from a CDROM -repository. Using +repository. +Same effect as if the +.SM CVSREADONLYFS +environment variable is set. Using .B \-R can also considerably speed up checkout's over NFS. .TP @@ -2047,6 +2050,13 @@ will try hard to make the files in your working directory read-only. When this is not set, the default behavior is to permit modification of your working files. .TP +.SM CVSREADONLYFS +If this is set, the +.B \-R +option is assumed, and +.B cvs +operates in read-only repository mode. +.TP .SM RCSBIN Specifies the full pathname where to find .SM RCS @@ -2072,6 +2082,12 @@ If this variable is set then .B cvs will ignore all references to remote repositories in the CVS/Root file. .TP +.SM CVS_OPTIONS +Specifies a set of default options for +.B cvs. +These options are interpreted before the startup file (\fI~/.cvsrc\fP) is read +and can be overridden by explicit command line parameters. +.TP .SM CVS_RSH .B cvs uses the contents of this variable to determine the name of the diff --git a/contrib/cvs/src/main.c b/contrib/cvs/src/main.c index c016a02597b6..679224531776 100644 --- a/contrib/cvs/src/main.c +++ b/contrib/cvs/src/main.c @@ -12,7 +12,10 @@ * */ +/* $FreeBSD$ */ + #include "cvs.h" +#include "prepend_args.h" #ifdef HAVE_WINSOCK_H #include @@ -465,6 +468,8 @@ main (argc, argv) logoff = 1; } + prepend_default_options (getenv ("CVS_OPTIONS"), &argc, &argv); + /* Set this to 0 to force getopt initialization. getopt() sets this to 1 internally. */ optind = 0; diff --git a/contrib/cvs/src/prepend_args.c b/contrib/cvs/src/prepend_args.c new file mode 100644 index 000000000000..2c15a24e177e --- /dev/null +++ b/contrib/cvs/src/prepend_args.c @@ -0,0 +1,87 @@ +/* prepend_args.c - utilility programs for manpiulating argv[] + Copyright (C) 1999 Free Software Foundation, Inc. + + 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +/* $FreeBSD$ */ + + +#ifdef HAVE_CONFIG_H +# include +#endif +#include "cvs.h" +#include "../diff/system.h" +#include "prepend_args.h" + + +/* Find the white-space-separated options specified by OPTIONS, and + using BUF to store copies of these options, set ARGV[0], ARGV[1], + etc. to the option copies. Return the number N of options found. + Do not set ARGV[N] to NULL. If ARGV is NULL, do not store ARGV[0] + etc. Backslash can be used to escape whitespace (and backslashes). */ +static int +prepend_args (options, buf, argv) + char const *options; + char *buf; + char **argv; +{ + char const *o = options; + char *b = buf; + int n = 0; + + for (;;) + { + while (ISSPACE ((unsigned char) *o)) + o++; + if (!*o) + return n; + if (argv) + argv[n] = b; + n++; + + do + if ((*b++ = *o++) == '\\' && *o) + b[-1] = *o++; + while (*o && ! ISSPACE ((unsigned char) *o)); + + *b++ = '\0'; + } +} + +/* Prepend the whitespace-separated options in OPTIONS to the argument + vector of a main program with argument count *PARGC and argument + vector *PARGV. */ +void +prepend_default_options (options, pargc, pargv) + char const *options; + int *pargc; + char ***pargv; +{ + if (options) + { + char *buf = xmalloc (strlen (options) + 1); + int prepended = prepend_args (options, buf, (char **) NULL); + int argc = *pargc; + char * const *argv = *pargv; + char **pp = (char **) xmalloc ((prepended + argc + 1) * sizeof *pp); + *pargc = prepended + argc; + *pargv = pp; + *pp++ = *argv++; + pp += prepend_args (options, buf, pp); + while ((*pp++ = *argv++)) + continue; + } +} diff --git a/contrib/cvs/src/prepend_args.h b/contrib/cvs/src/prepend_args.h new file mode 100644 index 000000000000..6708442ec124 --- /dev/null +++ b/contrib/cvs/src/prepend_args.h @@ -0,0 +1,26 @@ +/* prepend_args.h - utilility programs for manpiulating argv[] + Copyright (C) 1999 Free Software Foundation, Inc. + + 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +/* $FreeBSD$ */ + +/* This code, taken from GNU Grep, originally used the "PARAM" macro, as the + current GNU coding standards requires. Older GNU code used the "PROTO" + macro, before the GNU coding standards replaced it. We use the older + form here to keep from having to include another file in cvs/src/main.c. */ + +void prepend_default_options PROTO ((char const *, int *, char ***)); diff --git a/gnu/usr.bin/cvs/cvs/Makefile b/gnu/usr.bin/cvs/cvs/Makefile index 94a456ee9604..1c5015bc9fe6 100644 --- a/gnu/usr.bin/cvs/cvs/Makefile +++ b/gnu/usr.bin/cvs/cvs/Makefile @@ -15,7 +15,8 @@ SRCS= add.c admin.c buffer.c checkin.c checkout.c classify.c client.c \ expand_path.c fileattr.c filesubr.c find_names.c \ hardlink.c hash.c history.c \ ignore.c import.c lock.c log.c login.c logmsg.c main.c mkmodules.c \ - modules.c myndbm.c no_diff.c parseinfo.c patch.c rcs.c rcscmds.c \ + modules.c myndbm.c no_diff.c parseinfo.c patch.c prepend_args.c \ + rcs.c rcscmds.c \ recurse.c release.c remove.c repos.c root.c rtag.c run.c scramble.c \ server.c status.c subr.c tag.c update.c vers_ts.c version.c watch.c \ wrapper.c zlib.c diff --git a/gnu/usr.bin/cvs/cvs/prepend_args.c b/gnu/usr.bin/cvs/cvs/prepend_args.c new file mode 100644 index 000000000000..2c15a24e177e --- /dev/null +++ b/gnu/usr.bin/cvs/cvs/prepend_args.c @@ -0,0 +1,87 @@ +/* prepend_args.c - utilility programs for manpiulating argv[] + Copyright (C) 1999 Free Software Foundation, Inc. + + 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +/* $FreeBSD$ */ + + +#ifdef HAVE_CONFIG_H +# include +#endif +#include "cvs.h" +#include "../diff/system.h" +#include "prepend_args.h" + + +/* Find the white-space-separated options specified by OPTIONS, and + using BUF to store copies of these options, set ARGV[0], ARGV[1], + etc. to the option copies. Return the number N of options found. + Do not set ARGV[N] to NULL. If ARGV is NULL, do not store ARGV[0] + etc. Backslash can be used to escape whitespace (and backslashes). */ +static int +prepend_args (options, buf, argv) + char const *options; + char *buf; + char **argv; +{ + char const *o = options; + char *b = buf; + int n = 0; + + for (;;) + { + while (ISSPACE ((unsigned char) *o)) + o++; + if (!*o) + return n; + if (argv) + argv[n] = b; + n++; + + do + if ((*b++ = *o++) == '\\' && *o) + b[-1] = *o++; + while (*o && ! ISSPACE ((unsigned char) *o)); + + *b++ = '\0'; + } +} + +/* Prepend the whitespace-separated options in OPTIONS to the argument + vector of a main program with argument count *PARGC and argument + vector *PARGV. */ +void +prepend_default_options (options, pargc, pargv) + char const *options; + int *pargc; + char ***pargv; +{ + if (options) + { + char *buf = xmalloc (strlen (options) + 1); + int prepended = prepend_args (options, buf, (char **) NULL); + int argc = *pargc; + char * const *argv = *pargv; + char **pp = (char **) xmalloc ((prepended + argc + 1) * sizeof *pp); + *pargc = prepended + argc; + *pargv = pp; + *pp++ = *argv++; + pp += prepend_args (options, buf, pp); + while ((*pp++ = *argv++)) + continue; + } +} diff --git a/gnu/usr.bin/cvs/cvs/prepend_args.h b/gnu/usr.bin/cvs/cvs/prepend_args.h new file mode 100644 index 000000000000..6708442ec124 --- /dev/null +++ b/gnu/usr.bin/cvs/cvs/prepend_args.h @@ -0,0 +1,26 @@ +/* prepend_args.h - utilility programs for manpiulating argv[] + Copyright (C) 1999 Free Software Foundation, Inc. + + 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +/* $FreeBSD$ */ + +/* This code, taken from GNU Grep, originally used the "PARAM" macro, as the + current GNU coding standards requires. Older GNU code used the "PROTO" + macro, before the GNU coding standards replaced it. We use the older + form here to keep from having to include another file in cvs/src/main.c. */ + +void prepend_default_options PROTO ((char const *, int *, char ***));