Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 Mar 2005 23:37:45 +0100
From:      "David J. Weller-Fahy" <dave-lists-freebsd-questions@weller-fahy.com>
To:        freebsd-questions@freebsd.org
Subject:   Re: Scripting oddness (sh)
Message-ID:  <20050323223723.GC75716@weller-fahy.com>
In-Reply-To: <4241EDB9.5000107@toldme.com>
References:  <20050323193626.GH7474@weller-fahy.com> <20050323193716.GI7474@weller-fahy.com> <4241EDB9.5000107@toldme.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--MfFXiAuoTsnnDAfZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

* Danny Howard <dannyman@toldme.com> [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 ]

--MfFXiAuoTsnnDAfZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="foo.txt"

#!/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

--MfFXiAuoTsnnDAfZ--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050323223723.GC75716>