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
|