Dependencies [was Re: bugs, bugs, bugs!]
Leonard den Ottolander
leonardjo at hetnet.nl
Wed Jul 30 07:54:30 UTC 2003
Hi Bill,
> There are oodles of tools to solve this problem (redhat-config-packages,
> up2date, yum, ....) Adding extraneous dependencies isn't a solution.
This sounds a bit like putting the cart before the horse. A large part of the
problems that people are having with dependencies would be solved if they
were able to query the package without requiring an rpmdb or another tool
and still get a list of packages to install instead of a list of cryptic library
names. (I am not arguing the file dependencies should be dropped.)
The overhead of adding the names of required packages to a package are
minimal. It is not very difficult to generate the requirements from the
existing requirements. The script below gives an indication of how this
could be solved. Or it just adds to the oodles ;).
Anyway, I don't see why we shouldn't use the possibility to specify both
files and package names if this makes life easier. Currently the mix of
file/library and package name dependencies is a mess anyway.
Bye,
Leonard.
$ cat dependencies
#!/bin/sh
# dependencies
# This script assembles requirement information for a package
# It assumes all dependencies for queried packages are satisfied
# This could/should be changed to use an rpmdb instead
#
# Leonard den Ottolander <leonardjo at hetnet.nl>, 2003-07-30
# TODO Add package file handling
# TODO Add rpmlib version handling
# ${PACK}_requires plain requirements (rpm -qR output)
# ${PACK}_requires_sorted sorted requirements (versioning removed)
# ${PACK}_requires_libs required library files (.so)
# ${PACK}_requires_libstemp temporary list of library packages
# ${PACK}_requires_libpacks sorted list of library packages
# ${PACK}_requires_execs executables in requirements (contain /)
# ${PACK}_requires_execstemp temporary list of executable packages
# ${PACK}_requires_execpacks sorted list of executable packages
# ${PACK}_requires_rest files other than library and execs
# ${PACK}_requires_restlibs specific for rpmlib (why isn't librpm used as a req?)
# ${PACK}_requires_restpacks
# ${PACK}_requires_packs package names in the original requirements
if [ "$1" == "" ]; then
# echo "Usage: $0 <package | package file>"
echo "Usage: $0 <package>"
exit
fi
PACK=$1
#rpm -qf "Package: %{NAME}-%{VERSION}-%{RELEASE}\n" -qR ${PACK} > ${PACK}_requires
rpm -qR ${PACK} > ${PACK}_requires
cat ${PACK}_requires | cut -f 1 -d \ | cut -f 1 -d \( | sort -u > ${PACK}_requires_sort
# .so is library (also catches absolute library paths)
# library search path: (absolute path) /lib /usr/lib . /etc/ld.so.conf
grep \.so ${PACK}_requires_sort > ${PACK}_requires_libs
echo -n '' > ${PACK}_requires_libstemp
for lib in $(cat ${PACK}_requires_libs); do
found=0
for path in /lib /usr/lib /usr/local/lib $(cat /etc/ld.so.conf) ; do
# maybe library files with explicit paths need special handling
# if so, just moving the procedure for files before this should suffice
if [ -e $path/$lib ]; then
if [ -f $path/$lib ]; then
found=1 # or inc and check if > 1 occurence
pack=$(rpm -q --whatprovides $path/$lib)
retval=$?
if [ $retval -eq 0 ]; then
echo $pack >> ${PACK}_requires_libstemp
else
if [ "$pack" == "$(echo $pack | grep not\ owned\ by\ any\ package)" ]; then
# echo PACKAGE NOT OWNED
# package not owned, follow symlink
# ls -l $path/$lib | cut -f 2 -d \> | cut -b 2-
tlib=$(ls -l $path/$lib | cut -f 2 -d \> | cut -b 2-)
pack=$(rpm -q --whatprovides $path/$tlib)
echo $pack >> ${PACK}_requires_libstemp
else
# don't know what to do
echo "error: $pack"
fi
fi
fi
fi
done
if [ $found -eq 0 ]; then
echo "$path/$lib: file not found"
fi
done
sort -u ${PACK}_requires_libstemp > ${PACK}_requires_libpacks
# executables contain /
# / should be first char, or are relative paths allowed?
grep / ${PACK}_requires_sort > ${PACK}_requires_execs
echo -n '' > ${PACK}_requires_execstemp
for file in $(cat ${PACK}_requires_execs) ; do
rpm -q --whatprovides $file >> ${PACK}_requires_execstemp
done
sort -u ${PACK}_requires_execstemp > ${PACK}_requires_execpacks
# no / or . is path nor file thus package name
grep -v / ${PACK}_requires_sort | grep -v "\." > ${PACK}_requires_rest
# specifically rpmlib (why is this used anyway?)
grep lib ${PACK}_requires_rest > ${PACK}_requires_restlibs
# how to handle rpmlib further?
# anything else is a package name
grep -v lib ${PACK}_requires_rest > ${PACK}_requires_packs
# Sort all requires
cat ${PACK}_requires_execpacks > ${PACK}_requires_alltemp
cat ${PACK}_requires_libpacks >> ${PACK}_requires_alltemp
sort -u ${PACK}_requires_alltemp > ${PACK}_requires_alltemp1
# Produce some output
rpm --queryformat "Package %{NAME}-%{VERSION}-%{RELEASE} Requires the following packages:\n" -q ${PACK}
#rpm -q ${PACK}
cat ${PACK}_requires_alltemp1 | rev | cut -f 2- -d \- | sed 's/-/ => /' | rev
echo
cat ${PACK}_requires_packs
--
How clean is a war when you shoot around nukelar waste?
Stop the use of depleted uranium ammo!
End all weapons of mass destruction.
More information about the fedora-test-list
mailing list