* Danny Howard <[EMAIL PROTECTED]> [2005-03-23 23:29 +0100]:
> Bonus points if you inline the relevant portion, or at least name your
> attachment something like foo.sh.

And, as pointed out - apparently that didn't work either.

Here's the relevant portion of the script (I'll include only the
function that seems to be causing the trouble):

#v+
list_not_required_by()
{
        PKGLIST=""

        for PKG in $@ ; do
                if [ -s $PKGDB/$PKG/+REQUIRED_BY ] ; then
                        # grab list of packages this package is required by
                        RB_LIST=`cat $PKGDB/$PKG/+REQUIRED_BY`
                        RB_TEMP=$RB_LIST
                        for RB in $RB_LIST ; do
                                for RM_PKG in $@ ; do
                                        if [ "$RB" = "$RM_PKG" ] ; then
                                                RB_TEMP=`echo $RB_TEMP | sed 
"s/$RM_PKG[^ ]*//g"`
                                                break
                                        fi
                                done
                        done
                        [ -z "$RB_TEMP" ] && PKGLIST="$PKGLIST $PKG"
                else
                        PKGLIST="$PKGLIST $PKG"
                fi
        done
#       true
}
#v-

The line consisting of '#       true' seems to be the clincher, as
mentioned in the previous email.  I'm also attaching the rm_leaf.sh file
renamed to foo.txt.

Thanks for the hint, Danny.

Regards,
-- 
dave [ please don't CC me ]
#!/bin/sh
# $HOME/bin/remove_leaves.sh
set -e

set_variables()
{
        LETC="/usr/local/etc"
        PBASE="/usr/ports"
        PKGDB="/var/db/pkg"
        RMLFCNF="rm_leaf.conf"
        # get a list of packages not to touch
        NOTLIST=`cat $LETC/$RMLFCNF`
        # get list of packages from FreeBSD's packages database
        PKGLIST=`cd $PKGDB && find . -type d | sed '/^.$/d;s/^\.\///'`
}

cut_keepers()
{
        for PKG in $@ ; do
                # remove any packages that are in the parameter list
                PKGLIST=`echo $PKGLIST | sed "s/$PKG[^ ]*//g"`
        done
}

list_not_required_by()
{
        # In this function, we need to create a list of all those packages that 
are:
        # 1. Not required by any other package
        # 2. Required by a package that is being removed - this would be easier
        #    using C or something where I could use an array of char[], or
        #    using the database access methods in portmanagers library, but I'm
        #    hashing it out in sh first (then I'll convert).
        # So, first things first, we'll use the PKGLIST as a starting point.
        # PKGLIST will be the working list of removable packages (since we
        # passed as a parameter, we don't need to preserve it).

        # wipe out PKGLIST, we don't need it
        PKGLIST=""

        for PKG in $@ ; do
                if [ -s $PKGDB/$PKG/+REQUIRED_BY ] ; then
                        # grab list of packages this package is required by
                        RB_LIST=`cat $PKGDB/$PKG/+REQUIRED_BY`
                        RB_TEMP=$RB_LIST
                        for RB in $RB_LIST ; do
                                for RM_PKG in $@ ; do
                                        if [ "$RB" = "$RM_PKG" ] ; then
                                                RB_TEMP=`echo $RB_TEMP | sed 
"s/$RM_PKG[^ ]*//g"`
                                                break
                                        fi
                                done
                        done
                        [ -z "$RB_TEMP" ] && PKGLIST="$PKGLIST $PKG"
                else
                        PKGLIST="$PKGLIST $PKG"
                fi
        done
#       true
}

create_rm_list()
{
        # match up packages to origin in the ports tree
        for PKG in $@ ; do
                RMLIST="${RMLIST:-} $PKG:$PBASE/`pkg_info -o $( echo $PKG ) | 
sed -n '/^Origin:$/{n;p;}'`"
        done
}

set_variables
cut_keepers $NOTLIST
list_not_required_by $PKGLIST

[ -z "$PKGLIST" ] && echo "No packages/ports to remove." && exit

create_rm_list $PKGLIST

echo "#!/bin/sh"
echo "# script to remove all leaf packages not listed in $LETC/rm_leaf.conf"
echo "set -e" ; echo
for PKG in $RMLIST ; do
        PNAME=`echo $PKG | sed 's/:.*$//'`
        PPATH=`echo $PKG | sed 's/^[^:]*://'`
        echo "echo \"Removing $PNAME in $PPATH:\""
        echo "cd $PPATH"
        echo "make deinstall clean distclean"
        echo "echo \"Success!\" ; echo"
        echo
done
_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to