diff options
Diffstat (limited to 'bin/tweakmeta')
-rwxr-xr-x | bin/tweakmeta | 144 |
1 files changed, 71 insertions, 73 deletions
diff --git a/bin/tweakmeta b/bin/tweakmeta index 8d86ad9..2900a94 100755 --- a/bin/tweakmeta +++ b/bin/tweakmeta @@ -1,9 +1,27 @@ -# pbjparse.awk +#!/usr/bin/awk -f ## -# Parse a .pbj data file and print a PKGMETA data file to stdout. +# tweakmeta +# +# First read a PKGMETA file in the current directory, loading its values. +# Next read a PKGTWEAK file from standard input. +# The PKGTWEAK file tells us how to modify the PKGMETA data. +# The modified PKGMETA is printed to standard output. +# # Justin Davis <jrcd83@gmail.com> -BEGIN { PROG = "pbjparse" } +BEGIN { + PROG = "tweakmeta" + if (system("test -r PKGMETA") != 0) { + print PROG ": PKGMETA file could not be read." | "cat 1>&2" + exit(errcode = 2) + } + + FS = "\n"; RS = "" + while (getline<"PKGMETA" > 0) + for (i = 2; i <= NF; i++) pushval($1, $i) + close("PKGMETA") + FS = " "; RS = "\n" +} { sub(/#.*/, "") } @@ -12,115 +30,95 @@ $1 == "+" { pushval($2, joinfields(3)); next } $1 == "-" { remval($2, $3); next } $1 == "<" { - i = findval($2, $3) - stack[++stacklen] = pbvars[$2, i] - remelem($2, i) - next + i = findval($2, $3) + stack[++stacklen] = pbvars[$2, i] + remelem($2, i) + next } $1 == ">" { - if (stacklen < 1) - die("No values on the stack. Make sure you use '<' first.") - pushval($2, stack[stacklen--]) - next + if (stacklen < 1) + die("No values on the stack. Make sure you use '<' first.") + pushval($2, stack[stacklen--]) + next } $1 == "=" { - if ($2 == "optdepends") die("cannot use '=' with optdepends.") - remall($2) - for (i=3; i<=NF; i++) pushval($2, $i) - next -} - -$1 == "!" { - cmd = joinfields(2) - while ((ret = cmd | getline) > 0) parsepbj() - if (ret == -1) die("failed to run " cmd) - close(cmd) - next + if ($2 == "optdepends") die("cannot use '=' with optdepends.") + remall($2) + for (i=3; i<=NF; i++) pushval($2, $i) + next } -$1 == "|" { pbpipes[++pipecount] = joinfields(2); next } - # ignore lines of whitespace $1 !~ /^[ \t]*$/ { die("invalid input: " $0) } END { - OFS = "\n" - writemakepb() - - for (name in pbcount) { - len = pbcount[name] - if (len == 0) continue - - print name - for (i=1; i<=len; i++) print pbvars[name, i] - print "" - } - - if (!seenpkgr) { - pkger = ENVIRON["PACKAGER"] - if (pkger == "") pkger = "Anonymous" - print "packager\n" pkger - } + if (errcode) exit(errcode) + + OFS = "\n" + + for (name in pbcount) { + len = pbcount[name] + if (len == 0) continue + + print name + for (i=1; i<=len; i++) print pbvars[name, i] + print "" + } + + if (!seenpkgr) { + pkger = ENVIRON["PACKAGER"] + if (pkger == "") pkger = "Anonymous" + print "packager", pkger, "" + } } function die (msg) { - printf "%s: error line %d: %s\n", PROG, FNR, msg | "cat 1>&2" - exit 1 + printf "%s: error line %d: %s\n", PROG, FNR, msg | "cat 1>&2" + exit(errcode = 1) } function joinfields (start, msg) { - msg = $(start++) - while (start <= NF) msg = msg " " $(start++) - return msg + msg = $(start++) + while (start <= NF) msg = msg " " $(start++) + return msg } function remall (field) { - pbcount[field] = 0 + pbcount[field] = 0 } function pushval (field, val) { - if (field == "packager") seenpkgr = 1 - pbvars[field, ++pbcount[field]] = val + if (field == "packager") seenpkgr = 1 + pbvars[field, ++pbcount[field]] = val } function remval (field, prefix) { - remelem(field, findval(field, prefix)) + remelem(field, findval(field, prefix)) } function remelem (field, i, len) { - # TODO: error check if "i" is in bounds? - len = pbcount[field] - for (len = pbcount[field]; i < len; i++) - pbvars[field, i] = pbvars[field, i+1] - delete pbvars[field, i] - pbcount[field]-- + # TODO: error check if "i" is in bounds? + len = pbcount[field] + for (len = pbcount[field]; i < len; i++) + pbvars[field, i] = pbvars[field, i+1] + delete pbvars[field, i] + pbcount[field]-- } function findval (field, prefix, i, len) { - len = pbcount[field] - if (len == 0) die(field " is empty!") + len = pbcount[field] + if (len == 0) die(field " is empty!") - for (i=1; i<=len; i++) if (pbvars[field, i] ~ "^" prefix) break - if (i > len) die("could not find " prefix " in " field "'s values") - return i -} - -function writemakepb () -{ - tcmd = pbpipes[1] - for (i = 2; i <= pipecount; i++) tcmd = tcmd " | \\\n " pbpipes[i] - print "#!/bin/sh" > "makepb" - print "PATH=" ENVIRON["PATH"] > "makepb" - print "cat PKGMETA | " tcmd > "makepb" - close("makepb") - system("chmod +x makepb") + for (i=1; i<=len; i++) if (index(pbvars[field, i], prefix) == 0) break + if (i > len) die("could not find " prefix " in " field "'s values") + return i } |