]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blob - wwwbin/rpmcheck.sh
- script to show local rpmdb vs PLD-update-TODO upgrade difference
[projects/pld-ftp-admin.git] / wwwbin / rpmcheck.sh
1 #!/bin/sh
2 # check for packages on local system with PLD-doc/PLD-update-TODO
3 # Author: Elan Ruusamäe <glen@pld-linux.org>
4 # Date: 2012-04-05
5
6 export LC_ALL=C
7 CVSROOT=:pserver:cvs@cvs.pld-linux.org:/cvsroot
8 d=$-
9
10 orphaned_pkgs() {
11         set -$d
12         [ -s $t/pkgs.desc ] || /usr/bin/poldek --skip-installed "$@" --cmd "desc *" > $t/pkgs.desc
13         [ -s $t/pkgs.lst ] || sed -n 's/^Source package: \(.*\)-[^-]\+-[^-]\+$/\1/p' $t/pkgs.desc | sort -u > $t/pkgs.lst
14         # {w32codec,acroread,...}-installer pkgs
15         sed -i -e 's,-installer$,,' $t/pkgs.lst
16         for pkg in $(cat $t/pkgs.lst); do
17                 # use awk to match package without any regexp fuzz
18                 awk -vpkg=$pkg.spec -vm=1 '$1 == pkg{m=0} END{exit m}' $t/cvs.lst || echo Obsolete: $pkg
19         done
20 }
21
22 # generate list of .specs on ftp. needs cvsnt client
23 cvs_pkgs() {
24         set -$d
25         [ -s $t/cvs.raw ] || cvs -d $CVSROOT -Q ls -e packages > $t/cvs.raw 2>/dev/null
26         [ -s $t/cvs.dirs ] || awk -F/ '$1 == "D" { print $2 } ' $t/cvs.raw > $t/cvs.dirs
27         [ -s $t/cvs.specs ] || {
28                 while read pkg; do
29                         cvs -d $CVSROOT -Q ls -e packages/$pkg/$pkg.spec 2>/dev/null
30                 done < $t/cvs.dirs > $t/cvs.lst.tmp && mv $t/cvs.lst.tmp $t/cvs.specs
31         }
32         [ -s $t/cvs.lst ] || awk -F/ '$1 == "" { print $2 } ' $t/cvs.specs > $t/cvs.lst
33 }
34
35 # generate list of package basenames from rpmdb
36 rpm_pkgs() {
37         set -$d
38
39         [ -s $t/rpm.db ] || rpm -qa --qf '%{SOURCERPM} %{VERSION}\n' > $t/rpm.db
40
41         # translate pkg names to basenames
42         [ -s $t/rpm.basenames ] || sed -re 's,^(.+)-[^-]+-[^-]+ ,\1 ,' $t/rpm.db > $t/rpm.basenames
43         # uniq
44         [ -s $t/rpm.lst ] || sort -u $t/rpm.basenames > $t/rpm.lst
45 }
46
47 # fetch PLD-update-TODO
48 cvs_todo() {
49         set -$d
50
51         [ -s $t/PLD-doc/PLD-update-TODO ] || {
52                 cd $t
53                 cvs -d $CVSROOT -Q co PLD-doc/PLD-update-TODO
54                 cd -
55         }
56
57         # reformat for easier parsing
58         # amaya(13) [OLD] 9.54 [NEW] 11.0
59         # vim [OLD] 7.3.401 [NEW] 7.3.515
60         [ -s $t/rpm.todo ] || sed -rne 's,^([^( ]+).*?\[NEW\] (.+)$,\1 \2,p' $t/PLD-doc/PLD-update-TODO > $t/rpm.todo
61
62         # TODO: should uniq as well:
63         # $ grep links2 PLD-doc/PLD-update-TODO 
64         # links2(22) [OLD] 2.2 [NEW] 2.6
65         # links2(25) [OLD] 2.1pre28 [NEW] 2.6
66 }
67
68 rpm_diff() {
69 #       set -$d
70
71         rpm_pkgs
72         cvs_todo
73
74         [ -s $t/rpm.diffs ] || {
75                 set +e
76                 while read pkg v2; do
77                         v1=$(awk -vpkg=$pkg '$1 == pkg {print $2}' $t/rpm.lst)
78                         [ "$v1" ] || continue
79
80                         cmp=$(rpmvercmp $v1 $v2)
81                         if [ $? -eq 2 ]; then
82                                 echo "$pkg $cmp"
83                         fi
84                 done < $t/rpm.todo
85                 set -e
86         }
87 }
88
89 set -e
90 t=$(mktemp -d)
91 #t=.
92
93 rpm_diff
94
95 rm -rf $t
This page took 0.028197 seconds and 3 git commands to generate.