Annotation of src/usr.bin/cvs/modules.c, Revision 1.7
1.7 ! joris 1: /* $OpenBSD: modules.c,v 1.6 2008/02/03 23:34:41 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:
22: #include <stdlib.h>
23: #include <string.h>
24:
25: #include "cvs.h"
26: #include "config.h"
27:
28: TAILQ_HEAD(, module_info) modules;
29:
1.3 joris 30: struct module_checkout *current_module = NULL;
31: char *module_repo_root = NULL;
32:
1.1 joris 33: void
34: cvs_parse_modules(void)
35: {
36: cvs_log(LP_TRACE, "cvs_parse_modules()");
37:
38: TAILQ_INIT(&modules);
39: cvs_read_config(CVS_PATH_MODULES, modules_parse_line);
40: }
41:
42: void
1.7 ! joris 43: modules_parse_line(char *line, int lineno)
1.1 joris 44: {
45: int flags;
1.7 ! joris 46: struct module_info *mi;
1.4 joris 47: char *val, *p, *module, *sp, *dp;
1.7 ! joris 48: char *dirname, fpath[MAXPATHLEN], *prog;
1.1 joris 49:
50: flags = 0;
51: p = val = line;
1.7 ! joris 52: while (*p != ' ' && *p != '\t' && *p != '\0')
1.1 joris 53: p++;
54:
1.7 ! joris 55: if (*p == '\0')
! 56: goto bad;
! 57:
1.1 joris 58: *(p++) = '\0';
59: module = val;
60:
1.7 ! joris 61: while ((*p == ' ' || *p == '\t') && *p != '\0')
1.1 joris 62: p++;
63:
1.7 ! joris 64: if (*p == '\0')
! 65: goto bad;
1.1 joris 66:
67: val = p;
68: while (*p != ' ' && *p != '\t')
69: p++;
70:
1.7 ! joris 71: prog = NULL;
1.1 joris 72: while (val[0] == '-') {
73: p = val;
74: while (*p != ' ' && *p != '\t' && *p != '\0')
75: p++;
76:
1.7 ! joris 77: if (*p == '\0')
! 78: goto bad;
1.1 joris 79:
80: *(p++) = '\0';
81:
82: switch (val[1]) {
83: case 'a':
1.3 joris 84: if (flags & MODULE_TARGETDIR) {
85: cvs_log(LP_NOTICE, "cannot use -a with -d");
86: return;
87: }
88: flags |= MODULE_ALIAS;
89: break;
90: case 'd':
91: if (flags & MODULE_ALIAS) {
92: cvs_log(LP_NOTICE, "cannot use -d with -a");
93: return;
94: }
95: flags |= MODULE_TARGETDIR;
96: break;
97: case 'l':
98: flags |= MODULE_NORECURSE;
1.1 joris 99: break;
1.4 joris 100: case 'i':
1.7 ! joris 101: if (flags != 0 || prog != NULL) {
1.4 joris 102: cvs_log(LP_NOTICE,
103: "-i cannot be used with other flags");
104: return;
105: }
1.7 ! joris 106:
! 107: if ((val = strchr(p, ' ' )) == NULL)
! 108: goto bad;
! 109:
! 110: *(val++) = '\0';
! 111: prog = xstrdup(p);
! 112: p = val;
1.4 joris 113: flags |= MODULE_RUN_ON_COMMIT;
114: break;
1.1 joris 115: }
116:
117: val = p;
118: }
119:
1.7 ! joris 120: if (*val == '\0')
! 121: goto bad;
1.4 joris 122:
1.1 joris 123: mi = xmalloc(sizeof(*mi));
124: mi->mi_name = xstrdup(module);
1.3 joris 125: mi->mi_flags = flags;
1.7 ! joris 126: mi->mi_prog = prog;
1.4 joris 127:
128: dirname = NULL;
129: TAILQ_INIT(&(mi->mi_modules));
130: TAILQ_INIT(&(mi->mi_ignores));
131: for (sp = val; sp != NULL; sp = dp) {
132: dp = strchr(sp, ' ');
133: if (dp != NULL)
134: *(dp++) = '\0';
135:
136: if (mi->mi_flags & MODULE_ALIAS) {
1.5 joris 137: if (sp[0] == '!') {
138: if (strlen(sp) < 2)
139: fatal("invalid ! pattern");
1.4 joris 140: cvs_file_get((sp + 1), 0, &(mi->mi_ignores));
1.5 joris 141: } else {
1.4 joris 142: cvs_file_get(sp, 0, &(mi->mi_modules));
1.5 joris 143: }
1.4 joris 144: } else if (sp == val) {
145: dirname = sp;
146: } else {
147: if (sp[0] == '!') {
1.5 joris 148: if (strlen(sp) < 2)
149: fatal("invalid ! pattern");
150:
1.4 joris 151: sp++;
152: (void)xsnprintf(fpath, sizeof(fpath), "%s/%s",
153: dirname, sp);
154: cvs_file_get(fpath, 0, &(mi->mi_ignores));
155: } else {
156: (void)xsnprintf(fpath, sizeof(fpath), "%s/%s",
157: dirname, sp);
158: cvs_file_get(fpath, 0, &(mi->mi_modules));
159: }
160: }
161: }
162:
163: if (!(mi->mi_flags & MODULE_ALIAS) && TAILQ_EMPTY(&(mi->mi_modules)))
164: cvs_file_get(dirname, 0, &(mi->mi_modules));
165:
1.1 joris 166: TAILQ_INSERT_TAIL(&modules, mi, m_list);
1.7 ! joris 167: return;
! 168:
! 169: bad:
! 170: cvs_log(LP_NOTICE, "malformed line in CVSROOT/modules: %d", lineno);
1.1 joris 171: }
172:
1.3 joris 173: struct module_checkout *
1.1 joris 174: cvs_module_lookup(char *name)
175: {
1.3 joris 176: struct module_checkout *mc;
1.1 joris 177: struct module_info *mi;
178:
1.3 joris 179: mc = xmalloc(sizeof(*mc));
180:
1.1 joris 181: TAILQ_FOREACH(mi, &modules, m_list) {
1.3 joris 182: if (!strcmp(name, mi->mi_name)) {
183: mc = xmalloc(sizeof(*mc));
1.4 joris 184: mc->mc_modules = mi->mi_modules;
185: mc->mc_ignores = mi->mi_ignores;
186: mc->mc_canfree = 0;
1.7 ! joris 187: mc->mc_name = mi->mi_name;
1.3 joris 188: mc->mc_flags = mi->mi_flags;
1.7 ! joris 189: mc->mc_prog = mi->mi_prog;
1.3 joris 190: return (mc);
191: }
1.1 joris 192: }
193:
1.4 joris 194: TAILQ_INIT(&(mc->mc_modules));
195: TAILQ_INIT(&(mc->mc_ignores));
196: cvs_file_get(name, 0, &(mc->mc_modules));
197: mc->mc_canfree = 1;
1.7 ! joris 198: mc->mc_name = name;
1.3 joris 199: mc->mc_flags |= MODULE_ALIAS;
1.7 ! joris 200: mc->mc_prog = NULL;
1.3 joris 201:
202: return (mc);
1.1 joris 203: }