ports/85746: [patch] Tools/portbuild/scripts/buildscript to delete packages by dependencies
Boris B. Samorodov
bsam at ipt.ru
Mon Sep 5 15:00:36 UTC 2005
>Number: 85746
>Category: ports
>Synopsis: [patch] Tools/portbuild/scripts/buildscript to delete packages by dependencies
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: update
>Submitter-Id: current-users
>Arrival-Date: Mon Sep 05 15:00:32 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator: Boris B. Samorodov
>Release: FreeBSD 5.4-RELEASE-p1 i386
>Organization:
InPharmTech, Co.
>Environment:
System: FreeBSD srv.sem.ipt.ru 5.4-RELEASE-p1 FreeBSD 5.4-RELEASE-p1 #0: Fri May 27 13:22:04 MSD 2005 bsam at srv.sem.ipt.ru:/usr/obj/usr/src/sys/SRV i386
>Description:
Current Tools (portbuild/scripts/buildscript) when testing delete
all packages without looking for dependencies. The patch make
deletion with respect to dependencies. Each interation deletes
only packages that don't have dependent ones.
Assume that we have installed foo and bar ports,
foo depends on bar _and_ foo uses the same directory structure
(ie local/bar/foo). Then if we del_pkg bar, then del_pkg foo,
file system state will not be clean:
- bar knows about local/bar file system;
- foo knows about local/bar/foo file system;
- removing bar leaves local/bar/foo;
- removing foo deletes only local/bar/foo directory.
Fix: remove foo and then bar to get a clean file system.
>How-To-Repeat:
>Fix:
1. $recursion is used to flag existence of packages with
dependencies. $recursion=0 meens there is no need to iterate
once more.
2. $base adds to $delpkg only for those packages without pedendencies.
We check it by running "pkg_info $base | grep Required".
3. $dellist is a list with deleted packages. In order to overcome
endless recursion caused by any errors when new $delpkg is equal
to $dellist we stop the process and print a warning to log.
The system becomes a little bit noisy because of recursion but
imho it has a more reliable results.
--- buildscript.patch begins here ---
--- buildscript.orig Mon Sep 5 14:59:49 2005
+++ buildscript Mon Sep 5 17:46:17 2005
@@ -52,22 +52,40 @@
cd /tmp/depends
export PKG_PATH=/tmp/depends
if [ ! -z "${pkgs}" ]; then
- unset delpkg
- for i in $pkgs; do
- base=$(basename $i .tgz)
- base=$(basename $base .tbz)
- if ! pkg_info -q -e $base; then
- echo "skipping $base, already deleted"
- else
- delpkg="${base} ${delpkg}"
+ recursion=1
+ dellist=""
+ while [ $recursion -eq 1 ]; do
+ unset delpkg
+ recursion=0
+ for i in $pkgs; do
+ base=$(basename $i .tgz)
+ base=$(basename $base .tbz)
+ if ! pkg_info -q -e $base; then
+ echo "skipping $base, already deleted"
+ else
+ if (pkg_info $base | grep Required > /dev/null 2>&1); then
+ echo "skipping $base, packages found required by current"
+ recursion=1
+ else
+ delpkg="${base} ${delpkg}"
+ fi
+ fi
+ done
+ if [ "$dellist" = "$delpkg" ]; then
+ echo "deleted list =\""$dellist"\", packages to delete ="\"$delpkg\"
+ echo "error in pkg_delete, exiting"
+ echo "1" > /tmp/status
+ exit 1
+ else
+ echo "Deleting $delpkg"
+ if ! (echo ${delpkg} | xargs pkg_delete -f); then
+ echo "error in pkg_delete, exiting"
+ echo "1" > /tmp/status
+ exit 1
+ fi
+ dellist=$delpkg
fi
done
- echo "Deleting $delpkg"
- if ! (echo ${delpkg} | xargs pkg_delete -f); then
- echo "error in pkg_delete, exiting"
- echo "1" > /tmp/status
- exit 1
- fi
fi
}
--- buildscript.patch ends here ---
WBR
--
bsam
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list