Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37516055
en ru br
Репозитории ALT

Группа :: Other
Пакет: autorepo-altnode-repocop

 Главная   Изменения   Спек   Патчи   Исходники   Загрузить   Gear   Bugs and FR  Repocop 

pax_global_header00006660000000000000000000000064122310447010014504gustar00rootroot0000000000000052 comment=a9acb50035e1ad7450ad49da48b12ad114325436
autorepo-altnode-repocop-0.15/000075500000000000000000000000001223104470100163565ustar00rootroot00000000000000autorepo-altnode-repocop-0.15/.gear/000075500000000000000000000000001223104470100173525ustar00rootroot00000000000000autorepo-altnode-repocop-0.15/.gear/rules000064400000000000000000000000071223104470100204240ustar00rootroot00000000000000tar: .
autorepo-altnode-repocop-0.15/autorepo-altnode-repocop.spec000064400000000000000000000047331223104470100241700ustar00rootroot00000000000000%filter_from_requires /^repocop-unittest-build-logs/d

#BuildRequires:
Name: autorepo-altnode-repocop
Version: 0.15
Release: alt1
BuildArch: noarch
Packager: Igor Yu. Vlasenko <viy@altlinux.org>

Summary: repocop scripts for an automated packaging node
Group: Development/Other
License: GPL2+
#Url:
Source: %name-%version.tar

BuildRequires: repocop
Requires: repocop > 0.67

%description
%summary

%prep
%setup

%build

%install

mkdir -p $RPM_BUILD_ROOT%_bindir
install -m 755 repocop-* $RPM_BUILD_ROOT%_bindir

