Annotation of src/usr.bin/cvs/modules.c, Revision 1.6
1.6 ! joris 1: /* $OpenBSD: modules.c,v 1.5 2008/02/03 22:53:04 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
43: modules_parse_line(char *line)
44: {
45: int flags;
1.5 joris 46: struct cvs_filelist *fl;
1.4 joris 47: char *val, *p, *module, *sp, *dp;
1.1 joris 48: struct module_info *mi;
1.4 joris 49: char *dirname, fpath[MAXPATHLEN];
1.1 joris 50:
51: flags = 0;
52: p = val = line;
53: while (*p != ' ' && *p != '\t')
54: p++;
55:
56: *(p++) = '\0';
57: module = val;
58:
59: while (*p == ' ' || *p == '\t')
60: p++;
61:
62: if (*p == '\0') {
63: cvs_log(LP_NOTICE, "premature ending of CVSROOT/modules line");
64: return;
65: }
66:
67: val = p;
68: while (*p != ' ' && *p != '\t')
69: p++;
70:
71: if (*p == '\0') {
72: cvs_log(LP_NOTICE, "premature ending of CVSROOT/modules line");
73: return;
74: }
75:
76: while (val[0] == '-') {
77: p = val;
78: while (*p != ' ' && *p != '\t' && *p != '\0')
79: p++;
80:
81: if (*p == '\0') {
82: cvs_log(LP_NOTICE,
83: "misplaced option in CVSROOT/modules");
84: return;
85: }
86:
87: *(p++) = '\0';
88:
89: switch (val[1]) {
90: case 'a':
1.3 joris 91: if (flags & MODULE_TARGETDIR) {
92: cvs_log(LP_NOTICE, "cannot use -a with -d");
93: return;
94: }
95: flags |= MODULE_ALIAS;
96: break;
97: case 'd':
98: if (flags & MODULE_ALIAS) {
99: cvs_log(LP_NOTICE, "cannot use -d with -a");
100: return;
101: }
102: flags |= MODULE_TARGETDIR;
103: break;
104: case 'l':
105: flags |= MODULE_NORECURSE;
1.1 joris 106: break;
1.4 joris 107: case 'i':
108: if (flags != 0) {
109: cvs_log(LP_NOTICE,
110: "-i cannot be used with other flags");
111: return;
112: }
113: flags |= MODULE_RUN_ON_COMMIT;
114: break;
1.1 joris 115: }
116:
117: val = p;
118: }
119:
1.4 joris 120: /* XXX: until we support it */
121: if (flags & MODULE_RUN_ON_COMMIT)
122: return;
123:
1.1 joris 124: mi = xmalloc(sizeof(*mi));
125: mi->mi_name = xstrdup(module);
1.3 joris 126: mi->mi_flags = flags;
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);
167: }
168:
1.3 joris 169: struct module_checkout *
1.1 joris 170: cvs_module_lookup(char *name)
171: {
1.3 joris 172: struct module_checkout *mc;
1.1 joris 173: struct module_info *mi;
174:
1.3 joris 175: mc = xmalloc(sizeof(*mc));
176:
1.1 joris 177: TAILQ_FOREACH(mi, &modules, m_list) {
1.3 joris 178: if (!strcmp(name, mi->mi_name)) {
179: mc = xmalloc(sizeof(*mc));
1.4 joris 180: mc->mc_modules = mi->mi_modules;
181: mc->mc_ignores = mi->mi_ignores;
182: mc->mc_canfree = 0;
1.6 ! joris 183: mc->mc_name = xstrdup(mi->mi_name);
1.3 joris 184: mc->mc_flags = mi->mi_flags;
185: return (mc);
186: }
1.1 joris 187: }
188:
1.4 joris 189: TAILQ_INIT(&(mc->mc_modules));
190: TAILQ_INIT(&(mc->mc_ignores));
191: cvs_file_get(name, 0, &(mc->mc_modules));
192: mc->mc_canfree = 1;
1.6 ! joris 193: mc->mc_name = xstrdup(name);
1.3 joris 194: mc->mc_flags |= MODULE_ALIAS;
195:
196: return (mc);
1.1 joris 197: }