From: Nathan Wagner Date: Tue, 16 Oct 2018 10:32:57 +0000 (+0000) Subject: add rmpackage X-Git-Tag: v0.2.16~87 X-Git-Url: https://pd.if.org/git/?p=zpackage;a=commitdiff_plain;h=214fd7d30098cb9dad0fb2a7b522b262512d3892 add rmpackage added delete trigger for packages_pkgid to make removing packages easier. The install program will remove any existing package from the recording database before doing a merge. The test for an already existing package is earlier, so this should be safe. --- diff --git a/Makefile b/Makefile index 75e3b8e..f9ec250 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ ZPKGBIN=zpm-addfile zpm-extract zpm-init zpm-vercmp zpm-stat zpm-hash \ zpm-elftype SCRIPTS=zpm zpm-install zpm-merge zpm-list zpm-preserve zpm-test zpm-log \ - zpm-contents zpm-uninstall zpm-pathmod + zpm-contents zpm-uninstall zpm-pathmod zpm-rmpackage COMPILED=$(ZPKGBIN) PROGRAMS=$(SCRIPTS) $(COMPILED) diff --git a/db.sql b/db.sql index d5b1d10..2418d12 100644 --- a/db.sql +++ b/db.sql @@ -61,6 +61,13 @@ create view packages_pkgid as select printf('%s-%s-%s', package, version, release) as pkgid, * from packages; +create trigger packages_delete_trigger instead of +delete on packages_pkgid +begin + delete from packages where package = OLD.package + and version = OLD.version and release = OLD.release; +end; + create trigger packages_update_trigger instead of update on packages_pkgid begin diff --git a/zpm-install b/zpm-install index 2219271..d0f2f32 100755 --- a/zpm-install +++ b/zpm-install @@ -156,6 +156,8 @@ for pkgstr in "$@"; do current=$(zpm list -s installed "$package") if [ $runscripts -gt 0 ]; then + # TODO run pre-upgrade script if needed + # zpm runscript -p pre-upgrade $current $pkgid zpm runscript -f $pkgfile -p pre-install $pkgid $current if [ $? -ne 0 ]; then # TODO log @@ -163,8 +165,16 @@ for pkgstr in "$@"; do fi fi + # remove the package if it exists. can't be in an installed + # state, would have bailed above. So, if it exists, can only + # be 'upgraded'. This should be fast, because we won't run + # a garbage collect, so any possible duplicate files between + # an upgraded or removed files, if they're there, won't need + # to be merged. + # only merge if localdb and pkgfile are different if [ "$pkgfile" != "$ZPMDB" ]; then + zpm rmpackage $pkgid zpm merge -f $pkgfile -s installing $pkgid if [ $? -ne 0 ]; then # TODO log diff --git a/zpm-rmpackage b/zpm-rmpackage new file mode 100755 index 0000000..1cb3956 --- /dev/null +++ b/zpm-rmpackage @@ -0,0 +1,47 @@ +#!/bin/sh + +pkgfile=${ZPM_PACKAGE_FILE:-${ZPMDB:-/var/lib/zpm/local.db}} + +verbose=0 + +# newpackage -f pkgfile $pkgid +while getopts :f:v opt; do + case $opt in + f) pkgfile="$OPTARG" ;; + v) verbose=1 ;; + esac +done +shift $(( OPTIND - 1)) + +die() { + echo $* 1>&2 + exit 1 +} + +warn() { + echo $* 1>&2 +} + +if [ ! -f "$pkgfile" ]; then + die $pkgfile does not exist +fi + +{ + printf ".bail on\n" + printf "begin;\n" + for pkgstr in "$@"; do + pkgid=$(zpm findpkg -f $pkgfile "$pkgstr") + if [ $verbose -gt 0 ]; then + if [ -z "$pkgid" ]; then + warn "$pkgstr not found" + continue; + fi + if [ $verbose -gt 1 ]; then + warn "found %s -> %s\n" "$pkgstr", "$pkgid" + fi + fi + pkgid=$(zpm quote "$pkgid") + printf "delete from packages_pkgid where pkgid = '$pkgid';\n" + done + printf "commit;\n" +} | zpm shell $pkgfile