%files
%doc daily.conf.*
%doc crontab
%_bindir/*

%changelog
* Mon Oct 21 2013 Igor Vlasenko <viy@altlinux.ru> 0.15-alt1
- repocop TestDB interface support

* Wed Jul 31 2013 Igor Vlasenko <viy@altlinux.ru> 0.14-alt1
- dropped obsolete symlinks

* Tue Jul 30 2013 Igor Vlasenko <viy@altlinux.ru> 0.13-alt1
- more daily.conf

* Fri Jul 26 2013 Igor Vlasenko <viy@altlinux.ru> 0.12-alt1
- html support

* Fri Jul 19 2013 Igor Vlasenko <viy@altlinux.ru> 0.11-alt1
- release

* Thu Jul 18 2013 Igor Vlasenko <viy@altlinux.ru> 0.10-alt6
- bugfix release

* Wed Jul 17 2013 Igor Vlasenko <viy@altlinux.ru> 0.10-alt5
- fixed dependencies

* Tue Jul 16 2013 Igor Vlasenko <viy@altlinux.ru> 0.10-alt4
- more altnode tags

* Tue Jul 16 2013 Igor Vlasenko <viy@altlinux.ru> 0.10-alt3
- support for html report

* Mon Jul 15 2013 Igor Vlasenko <viy@altlinux.ru> 0.10-alt2
- added altnode support

* Mon Jul 15 2013 Igor Vlasenko <viy@altlinux.ru> 0.10-alt1
- added extra statistics reports

* Fri May 10 2013 Igor Vlasenko <viy@altlinux.ru> 0.09-alt2
- support for archive task on autorepo nodes

* Fri Apr 26 2013 Igor Vlasenko <viy@altlinux.ru> 0.09-alt1
- new distrodb format

* Thu Apr 25 2013 Igor Vlasenko <viy@altlinux.ru> 0.08-alt1
- distrodb-extra support

* Wed Jan 23 2013 Igor Vlasenko <viy@altlinux.ru> 0.07-alt1
- enabled build logs again

* Tue Nov 27 2012 Igor Vlasenko <viy@altlinux.ru> 0.06-alt2
- dropped optional dependency on repocop-unittest-build-logs

* Tue Nov 27 2012 Igor Vlasenko <viy@altlinux.ru> 0.06-alt1
- prometheus2 support

* Fri Jul 13 2012 Igor Vlasenko <viy@altlinux.ru> 0.05-alt1
- export of watch files

* Sun Jul 08 2012 Igor Vlasenko <viy@altlinux.ru> 0.04-alt1
- repocop 0.59 distrotest support

* Sun Jul 08 2012 Igor Vlasenko <viy@altlinux.ru> 0.03-alt1
- repocop 0.58 support

* Fri Jul 06 2012 Igor Vlasenko <viy@altlinux.ru> 0.02-alt1
- support for repocop-report-prometeus2-sqlite

* Tue Jun 12 2012 Igor Vlasenko <viy@altlinux.ru> 0.01-alt1
- First build for Sisyphus.
autorepo-altnode-repocop-0.15/crontab000064400000000000000000000001051223104470100177250ustar00rootroot0000000000000001 4 * * * /usr/bin/repocop-daily > $HOME/repocop-daily.log 2>&1
autorepo-altnode-repocop-0.15/daily.conf.autoextra-mgaimport000064400000000000000000000007631223104470100243450ustar00rootroot00000000000000DISTROMAP_COMPONENT=mgaimport
PUBDIR=/var/ftp/pub/repocop/$DISTROMAP_COMPONENT/Sisyphus
REPODIR=/var/ftp/pub/ALTLinux/$DISTROMAP_COMPONENT/Sisyphus
#REPOCOP_CYBERTALK_EMAIL=viy@altlinux.org
ALLRPMS="$REPODIR/noarch/RPMS.$DISTROMAP_COMPONENT $REPODIR/x86_64/RPMS.$DISTROMAP_COMPONENT $REPODIR/files/SRPMS"
REPOCOP_RUN_POSTTEST_OPTS=--no-distrotest

DO_rsync=
DO_archdiff=
DO_beehive=
DO_collect=yes
DO_posttest=yes
DO_report=yes
DO_diff=yes
DO_cybertalk=
DO_prometheus=
DO_distromap=yes
DO_archive=

autorepo-altnode-repocop-0.15/daily.conf.autoimports-sisyphus000064400000000000000000000007211223104470100246010ustar00rootroot00000000000000PUBDIR=/var/ftp/pub/repocop/autoimports/Sisyphus
REPODIR=/var/ftp/pub/ALTLinux/autoimports/Sisyphus
DISTROMAP_COMPONENT=autoimports
#REPOCOP_CYBERTALK_EMAIL=viy@altlinux.org
ALLRPMS="$REPODIR/noarch/RPMS.autoimports $REPODIR/x86_64/RPMS.autoimports $REPODIR/files/SRPMS"
REPOCOP_RUN_POSTTEST_OPTS=--no-distrotest

DO_rsync=
DO_archdiff=
DO_beehive=
DO_collect=yes
DO_posttest=yes
DO_report=yes
DO_diff=yes
DO_cybertalk=
DO_prometheus=
DO_distromap=yes
DO_archive=

autorepo-altnode-repocop-0.15/daily.conf.autoimports-t7000064400000000000000000000007311223104470100232450ustar00rootroot00000000000000BRANCH=t7
PUBDIR=/var/ftp/pub/repocop/autoimports/$BRANCH
REPODIR=/var/ftp/pub/ALTLinux/autoimports/$BRANCH
DISTROMAP_COMPONENT=autoimports
#REPOCOP_CYBERTALK_EMAIL=viy@altlinux.org
ALLRPMS="$REPODIR/noarch/RPMS.autoimports $REPODIR/x86_64/RPMS.autoimports $REPODIR/files/SRPMS"
REPOCOP_RUN_POSTTEST_OPTS=--no-distrotest

DO_rsync=
DO_archdiff=
DO_beehive=
DO_collect=yes
DO_posttest=yes
DO_report=yes
DO_diff=yes
DO_cybertalk=
DO_prometheus=
DO_distromap=yes
DO_archive=

autorepo-altnode-repocop-0.15/daily.conf.autoperl-cpanbuilder000064400000000000000000000007651223104470100244570ustar00rootroot00000000000000DISTROMAP_COMPONENT=cpanbuilder
PUBDIR=/var/ftp/pub/repocop/$DISTROMAP_COMPONENT/Sisyphus
REPODIR=/var/ftp/pub/ALTLinux/$DISTROMAP_COMPONENT/Sisyphus
#REPOCOP_CYBERTALK_EMAIL=viy@altlinux.org
ALLRPMS="$REPODIR/noarch/RPMS.$DISTROMAP_COMPONENT $REPODIR/x86_64/RPMS.$DISTROMAP_COMPONENT $REPODIR/files/SRPMS"
REPOCOP_RUN_POSTTEST_OPTS=--no-distrotest

DO_rsync=
DO_archdiff=
DO_beehive=
DO_collect=yes
DO_posttest=yes
DO_report=yes
DO_diff=yes
DO_cybertalk=
DO_prometheus=
DO_distromap=yes
DO_archive=

autorepo-altnode-repocop-0.15/daily.conf.autoports-branch-p7000064400000000000000000000006511223104470100241470ustar00rootroot00000000000000BRANCH=p7
REPODIR=/ALT/stable/$BRANCH
PUBDIR=/var/ftp/pub/repocop/$BRANCH

REPOCOP_RUN_COLLECT_OPTS="--skip-big-binary=280m --big-tmpdir=$HOME/tmp --big-binary=40m"
REPOCOP_REPORT_ACL_OPTS="--acl-altlinux --acl-branch=$BRANCH"
#REPOCOP_REPORT_HTML_OPTS="--no-by-srpm --no-by-test"

DO_rsync=
DO_archdiff=yes
DO_beehive=
DO_collect=yes
DO_posttest=yes
DO_report=yes
DO_diff=yes
DO_cybertalk=
DO_prometheus=yes
DO_archive=yes

autorepo-altnode-repocop-0.15/daily.conf.autoports-branch-t6000064400000000000000000000006511223104470100241520ustar00rootroot00000000000000BRANCH=t6
REPODIR=/ALT/stable/$BRANCH
PUBDIR=/var/ftp/pub/repocop/$BRANCH

REPOCOP_RUN_COLLECT_OPTS="--skip-big-binary=280m --big-tmpdir=$HOME/tmp --big-binary=40m"
REPOCOP_REPORT_ACL_OPTS="--acl-altlinux --acl-branch=$BRANCH"
#REPOCOP_REPORT_HTML_OPTS="--no-by-srpm --no-by-test"

DO_rsync=
DO_archdiff=yes
DO_beehive=
DO_collect=yes
DO_posttest=yes
DO_report=yes
DO_diff=yes
DO_cybertalk=
DO_prometheus=yes
DO_archive=yes

autorepo-altnode-repocop-0.15/daily.conf.repocop000064400000000000000000000005651223104470100220030ustar00rootroot00000000000000REPODIR=/ALT/stable/Sisyphus
REPOCOP_CYBERTALK_EMAIL=sisyphus-cybertalk@lists.altlinux.org
REPOCOP_REPORT_ACL_OPTS="--acl-altlinux --acl-branch=sisyphus"
#REPOCOP_REPORT_HTML_OPTS="--no-by-srpm --no-by-test"
DO_rsync=
DO_archdiff=yes
DO_beehive=yes
DO_collect=yes
DO_posttest=yes
DO_report=yes
DO_diff=yes
DO_cybertalk=yes
DO_prometheus=yes
DO_distromap=yes
DO_archive=yes
autorepo-altnode-repocop-0.15/repocop-daily000075500000000000000000000206521223104470100210600ustar00rootroot00000000000000#!/bin/sh

#HOME=/home/repocop
export PATH=$HOME/bin:$PATH

ARCHDIFFHACK=/usr/share/repocop/pkgtests/unmet-dependency-build-missing-package/_archdiff
REPOCOP_CACHEDIR=$HOME/.repocop
ARCHDIFFDIR=$REPOCOP_CACHEDIR/testcache/_archdiff
BRANCH=sisyphus
DISTROMAP_REPOSITORY=altlinux



PROG="${0##*/}"
quiet=

