diff --git a/misc/tools-source/config_helper.c b/misc/tools-source/config_helper.c index 9db965896..86b700944 100644 --- a/misc/tools-source/config_helper.c +++ b/misc/tools-source/config_helper.c @@ -54,6 +54,8 @@ struct package { char *alias; char *version; char *prefix; + /* flags must end with a space character + (for easily searching for flags). */ char *flags; struct package *next; }; @@ -98,8 +100,19 @@ int read_pkg_list(const char *file) { pkg_tmp->repository = strdup(tok); tok = strtok(0, " "); - pkg_tmp->name = strdup(tok); - pkg_tmp->alias = strdup(tok); + char *c = strchr(tok, '='); + if (c) + { + pkg_tmp->name = malloc(c-tok+1); + pkg_tmp->name[c-tok] = '\0'; + strncpy(pkg_tmp->name, tok, c-tok); + pkg_tmp->alias = strdup(c+1); + } + else + { + pkg_tmp->name = strdup(tok); + pkg_tmp->alias = strdup(tok); + } tok = strtok(0, " "); pkg_tmp->version = strdup(tok); @@ -108,7 +121,7 @@ int read_pkg_list(const char *file) { pkg_tmp->prefix = strdup(tok); tok = strtok(0, "\n"); - tok[strlen(tok)-2] = 0; + tok[strlen(tok)-1] = 0; pkg_tmp->flags = strdup(tok); if ( !package_list ) @@ -134,7 +147,7 @@ int write_pkg_list(const char *file) { fprintf(f, " %s %s %s", pkg->prio, pkg->repository, pkg->name); if (strcmp(pkg->name, pkg->alias)) fprintf(f, "=%s", pkg->alias); - fprintf(f, " %s %s %s 0\n", pkg->version, pkg->prefix, pkg->flags); + fprintf(f, " %s %s %s0\n", pkg->version, pkg->prefix, pkg->flags); pkg = pkg->next; } @@ -208,6 +221,91 @@ int pkgswitch(int mode, char **args) return 0; } +int pkgfork(char *pkgname, char *xpkg, char** opt) +{ + + struct package *fork, *pkg; + int i, k; + + for (pkg = package_list; pkg; pkg = pkg->next) + if (!strcmp(pkg->alias, pkgname)) + break; + if (!pkg) return 1; + + fork = calloc(1, sizeof(struct package)); + + fork->status = pkg->status; + for (k=0; k<10; k++) + fork->stages[k] = pkg->stages[k]; + fork->prio = strdup(pkg->prio); + fork->repository = strdup(pkg->repository); + fork->name = strdup(pkgname); + fork->alias = strdup(xpkg); + fork->version = strdup(pkg->version); + fork->prefix = strdup(pkg->prefix); + fork->flags = strdup(pkg->flags); + + fork->next = pkg->next; + pkg->next = fork; + + for (i=0; *opt[i] && *opt[i+1]; i+=2) + { + if (!strcmp(opt[i], "status")) + fork->status= opt[i+1][0] == 'X'; + + else if (!strcmp(opt[i], "stages")) + for (k=0; k<10; k++) + fork->stages[k] = opt[i+1][k] != '-' ? opt[i+1][k] : 0; + + else if (!strcmp(opt[i], "priority")) + { + free(fork->prio); + fork->prio = strdup(opt[i+1]); + } + + else if (!strcmp(opt[i], "version")) + { + free(fork->version); + fork->version = strdup(opt[i+1]); + } + + else if (!strcmp(opt[i], "prefix")) + { + free(fork->prefix); + fork->prefix = strdup(opt[+1]); + } + + else if (!strcmp(opt[i], "flag")) + { + char buf[512], flag[512]; + snprintf(flag, 512, " %s ", opt[i+1]); + if (! strstr(fork->flags, flag)) + { + free(fork->flags); + snprintf(buf, 512, "%s%s ", pkg->flags, opt[i+1]); + fork->flags = strdup(buf); + } + } + + else if (!strcmp(opt[i], "unflag")) + { + char buf[512], flag[512]; + snprintf(flag, 512, " %s ", opt[i+1]); + char *flagstart = strstr(fork->flags, flag); + if (flagstart) + { + int len = flagstart - fork->flags + 1; + strncpy(buf, fork->flags, len); + strncpy(buf+len, flagstart+strlen(flag), 512-len); + + free(fork->flags); + fork->flags = strdup(buf); + } + } + } + return 0; +} + int cfghlp_builtin(WORD_LIST *list) { char *args[10]; @@ -224,21 +322,24 @@ int cfghlp_builtin(WORD_LIST *list) if (!strcmp(args[0],"pkg_in")) return read_pkg_list(args[1]); - if (!strcmp(args[0],"pkg_out")) + else if (!strcmp(args[0],"pkg_out")) return write_pkg_list(args[1]); - if (!strcmp(args[0],"pkgcheck")) + else if (!strcmp(args[0],"pkgcheck")) return pkgcheck(args[1], args[2]); - if (!strcmp(args[0],"pkgremove")) + else if (!strcmp(args[0],"pkgremove")) return pkgswitch(0, args+1); - if (!strcmp(args[0],"pkgenable")) + else if (!strcmp(args[0],"pkgenable")) return pkgswitch(1, args+1); - if (!strcmp(args[0],"pkgdisable")) + else if (!strcmp(args[0],"pkgdisable")) return pkgswitch(2, args+1); + else if (!strcmp(args[0],"pkgfork")) + return pkgfork(args[1], args[2], args+3); + return 1; } diff --git a/scripts/config.func b/scripts/config.func index a64f7f33e..180d9a481 100644 --- a/scripts/config.func +++ b/scripts/config.func @@ -101,6 +101,50 @@ then bprof pkgcheck stop return $ret } + # + # pkgfork .. + # + # Names: + # status X / O + # stages 012--5---9 + # priority 115.000 + # version 0.9.26 + # prefix /opt/foobar + # flag CORE + # unflag CORE + # + pkgfork() { + local script="\$5==\"$1\" {print;\$5=\"$1=$2\";" + shift; shift; + while [ -n "$1" ]; do + case "$1" in + status) + script="$script \$1=\"$2\";" + ;; + stages) + script="$script \$2=\"$2\";" + ;; + priority) + script="$script \$3=\"$2\";" + ;; + version) + script="$script \$6=\"$2\";" + ;; + prefix) + script="$script \$7=\"$2\";" + ;; + flag) + script="$script sub(\" 0\$\", \" $2 0\");" + ;; + unflag) + script="$script sub(\" $2 \", \" \");" + ;; + esac + shift; shift; + done + script="$script} {print;}" + pkgfilter "awk" "--" "$script" + } else pkgin() { cfghlp pkg_in config/$config.$swpid/packages; } pkgout() { cfghlp pkg_out config/$config.$swpid/packages ; } @@ -132,53 +176,13 @@ else bprof pkgcheck stop return $ret } + pkgfork() { + bprof pkgfork start + cfghlp pkgfork "$@" + bprof pkgfork stop + } fi -# -# pkgfork .. -# -# Names: -# status X / O -# stages 012--5---9 -# priority 115.000 -# version 0.9.26 -# prefix /opt/foobar -# flag CORE -# unflag CORE -# -pkgfork() { - local script="\$5==\"$1\" {print;\$5=\"$1=$2\";" - shift; shift; - while [ -n "$1" ]; do - case "$1" in - status) - script="$script \$1=\"$2\";" - ;; - stages) - script="$script \$2=\"$2\";" - ;; - priority) - script="$script \$3=\"$2\";" - ;; - version) - script="$script \$6=\"$2\";" - ;; - prefix) - script="$script \$7=\"$2\";" - ;; - flag) - script="$script sub(\" 0\$\", \" $2 0\");" - ;; - unflag) - script="$script sub(\" $2 \", \" \");" - ;; - esac - shift; shift; - done - script="$script} {print;}" - pkgfilter "awk" "--" "$script" -} - comment() { bprof comment start if [ $ROCKCFG_EXPERT -eq 1 -o $expert -eq 0 ] && \