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.

Reply via email to