#!/bin/sh
META_SUFFIX=".tar.gz"
# Init ths installed package database
db_init() {
local tdbdir=$(dirname "$APK_DEFAULT_TDB")
mkdir -p "$APKDB"
mkdir -p "$tdbdir"
}
# All installed packages
db_all_installed() {
local opwd i
opwd="$PWD"
cd "$APKDB"
ls -d *-[0-9]* 2>/dev/null | sed 's/'$META_SUFFIX'$//'
cd "$opwd"
}
##########################################################
# is package installed?
# returns pkgv or nothing if pkg is not installed
db_get_installed_pkgv() {
local p="$1"
local regexp
if has_version "$p" ; then
regexp="^$p\$"
else
regexp="^$p-[0-9].*"
fi
db_all_installed | grep "$regexp"
}
############################################################
db_decompress_meta() {
local metafile="$APKDB/$1$META_SUFFIX"
[ "$APK_NOCOMPRESS" ] && return
[ ! -f "$metafile" ] && die "$1 does not seem to be installed."
tar -C "$APKDB" -zxf "$metafile"
}
#############################################################
db_compress_meta() {
local opwd metaball pkgv
[ "$APK_NOCOMPRESS" ] && return
opwd="$PWD"
pkgv="$1"
metaball="$pkgv$META_SUFFIX"
cd "$APKDB"
[ ! -d "$pkgv" ] &&\
die "db_compress_meta: $APKDB/$pkgv is not a directory or is missing"
rm -f "$metaball"
tar -czf "$metaball" $pkgv
rm -rf "$pkgv"
cd "$opwd"
}
db_register_required_by() {
local pkgv="`db_get_installed_pkgv $1`"
local reqby_pkgv="$2"
[ -z "$pkgv" ] && return 1
db_decompress_meta $pkgv
echo "$reqby_pkgv" >> "$APKDB/$pkgv/REQUIRED_BY"
db_compress_meta $pkgv
}
db_unregister_required_by() {
local pkgv="`db_get_installed_pkgv $1`"
local reqby_pkgv=$2
local reqbys
local rbfile="$APKDB/$pkgv/REQUIRED_BY"
[ -z "$pkgv" ] && return 1
db_decompress_meta $pkgv
if [ -f "$rbfile" ] ; then
sed -i "/^$reqby_pkgv$/d" "$rbfile"
fi
db_compress_meta $pkgv
}
# unregister package in dependencies REQUIRED_BY
db_unregister_pkgv() {
local i pkgv="$1"
local deps="`db_get_pkgv_deps $pkgv`"
if [ "$deps" ] ; then
for i in $deps ; do
[ "$VERBOSE" ] && echo "unregistering $i required by $pkgv"
[ "$DRYRUN" ] || db_unregister_required_by $i $pkgv
done
fi
}
# create checksums for config files. reads stdin
db_reg_confs() {
local opwd="$PWD"
if [ "$1" ] ; then
cd "$1"
else
cd "$ROOT"
fi
[ "$SFIC" ] && $SFIC --add "$APK_DEFAULT_TDB" --file -
cd "$opwd"
}
# unregister confs from sfic database. read stdin
db_unreg_confs() {
if [ "$SFIC" ] && [ $# -gt 0 ] ; then
[ "$VERBOSE" ] && echo "unregistering $# config files"
[ -z "$DRYRUN" ] && $SFIC --delete "$APK_DEFAULT_TDB" --file -
fi
}
# unregister confs for an installed package
db_unreg_confs_pkgv() {
db_decompress_meta "$1"
# sfic does not handle trailing / well.
lbu_filter < "$APKDB/$1/CONTENTS" | sed 's:/$::' | db_unreg_confs
db_compress_meta "$1"
}
db_get_pkgv_meta() {
if [ "$APK_NOCOMPRESS" ] ; then
cat "$APKDB/$1/$2" 2>/dev/null
else
tar -O -zxf "$APKDB/$1$META_SUFFIX" $1/$2 2>/dev/null
fi
}
db_get_pkgv_deps() {
db_get_pkgv_meta "$1" DEPEND
}
db_get_pkgv_reqby() {
db_get_pkgv_meta "$1" REQUIRED_BY
}
db_get_pkgv_size() {
local metafile="$APKDB/$1$META_SUFFIX"
(
cd "$ROOT"
db_get_pkgv_meta "$1" CONTENTS | while read f ; do
ls -s -d "$f" 2>/dev/null
done
ls -s "$metafile" 2>/dev/null
) | awk '{ total += $1 } END { print total }'
}
# return a list of installed pkgv's from given glob
db_glob() {
local sufx re
[ -z "$APK_NOCOMPRESS" ] && sufx=".tar.gz"
if echo "$1" | grep "^:" >/dev/null ; then
re=`echo "$1" | sed 's/^://'`
db_all_installed | grep "$re"
elif has_wildcard "$1" || has_version "$1" ; then
ls -d "$APKDB/"$1$sufx 2>/dev/null | sed 's|.*/|| ; s|'$META_SUFFIX'||'
else
ls -d "$APKDB/$1"-[0-9]* 2>/dev/null | sed 's|.*/|| ; s|'$META_SUFFIX'||'
fi
}
# remove all meta data for given package
db_zap_pkgv_meta() {
local p="$APKDB/$1"
local pgz="$p$META_SUFFIX"
[ -d "$p" ] && rm -rf "$p"
[ -f "$pgz" ] && rm -f "$pgz"
}
#find the package to which specified file belongs.
db_belongs() {
local pv f
# remove leading /
f=`beautify_path "${1#/}"`
db_all_installed | while read pv ; do
db_get_pkgv_meta $pv CONTENTS | grep "$f\$" >/dev/null && echo $pv
done
}