Implement a very basic routine to check minimal required dependency.

It's a very basic routine in shell+sed that checks if the installed
package version is greater than the one required. It works by removing
all stuff that is not a digit from $version, and comparing with
-gt or -eq to the required version.

It's not optimal and will give errors, but for now seems to work.

--HG--
extra : convert_revision : 5773180344f6759d0992a837f02608fe61603664
This commit is contained in:
Juan RP 2008-10-05 21:23:39 +02:00
parent 15f4d9b5dd
commit d36db715e5
1 changed files with 49 additions and 25 deletions

View File

@ -29,6 +29,9 @@
#- #-
# #
# TODO # TODO
# - Implement a routine that checks if installed version is sufficient
# to satisfy the required dependency... right now it's very prone
# to errors and slow.
# - Multiple distfiles in a package. # - Multiple distfiles in a package.
# - Multiple URLs to download source distribution files. # - Multiple URLs to download source distribution files.
# - Support adding filters to templates to avoid creating useless links. # - Support adding filters to templates to avoid creating useless links.
@ -37,7 +40,6 @@
# via the environment or command line. # via the environment or command line.
# #
: ${PKGFS_CONFIG_FILE:=/usr/local/etc/pkgfs.conf} : ${PKGFS_CONFIG_FILE:=/usr/local/etc/pkgfs.conf}
: ${PKGFS_REGISTERED_PKG_DB:=.pkgfs-registered-pkgfs.db}
: ${progname:=$(basename $0)} : ${progname:=$(basename $0)}
: ${topdir:=$(/bin/pwd -P 2>/dev/null)} : ${topdir:=$(/bin/pwd -P 2>/dev/null)}
@ -71,6 +73,7 @@ set_defvars()
: ${PKGFS_DEPSDIR:=$PKGFS_DISTRIBUTIONDIR/dependencies} : ${PKGFS_DEPSDIR:=$PKGFS_DISTRIBUTIONDIR/dependencies}
: ${PKGFS_BUILD_DEPS_DB:=$PKGFS_DEPSDIR/build-depends.db} : ${PKGFS_BUILD_DEPS_DB:=$PKGFS_DEPSDIR/build-depends.db}
: ${PKGFS_TMPLHELPDIR:=$PKGFS_DISTRIBUTIONDIR/helper-templates} : ${PKGFS_TMPLHELPDIR:=$PKGFS_DISTRIBUTIONDIR/helper-templates}
: ${PKGFS_REGPKG_DB:=$PKGFS_DESTDIR/.pkgfs-registered-pkgs.db}
local DDIRS="PKGFS_DEPSDIR PKGFS_TEMPLATESDIR PKGFS_TMPLHELPDIR" local DDIRS="PKGFS_DEPSDIR PKGFS_TEMPLATESDIR PKGFS_TMPLHELPDIR"
for i in ${DDIRS}; do for i in ${DDIRS}; do
@ -732,7 +735,7 @@ stow_tmpl()
xstow_args="$real_xstowargs" xstow_args="$real_xstowargs"
installed_tmpl_handler register $pkg installed_tmpl_handler register $pkgname $version
# #
# Run template postinstall helpers if requested. # Run template postinstall helpers if requested.
@ -777,7 +780,7 @@ unstow_tmpl()
echo "==> Removed \`$pkg' symlinks from master directory." echo "==> Removed \`$pkg' symlinks from master directory."
fi fi
installed_tmpl_handler unregister $pkgname-$version installed_tmpl_handler unregister $pkgname $version
} }
# #
@ -787,7 +790,6 @@ unstow_tmpl()
add_dependency_tolist() add_dependency_tolist()
{ {
local curpkg="$1" local curpkg="$1"
local reg_pkgdb="$PKGFS_DESTDIR/$PKGFS_REGISTERED_PKG_DB"
[ -z "$curpkg" ] && return 1 [ -z "$curpkg" ] && return 1
[ -n "$prev_pkg" ] && curpkg=$prev_pkg [ -n "$prev_pkg" ] && curpkg=$prev_pkg
@ -796,8 +798,8 @@ add_dependency_tolist()
# #
# Check if dep already installed. # Check if dep already installed.
# #
if [ -r "$reg_pkgdb" ]; then if [ -r "$PKGFS_REGPKG_DB" ]; then
check_installed_tmpl $i check_installed_tmpl $i ${i##[aA-zZ]*-}
# #
# If dep is already installed, put it on the # If dep is already installed, put it on the
# installed deps list and continue. # installed deps list and continue.
@ -889,7 +891,8 @@ install_dependency_tmpl()
echo "==> Required dependencies for $(basename $pkg):" echo "==> Required dependencies for $(basename $pkg):"
for i in ${installed_deps_list}; do for i in ${installed_deps_list}; do
echo " $i: already installed." fpkg="$($db_cmd -O '-' btree $PKGFS_REGPKG_DB ${i%-[0-9]*})"
echo " $i: found $fpkg."
done done
for i in ${deps_list}; do for i in ${deps_list}; do
@ -934,18 +937,18 @@ installed_tmpl_handler()
{ {
local action="$1" local action="$1"
local pkg="$2" local pkg="$2"
local version="$3"
[ -z "$action" -o -z "$pkg" ] && return 1 [ -z "$action" -o -z "$pkg" -o -z "$version" ] && return 1
if [ "$action" = "register" ]; then if [ "$action" = "register" ]; then
$db_cmd -w btree $PKGFS_DESTDIR/$PKGFS_REGISTERED_PKG_DB \ $db_cmd -w btree $PKGFS_REGPKG_DB $pkg $version
$pkg stowned
if [ "$?" -ne 0 ]; then if [ "$?" -ne 0 ]; then
echo -n "*** ERROR: couldn't register stowned \`$pkg'" echo -n "*** ERROR: couldn't register stowned \`$pkg'"
echo " in db file ***" echo " in db file ***"
exit 1 exit 1
fi fi
elif [ "$action" = "unregister" ]; then elif [ "$action" = "unregister" ]; then
$db_cmd -d btree $PKGFS_DESTDIR/$PKGFS_REGISTERED_PKG_DB $pkg $db_cmd -d btree $PKGFS_REGPKG_DB $pkg
if [ "$?" -ne 0 ]; then if [ "$?" -ne 0 ]; then
echo -n "*** ERROR: \`$pkg' stowned not registered " echo -n "*** ERROR: \`$pkg' stowned not registered "
echo "in db file? ***" echo "in db file? ***"
@ -957,18 +960,43 @@ installed_tmpl_handler()
} }
# #
# Checks the registered pkgs db file and returns 0 if pkg is installed, # Checks the registered pkgs db file and returns 0 if a pkg that satisfies
# otherwise returns 1. # the minimal required version if there, or 1 otherwise.
# #
check_installed_tmpl() check_installed_tmpl()
{ {
local pkg="$1" local pkg="$1"
local db_file="$PKGFS_DESTDIR/$PKGFS_REGISTERED_PKG_DB" local reqver="$2"
local iver=
[ -z "$pkg" ] && return 1 [ -z "$pkg" -o -z "$reqver" ] && return 1
$db_cmd btree $db_file $pkg 2>&1 >/dev/null run_file $PKGFS_TEMPLATESDIR/${pkg%-[0-9]*}.tmpl
return $?
reqver="$(echo $reqver | $sed_cmd 's|\.||g;s|[aA-zZ]||g')"
$db_cmd -K btree $PKGFS_REGPKG_DB $pkgname 2>&1 >/dev/null
if [ "$?" -eq 0 ]; then
#
# Package is installed, let's check the version.
#
iver="$($db_cmd -V btree $PKGFS_REGPKG_DB $pkgname)"
if [ -n "$iver" ]; then
#
# As shell only supports decimal arith expressions,
# we simply remove anything except the numbers.
# It's not optimal and may fail, but it is enough
# for now.
#
iver="$(echo $iver | $sed_cmd 's|\.||g;s|[aA-zZ]||g')"
if [ "$iver" -eq "$reqver" \
-o "$iver" -gt "$reqver" ]; then
return 0
fi
fi
fi
return 1
} }
# #
@ -1060,19 +1088,15 @@ install_tmpl()
# #
list_tmpls() list_tmpls()
{ {
local reg_pkgdb="$PKGFS_DESTDIR/$PKGFS_REGISTERED_PKG_DB" if [ ! -r "$PKGFS_REGPKG_DB" ]; then
if [ ! -r "$reg_pkgdb" ]; then
echo "=> No packages registered or missing register db file." echo "=> No packages registered or missing register db file."
exit 0 exit 0
fi fi
for i in $($db_cmd btree $reg_pkgdb); do for i in $($db_cmd -K btree $PKGFS_REGPKG_DB); do
# Skip stowned value
[ "$i" = "stowned" ] && continue
# Run file to get short_desc and print something useful # Run file to get short_desc and print something useful
run_file ${PKGFS_TEMPLATESDIR}/${i%-[0-9]*}.tmpl run_file ${PKGFS_TEMPLATESDIR}/$i.tmpl
echo "$i $short_desc" echo "$i-$version $short_desc"
reset_tmpl_vars reset_tmpl_vars
done done
} }