Annotation of src/usr.bin/cvs/modules.c, Revision 1.10
1.10 ! joris 1: /* $OpenBSD: modules.c,v 1.9 2008/02/06 10:37:10 tobias 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.10 ! joris 44: cvs_modules_list(void)
! 45: {
! 46: struct module_info *mi;
! 47:
! 48: TAILQ_FOREACH(mi, &modules, m_list)
! 49: printf("%s\n", mi->mi_str);
! 50: }
! 51:
! 52: void
1.7 joris 53: modules_parse_line(char *line, int lineno)
1.1 joris 54: {
55: int flags;
1.7 joris 56: struct module_info *mi;
1.10 ! joris 57: char *bline, *val, *p, *module, *sp, *dp;
1.7 joris 58: char *dirname, fpath[MAXPATHLEN], *prog;
1.1 joris 59:
1.10 ! joris 60: bline = xstrdup(line);
! 61:
1.1 joris 62: flags = 0;
63: p = val = line;
1.9 tobias 64: while (!isspace(*p) && *p != '\0')
1.1 joris 65: p++;
66:
1.7 joris 67: if (*p == '\0')
68: goto bad;
69:
1.1 joris 70: *(p++) = '\0';
71: module = val;
72:
1.9 tobias 73: while (isspace(*p))
1.1 joris 74: p++;
75:
1.7 joris 76: if (*p == '\0')
77: goto bad;
1.1 joris 78:
79: val = p;
1.9 tobias 80: while (!isspace(*p) && *p != '\0')
1.1 joris 81: p++;
82:
1.7 joris 83: prog = NULL;
1.1 joris 84: while (val[0] == '-') {
85: p = val;
1.9 tobias 86: while (!isspace(*p) && *p != '\0')
1.1 joris 87: p++;
88:
1.7 joris 89: if (*p == '\0')
90: goto bad;
1.1 joris 91:
92: *(p++) = '\0';
93:
94: switch (val[1]) {
95: case 'a':
1.3 joris 96: if (flags & MODULE_TARGETDIR) {
97: cvs_log(LP_NOTICE, "cannot use -a with -d");
98: return;
99: }
100: flags |= MODULE_ALIAS;
101: break;
102: case 'd':
103: if (flags & MODULE_ALIAS) {
104: cvs_log(LP_NOTICE, "cannot use -d with -a");
105: return;
106: }
107: flags |= MODULE_TARGETDIR;
108: break;
109: case 'l':
110: flags |= MODULE_NORECURSE;
1.8 joris 111: break;
112: case 'o':
113: if (flags != 0 || prog != NULL) {
114: cvs_log(LP_NOTICE,
115: "-o cannot be used with other flags");
116: return;
117: }
118:
1.9 tobias 119: val = p;
120: while (!isspace(*val) && *val != '\0')
121: val++;
122: if (*val == '\0')
1.8 joris 123: goto bad;
124:
125: *(val++) = '\0';
126: prog = xstrdup(p);
127: p = val;
128: flags |= MODULE_RUN_ON_CHECKOUT;
1.1 joris 129: break;
1.4 joris 130: case 'i':
1.7 joris 131: if (flags != 0 || prog != NULL) {
1.4 joris 132: cvs_log(LP_NOTICE,
133: "-i cannot be used with other flags");
134: return;
135: }
1.7 joris 136:
137: if ((val = strchr(p, ' ' )) == NULL)
138: goto bad;
139:
140: *(val++) = '\0';
141: prog = xstrdup(p);
142: p = val;
1.4 joris 143: flags |= MODULE_RUN_ON_COMMIT;
144: break;
1.10 ! joris 145: default:
! 146: goto bad;
1.1 joris 147: }
148:
149: val = p;
150: }
151:
1.7 joris 152: if (*val == '\0')
153: goto bad;
1.4 joris 154:
1.1 joris 155: mi = xmalloc(sizeof(*mi));
156: mi->mi_name = xstrdup(module);
1.3 joris 157: mi->mi_flags = flags;
1.7 joris 158: mi->mi_prog = prog;
1.10 ! joris 159: mi->mi_str = bline;
1.4 joris 160:
161: dirname = NULL;
162: TAILQ_INIT(&(mi->mi_modules));
163: TAILQ_INIT(&(mi->mi_ignores));
1.9 tobias 164: for (sp = val; *sp != '\0'; sp = dp) {
165: dp = sp;
166: while (!isspace(*dp) && *dp != '\0')
167: dp++;
168: if (*dp != '\0')
1.4 joris 169: *(dp++) = '\0';
170:
171: if (mi->mi_flags & MODULE_ALIAS) {
1.5 joris 172: if (sp[0] == '!') {
173: if (strlen(sp) < 2)
174: fatal("invalid ! pattern");
1.4 joris 175: cvs_file_get((sp + 1), 0, &(mi->mi_ignores));
1.5 joris 176: } else {
1.4 joris 177: cvs_file_get(sp, 0, &(mi->mi_modules));
1.5 joris 178: }
1.4 joris 179: } else if (sp == val) {
180: dirname = sp;
181: } else {
182: if (sp[0] == '!') {
1.5 joris 183: if (strlen(sp) < 2)
184: fatal("invalid ! pattern");
185:
1.4 joris 186: sp++;
187: (void)xsnprintf(fpath, sizeof(fpath), "%s/%s",
188: dirname, sp);
189: cvs_file_get(fpath, 0, &(mi->mi_ignores));
190: } else {
191: (void)xsnprintf(fpath, sizeof(fpath), "%s/%s",
192: dirname, sp);
193: cvs_file_get(fpath, 0, &(mi->mi_modules));
194: }
195: }
196: }
197:
198: if (!(mi->mi_flags & MODULE_ALIAS) && TAILQ_EMPTY(&(mi->mi_modules)))
199: cvs_file_get(dirname, 0, &(mi->mi_modules));
200:
1.1 joris 201: TAILQ_INSERT_TAIL(&modules, mi, m_list);
1.7 joris 202: return;
203:
204: bad:
205: cvs_log(LP_NOTICE, "malformed line in CVSROOT/modules: %d", lineno);
1.1 joris 206: }
207:
1.3 joris 208: struct module_checkout *
1.1 joris 209: cvs_module_lookup(char *name)
210: {
1.3 joris 211: struct module_checkout *mc;
1.1 joris 212: struct module_info *mi;
213:
1.3 joris 214: mc = xmalloc(sizeof(*mc));
215:
1.1 joris 216: TAILQ_FOREACH(mi, &modules, m_list) {
1.3 joris 217: if (!strcmp(name, mi->mi_name)) {
218: mc = xmalloc(sizeof(*mc));
1.4 joris 219: mc->mc_modules = mi->mi_modules;
220: mc->mc_ignores = mi->mi_ignores;
221: mc->mc_canfree = 0;
1.7 joris 222: mc->mc_name = mi->mi_name;
1.3 joris 223: mc->mc_flags = mi->mi_flags;
1.7 joris 224: mc->mc_prog = mi->mi_prog;
1.3 joris 225: return (mc);
226: }
1.1 joris 227: }
228:
1.4 joris 229: TAILQ_INIT(&(mc->mc_modules));
230: TAILQ_INIT(&(mc->mc_ignores));
231: cvs_file_get(name, 0, &(mc->mc_modules));
232: mc->mc_canfree = 1;
1.7 joris 233: mc->mc_name = name;
1.3 joris 234: mc->mc_flags |= MODULE_ALIAS;
1.7 joris 235: mc->mc_prog = NULL;
1.3 joris 236:
237: return (mc);
1.1 joris 238: }