#!/bin/sh # Find redundant dependencies # Johannes Winkelmann # $ cd /usr/ports/contrib # $ findredundantdeps * # $ findredundantdeps bmp usage() { echo "usage: ${0##*/} [-vfsh] " >&2 exit 1 } find_deps() { if blaat=$(prt-get quickdep $1 2>/dev/null); then result=${blaat%$1*} if [ -n "$result" ]; then echo "$result" return 0 else return 1 fi fi } get_directdeps() { prt-get info $1 | gawk ' /^Dependencies:/ { split($2,a,",") # remove duplicates for (i in a) b[a[i]] for (i in b) print i }' } sortvar() { for d in $*; do echo $d done | sort -u } sortvar_d() { for d in $*; do echo $d done | sort| uniq -d } sortvar_u() { for d in $*; do echo $d done | sort| uniq -u } verbose=false fixit=false suggest=false while [ $# -gt 0 ]; do case $1 in -v) shift verbose=true ;; -f) shift fixit=true ;; -s) shift suggest=true ;; --*) echo "${0##*/} doesn't recognize -- gnu-longopts." usage exit 1 ;; -[a-zA-Z][a-zA-Z]*) # split concatenated single-letter options apart FIRST="$1"; shift set -- `echo "$FIRST" | sed 's/^-\(.\)\(.*\)/-\1 -\2/'` "$@" ;; ''|-*) usage ;; *) break ;; esac done for package in $*; do if prt-get info $package >/dev/null; then deps=$(find_deps $package) unset subdeps for d in $deps; do if dep=$(find_deps $d); then subdeps="$subdeps $dep" # else # echo "Ignoring unknown dependency '$d' for '$package'" fi done deps=$(sortvar $deps) subdeps=$(sortvar $subdeps) res=$(sortvar_d $deps $subdeps) directdeps=$(get_directdeps $package) redundant=$(sortvar_d $res $directdeps) # tranform \n in ' ' set -- $redundant redundant=$* if [ -n "$redundant" ]; then right=$(sortvar_u $redundant $directdeps) set -- $right right=$* echo "Redundant deps for $package are: $redundant" if [ "$suggest" = true ]; then echo "Right is: # Depends on: $right" fi if [ "$fixit" = true ]; then Pkgfile="$(prt-get info $package|awk '/Path:/ {print $2}')/$package/Pkgfile" cp $Pkgfile ${Pkgfile}.orig sed -i "s|^#.*Depends on:.*|# Depends on: $right|" $Pkgfile echo " * Fixed $package" fi else [ "$verbose" = true ] && echo " * $package is fine." fi fi done