DO_rsync=
DO_archdiff=yes
DO_beehive=
DO_collect=yes
DO_posttest=yes
DO_report=yes
DO_diff=yes
DO_cybertalk=
DO_prometheus=
DO_distromap=yes
DO_archive=yes
DO_altnode=yes

# import beehive logs on Tuesdays
# [ `date +%u` = 2 ] && DO_beehive=

REPOCOP_RUN_COLLECT_OPTS=
REPOCOP_RUN_POSTTEST_OPTS=
REPOCOP_REPORT_PROMETHEUS_OPTS=
REPOCOP_REPORT_ACL_OPTS=

[ -e $REPOCOP_CACHEDIR/daily.conf ] && . $REPOCOP_CACHEDIR/daily.conf

REPODIR=${REPODIR:-~/Sisyphus}
ALLRPMS=${ALLRPMS:-$REPODIR/files/noarch/RPMS $REPODIR/files/x86_64/RPMS $REPODIR/files/SRPMS}
SRPMS=${SRPMS:-$REPODIR/files/SRPMS}
FTPDIR=${FTPDIR:-/var/ftp}
ALTNODE_DIR=${ALTNODE_DIR:-$FTPDIR/altnode/`whoami`}
PUBDIR=${PUBDIR:-$FTPDIR/pub/repocop}
PUB_PROMETHEUS1_DIR=${PUB_PROMETHEUS1_DIR:-$PUBDIR/prometeus}
PUB_PROMETHEUS2_DIR=${PUB_PROMETHEUS2_DIR:-$PUBDIR/prometheus2}

