-
-
Save damphat/6214499 to your computer and use it in GitHub Desktop.
#! /bin/bash | |
# Description: show dependency tree | |
# Author: damphat | |
if [ $# != 1 ]; then | |
echo 'Usage: apt-rdepends-tree <package>' | |
echo 'Required packages: apt-rdepends' | |
exit 1 | |
fi | |
# tree template | |
T1=" ├─" | |
T2=" │ ├─" | |
T3=" │ └─" | |
# tree template for last node | |
T4=" └─" | |
T5=" ├─" | |
T6=" └─" | |
# mark '1' for parent node, '2' for child node | |
TEXT="$(apt-rdepends $1 | sed -e 's/^/1 /' -e 's/.*: /2 /'; echo '-')" | |
TOTAL=$(echo "$TEXT" | grep '^1' | wc -l) # total parent | |
COUNT=0 | |
echo "$TEXT" | while read line; do | |
tmp=$last | |
[ "${line:0:1}" != "${last:0:1}" ] && tmp=$(echo $last | sed -e 's/^2/3/') | |
[ "${tmp:0:1}" == "1" ] && ((COUNT++)) | |
if [ "$TOTAL" != "$COUNT" ]; then | |
echo $tmp | sed -e "s/^1/$T1/" -e "s/^2/$T2/" -e "s/^3/$T3/" | |
else | |
echo $tmp | sed -e "s/^1/$T4/" -e "s/^2/$T5/" -e "s/^3/$T6/" | |
fi | |
last=$line | |
done |
I only added the -r option:
this is fantastic! Exactly what I was looking for, thanks a ton :D
+1 very nice! Thanks for writing this and posting on SO!
Would be nice to have an option to suppress (filter out) dependencies which are already listed above, e.g.
├─ libexpat1
│ └─ libc6 (>= 2.4)
└─ libpcre2-8-0
└─ libc6 (>= 2.4)
turns into:
├─ libexpat1
│ └─ libc6 (>= 2.4)
└─ libpcre2-8-0
If I understand well, actually we only get the tree up to depth 2. It would be cool to get it up to any arbitrary depth.
If I understand well, actually we only get the tree up to depth 2. It would be cool to get it up to any arbitrary depth.
That limitation stems from apt-rdepends
output format, as unfortunately it does not nest packages but rather shows each dependency as a top-level package. Fixing this would be non-trivial for such a simple (but amazing) bash script
What an amazing script!
Inspired by this I've created apt-tree, featuring:
- Arbitrary depth, as suggested by @completementgaga , taking care to handle circular dependencies (yes, they exist! See
libc6
) - Suppress duplicate sub-trees, as suggested by @dmak . Packages already printed are marked with
*
- Pass through options to
apt-rdepends
, to allow-r|--reverse
as requested by @willemw12 (among many other possibilities) - Full command-line argument parsing, including
--help
A small example:
$ apt-tree p7zip-full
Reading package lists... Done
Building dependency tree
Reading state information... Done
p7zip-full
├─ libc6
│ ╰─ libgcc1
│ ├─ gcc-8-base
│ ╰─ libc6*
├─ libgcc1*
├─ libstdc++6
│ ├─ gcc-8-base*
│ ├─ libc6*
│ ╰─ libgcc1*
╰─ p7zip
├─ libc6*
├─ libgcc1*
╰─ libstdc++6*
If you allow for more apt-rdepends options (for example, ' apt-rdepends "$@" '), then you can also, for example, display a reverse dependency tree (' apt-rdepends-tree -r ').