From: Nathan Wagner Date: Sat, 10 Nov 2018 19:35:48 +0000 (+0000) Subject: add options for vercmp output and tests X-Git-Tag: v0.2.16~20 X-Git-Url: https://pd.if.org/git/?p=zpackage;a=commitdiff_plain;h=86d8fda79c6b83f5b1790388d9e419d999232d45 add options for vercmp output and tests --- diff --git a/t/vercmp.t b/t/vercmp.t index 2799a53..a877c08 100755 --- a/t/vercmp.t +++ b/t/vercmp.t @@ -13,7 +13,34 @@ vtest() { okstreq "$res" 0 "$1 == $1" } -plan 45 +least() { + want=$1 + shift + l=$(zpm vercmp -L "$@") + okstreq "$l" "$want" "least $*" +} + +greatest() { + want=$1 + shift + g=$(zpm vercmp -G "$@") + okstreq "$g" "$want" "greatest $*" +} + +plan 53 + +least 1.0a 1.0a 1.0b +least 1.0a 1.0b 1.0a +greatest z a b z +greatest z a z b +least abc abc +greatest abc abc + +zpm vercmp -gq 'gnupg-1.0-1' "gnupg-2.0-1" +exitwith 1 vercmp -g not gt + +zpm vercmp -gq 'gnupg-2.0-1' "gnupg-1.0-1" +exitwith 0 vercmp -g is gt # alpha vtest 1.0a 1.0b diff --git a/zpm-vercmp.c b/zpm-vercmp.c index bfa5412..b0e5117 100644 --- a/zpm-vercmp.c +++ b/zpm-vercmp.c @@ -1,15 +1,111 @@ +#define _POSIX_C_SOURCE 2 + #include #include +#include + #include "zpm.h" +/* + * -g greater than + * -l less than + * -e equal + * -L least : print least + * -G greatest : print greatest + * -q quiet: no print + */ int main(int ac, char *av[]) { int cmp; + char *a = 0, *b = 0; + int print = 1; + int argn, opt, pass, failed = 0; + + /* 0x1 = less than, 0x2 = equal, 0x4 = greater */ + unsigned testmask = 0; + unsigned testcases = 0; + + char *greatest = 0; + char *least = 0; if (ac < 2) return 1; - cmp = zpm_vercmp(av[1], av[2]); - printf("%d\n", cmp); - if (cmp == -1) cmp = 2; - return cmp; + while ((opt = getopt(ac, av, "qgleLG")) != -1) { + switch (opt) { + case 'q': print = 0; break; + case 'l': testmask |= 0x1; break; + case 'e': testmask |= 0x2; break; + case 'g': testmask |= 0x4; break; + case 'L': print = 2; break; + case 'G': print = 3; break; + default: + exit(EXIT_FAILURE); + break; + } + } + argn = optind; + + if (ac > argn) { + a = av[argn++]; + greatest = a; + least = a; + } + + while (ac > argn) { + b = av[argn++]; + + cmp = zpm_vercmp(a, b) + 1; + testcases |= (1< 0) { + greatest = b; + } + + cmp = zpm_vercmp(least, b); + if (cmp < 0) { + least = b; + } + } + + switch (testcases) { + case 0: /* no tests */ + cmp = 0; break; + case 1: /* only less than */ + cmp = 2; break; + case 2: /* only equal */ + cmp = 0; break; + case 4: /* only greater than */ + cmp = 1; break; + default: /* mixed */ + cmp = 3; break; + } + + switch (print) { + case 1: + printf("%d\n", cmp == 2 ? -1 : cmp); + break; + case 2: + if (greatest) printf("%s\n", greatest); + break; + case 3: + if (least) printf("%s\n", least); + break; + default: + break; + } + fflush(stdout); + + if (testmask == 0) { + return cmp; + } else { + return failed ? 1 : 0; + } }