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