Unlink_Except()
{
local kept_file="$1"
shift;
for i in "$@"; do
[ "$kept_file" != "$i" ] && ! [ -L "$i" ] && rm -f -- "$i"
done
}

Message()
{
[ -z "$quiet" ] || return 0
printf %s\\n "$*"
}

Fatal()
{
printf %s\\n "$PROG: $*" >&2
exit 1
}

do_rsync()
{
Message "rsync (nothing to do)..."
}

do_archdiff()
{
if [ -x $ARCHDIFFHACK ]; then
Message "running _archdiff hack..."
$ARCHDIFFHACK "$ARCHDIFFDIR" $REPODIR || exit 3
cp "$ARCHDIFFDIR"/i586.only "$ARCHDIFFDIR"/missing
fi
}

do_beehive()
{
cmd=/usr/bin/repocop-process-build-logs
if [ -x $cmd ]; then
if [ -x ~/bin/repocop-rsync-build-logs ]; then
Message "run (beehive log collect)..."
repocop-rsync-beehive-logs || exit 3
fi
Message "run (beehive log process)..."
$cmd || exit 3
else
Message "skip (beehive) - no "
fi
}

do_collect()
{
Message "run (collect)..."
# if repocop-run exited abnormally it should just stop
repocop-run --no-posttest $REPOCOP_RUN_COLLECT_OPTS $ALLRPMS || exit 2
vacuum_opt=--novacuum
[ `date +%u` = 3 ] && vacuum_opt=--vacuum
repocop-purge-except -l $vacuum_opt
}


do_posttest()
{
Message "run (posttest)..."
# if repocop-run exited abnormally it should just stop
repocop-run --no-collect --posttest --distrotest $REPOCOP_RUN_POSTTEST_OPTS || exit 2
}

do_diff()
{
cmd=/usr/bin/repocop-fix-srpm
if [ -x $cmd ]; then
Message "diff..."
# SLOWER
#repocop-fix-srpm --write-report --diff $REPOCOP_REPORT_ACL_OPTS $SRPMS
# FASTER
$cmd --write-report --diff $REPOCOP_REPORT_ACL_OPTS $REPOCOP_CACHEDIR/testcache/specfile
# tmp hack to fix in repocop-fix-srpm
find $REPOCOP_CACHEDIR/reports/diff/by-srpm/ -type f -size 0 -delete
fi
}

do_report()
{
Message "report (txt)..."
repocop-report-txt --report experimental $REPOCOP_REPORT_ACL_OPTS
cmd=/usr/bin/repocop-report-html
if [ -x $cmd ]; then
Message "report (html)..."
$cmd --report experimental $REPOCOP_REPORT_ACL_OPTS $REPOCOP_REPORT_HTML_OPTS
fi
rsync -a --delete-after $REPOCOP_CACHEDIR/reports $PUBDIR/
}

do_cybertalk()
{
cmd=/usr/bin/repocop-report-email
if [ -x $cmd ] && [ -n "$REPOCOP_CYBERTALK_EMAIL" ]; then
Message "cybertalk..."
$cmd "$REPOCOP_CYBERTALK_EMAIL"
fi
}

