From: Nathan Wagner Date: Fri, 28 Sep 2018 17:54:24 +0000 (+0000) Subject: change findpkg to use -f option X-Git-Tag: v0.1.7~21 X-Git-Url: https://pd.if.org/git/?p=zpackage;a=commitdiff_plain;h=51a6d79f8a532376a9f27dbb5133bf13a5474703 change findpkg to use -f option --- diff --git a/db.sql b/db.sql index bf6fd22..94ffce3 100644 --- a/db.sql +++ b/db.sql @@ -52,6 +52,8 @@ create table packages ( without rowid ; +create index package_status_index on packages (status); + create view packages_pkgid as select printf('%s-%s-%s', package, version, release) as pkgid, * from packages; @@ -153,6 +155,13 @@ from installedfiles I group by I.path ; +create view sync_status_ref_count as +select path, status, count(*) as refcount +from packagefiles_status +where status in ('installed', 'installing', 'removing') +group by path, status +; + create view packagefiles_status as select P.status, PF.* from packagefiles_pkgid PF @@ -197,6 +206,16 @@ left join packagefiles_status PN and PI.pkgid != PN.pkgid where PN.path is null and PI.package in (select package from packages where status = 'installing') + +union all +-- remove files in removing, but not installing +select distinct 'remove' as op, PR.* +from packagefiles_status PR +left join packagefiles_status PN +on PR.path = PN.path +and PR.pkgid != PN.pkgid and PN.status in ('installing', 'installed') +where PN.path is null +and PR.status = 'removing' ; create table pathtags ( diff --git a/t/install.t b/t/install.t index 9b8d5ee..00287a9 100755 --- a/t/install.t +++ b/t/install.t @@ -6,7 +6,7 @@ . tap.sh -plan 51 +plan 53 newpkg() { pkgid=$1 @@ -186,6 +186,10 @@ skiponfail 3 "can't create $pkgid" || { } } +tryrun zpm uninstall -d local.db third-1.0-1 +test -f bin/echo +failsok bin/echo removed +ls -l bin | diagstdin cd .. || bailout require rm -rf tmp diff --git a/zpm-add b/zpm-add index 2b4dda6..1d68800 100755 --- a/zpm-add +++ b/zpm-add @@ -71,7 +71,7 @@ if [ -z "$release" ]; then if [ -z "$pkgfile" ]; then die "cannot determine package file" else - pkgstr=$(zpm findpkg $pkgfile $pkgid) + pkgstr=$(zpm findpkg -f $pkgfile $pkgid) if [ -z "$pkgstr" ]; then die "unable to find package id for $pkgid in $pkgfile" fi diff --git a/zpm-contents b/zpm-contents index 0d1a027..3d1d13f 100755 --- a/zpm-contents +++ b/zpm-contents @@ -18,7 +18,7 @@ fi for pkg in "$@"; do - pkgid=$(zpm findpkg $pkgfile $pkg) + pkgid=$(zpm findpkg -f $pkgfile $pkg) zpm shell $pkgfile < #include #include +#include #include "zpm.h" static int found = 0; +void usage(void) { + fprintf(stderr, "zpm-findpkg [-I] [-s ...] [-S ] [package]\n"); +} + static int prow(void *f, int ncols, char **vals, char **cols) { FILE *out = f; int i; @@ -68,60 +75,105 @@ void parse_package(char *pstr, char *name, char *ver, int *rel) { } int main(int ac, char **av){ + int opt; struct zpm pkg; char *dbfile, *pkgstr; char *select = "select package, version, release, package||'-'||version||'-'||release as pkgid from packages"; char *group = "group by package having max( version||'-'||release collate vercmp) order by length(package), package, version||'-'||release collate vercmp"; -// char *select = "select package, version, release, package||'-'||version||'-'||release as pkgid from packages"; -// char *order = "order by package, version collate vercmp, cast(release as integer)"; - char sql[2048]; - - if (ac < 2) { - fprintf(stderr, "usage: db path\n"); - return 1; - } + char *sql; + sqlite3_str *include; + sqlite3_str *exclude; + sqlite3_str *query; dbfile = getenv("ZPMDB"); - if (ac > 1) { - dbfile = av[1]; + query = sqlite3_str_new(NULL); + include = sqlite3_str_new(NULL); + exclude = sqlite3_str_new(NULL); + + while ((opt = getopt(ac, av, "f:s:S:I")) != -1) { + switch (opt) { + case 'f': dbfile = optarg; break; + case 's': sqlite3_str_appendf(include,",%Q", optarg); + break; + case 'S': sqlite3_str_appendf(exclude,",%Q", optarg); + break; + case 'I': sqlite3_str_appendall(include,",'installed'"); + break; + default: + usage(); + exit(EXIT_FAILURE); + break; + } + } + int argn = optind; + + if (!dbfile) { + fprintf(stderr, "must specify db\n"); + return 1; } /* given a package name, get the packages */ /* no package name, get all */ +#ifdef DEBUG + fprintf(stderr, "opening db %s\n", dbfile); +#endif + if (zpm_open(&pkg, dbfile)) { char *errmsg; + char *excludes, *includes; - if (ac >= 2) { + excludes = sqlite3_str_value(exclude); + includes = sqlite3_str_value(include); + + sqlite3_str_appendall(query, " "); + sqlite3_str_appendall(query, select); + sqlite3_str_appendall(query, " where true"); + + if (includes) { + sqlite3_str_appendf(query, " and status in (%s)", includes+1); + } + if (excludes) { + sqlite3_str_appendf(query, " and status not in (%s)", excludes+1); + } + + if (ac >= argn) { int release; char version[32]; char package[32]; - pkgstr = av[2]; + pkgstr = av[argn]; parse_package(pkgstr, package, version, &release); + if (*package != 0) { + sqlite3_str_appendf(query, " and package = %Q", + package); + } + if (*version != 0) { + sqlite3_str_appendf(query, " and version = %Q", + version); + } if (release != -1) { - /* all three */ - sprintf(sql, "%s where package = '%s' and version = " - "'%s' and release = %d %s;", select, - package, version, release, group); - } else if (*version != 0) { - sprintf(sql, "%s where package = '%s' and version = " - "'%s' %s;", select, - package, version, group); - - } else { - - sprintf(sql, "%s where package = '%s' %s;", - select, av[2], group); + sqlite3_str_appendf(query, " and release = %d", + release); } - } else { - sprintf(sql, "%s %s;", select, group); } - zpm_exec(&pkg, sql, prow, stdout, &errmsg); + sqlite3_str_appendall(query, " "); + sqlite3_str_appendall(query, group); + sqlite3_str_appendall(query, ";"); + + sql = sqlite3_str_value(query); + if (sql) { +#ifdef DEBUG + fprintf(stderr, "q: %s\n", sql); +#endif + zpm_exec(&pkg, sql, prow, stdout, &errmsg); + } else { + fprintf(stderr, "unable to form database query\n"); + } } zpm_close(&pkg); return found ? 0 : 1; diff --git a/zpm-install b/zpm-install index 0bbfed5..47681d3 100755 --- a/zpm-install +++ b/zpm-install @@ -98,6 +98,17 @@ if [ $var -gt 0 ]; then zpm list -v -f $localdb -s installing die "already ($localdb) installing $var package(s)" fi +# check if we're installing something already +var=$(zpm list -f $localdb -s removing | wc -l) +if [ $var -gt 0 ]; then + zpm list -v -f $localdb -s removing + die "already ($localdb) removing $var package(s)" +fi +var=$(zpm list -f $localdb -s updating | wc -l) +if [ $var -gt 0 ]; then + zpm list -v -f $localdb -s updating + die "already ($localdb) updating $var package(s)" +fi if [ -n "$rootdir" ]; then ZPM_ROOT_DIR="$rootdir" @@ -106,7 +117,7 @@ fi # TODO mark already installed packages as updating? for pkgstr in "$@"; do - pkgid=$(zpm findpkg $pkgfile $pkgstr) + pkgid=$(zpm findpkg -f $pkgfile $pkgstr) if [ $? -ne 0 ]; then # TODO log die "can't find package $pkgstr in $pkgfile" diff --git a/zpm-list b/zpm-list index 5868ef2..0dda9da 100755 --- a/zpm-list +++ b/zpm-list @@ -60,4 +60,3 @@ zpm shell $pkgfile <