This sounds very similar to a patch I wrote for pkg_delete some time back. The new added -r option seems to offer the same functionality you are proposing here.
In case this is useful for you somehow, I wrote a complete page about it: http://users.cis.fiu.edu/~lusec001/moin.cgi/Software/OBSD_Recursive_pkg_del Hope this helps someone, Luis On Sun, Dec 27, 2009 at 7:25 PM, Andris <[email protected]> wrote: > pkg_clean helps to delete Lola packages. > > A package is said to be Lola only if: > > 1. It's unneeded by other packages. > 2. It's unwanted by the root user. > > If a package that was deleted needed _now_ Lola packages, pkg_clean > will also help deleting them. This is usual when a package uses > libraries unneeded by other packages. Each run request a list of > unneeded packages to pkg_info -t. After each iteration of unwanted > packages of that list, pkg_info -t is called again, and the whole > process starts again. So it's usual to see a run that goes: A-Z, then > M, A, X, B, etc., where each letter is the first letter of a package > name. > > pkg_clean asks the user if he/she wants to delete each Lola package. > For example: > > -- > > Delete amsn-0.97.2p1? (l, n, YES): [n] > > l: > list package files > > n: > don't delete the package, add it to the exception list instead > > YES: > delete the package > > -- > > pkg_clean writes its exception list to /etc/pkg_clean.conf. If the > name of the utility is changed, so will change the name of this file. > > The exception list can be cleared by calling: pkg_clean -c. This also > starts pkg_clean in interactive mode. > > The exception list won't be useful if a package is updated, since it > has the package name, including its version. I haven't added a feature > to be able to treat an updated package just as an non-updated package, > so pkg_clean will ask for each package-1.0, package-1.0p0, > package-1.0p1. This is mainly because packages-specs(7) does not rule > out the possibility that a version from upstream can't match > p[[:digit:]]+$. > > -- > > Please feel free to report any bug, or request any feature. Any > comment of the shell script itself is well received. Even if I could > manage to write it, doesn't hurt to know whenever something could be > written in a better way. Better if any change would me it eligible to > be part of base :P > > -- > > In case you remember, this are the previous versions of the tool: > > http://article.gmane.org/gmane.os.openbsd.misc/105917 > http://article.gmane.org/gmane.os.openbsd.misc/105964 > http://article.gmane.org/gmane.os.openbsd.misc/106012 > > None of them is now supported. > > -- > > #!/bin/sh > > # Copyright 2006, 2007, 2008, 2009 Andris Delfino <[email protected]> > > # Permission to use, copy, modify, and distribute this software for any > # purpose with or without fee is hereby granted, provided that the above > # copyright notice and this permission notice appear in all copies. > > # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES > # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR > # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > > util_name="${0##*/}" > conf_pathname="/etc/${util_name}.conf" > > clean_conf=0 > show_usage=0 > > while getopts ':c' ch; do > case "${ch}" in > (c) > clean_conf=1 > ;; > (*) > show_usage=1 > > break > # NOTREACHED > ;; > esac > done > > if [ "${show_usage}" -eq 1 ]; then > printf 'usage: %s [-ch]\n' "${util_name}" >&2 > > exit 1 > fi > > if ! [ `id -u` -eq 0 ]; then > printf '%s must be run as root\n' "${util_name}" >&2 > > exit 2 > fi > > if ! [ -e "${conf_pathname}" ] || [ "${clean_conf}" -eq 1 ]; then > printf '' > "${conf_pathname}" > fi > > while true; do > # Note: this does't work flawlessly, some ports are identified by > their version (autoconf, python) > # packages=`pkg_info -At | cut -d ' ' -f 1 | sed 's/-[^-]\{1,\}$//' | > grep -f "${conf_pathname}" -vx` > > # Note: this doesn't work flawlessly either, since package updates > will render the exception list useless > packages=`pkg_info -At | cut -d ' ' -f 1 | grep -f "${conf_pathname}" -vx` > > if [ -z "${packages}" ]; then > printf '%s: no unwanted packages to delete\n' "${util_name}" >&2 > > break > fi > > for package in $packages; do > while true; do > printf 'Delete %s? (l, n, YES): [n] ' "${package}" >&2 > > read > > case "${REPLY}" in > (l) > pkg_info -Lq "${package}" | less > ;; > (n | '') > printf '%s\n' "${package}" >> "${conf_pathname}" > > break > ;; > (YES) > pkg_delete -ix "${package}" > > break > ;; > (*) > # NOTREACHED > ;; > esac > done > done > done > > exit 0 > > -- > > Greetings. > > > > Poscript: Lola is my dog's name. Didn't find any correct term, sorry.