# ----- prometheus -----------
do_prometheus()
{
cmd=/usr/bin/repocop-report-prometheus-dump
if [ -x $cmd ]; then
Message "prometheus..."
mkdir -p $PUB_PROMETHEUS1_DIR
$cmd > $PUB_PROMETHEUS1_DIR/repocop-prometeus.sql
rm -f $PUB_PROMETHEUS1_DIR/repocop-prometeus.sql.gz
gzip -9 $PUB_PROMETHEUS1_DIR/repocop-prometeus.sql
stat $PUB_PROMETHEUS1_DIR/repocop-prometeus.sql.gz --format %y > $PUB_PROMETHEUS1_DIR/timestamp
fi
cmd=/usr/bin/repocop-report-prometheus2
if [ -x $cmd ]; then
Message "prometheus2 (text sql)..."
CURDATA=`date '+%Y%m%d'`
mkdir -p $PUB_PROMETHEUS2_DIR
rm -f $PUB_PROMETHEUS2_DIR/prometheus2*.sql
$cmd --branch $BRANCH > $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sql
ln -sf $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sql $PUB_PROMETHEUS2_DIR/prometheus2.sql
rm -f $PUB_PROMETHEUS2_DIR/prometheus2-patches-*.sql
cmd=/usr/bin/repocop-report-prometheus2-patches
$cmd --branch $BRANCH > $PUB_PROMETHEUS2_DIR/prometheus2-patches-$CURDATA.sql
ln -sf $PUB_PROMETHEUS2_DIR/prometheus2-patches-$CURDATA.sql $PUB_PROMETHEUS2_DIR/prometheus2-patches.sql
fi
cmd=/usr/bin/repocop-report-prometheus2-sqlite
if [ -x $cmd ]; then
Message "prometheus2 (sqlite)..."
CURDATA=`date '+%Y%m%d'`
mkdir -p $PUB_PROMETHEUS2_DIR
rm -f $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sqlite.bz2
$cmd --branch $BRANCH ${DISTROMAP_COMPONENT:+--component "$DISTROMAP_COMPONENT"} --out $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sqlite
bzip2 $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sqlite
ln -sf $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sqlite.bz2 $PUB_PROMETHEUS2_DIR/prometheus2.sqlite.bz2
Unlink_Except $PUB_PROMETHEUS2_DIR/prometheus2-$CURDATA.sqlite.bz2 $PUB_PROMETHEUS2_DIR/prometheus2-*.sqlite.bz2
fi
}
# ---- end prometheus ----

Pack_and_Rotate()
{
local destdir=$1
local fileprefix=$2
shift;shift;
mkdir -p $destdir/
local CURDATA=`date '+%Y%m%d'`
rm -rf $destdir/$fileprefix-$CURDATA.tar.gz
tar czf $destdir/$fileprefix-$CURDATA.tar.gz "$@"
ln -sf $fileprefix-$CURDATA.tar.gz $destdir/$fileprefix-current.tar.gz
Unlink_Except $destdir/$fileprefix-$CURDATA.tar.gz $destdir/$fileprefix*
}

do_distromap()
{
cmd=/usr/bin/repocop-report-distrodb
if [ -x $cmd ]; then
Message "distromap-db..."
$cmd --branch $BRANCH ${DISTROMAP_COMPONENT:+--component "$DISTROMAP_COMPONENT"}
distrodb_main_file=repocop-distrodb-$BRANCH
distrodb_extra_file=repocop-distrodb-extra-$BRANCH
[ -n "$DISTROMAP_COMPONENT" ] && distrodb_main_file="$distrodb_main_file-$DISTROMAP_COMPONENT"
Pack_and_Rotate $PUBDIR/data $distrodb_extra_file -C ~ .cache/distrodb/$DISTROMAP_REPOSITORY/$BRANCH/unique_data
Pack_and_Rotate $PUBDIR/data $distrodb_main_file -C ~ --exclude '*/unique_data*' .cache/distro*
fi
}

