[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.9

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