[BACK]Return to modules.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / cvs

Annotation of src/usr.bin/cvs/modules.c, Revision 1.13

1.13    ! tobias      1: /*     $OpenBSD: modules.c,v 1.12 2008/03/02 11:58:45 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.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:
1.12      joris      52: int
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.11      joris      60:        prog = NULL;
1.10      joris      61:        bline = xstrdup(line);
                     62:
1.1       joris      63:        flags = 0;
                     64:        p = val = line;
1.9       tobias     65:        while (!isspace(*p) && *p != '\0')
1.1       joris      66:                p++;
                     67:
1.7       joris      68:        if (*p == '\0')
                     69:                goto bad;
                     70:
1.1       joris      71:        *(p++) = '\0';
                     72:        module = val;
                     73:
1.9       tobias     74:        while (isspace(*p))
1.1       joris      75:                p++;
                     76:
1.7       joris      77:        if (*p == '\0')
                     78:                goto bad;
1.1       joris      79:
                     80:        val = p;
1.9       tobias     81:        while (!isspace(*p) && *p != '\0')
1.1       joris      82:                p++;
                     83:
                     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");
1.11      joris      98:                                goto bad;
1.3       joris      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");
1.11      joris     105:                                goto bad;
1.3       joris     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");
1.11      joris     116:                                goto bad;
1.8       joris     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");
1.11      joris     134:                                goto bad;
1.4       joris     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.12      joris     202:        return (0);
1.7       joris     203:
                    204: bad:
1.11      joris     205:        if (prog != NULL)
                    206:                xfree(prog);
                    207:        xfree(bline);
1.7       joris     208:        cvs_log(LP_NOTICE, "malformed line in CVSROOT/modules: %d", lineno);
1.12      joris     209:        return (0);
1.1       joris     210: }
                    211:
1.3       joris     212: struct module_checkout *
1.1       joris     213: cvs_module_lookup(char *name)
                    214: {
1.3       joris     215:        struct module_checkout *mc;
1.1       joris     216:        struct module_info *mi;
                    217:
1.3       joris     218:        mc = xmalloc(sizeof(*mc));
                    219:
1.1       joris     220:        TAILQ_FOREACH(mi, &modules, m_list) {
1.3       joris     221:                if (!strcmp(name, mi->mi_name)) {
1.4       joris     222:                        mc->mc_modules = mi->mi_modules;
                    223:                        mc->mc_ignores = mi->mi_ignores;
                    224:                        mc->mc_canfree = 0;
1.7       joris     225:                        mc->mc_name = mi->mi_name;
1.3       joris     226:                        mc->mc_flags = mi->mi_flags;
1.7       joris     227:                        mc->mc_prog = mi->mi_prog;
1.3       joris     228:                        return (mc);
                    229:                }
1.1       joris     230:        }
                    231:
1.4       joris     232:        TAILQ_INIT(&(mc->mc_modules));
                    233:        TAILQ_INIT(&(mc->mc_ignores));
                    234:        cvs_file_get(name, 0, &(mc->mc_modules));
                    235:        mc->mc_canfree = 1;
1.7       joris     236:        mc->mc_name = name;
1.13    ! tobias    237:        mc->mc_flags = MODULE_ALIAS;
1.7       joris     238:        mc->mc_prog = NULL;
1.3       joris     239:
                    240:        return (mc);
1.1       joris     241: }