Annotation of src/usr.bin/cvs/modules.c, Revision 1.9
1.9 ! tobias 1: /* $OpenBSD: modules.c,v 1.8 2008/02/04 22:36:40 joris Exp $ */
1.1 joris 2: /*
3: * Copyright (c) 2008 Joris Vink <joris@openbsd.org>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: */
17:
18: #include <sys/param.h>
19: #include <sys/dirent.h>
20: #include <sys/resource.h>
21:
1.9 ! tobias 22: #include <ctype.h>
1.1 joris 23: #include <stdlib.h>
24: #include <string.h>
25:
26: #include "cvs.h"
27: #include "config.h"
28:
29: TAILQ_HEAD(, module_info) modules;
30:
1.3 joris 31: struct module_checkout *current_module = NULL;
32: char *module_repo_root = NULL;
33:
1.1 joris 34: void
35: cvs_parse_modules(void)
36: {
37: cvs_log(LP_TRACE, "cvs_parse_modules()");
38:
39: TAILQ_INIT(&modules);
40: cvs_read_config(CVS_PATH_MODULES, modules_parse_line);
41: }
42:
43: void
1.7 joris 44: modules_parse_line(char *line, int lineno)
1.1 joris 45: {
46: int flags;
1.7 joris 47: struct module_info *mi;
1.4 joris 48: char *val, *p, *module, *sp, *dp;
1.7 joris 49: char *dirname, fpath[MAXPATHLEN], *prog;
1.1 joris 50:
51: flags = 0;
52: p = val = line;
1.9 ! tobias 53: while (!isspace(*p) && *p != '\0')
1.1 joris 54: p++;
55:
1.7 joris 56: if (*p == '\0')
57: goto bad;
58:
1.1 joris 59: *(p++) = '\0';
60: module = val;
61:
1.9 ! tobias 62: while (isspace(*p))
1.1 joris 63: p++;
64:
1.7 joris 65: if (*p == '\0')
66: goto bad;
1.1 joris 67:
68: val = p;
1.9 ! tobias 69: while (!isspace(*p) && *p != '\0')
1.1 joris 70: p++;
71:
1.7 joris 72: prog = NULL;
1.1 joris 73: while (val[0] == '-') {
74: p = val;
1.9 ! tobias 75: while (!isspace(*p) && *p != '\0')
1.1 joris 76: p++;
77:
1.7 joris 78: if (*p == '\0')
79: goto bad;
1.1 joris 80:
81: *(p++) = '\0';
82:
83: switch (val[1]) {
84: case 'a':
1.3 joris 85: if (flags & MODULE_TARGETDIR) {
86: cvs_log(LP_NOTICE, "cannot use -a with -d");
87: return;
88: }
89: flags |= MODULE_ALIAS;
90: break;
91: case 'd':
92: if (flags & MODULE_ALIAS) {
93: cvs_log(LP_NOTICE, "cannot use -d with -a");
94: return;
95: }
96: flags |= MODULE_TARGETDIR;
97: break;
98: case 'l':
99: flags |= MODULE_NORECURSE;
1.8 joris 100: break;
101: case 'o':
102: if (flags != 0 || prog != NULL) {
103: cvs_log(LP_NOTICE,
104: "-o cannot be used with other flags");
105: return;
106: }
107:
1.9 ! tobias 108: val = p;
! 109: while (!isspace(*val) && *val != '\0')
! 110: val++;
! 111: if (*val == '\0')
1.8 joris 112: goto bad;
113:
114: *(val++) = '\0';
115: prog = xstrdup(p);
116: p = val;
117: flags |= MODULE_RUN_ON_CHECKOUT;
1.1 joris 118: break;
1.4 joris 119: case 'i':
1.7 joris 120: if (flags != 0 || prog != NULL) {
1.4 joris 121: cvs_log(LP_NOTICE,
122: "-i cannot be used with other flags");
123: return;
124: }
1.7 joris 125:
126: if ((val = strchr(p, ' ' )) == NULL)
127: goto bad;
128:
129: *(val++) = '\0';
130: prog = xstrdup(p);
131: p = val;
1.4 joris 132: flags |= MODULE_RUN_ON_COMMIT;
133: break;
1.1 joris 134: }
135:
136: val = p;
137: }
138:
1.7 joris 139: if (*val == '\0')
140: goto bad;
1.4 joris 141:
1.1 joris 142: mi = xmalloc(sizeof(*mi));
143: mi->mi_name = xstrdup(module);
1.3 joris 144: mi->mi_flags = flags;
1.7 joris 145: mi->mi_prog = prog;
1.4 joris 146:
147: dirname = NULL;
148: TAILQ_INIT(&(mi->mi_modules));
149: TAILQ_INIT(&(mi->mi_ignores));
1.9 ! tobias 150: for (sp = val; *sp != '\0'; sp = dp) {
! 151: dp = sp;
! 152: while (!isspace(*dp) && *dp != '\0')
! 153: dp++;
! 154: if (*dp != '\0')
1.4 joris 155: *(dp++) = '\0';
156:
157: if (mi->mi_flags & MODULE_ALIAS) {
1.5 joris 158: if (sp[0] == '!') {
159: if (strlen(sp) < 2)
160: fatal("invalid ! pattern");
1.4 joris 161: cvs_file_get((sp + 1), 0, &(mi->mi_ignores));
1.5 joris 162: } else {
1.4 joris 163: cvs_file_get(sp, 0, &(mi->mi_modules));
1.5 joris 164: }
1.4 joris 165: } else if (sp == val) {
166: dirname = sp;
167: } else {
168: if (sp[0] == '!') {
1.5 joris 169: if (strlen(sp) < 2)
170: fatal("invalid ! pattern");
171:
1.4 joris 172: sp++;
173: (void)xsnprintf(fpath, sizeof(fpath), "%s/%s",
174: dirname, sp);
175: cvs_file_get(fpath, 0, &(mi->mi_ignores));
176: } else {
177: (void)xsnprintf(fpath, sizeof(fpath), "%s/%s",
178: dirname, sp);
179: cvs_file_get(fpath, 0, &(mi->mi_modules));
180: }
181: }
182: }
183:
184: if (!(mi->mi_flags & MODULE_ALIAS) && TAILQ_EMPTY(&(mi->mi_modules)))
185: cvs_file_get(dirname, 0, &(mi->mi_modules));
186:
1.1 joris 187: TAILQ_INSERT_TAIL(&modules, mi, m_list);
1.7 joris 188: return;
189:
190: bad:
191: cvs_log(LP_NOTICE, "malformed line in CVSROOT/modules: %d", lineno);
1.1 joris 192: }
193:
1.3 joris 194: struct module_checkout *
1.1 joris 195: cvs_module_lookup(char *name)
196: {
1.3 joris 197: struct module_checkout *mc;
1.1 joris 198: struct module_info *mi;
199:
1.3 joris 200: mc = xmalloc(sizeof(*mc));
201:
1.1 joris 202: TAILQ_FOREACH(mi, &modules, m_list) {
1.3 joris 203: if (!strcmp(name, mi->mi_name)) {
204: mc = xmalloc(sizeof(*mc));
1.4 joris 205: mc->mc_modules = mi->mi_modules;
206: mc->mc_ignores = mi->mi_ignores;
207: mc->mc_canfree = 0;
1.7 joris 208: mc->mc_name = mi->mi_name;
1.3 joris 209: mc->mc_flags = mi->mi_flags;
1.7 joris 210: mc->mc_prog = mi->mi_prog;
1.3 joris 211: return (mc);
212: }
1.1 joris 213: }
214:
1.4 joris 215: TAILQ_INIT(&(mc->mc_modules));
216: TAILQ_INIT(&(mc->mc_ignores));
217: cvs_file_get(name, 0, &(mc->mc_modules));
218: mc->mc_canfree = 1;
1.7 joris 219: mc->mc_name = name;
1.3 joris 220: mc->mc_flags |= MODULE_ALIAS;
1.7 joris 221: mc->mc_prog = NULL;
1.3 joris 222:
223: return (mc);
1.1 joris 224: }