Last active
December 16, 2023 01:38
-
-
Save damphat/6214499 to your computer and use it in GitHub Desktop.
debian dependency tree
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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 |
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*
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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