do_archive()
{
Message "archive..."
Pack_and_Rotate $PUBDIR/data repocop-report -C ~ .repocop/reports/diff .repocop/reports/txt
Pack_and_Rotate $PUBDIR/data repocop-data -C ~ .repocop/testcache .repocop/db .repocop/testdb
[ -d $REPOCOP_CACHEDIR/testcache/watch ] && Pack_and_Rotate $PUBDIR/data repocop-watchfiles -C $REPOCOP_CACHEDIR/testcache watch
[ -d $REPOCOP_CACHEDIR/testcache/specfile ] && Pack_and_Rotate $PUBDIR/data repocop-specfiles -C $REPOCOP_CACHEDIR/testcache specfile

ln -f .repocop/db/freedesktop-desktop.db $PUBDIR/data/
}

_altnode_stamp_common()
{
echo repocop > $ALTNODE_DIR/type
echo $BRANCH > $ALTNODE_DIR/platform
echo ${DISTROMAP_COMPONENT:+$DISTROMAP_COMPONENT/}$BRANCH > $ALTNODE_DIR/repository
echo ${PUBDIR##$FTPDIR/}/reports > $ALTNODE_DIR/relative_path
date +'%F %T %Z' > $ALTNODE_DIR/datastring
}

do_altnode()
{
Message "altnode..."
_altnode_stamp_common
repocop-report-total-messages > $ALTNODE_DIR/repocop_summary
echo ok > $ALTNODE_DIR/status
}

while [ "$#" -ge 1 ]; do
case "$1" in
-q|--quiet) quiet=-q
;;
-v|--verbose) quiet=
;;
-h|--help) show_help
;;
--) shift; break
;;
--no-[a-z]*)
arg="NO_${1##--no-}"
eval $arg=1
;;
--[a-z]*)
arg="DO_${1##--}"
eval $arg=1
;;
*) Fatal "unrecognized option: $1"
;;
esac
shift
done

if ! repocop-cachedir-lock --lock $$ ; then
echo -n "can't lock the workdir. "
repocop-cachedir-lock $$
_altnode_stamp_common
echo fail > $ALTNODE_DIR/status
exit 1
fi

# Failsafe tmp cleanup
me=`whoami`
[ -d /tmp/.private/$me ] && for i in /tmp/.private/$me/*; do rm -rf $i; done

[ -n "$DO_rsync" ] && [ -z "$NO_rsync" ] && do_rsync
[ -n "$DO_archdiff" ] && [ -z "$NO_archdiff" ] && do_archdiff
[ -n "$DO_beehive" ] && [ -z "$NO_beehive" ] && do_beehive
[ -n "$DO_collect" ] && [ -z "$NO_collect" ] && do_collect
[ -n "$DO_posttest" ] && [ -z "$NO_posttest" ] && do_posttest
[ -n "$DO_diff" ] && [ -z "$NO_diff" ] && do_diff
[ -n "$DO_report" ] && [ -z "$NO_report" ] && do_report
[ -n "$DO_cybertalk" ] && [ -z "$NO_cybertalk" ] && do_cybertalk
[ -n "$DO_prometheus" ] && [ -z "$NO_prometheus" ] && do_prometheus
[ -n "$DO_distromap" ] && [ -z "$NO_distromap" ] && do_distromap
[ -n "$DO_archive" ] && [ -z "$NO_archive" ] && do_archive
[ -n "$DO_altnode" ] && [ -z "$NO_altnode" ] && do_altnode

repocop-cachedir-lock --unlock $$
exit 0
autorepo-altnode-repocop-0.15/repocop-report-total-messages000075500000000000000000000010721223104470100242120ustar00rootroot00000000000000#!/usr/bin/perl -w

use strict;
use Test::Repocop::Options;
use Test::Repocop::TestDB;
$Repocop::arg::reportlevel ='experimental';

&Test::Repocop::Options::get_common_options();
&Test::Repocop::Options::die_if_nothing_to_report();
my @types=qw/fail warn info experimental/;
my %sum;
foreach my $type (@types) {
$sum{$type}=0;
}

my $testdb=Test::Repocop::TestDB->new();
my $cache=$testdb->get_pkg_test_status_iterator();
while (my ($rpm,$test,$status)=$cache->iterate3_filtered()) {
$sum{$status}++;
}

foreach my $type (@types) {
print $sum{$type},"\n";
}
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin