[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