From bsam@bsam.ru  Mon Sep  5 14:50:37 2005
Return-Path: <bsam@bsam.ru>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 24F6816A41F
	for <FreeBSD-gnats-submit@freebsd.org>; Mon,  5 Sep 2005 14:50:37 +0000 (GMT)
	(envelope-from bsam@bsam.ru)
Received: from bsam.ru (gw.ipt.ru [80.253.10.66])
	by mx1.FreeBSD.org (Postfix) with ESMTP id B3E1A43D49
	for <FreeBSD-gnats-submit@freebsd.org>; Mon,  5 Sep 2005 14:50:35 +0000 (GMT)
	(envelope-from bsam@bsam.ru)
Received: from bsam by bsam.ru with local (Exim 4.30; FreeBSD)
	id 1ECIKV-0009UR-KR
	for FreeBSD-gnats-submit@freebsd.org; Mon, 05 Sep 2005 18:52:15 +0400
Message-Id: <E1ECIKV-0009UR-KR@bsam.ru>
Date: Mon, 05 Sep 2005 18:52:15 +0400
From: Boris B. Samorodov <bsam@ipt.ru>
Sender: "Boris B. Samorodov" <bsam@bsam.ru>
Reply-To: Boris B. Samorodov <bsam@ipt.ru>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [patch] Tools/portbuild/scripts/buildscript to delete packages by dependencies
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         85746
>Category:       ports
>Synopsis:       [patch] Tools/portbuild/scripts/buildscript to delete packages by dependencies
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    kris
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          update
>Submitter-Id:   current-users
>Arrival-Date:   Mon Sep 05 15:00:32 GMT 2005
>Closed-Date:    Wed Feb 15 08:39:22 GMT 2006
>Last-Modified:  Wed Feb 15 08:39:22 GMT 2006
>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@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:
Responsible-Changed-From-To: freebsd-ports-bugs->portmgr 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Mon Sep 5 17:43:53 GMT 2005 
Responsible-Changed-Why:  
For portmgr review. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=85746 
Responsible-Changed-From-To: portmgr->kris 
Responsible-Changed-By: kris 
Responsible-Changed-When: Fri Oct 21 00:02:33 GMT 2005 
Responsible-Changed-Why:  
I'll take this since I work on the scripts 

http://www.freebsd.org/cgi/query-pr.cgi?pr=85746 
State-Changed-From-To: open->closed 
State-Changed-By: kris 
State-Changed-When: Wed Feb 15 08:38:35 UTC 2006 
State-Changed-Why:  
I committed a change based on this patch (but there were 
problems with your patch as submitted).  Thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=85746 
>Unformatted:
