Skip to content

Instantly share code, notes, and snippets.

@bdrewery
Created August 17, 2012 01:04
Show Gist options
  • Save bdrewery/3375001 to your computer and use it in GitHub Desktop.
Save bdrewery/3375001 to your computer and use it in GitHub Desktop.
pkgng tree view script for FreeBSD
#! /bin/sh
# Copyright (c) 2012 Bryan Drewery <bryan@shatow.net>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer
# in this position and unchanged.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
show_tree() {
local name=$1
local indentation=$2
local parent=$3
if [ $RECURSIVE -eq 0 -a $indentation -gt 1 ]; then
return
fi
if [ $indentation -eq 0 ]; then
parent="${name}"
else
parent="${parent}% ${name}"
fi
echo ${parent}
for depends in $(pkg ${PKG_QUERY} ${PKG_QUERY_DISPLAY_DEPENDS} ${name} | sort); do
test -z "${depends}" && return
show_tree $depends $((${indentation} + 1)) ${parent}
done
}
usage() {
echo "Usage: $0 [-nprR] [pkgname|origin] [...]"
echo "-n: Non-tree view, uses tabs instead"
echo "-p: Print package names"
echo "-r: Recursively show required packages"
echo "-R: Use remote repository"
echo "-U: Show reverse depends"
echo "If no package/origin is specified, show all non-automatic packages at top-level."
exit 0
}
while getopts "hnprRU" opt; do
case "${opt}" in
n)
TREE_VIEW=0
;;
p)
DISPLAY_PKG=1
;;
r)
RECURSIVE=1
;;
R)
USE_RQUERY=1
;;
U)
REVERSE_DEPENDS=1
;;
*)
usage
;;
esac
done
shift $(($OPTIND - 1))
: ${RECURSIVE:=0}
: ${REVERSE_DEPENDS:=0}
: ${TREE_VIEW:=1}
: ${USE_RQUERY:=0}
: ${DISPLAY_PKG:=0}
if [ $REVERSE_DEPENDS -eq 0 ]; then
PKG_QUERY_DEPENDS="d"
else
PKG_QUERY_DEPENDS="r"
fi
if [ $DISPLAY_PKG -eq 1 ]; then
PKG_QUERY_DISPLAY="%n-%v"
PKG_QUERY_DISPLAY_DEPENDS="%${PKG_QUERY_DEPENDS}n-%${PKG_QUERY_DEPENDS}v"
else
PKG_QUERY_DISPLAY="%o"
PKG_QUERY_DISPLAY_DEPENDS="%${PKG_QUERY_DEPENDS}o"
fi
if [ $USE_RQUERY -eq 0 ]; then
PKG_QUERY=query
else
PKG_QUERY=rquery
fi
main() {
if [ $# -eq 0 ]; then
if [ $USE_RQUERY -eq 0 ]; then
packages=$(pkg ${PKG_QUERY} -e '%a = 0' ${PKG_QUERY_DISPLAY} | sort)
else
packages=$(pkg ${PKG_QUERY} ${PKG_QUERY_DISPLAY} | sort)
fi
else
packages=$@
fi;
for name in ${packages}; do
show_tree ${name} 0
done
}
if [ $TREE_VIEW -eq 1 ]; then
main $@ | sed -e 's/[^%]*%/| /g' -e 's/| \([^|]\)/`--\1/g'
else
main $@ | sed -e 's/[^%]*%/ /g'
fi
@bdrewery
Copy link
Author

devel/git
`-- www/apache22
|  `-- devel/apr1
|  |  `-- databases/db42
|  |  `-- textproc/expat2
|  |  `-- databases/gdbm
|  |  `-- converters/libiconv
|  `-- databases/db42
|  `-- textproc/expat2
|  `-- databases/gdbm
|  `-- converters/libiconv
|  `-- security/openssl
|  `-- devel/pcre
|  `-- lang/perl5.12
`-- devel/apr1
|  `-- databases/db42
|  `-- textproc/expat2
|  `-- databases/gdbm
|  `-- converters/libiconv
`-- security/ca_root_nss
...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment