Annotation of src/usr.bin/cvs/modules.c, Revision 1.4
1.4 ! joris 1: /* $OpenBSD: modules.c,v 1.3 2008/02/03 17:20:14 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.4 ! joris 46: struct cvs_filelist *fl, *nxt;
! 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) {
! 137: if (sp[0] == '!')
! 138: cvs_file_get((sp + 1), 0, &(mi->mi_ignores));
! 139: else
! 140: cvs_file_get(sp, 0, &(mi->mi_modules));
! 141: } else if (sp == val) {
! 142: dirname = sp;
! 143: } else {
! 144: if (sp[0] == '!') {
! 145: sp++;
! 146: (void)xsnprintf(fpath, sizeof(fpath), "%s/%s",
! 147: dirname, sp);
! 148: cvs_file_get(fpath, 0, &(mi->mi_ignores));
! 149: } else {
! 150: (void)xsnprintf(fpath, sizeof(fpath), "%s/%s",
! 151: dirname, sp);
! 152: cvs_file_get(fpath, 0, &(mi->mi_modules));
! 153: }
! 154: }
! 155: }
! 156:
! 157: if (!(mi->mi_flags & MODULE_ALIAS) && TAILQ_EMPTY(&(mi->mi_modules)))
! 158: cvs_file_get(dirname, 0, &(mi->mi_modules));
! 159:
! 160: fl = TAILQ_FIRST(&(mi->mi_modules));
! 161: mi->mi_repository = xstrdup(fl->file_path);
! 162:
1.1 joris 163: TAILQ_INSERT_TAIL(&modules, mi, m_list);
164: }
165:
1.3 joris 166: struct module_checkout *
1.1 joris 167: cvs_module_lookup(char *name)
168: {
1.3 joris 169: struct module_checkout *mc;
1.1 joris 170: struct module_info *mi;
171:
1.3 joris 172: mc = xmalloc(sizeof(*mc));
173:
1.1 joris 174: TAILQ_FOREACH(mi, &modules, m_list) {
1.3 joris 175: if (!strcmp(name, mi->mi_name)) {
176: mc = xmalloc(sizeof(*mc));
1.4 ! joris 177: mc->mc_modules = mi->mi_modules;
! 178: mc->mc_ignores = mi->mi_ignores;
! 179: mc->mc_canfree = 0;
1.3 joris 180: if (mi->mi_flags & MODULE_ALIAS)
181: mc->mc_wdir = xstrdup(mi->mi_repository);
182: else
183: mc->mc_wdir = xstrdup(mi->mi_name);
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.3 joris 193: mc->mc_wdir = xstrdup(name);
194: mc->mc_flags |= MODULE_ALIAS;
195:
196: return (mc);
1.1 joris 197: }