summaryrefslogtreecommitdiff
path: root/findredundantdeps
blob: 95219775dd3c1bf6c88fa812b090a6ccd22096c7 (plain)
    1 #!/bin/sh
    2 # Find redundant dependencies
    3 # Johannes Winkelmann <jw at tks6 dot net>
    4 
    5 # $ cd /usr/ports/contrib
    6 # $ findredundantdeps *
    7 # $ findredundantdeps bmp
    8 
    9 
   10 usage()
   11 {
   12     echo "usage: ${0##*/} [-vfsh] <package>" >&2
   13     exit 1
   14 }
   15 
   16 find_deps()
   17 {
   18     if blaat=$(prt-get quickdep $1 2>/dev/null); then
   19 	result=${blaat%$1*}
   20 	if  [ -n "$result" ]; then
   21 	    echo "$result"
   22 	    return 0
   23 	else
   24 	    return 1
   25 	fi
   26     fi
   27 }
   28 
   29 get_directdeps()
   30 {
   31     prt-get info $1 | gawk '
   32     /^Dependencies:/ {  
   33         split($2,a,",")
   34         # remove duplicates
   35         for (i in a) b[a[i]]
   36         for (i in b) print i
   37     }'
   38 }
   39 
   40 sortvar()
   41 {
   42     for d in $*; do
   43 	echo $d
   44     done | sort -u
   45 }
   46 
   47 sortvar_d()
   48 {
   49     for d in $*; do
   50 	echo $d
   51     done | sort| uniq -d
   52 }
   53 
   54 sortvar_u()
   55 {
   56     for d in $*; do
   57 	echo $d
   58     done | sort| uniq -u
   59 }
   60 
   61 verbose=false
   62 fixit=false
   63 suggest=false
   64 
   65 while [ $# -gt 0 ]; do
   66     case $1 in
   67 	-v)
   68 	    shift
   69 	    verbose=true
   70 	    ;;
   71 	-f)
   72 	    shift
   73 	    fixit=true
   74 	    ;;
   75 	-s)
   76 	    shift
   77 	    suggest=true
   78 	    ;;
   79 	--*)
   80 	    echo "${0##*/} doesn't recognize -- gnu-longopts."
   81             usage
   82             exit 1
   83 	    ;;
   84 	-[a-zA-Z][a-zA-Z]*)
   85             # split concatenated single-letter options apart
   86             FIRST="$1"; shift
   87             set -- `echo "$FIRST" | sed 's/^-\(.\)\(.*\)/-\1 -\2/'` "$@"
   88             ;;
   89 	''|-*)
   90 	    usage
   91 	    ;;
   92 	*)
   93 	    break
   94 	    ;;
   95     esac
   96 done
   97 
   98 for package in $*; do
   99     if prt-get info $package >/dev/null; then
  100 	deps=$(find_deps $package)
  101 	unset subdeps
  102 	for d in $deps; do
  103 	    if dep=$(find_deps $d); then
  104 		subdeps="$subdeps $dep"
  105 		# 	else
  106 		# 	    echo "Ignoring unknown dependency '$d' for '$package'"
  107 	    fi
  108 	done
  109 	deps=$(sortvar $deps)
  110 	subdeps=$(sortvar $subdeps)
  111 
  112 	res=$(sortvar_d $deps $subdeps)
  113 	directdeps=$(get_directdeps $package)
  114 
  115 	redundant=$(sortvar_d $res $directdeps)
  116 	# tranform \n in ' '
  117 	set -- $redundant
  118 	redundant=$*
  119 
  120 	if [ -n "$redundant" ]; then
  121 	    right=$(sortvar_u $redundant $directdeps)
  122 	    set -- $right
  123 	    right=$*
  124 	    echo "Redundant deps for $package are: $redundant"
  125 	    if [ "$suggest" = true ]; then
  126 		echo "Right is: # Depends on: $right"
  127 	    fi
  128 	    if [ "$fixit" = true ]; then
  129 		Pkgfile="$(prt-get info $package|awk '/Path:/ {print $2}')/$package/Pkgfile"
  130 		cp $Pkgfile ${Pkgfile}.orig
  131 		sed -i "s|^#.*Depends on:.*|# Depends on: $right|" $Pkgfile
  132 		echo " * Fixed $package"
  133 	    fi
  134 	else
  135 	    [ "$verbose" = true ] && echo " * $package is fine."
  136 	fi
  137     fi
  138 done

Generated by cgit