[sisyphus] qa-pkgwatch-robot (was: I: Sisyphus-20050717 packages: +67 (4462))
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вс Июл 17 16:52:36 MSD 2005
On Sun, Jul 17, 2005 at 04:40:55PM +0400, Alexey M. Tourbin wrote:
> 67 UPDATED packages
Внимание, это письмо отражает не изменения в репозитарии, а изменения
в роботе. Теперь робот умеет распознавать дупы, и среди группы дупов
учитывается только пакет с самой большой версией (раньше учитывался
пакет, выбранный, грубо говоря, случайным образом; из-за этого некоторые
обновления-дупы не были в предыдущих отчетах, теперь это видно).
По моему нескромному мнению, этот скрипт является удачным примером
программирования на shell+perl: кое-что удобнее писать на шелле (comm+join),
а кое-что -- на перле (дамп + сортировка rpmevrcmp по вторичному ключу).
Теперь осталось только переделать lastchange(), чтобы не терялись
промежуточные changelog entries. Кто-нибудь знает, как изящнее всего
это сделать?
----------- следующая часть -----------
#!/bin/sh -ef
export LC_ALL=C
SRPMS=/raid/ALT/Sisyphus/files/SRPMS
dump()
{
local dir="$1"; shift
# we use perl because it's quite a lot faster
# using shell+rpm whould require >4000 fork+exec calls
perl -MRPM::Header -Mstrict - "$dir" <<'EOF'
my $dir = shift;
chdir $dir or die "$dir: $!";
my @rpms;
foreach my $f (<*.rpm>) {
tie my %hdr, "RPM::Header", $f or die "$f: $RPM::err";
my $SVR = "$hdr{VERSION}-$hdr{RELEASE}";
$SVR = "$hdr{SERIAL}:$SVR" if $hdr{SERIAL};
# the output format is: name SVR filename
push @rpms, [ $hdr{NAME}, $SVR, $f ];
}
die "$dir: no rpms" unless @rpms;
# sort order is: by name, ascending; by SVR, descending
@rpms = sort { $$a[0] cmp $$b[0] or 0+`rpmevrcmp $$b[1] $$a[1]` } @rpms;
# unique, by name
my %seen;
foreach my $rpm (@rpms) {
print join("\t", @$rpm), "\n" if not $seen{$$rpm[0]}++;
}
EOF
}
lines() { wc -l ${1+"$@"} |awk '{print$1}'; }
mtime() { stat --format $'%Y\n' ${1+"$@"}; }
mkdir -p pkgwatch
now="$(mtime "$SRPMS")"
dump "$SRPMS" >pkgwatch/srpms.new
total="$(lines pkgwatch/srpms.new)"
if [ ! -f pkgwatch/srpms.old ]; then
mv pkgwatch/srpms.new pkgwatch/srpms.old
echo "Initialized database ($total packages)."
exit 0
fi
comm -13 pkgwatch/srpms.old pkgwatch/srpms.new >pkgwatch/plus
comm -23 pkgwatch/srpms.old pkgwatch/srpms.new >pkgwatch/minus
join pkgwatch/minus pkgwatch/plus >pkgwatch/updated
join -v1 pkgwatch/minus pkgwatch/plus >pkgwatch/orphaned
join -v2 pkgwatch/minus pkgwatch/plus >pkgwatch/brandnew
[ -s pkgwatch/updated -o -s pkgwatch/orphaned -o -s pkgwatch/brandnew ] || exit 0
exec 4>pkgwatch/msg
subj="I: Sisyphus-$(date +%Y%m%d) packages:"
summary() { local f="$1"; shift; rpm -qp --qf '%{SUMMARY}\n' -- "$f"; }
lastchange() { local f="$1"; shift; rpm -qp --lastchange -- "$f" |sed -ne \
's/@\([[:alnum:]-]\+\)\.[[:alnum:]]\+>/@\1>/;/[[:alnum:]]/p'; }
if [ -s pkgwatch/brandnew ]; then
n="$(lines pkgwatch/brandnew)"
subj="$subj +$n!"
echo " $n BRAND NEW packages"; echo
while read name SVR f; do
echo -n "$name - "
summary "$SRPMS/$f"
lastchange "$SRPMS/$f"
echo
done <pkgwatch/brandnew
fi >&4
if [ -s pkgwatch/orphaned ]; then
n="$(lines pkgwatch/orphaned)"
subj="$subj -$n"
echo " $n ORPHANED/obsolete packages"; echo
while read name SVR f; do echo "$name $SVR"; done <pkgwatch/orphaned
echo
fi >&4
if [ -s pkgwatch/updated ]; then
n="$(lines pkgwatch/updated)"
subj="$subj +$n"
echo " $n UPDATED packages"; echo
while read name SVR2 f0 SVR4 f; do
echo -n "$name - "
summary "$SRPMS/$f"
echo "$SVR2 -> $SVR4"
lastchange "$SRPMS/$f"
echo
done <pkgwatch/updated
fi >&4
if [ "$now" -ne "$(mtime "$SRPMS")" ]; then
echo "$SRPMS was changed; we are out of luck" >&2
# shit happens; we can re-exec ourselves, but...
exit 1
fi
subj="$subj ($total)"
echo "Total $total packages." >&4
if [ -n "$mailto" -a -z "${mailto##*@*}" ]; then
if [ -f pkgwatch/signature ]; then
echo
cat pkgwatch/signature
fi >&4
mail -s "$subj" $mailto <pkgwatch/msg
mv -f pkgwatch/srpms.new pkgwatch/srpms.old
else
echo "$subj"
cat pkgwatch/msg
fi
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20050717/40763c46/attachment-0003.bin>
Подробная информация о списке рассылки Sisyphus