Files
entropy/libraries/databaseTools.py
2007-09-22 13:16:19 +00:00

3375 lines
201 KiB
Python

#!/usr/bin/python
'''
# DESCRIPTION:
# Entropy Database Interface
Copyright (C) 2007 Fabio Erculiani
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
'''
# Never do "import portage" here, please use entropyTools binding
# EXIT STATUSES: 300-399
from entropyConstants import *
import entropyTools
from outputTools import *
from pysqlite2 import dbapi2 as sqlite
import os
import sys
import string
# Logging initialization
import logTools
dbLog = logTools.LogFile(level = etpConst['databaseloglevel'],filename = etpConst['databaselogfile'], header = "[DBase]")
def database(options):
import activatorTools
import reagentTools
import mirrorTools
databaseRequestNoAsk = False
_options = []
for opt in options:
if opt.startswith("--noask"):
databaseRequestNoAsk = True
else:
_options.append(opt)
options = _options
if len(options) == 0:
print_error(yellow(" * ")+red("Not enough parameters"))
sys.exit(301)
if (options[0] == "--initialize"):
# do some check, print some warnings
print_info(green(" * ")+red("Initializing Entropy database..."), back = True)
# database file: etpConst['etpdatabasefilepath']
revisionsMatch = {}
if os.path.isfile(etpConst['etpdatabasefilepath']):
try:
dbconn = etpDatabase(readOnly = True, noUpload = True)
idpackages = dbconn.listAllIdpackages()
for idpackage in idpackages:
package = os.path.basename(dbconn.retrieveDownloadURL(idpackage))
branch = dbconn.retrieveBranch(idpackage)
revision = dbconn.retrieveRevision(idpackage)
revisionsMatch[package] = [branch,revision]
dbconn.closeDB()
except:
pass
print_info(red(" * ")+bold("WARNING")+red(": database file already exists. Overwriting."))
rc = entropyTools.askquestion("\n Do you want to continue ?")
if rc == "No":
sys.exit(0)
os.remove(etpConst['etpdatabasefilepath'])
revisionsMatch = {u'm4-1.4.10.tbz2': [u'unstable', 0], u'gst-plugins-esd-0.10.6.tbz2': [u'unstable', 0], u'toolame-02l-r2.tbz2': [u'unstable', 1], u'myspell-fr-20060316.tbz2': [u'unstable', 1], u'ebdftopcf-2.tbz2': [u'unstable', 1], u'dvdauthor-0.6.14.tbz2': [u'unstable', 1], u'pgpdump-0.24.tbz2': [u'unstable', 1], u'aspell-ro-0.50.2.tbz2': [u'unstable', 1], u'torcs-1.3.0.tbz2': [u'unstable', 1], u'sabayonlive-tools-1.6.1.tbz2': [u'unstable', 0], u'alsa-plugins-1.0.14.tbz2': [u'unstable', 0], u'libcaca-0.99_beta11.tbz2': [u'unstable', 1], u'kverbos-3.5.7.tbz2': [u'unstable', 1], u'kate-plugins-3.5.7.tbz2': [u'unstable', 1], u'slmodem-2.9.11_pre20070505-t2.6.22_sabayon.tbz2': [u'unstable', 0], u'aspell-es-0.50.2.tbz2': [u'unstable', 1], u'dmapi-2.2.8.tbz2': [u'unstable', 0], u'amsn-0.97_rc1.tbz2': [u'unstable', 0], u'xf86-video-chips-1.1.1.tbz2': [u'unstable', 1], u'linux-wlan-ng-utils-0.2.2.tbz2': [u'unstable', 1], u'irssi-0.8.12_rc1.tbz2': [u'unstable', 0], u'fribidi-0.10.7.tbz2': [u'unstable', 1], u'kteatime-3.5.7.tbz2': [u'unstable', 1], u'aspell-cy-0.50.3.tbz2': [u'unstable', 1], u'celementtree-1.0.5-r1.tbz2': [u'unstable', 0], u'extutils-parsexs-2.18.tbz2': [u'unstable', 1], u'sdl-mixer-1.2.8.tbz2': [u'unstable', 0], u'synce-libsynce-0.9.1.tbz2': [u'unstable', 1], u'gdm-2.18.4.tbz2': [u'unstable', 0], u'safe-browsing-helpers-1.0.1.tbz2': [u'unstable', 1], u'xkbutils-1.0.1.tbz2': [u'unstable', 1], u'at-spi-1.18.1-r1.tbz2': [u'unstable', 0], u'xf86-video-tdfx-1.3.0.tbz2': [u'unstable', 1], u'gst-plugins-good-0.10.6.tbz2': [u'unstable', 0], u'neon-0.26.3.tbz2': [u'unstable', 0], u'uw-mailutils-2004g.tbz2': [u'unstable', 1], u'klatin-3.5.7.tbz2': [u'unstable', 1], u'transcode-1.0.4_rc6.tbz2': [u'unstable', 0], u'ksokoban-3.5.7.tbz2': [u'unstable', 1], u'log4j-1.2.14-r1.tbz2': [u'unstable', 1], u'sauerbraten-2007.08.19.tbz2': [u'unstable', 0], u'genkernel-3.4.9_pre2.tbz2': [u'unstable', 0], u'kturtle-3.5.7.tbz2': [u'unstable', 1], u'XML-XQL-0.68.tbz2': [u'unstable', 1], u'googleearth-4.tbz2': [u'unstable', 1], u'konsolekalendar-3.5.7.tbz2': [u'unstable', 1], u'gob-2.0.14.tbz2': [u'unstable', 1], u'gnome-panel-2.18.3.tbz2': [u'unstable', 0], u'lxml-1.3.4.tbz2': [u'unstable', 0], u'binutils-config-1.9-r4.tbz2': [u'unstable', 0], u'ktalkd-3.5.7.tbz2': [u'unstable', 1], u'libdvdnav-0.1.10.tbz2': [u'unstable', 1], u'dos2unix-3.1-r2.tbz2': [u'unstable', 0], u'aspell-el-0.50.3.tbz2': [u'unstable', 1], u'font-adobe-75dpi-1.0.0.tbz2': [u'unstable', 1], u'glade-sharp-2.10.0.tbz2': [u'unstable', 2], u'Heap-0.80.tbz2': [u'unstable', 0], u'xf86-input-citron-2.2.1.tbz2': [u'unstable', 0], u'Time-Local-1.17.tbz2': [u'unstable', 1], u'font-bitstream-75dpi-1.0.0.tbz2': [u'unstable', 1], u'gawk-3.1.5-r5.tbz2': [u'unstable', 0], u'aspell-0.60.5.tbz2': [u'unstable', 1], u'kdepim-meta-3.5.7.tbz2': [u'unstable', 1], u'system-tools-backends-2.2.1-r2.tbz2': [u'unstable', 1], u'ipw2200-firmware-3.0.tbz2': [u'unstable', 3], u'pwlib-1.10.7.tbz2': [u'unstable', 1], u'kpovmodeler-3.5.7.tbz2': [u'unstable', 1], u'tor-0.1.2.17.tbz2': [u'unstable', 0], u'speech-tools-1.2.96_beta.tbz2': [u'unstable', 1], u'Text-WrapI18N-0.06.tbz2': [u'unstable', 1], u'libintl-perl-1.16.tbz2': [u'unstable', 1], u'commons-lang-2.3.tbz2': [u'unstable', 0], u'font-bh-lucidatypewriter-100dpi-1.0.0.tbz2': [u'unstable', 1], u'vim-core-7.1.087.tbz2': [u'unstable', 0], u'renamedlg-audio-3.5.7.tbz2': [u'unstable', 1], u'nautilus-cd-burner-2.18.2.tbz2': [u'unstable', 0], u'libvisual-plugins-0.2.0.tbz2': [u'unstable', 1], u'python-fchksum-1.7.1.tbz2': [u'unstable', 1], u'docbook-xml-dtd-4.5.tbz2': [u'unstable', 2], u'kaudiocreator-3.5.7.tbz2': [u'unstable', 1], u'IO-stringy-2.110.tbz2': [u'unstable', 1], u'kamera-3.5.7.tbz2': [u'unstable', 1], u'libgphoto2-2.3.1-r5.tbz2': [u'unstable', 0], u'perl-Sys-Syslog-0.18.tbz2': [u'unstable', 1], u'module-init-tools-3.2.2-r3.tbz2': [u'unstable', 1], u'kpercentage-3.5.7.tbz2': [u'unstable', 1], u'kmahjongg-3.5.7.tbz2': [u'unstable', 1], u'dialog-1.1.20070704.tbz2': [u'unstable', 0], u'xf86-video-sis-0.9.3.tbz2': [u'unstable', 1], u'virtualbox-bin-1.5.0.tbz2': [u'unstable', 0], u'gnome-mount-0.6.tbz2': [u'unstable', 1], u'obexftp-0.22_rc7.tbz2': [u'unstable', 0], u'xf86-video-cirrus-1.1.0.tbz2': [u'unstable', 1], u'opencdk-0.6.4.tbz2': [u'unstable', 0], u'man-1.6e-r3.tbz2': [u'unstable', 1], u'gspcav1-20070508-t2.6.22_sabayon.tbz2': [u'unstable', 1], u'flightgear-0.9.10.tbz2': [u'unstable', 1], u'privoxy-3.0.6.tbz2': [u'unstable', 1], u'recode-3.6-r2.tbz2': [u'unstable', 1], u'xalan-serializer-2.7.0.tbz2': [u'unstable', 0], u'kasteroids-3.5.7.tbz2': [u'unstable', 1], u'emul-linux-x86-sdl-10.1.tbz2': [u'unstable', 1], u'unshield-0.5-r1.tbz2': [u'unstable', 1], u'madwifi-ng-tools-0.9.3.2.tbz2': [u'unstable', 0], u'glitz-0.5.6.tbz2': [u'unstable', 1], u'art-sharp-2.16.0.tbz2': [u'unstable', 1], u'hal-0.5.9.1-r7.tbz2': [u'unstable', 1], u'libxml-1.8.17-r2.tbz2': [u'unstable', 1], u'libdc1394-1.2.1.tbz2': [u'unstable', 1], u'dbus-qt3-old-0.70.tbz2': [u'unstable', 1], u'extutils-depends-0.205.tbz2': [u'unstable', 1], u'gst-plugins-libpng-0.10.6.tbz2': [u'unstable', 0], u'eel-2.18.3.tbz2': [u'unstable', 0], u'compositeproto-0.4.tbz2': [u'unstable', 0], u'bsh-2.0_beta4-r3.tbz2': [u'unstable', 0], u'xf86-video-ark-0.6.0.tbz2': [u'unstable', 1], u'libstdc++-3.3.tbz2': [u'unstable', 1], u'libaal-1.0.5.tbz2': [u'unstable', 1], u'kruler-3.5.7.tbz2': [u'unstable', 1], u'hping-2.0.0_rc3-r1.tbz2': [u'unstable', 1], u'xterm-229.tbz2': [u'unstable', 0], u'gpm-1.20.1-r6.tbz2': [u'unstable', 0], u'kimagemapeditor-3.5.7.tbz2': [u'unstable', 1], u'xf86-input-aiptek-1.0.1.tbz2': [u'unstable', 1], u'perl-Storable-2.16.tbz2': [u'unstable', 1], u'apr-util-0.9.12-r1.tbz2': [u'unstable', 1], u'gjdoc-0.7.8.tbz2': [u'unstable', 1], u'smartmontools-5.37.tbz2': [u'unstable', 1], u'secondlife-bin-1.18.0.6.tbz2': [u'unstable', 1], u'perl-5.8.8-r2.tbz2': [u'unstable', 1], u'gconf-editor-2.18.2.tbz2': [u'unstable', 0], u'kdewebdev-meta-3.5.7.tbz2': [u'unstable', 1], u'ccrtp-1.5.1.tbz2': [u'unstable', 0], u'webapp-config-1.50.16-r2.tbz2': [u'unstable', 0], u'kontact-3.5.7-r1.tbz2': [u'unstable', 0], u'aspell-pt-0.50.2.tbz2': [u'unstable', 1], u'libX11-1.1.3.tbz2': [u'unstable', 0], u'kdemultimedia-kioslaves-3.5.7.tbz2': [u'unstable', 1], u'xclip-0.08-r2.tbz2': [u'unstable', 0], u'ikvm-bin-0.34.0.2.tbz2': [u'unstable', 0], u'kview-3.5.7.tbz2': [u'unstable', 1], u'sabayon-2.18.1.tbz2': [u'unstable', 1], u'gst-plugins-v4l2-0.10.6.tbz2': [u'unstable', 0], u'cracklib-2.8.10.tbz2': [u'unstable', 1], u'XML-Simple-2.18.tbz2': [u'unstable', 0], u'libassuan-1.0.2-r1.tbz2': [u'unstable', 0], u'sqlite-2.8.16-r4.tbz2': [u'unstable', 1], u'aspell-bg-0.50.0.tbz2': [u'unstable', 1], u'itk-3.3-r1.tbz2': [u'unstable', 1], u'ttf-bitstream-vera-1.10-r3.tbz2': [u'unstable', 1], u'XML-RegExp-0.03-r1.tbz2': [u'unstable', 1], u'groff-1.18.1.1.tbz2': [u'unstable', 1], u'compiz-settings-0.07.tbz2': [u'unstable', 1], u'pth-2.0.7.tbz2': [u'unstable', 1], u'kbounce-3.5.7.tbz2': [u'unstable', 1], u'airtraf-1.1.tbz2': [u'unstable', 1], u'xf86dgaproto-2.0.3.tbz2': [u'unstable', 0], u'pygtk-2.10.6.tbz2': [u'unstable', 0], u'potrace-1.7.tbz2': [u'unstable', 1], u'mimelib-3.5.7.tbz2': [u'unstable', 1], u'libXcomposite-0.4.0.tbz2': [u'unstable', 0], u'kdeprint-3.5.7.tbz2': [u'unstable', 1], u'raptor-1.4.15.tbz2': [u'unstable', 1], u'kblackbox-3.5.7.tbz2': [u'unstable', 1], u'elementtree-1.2.6-r2.tbz2': [u'unstable', 0], u'xf86-video-i740-1.1.0.tbz2': [u'unstable', 1], u'DBD-Pg-1.49.tbz2': [u'unstable', 1], u'xvid4conf-1.12.tbz2': [u'unstable', 1], u'libsynaptics-0.14.6c.tbz2': [u'unstable', 1], u'man-pages-ro-0.2.tbz2': [u'unstable', 1], u'Socket6-0.19.tbz2': [u'unstable', 1], u'xf86-video-vesa-1.3.0.tbz2': [u'unstable', 1], u'gtkglext-1.2.0.tbz2': [u'unstable', 1], u'sun-jaf-1.1.tbz2': [u'unstable', 1], u'jdk-1.6.0.tbz2': [u'unstable', 1], u'Scalar-List-Utils-1.19.tbz2': [u'unstable', 1], u'libgtop-2.14.9.tbz2': [u'unstable', 0], u'xcalc-1.0.2.tbz2': [u'unstable', 0], u'libxml-perl-0.08.tbz2': [u'unstable', 1], u'aspell-hr-0.51.0.tbz2': [u'unstable', 1], u'grub-0.97-r12.tbz2': [u'unstable', 0], u'virtinst-0.300.0.tbz2': [u'unstable', 0], u'mpfr-2.2.1_p5.tbz2': [u'unstable', 1], u'freetype-2.3.5-r1.tbz2': [u'unstable', 0], u'gnome-system-tools-2.18.0.tbz2': [u'unstable', 1], u'libXTrap-1.0.0.tbz2': [u'unstable', 1], u'ktron-3.5.7.tbz2': [u'unstable', 1], u'libdmx-1.0.2.tbz2': [u'unstable', 1], u'kaboodle-3.5.7.tbz2': [u'unstable', 1], u'font-bh-ttf-1.0.0.tbz2': [u'unstable', 1], u'libpqxx-2.6.9.tbz2': [u'unstable', 0], u'pycairo-1.4.0.tbz2': [u'unstable', 1], u'font-mutt-misc-1.0.0.tbz2': [u'unstable', 1], u'Pod-Escapes-1.04.tbz2': [u'unstable', 1], u'kbattleship-3.5.7.tbz2': [u'unstable', 1], u'xplc-0.3.13-r1.tbz2': [u'unstable', 1], u're2c-0.12.0.tbz2': [u'unstable', 0], u'faad2-2.0-r13.tbz2': [u'unstable', 1], u'chkrootkit-0.47.tbz2': [u'unstable', 1], u'bluez-firmware-1.2.tbz2': [u'unstable', 1], u'XML-Writer-0.603.tbz2': [u'unstable', 0], u'libkcal-3.5.7-r1.tbz2': [u'unstable', 0], u'liboil-0.3.12.tbz2': [u'unstable', 0], u'fltk-1.1.7-r2.tbz2': [u'unstable', 0], u'bcm43xx-firmware-4319-r1.tbz2': [u'unstable', 1], u'multipath-tools-0.4.7-r2.tbz2': [u'unstable', 0], u'kcoloredit-3.5.7.tbz2': [u'unstable', 1], u'evolution-data-server-1.10.3.1.tbz2': [u'unstable', 0], u'savage-bin-2.00e.tbz2': [u'unstable', 1], u'lm_sensors-2.10.4.tbz2': [u'unstable', 0], u'netkit-talk-0.17-r4.tbz2': [u'unstable', 1], u'gentoo-syntax-20070506.tbz2': [u'unstable', 0], u'realplayer-10.0.9.tbz2': [u'unstable', 0], u'klettres-3.5.7.tbz2': [u'unstable', 1], u'pcsc-lite-1.4.4.tbz2': [u'unstable', 0], u'DB_File-1.815.tbz2': [u'unstable', 1], u'plotutils-2.4.1-r4.tbz2': [u'unstable', 0], u'pam_userdb-0.99.8.1.tbz2': [u'unstable', 0], u'iproute2-2.6.22.20070710.tbz2': [u'unstable', 0], u'aspell-fr-0.60.tbz2': [u'unstable', 0], u'perl-ldap-0.34.tbz2': [u'unstable', 1], u'xinput-1.2.tbz2': [u'unstable', 1], u'gnome-power-manager-2.18.3.tbz2': [u'unstable', 1], u'tetex-3.0_p1-r4.tbz2': [u'unstable', 0], u'flex-2.5.33-r3.tbz2': [u'unstable', 0], u'pycrash-0.4_pre3.tbz2': [u'unstable', 1], u'libkholidays-3.5.7.tbz2': [u'unstable', 1], u'gtk-engines-qt-0.7_p20070327-r2.tbz2': [u'unstable', 1], u'module-rebuild-0.5.tbz2': [u'unstable', 1], u'xalan-2.7.0-r4.tbz2': [u'unstable', 0], u'opengl-7.0.tbz2': [u'unstable', 1], u'xdpyinfo-1.0.2.tbz2': [u'unstable', 1], u'gtk2-gladexml-1.006.tbz2': [u'unstable', 1], u'hugin-0.6.1.tbz2': [u'unstable', 1], u'dev86-0.16.17-r3.tbz2': [u'unstable', 0], u'pam_krb5-20030601-r1.tbz2': [u'unstable', 1], u'man-pages-fr-2.39.0.tbz2': [u'unstable', 1], u'pam_require-0.6.tbz2': [u'unstable', 1], u'layman-1.0.99.tbz2': [u'unstable', 1], u'hspell-1.0-r1.tbz2': [u'unstable', 1], u'faac-1.25.tbz2': [u'unstable', 1], u'kmousetool-3.5.7.tbz2': [u'unstable', 1], u'intltool-0.35.5.tbz2': [u'unstable', 1], u'commons-logging-1.1-r2.tbz2': [u'unstable', 1], u'recordproto-1.13.2.tbz2': [u'unstable', 1], u'libbonoboui-2.18.0.tbz2': [u'unstable', 1], u'xf86-input-palmax-1.1.0.tbz2': [u'unstable', 1], u'libdvdplay-1.0.1.tbz2': [u'unstable', 1], u'kolf-3.5.7.tbz2': [u'unstable', 1], u'ftp-0.17-r6.tbz2': [u'unstable', 1], u'kodo-3.5.7.tbz2': [u'unstable', 1], u'mdadm-2.6.3.tbz2': [u'unstable', 0], u'PyQt-3.17.3.tbz2': [u'unstable', 0], u'bluez-libs-3.18.tbz2': [u'unstable', 0], u'orbit-2.14.8-r3.tbz2': [u'unstable', 2], u'poppler-0.5.4-r2.tbz2': [u'unstable', 0], u'libmtp-0.2.1.tbz2': [u'unstable', 0], u'kalarm-3.5.7.tbz2': [u'unstable', 1], u'akode-2.0.2.tbz2': [u'unstable', 1], u'tcp-wrappers-7.6-r8.tbz2': [u'unstable', 1], u'fontcacheproto-0.1.2.tbz2': [u'unstable', 1], u'pam_ssh-1.92.tbz2': [u'unstable', 1], u'bigreqsproto-1.0.2.tbz2': [u'unstable', 1], u'kdeaccessibility-iconthemes-3.5.7.tbz2': [u'unstable', 1], u'font-xfree86-type1-1.0.0.tbz2': [u'unstable', 1], u'XML-LibXML-1.63.tbz2': [u'unstable', 1], u'dasher-4.4.2.tbz2': [u'unstable', 0], u'esearch-0.7.1-r4.tbz2': [u'unstable', 1], u'a2ps-4.13c-r5.tbz2': [u'unstable', 1], u'ksplash-engine-moodin-0.4.2.tbz2': [u'unstable', 1], u'xf86-video-nv-2.1.3.tbz2': [u'unstable', 0], u'm2crypto-0.18.tbz2': [u'unstable', 0], u'scrollkeeper-0.3.14-r2.tbz2': [u'unstable', 1], u'xsane-0.994.tbz2': [u'unstable', 1], u'acx-firmware-20060207.tbz2': [u'unstable', 1], u'ctypes-1.0.2.tbz2': [u'unstable', 0], u'jdk-1.4.2.tbz2': [u'unstable', 1], u'kdict-3.5.7.tbz2': [u'unstable', 1], u'konsole-3.5.7.tbz2': [u'unstable', 1], u'kmid-3.5.7.tbz2': [u'unstable', 1], u'MailTools-1.77.tbz2': [u'unstable', 0], u'kmyfirewall-1.0.1-r1.tbz2': [u'unstable', 1], u'bison-2.3.tbz2': [u'unstable', 1], u'libxslt-1.1.20-r1.tbz2': [u'unstable', 0], u'xlsfonts-1.0.2.tbz2': [u'unstable', 1], u'Louie-1.1.tbz2': [u'unstable', 1], u'libkexiv2-0.1.5.tbz2': [u'unstable', 0], u'synaptics-0.14.6.tbz2': [u'unstable', 1], u'xmag-1.0.2.tbz2': [u'unstable', 0], u'xf86-input-dmc-1.1.1.tbz2': [u'unstable', 0], u'font-schumacher-misc-1.0.0.tbz2': [u'unstable', 1], u'amd64codecs-20061203.tbz2': [u'unstable', 1], u'ksirtet-3.5.7.tbz2': [u'unstable', 1], u'iwlwifi-ucode-2.14.3.tbz2': [u'unstable', 1], u'pam_ssh_agent-0.2-r1.tbz2': [u'unstable', 1], u'IP-Country-2.23.tbz2': [u'unstable', 1], u'ktux-3.5.7.tbz2': [u'unstable', 1], u'kdebase-startkde-3.5.7.tbz2': [u'unstable', 1], u'emul-linux-x86-soundlibs-10.0-r1.tbz2': [u'unstable', 1], u'mjpegtools-1.9.0_rc2.tbz2': [u'unstable', 1], u'libXxf86dga-1.0.2.tbz2': [u'unstable', 0], u'sip-4.7.tbz2': [u'unstable', 0], u'kaffeine-0.8.5.tbz2': [u'unstable', 0], u'aspell-it-2.2.20050523.tbz2': [u'unstable', 1], u'Digest-SHA-5.45.tbz2': [u'unstable', 0], u'libSM-1.0.3.tbz2': [u'unstable', 0], u'pstoedit-3.44.tbz2': [u'unstable', 0], u'glut-3.7.1.tbz2': [u'unstable', 1], u'klickety-3.5.7.tbz2': [u'unstable', 1], u'xf86-video-voodoo-1.1.1.tbz2': [u'unstable', 1], u'ncurses-5.6-r2.tbz2': [u'unstable', 0], u'tcpdump-3.9.7-r1.tbz2': [u'unstable', 0], u'915resolution-0.5.3-r1.tbz2': [u'unstable', 0], u'iptraf-3.0.0-r4.tbz2': [u'unstable', 0], u'ruby-1.8.6_p36-r4.tbz2': [u'unstable', 0], u'plib-1.8.4-r1.tbz2': [u'unstable', 1], u'gnome-light-2.18.3.tbz2': [u'unstable', 0], u'kmilo-3.5.7.tbz2': [u'unstable', 1], u'kdeaddons-kfile-plugins-3.5.6-r1.tbz2': [u'unstable', 1], u'fontsproto-2.0.2.tbz2': [u'unstable', 1], u'grep-2.5.1a-r1.tbz2': [u'unstable', 1], u'kghostview-3.5.7.tbz2': [u'unstable', 1], u'kwin4-3.5.7.tbz2': [u'unstable', 1], u'khelpcenter-3.5.7.tbz2': [u'unstable', 1], u'linux-headers-2.6.22-r2.tbz2': [u'unstable', 0], u'liblockfile-1.06-r2.tbz2': [u'unstable', 1], u'perl-MIME-Base64-3.07.tbz2': [u'unstable', 1], u'libdvb-0.5.5.1-r3.tbz2': [u'unstable', 1], u'vino-2.18.1.tbz2': [u'unstable', 0], u'gst-plugins-raw1394-0.10.6.tbz2': [u'unstable', 0], u'libxkbfile-1.0.4.tbz2': [u'unstable', 1], u'ksystraycmd-3.5.5.tbz2': [u'unstable', 1], u'kdepasswd-3.5.7-r1.tbz2': [u'unstable', 0], u'docbook-xsl-stylesheets-1.73.2.tbz2': [u'unstable', 0], u'gst-plugins-faac-0.10.5.tbz2': [u'unstable', 0], u'kdetoys-meta-3.5.7.tbz2': [u'unstable', 1], u'aspell-vi-0.01.1.1.tbz2': [u'unstable', 1], u'python-ldap-2.3.1.tbz2': [u'unstable', 0], u'networkmanager-openvpn-0.3.3.tbz2': [u'unstable', 0], u'kdeedu-applnk-3.5.7.tbz2': [u'unstable', 1], u'gst-plugins-cdio-0.10.6.tbz2': [u'unstable', 0], u'gnokii-0.6.18-r1.tbz2': [u'unstable', 0], u'Digest-MD4-1.5.tbz2': [u'unstable', 1], u'Test-Number-Delta-1.03.tbz2': [u'unstable', 0], u'libdvbpsi-0.1.5.tbz2': [u'unstable', 1], u'kerry-0.2.1.tbz2': [u'unstable', 1], u'libid3tag-0.15.1b.tbz2': [u'unstable', 1], u'dcoprss-3.5.7.tbz2': [u'unstable', 1], u'iwlwifi4965-ucode-4.44.15.tbz2': [u'unstable', 1], u'kdeaddons-docs-konq-plugins-3.5.7.tbz2': [u'unstable', 1], u'gnome-nettool-2.18.0.tbz2': [u'unstable', 1], u'unix2dos-2.2.tbz2': [u'unstable', 1], u'libICE-1.0.4.tbz2': [u'unstable', 0], u'startup-notification-0.9.tbz2': [u'unstable', 0], u'netkit-rsh-0.17-r8.tbz2': [u'unstable', 1], u'aspell-sk-0.52.0.tbz2': [u'unstable', 1], u'nmap-4.20.tbz2': [u'unstable', 1], u'flac-1.1.4.tbz2': [u'unstable', 0], u'libgail-gnome-1.18.0.tbz2': [u'unstable', 1], u'corefonts-1-r4.tbz2': [u'unstable', 0], u'gst-python-0.10.8.tbz2': [u'unstable', 0], u'SGMLSpm-1.03-r5.tbz2': [u'unstable', 1], u'libical-0.26.7.tbz2': [u'unstable', 0], u'libgnomeuimm-2.18.0.tbz2': [u'unstable', 1], u'egenix-mx-base-3.0.0.tbz2': [u'unstable', 0], u'khexedit-3.5.7.tbz2': [u'unstable', 1], u'ksayit-3.5.7.tbz2': [u'unstable', 1], u'xlsatoms-1.0.1.tbz2': [u'unstable', 1], u'ladspa-cmt-1.15.tbz2': [u'unstable', 1], u'cdrdao-1.2.2.tbz2': [u'unstable', 1], u'iptables-1.3.8-r2.tbz2': [u'unstable', 0], u'freealut-1.1.0.tbz2': [u'unstable', 1], u'kdeartwork-styles-3.5.7.tbz2': [u'unstable', 1], u'libvisual-plugins-0.4.0-r1.tbz2': [u'unstable', 0], u'compizconfig-python-0.5.2.tbz2': [u'unstable', 1], u'superkaramba-3.5.7.tbz2': [u'unstable', 1], u'dhcdbd-3.0.tbz2': [u'unstable', 0], u'kdf-3.5.7.tbz2': [u'unstable', 1], u'libmpeg2-0.4.1.tbz2': [u'unstable', 1], u'liboobs-2.18.1.tbz2': [u'unstable', 1], u'font-bitstream-type1-1.0.0.tbz2': [u'unstable', 1], u'gnome-netstatus-2.12.1.tbz2': [u'unstable', 1], u'xf86-input-elographics-1.1.0.tbz2': [u'unstable', 1], u'mono-1.2.5-r1.tbz2': [u'unstable', 0], u'qca-tls-1.0-r3.tbz2': [u'unstable', 1], u'kgoldrunner-3.5.7.tbz2': [u'unstable', 1], u'unifdef-1.20.tbz2': [u'unstable', 1], u'samba-3.0.25c-r1.tbz2': [u'unstable', 0], u'bluez-hcidump-1.40.tbz2': [u'unstable', 0], u'MIME-Lite-3.01.tbz2': [u'unstable', 1], u'xmessage-1.0.2.tbz2': [u'unstable', 0], u'yakuake-2.8_beta1.tbz2': [u'unstable', 0], u'dvd+rw-tools-7.0.tbz2': [u'unstable', 1], u'pygame-1.7.1.tbz2': [u'unstable', 1], u'evolution-webcal-2.10.0.tbz2': [u'unstable', 0], u'yasm-0.6.1.tbz2': [u'unstable', 0], u'Text-Shellwords-1.08.tbz2': [u'unstable', 1], u'mpeg2vidcodec-12-r1.tbz2': [u'unstable', 1], u'konversation-1.0.1-r3.tbz2': [u'unstable', 0], u'libpcre-7.2.tbz2': [u'unstable', 0], u'rman-3.2.tbz2': [u'unstable', 1], u'libpthread-stubs-0.1.tbz2': [u'unstable', 0], u'Time-HiRes-1.97.07.tbz2': [u'unstable', 1], u'kmenuedit-3.5.7.tbz2': [u'unstable', 1], u'aspell-af-0.50.0.tbz2': [u'unstable', 1], u'gtkmm-2.10.10.tbz2': [u'unstable', 0], u'docbook-xml-dtd-4.2-r2.tbz2': [u'unstable', 1], u'gimp-2.4.0_rc2.tbz2': [u'unstable', 0], u'gnome-python-extras-2.14.2-r1.tbz2': [u'unstable', 1], u'poppler-data-0.1.tbz2': [u'unstable', 1], u'libpano12-2.8.4.tbz2': [u'unstable', 1], u'musepack-tools-1.15v.tbz2': [u'unstable', 1], u'kappfinder-3.5.7.tbz2': [u'unstable', 1], u'qt-4.3.1.tbz2': [u'unstable', 0], u'pciutils-2.2.6-r1.tbz2': [u'unstable', 0], u'aspell-en-6.0.0.tbz2': [u'unstable', 1], u'libcompizconfig-0.5.2.tbz2': [u'unstable', 1], u'splashutils-1.5.2.tbz2': [u'unstable', 0], u'kdebase-meta-3.5.7.tbz2': [u'unstable', 1], u'gst-plugins-shout2-0.10.6.tbz2': [u'unstable', 0], u'doxygen-1.5.3.tbz2': [u'unstable', 0], u'xf86-input-digitaledge-1.1.0.tbz2': [u'unstable', 1], u'psmisc-22.5-r2.tbz2': [u'unstable', 0], u'kdeartwork-sounds-3.5.6.tbz2': [u'unstable', 1], u'docbook-sgml-dtd-3.1-r3.tbz2': [u'unstable', 1], u'openmotif-2.2.3-r9.tbz2': [u'unstable', 1], u'xf86-input-penmount-1.2.1.tbz2': [u'unstable', 0], u'knock-0.5.tbz2': [u'unstable', 1], u'texinfo-4.8-r5.tbz2': [u'unstable', 1], u'xf86-input-acecad-1.2.1.tbz2': [u'unstable', 0], u'tcl-8.4.15.tbz2': [u'unstable', 0], u'compiz-bcop-0.5.2.tbz2': [u'unstable', 1], u'win32codecs-20061022-r1.tbz2': [u'unstable', 1], u'mftrace-1.2.9.tbz2': [u'unstable', 0], u'motif-config-0.10.tbz2': [u'unstable', 1], u'appres-1.0.1.tbz2': [u'unstable', 1], u'check-0.9.5.tbz2': [u'unstable', 1], u'fonttosfnt-1.0.3.tbz2': [u'unstable', 1], u'docbook-dsssl-stylesheets-1.79.tbz2': [u'unstable', 1], u'libxkbui-1.0.2.tbz2': [u'unstable', 1], u'commons-lang-2.0-r2.tbz2': [u'unstable', 1], u'gst-plugins-jpeg-0.10.6.tbz2': [u'unstable', 0], u'beecrypt-4.1.2-r2.tbz2': [u'unstable', 1], u'desktop-file-utils-0.14.tbz2': [u'unstable', 0], u'perl-File-Spec-3.25.tbz2': [u'unstable', 0], u'musicbrainz-2.1.4.tbz2': [u'unstable', 1], u'libraw1394-1.2.1.tbz2': [u'unstable', 1], u'yaml-0.65.tbz2': [u'unstable', 0], u'gst-plugins-farsight-0.12.2.tbz2': [u'unstable', 0], u'Net-Daemon-0.43.tbz2': [u'unstable', 0], u'gksu-2.0.0.tbz2': [u'unstable', 1], u'mit-krb5-1.5.3-r1.tbz2': [u'unstable', 0], u'dosfstools-2.11-r3.tbz2': [u'unstable', 0], u'xproto-7.0.10.tbz2': [u'unstable', 1], u'Event-1.09.tbz2': [u'unstable', 0], u'pe-format-0.tbz2': [u'unstable', 1], u'tomboy-0.6.3.tbz2': [u'unstable', 0], u'libXaw-1.0.4.tbz2': [u'unstable', 0], u'kaddressbook-3.5.7.tbz2': [u'unstable', 1], u'gsmlib-1.11_pre041028.tbz2': [u'unstable', 1], u'font-bh-type1-1.0.0.tbz2': [u'unstable', 1], u'vcdimager-0.7.23.tbz2': [u'unstable', 1], u'gentoolkit-0.2.4_pre6.tbz2': [u'unstable', 0], u'DBI-1.58.tbz2': [u'unstable', 0], u'pam_passwdqc-1.0.4.tbz2': [u'unstable', 0], u'xmodmap-1.0.3.tbz2': [u'unstable', 0], u'libfame-0.9.1-r1.tbz2': [u'unstable', 0], u'enchant-1.2.5.tbz2': [u'unstable', 1], u'cvs-1.12.12-r4.tbz2': [u'unstable', 1], u'expat-2.0.1.tbz2': [u'unstable', 0], u'cronbase-0.3.2.tbz2': [u'unstable', 1], u'font-bitstream-100dpi-1.0.0.tbz2': [u'unstable', 1], u'urw-fonts-2.3.6.tbz2': [u'unstable', 0], u'xwd-1.0.1.tbz2': [u'unstable', 1], u'gtk2-ex-formfactory-0.65-r1.tbz2': [u'unstable', 1], u'libgadu-1.7.1.tbz2': [u'unstable', 0], u'juk-3.5.7.tbz2': [u'unstable', 1], u'gst-plugins-ugly-0.10.6.tbz2': [u'unstable', 0], u'Compress-Raw-Zlib-2.005.tbz2': [u'unstable', 0], u'boost-1.34.1.tbz2': [u'unstable', 0], u'dbus-1.0.2-r2.tbz2': [u'unstable', 1], u'kipi-plugins-0.1.4-r1.tbz2': [u'unstable', 0], u'compiz-fusion-plugins-main-0.5.2.tbz2': [u'unstable', 1], u'gst-plugins-annodex-0.10.6.tbz2': [u'unstable', 0], u'IO-Zlib-1.05.tbz2': [u'unstable', 1], u'gconf-2.18.0.1.tbz2': [u'unstable', 1], u'libdvdcss-1.2.9-r1.tbz2': [u'unstable', 1], u'aspell-nl-0.50.2.tbz2': [u'unstable', 1], u'xlsclients-1.0.1.tbz2': [u'unstable', 1], u'SOAP-Lite-0.69.tbz2': [u'unstable', 0], u'exiv2-0.15.tbz2': [u'unstable', 0], u'aspell-cs-0.60.20040614.tbz2': [u'unstable', 0], u'kjots-3.5.7.tbz2': [u'unstable', 1], u'eselect-esd-20060719.tbz2': [u'unstable', 1], u'read-edid-1.4.1-r1.tbz2': [u'unstable', 0], u'kdelirc-3.5.7.tbz2': [u'unstable', 1], u'gtksourceview-sharp-0.10-r1.tbz2': [u'unstable', 1], u'xsm-1.0.1.tbz2': [u'unstable', 1], u'ktimer-3.5.7.tbz2': [u'unstable', 1], u'artsplugin-xine-3.5.7.tbz2': [u'unstable', 1], u'jhead-2.7.tbz2': [u'unstable', 0], u'Xaw3d-1.5-r1.tbz2': [u'unstable', 1], u'flac123-0.0.11.tbz2': [u'unstable', 0], u'vpnc-0.5.1.tbz2': [u'unstable', 0], u'xf86-input-ur98-1.1.0.tbz2': [u'unstable', 1], u'sdl-ttf-2.0.9.tbz2': [u'unstable', 0], u'ksplashml-3.5.7.tbz2': [u'unstable', 1], u'cpuburn-1.4.tbz2': [u'unstable', 1], u'XML-Twig-3.29.tbz2': [u'unstable', 0], u'gdbm-1.8.3-r3.tbz2': [u'unstable', 1], u'tango-icon-theme-extras-0.1.0-r1.tbz2': [u'unstable', 1], u'gnome-mime-data-2.18.0.tbz2': [u'unstable', 1], u'fast-user-switch-applet-2.18.0.tbz2': [u'unstable', 1], u'kstars-3.5.7.tbz2': [u'unstable', 1], u'amor-3.5.7.tbz2': [u'unstable', 1], u'networkmanager-0.6.5_p20070823-r1.tbz2': [u'unstable', 0], u'nspluginwrapper-0.9.91.5.tbz2': [u'unstable', 0], u'mkfontscale-1.0.3.tbz2': [u'unstable', 1], u'randrproto-1.2.1.tbz2': [u'unstable', 1], u'TermReadKey-2.30.tbz2': [u'unstable', 1], u'fpconst-0.7.3.tbz2': [u'unstable', 1], u'xclock-1.0.3.tbz2': [u'unstable', 0], u'gift-0.11.8.1-r1.tbz2': [u'unstable', 0], u'kreversi-3.5.7.tbz2': [u'unstable', 1], u'krfb-3.5.7.tbz2': [u'unstable', 1], u'htdig-3.2.0_beta6-r2.tbz2': [u'unstable', 1], u'eyeD3-0.6.14.tbz2': [u'unstable', 0], u'kode-3.5.6.tbz2': [u'unstable', 1], u'libgnomecups-0.2.2.tbz2': [u'unstable', 1], u'docbook-sgml-dtd-4.0-r3.tbz2': [u'unstable', 1], u'xprop-1.0.3.tbz2': [u'unstable', 0], u'XML-Filter-BufferText-1.01.tbz2': [u'unstable', 1], u'videoproto-2.2.2.tbz2': [u'unstable', 1], u'linux-sabayon-2.6.22.tbz2': [u'unstable', 1], u'libXevie-1.0.2.tbz2': [u'unstable', 1], u'eselect-vi-1.1.5.tbz2': [u'unstable', 0], u'nss-mdns-0.10.tbz2': [u'unstable', 0], u'gnome-volume-manager-2.17.0.tbz2': [u'unstable', 1], u'eject-2.1.5-r1.tbz2': [u'unstable', 1], u'aircrack-ng-0.9.1.tbz2': [u'unstable', 0], u'XML-DOM-1.44.tbz2': [u'unstable', 1], u'rcs-5.7-r3.tbz2': [u'unstable', 1], u'glade-3.2.2.tbz2': [u'unstable', 0], u'crypto++-5.5.1.tbz2': [u'unstable', 0], u'kdcop-3.5.7.tbz2': [u'unstable', 1], u'docbook-sgml-dtd-3.0-r3.tbz2': [u'unstable', 1], u'sabayon-sources-2.6.22.tbz2': [u'unstable', 1], u'font-bh-lucidatypewriter-75dpi-1.0.0.tbz2': [u'unstable', 1], u'qscintilla-2.1.tbz2': [u'unstable', 0], u'mirrorselect-1.2.tbz2': [u'unstable', 1], u'kismet-2007.01.1b.tbz2': [u'unstable', 1], u'pptpclient-1.7.1-r1.tbz2': [u'unstable', 1], u'jasper-1.900.1-r1.tbz2': [u'unstable', 0], u'libmodplug-0.8.4-r2.tbz2': [u'unstable', 1], u'man-pages-zh_CN-1.5.tbz2': [u'unstable', 1], u'util-linux-2.13-r1.tbz2': [u'unstable', 1], u'libwww-5.4.0-r7.tbz2': [u'unstable', 1], u'libidn-1.0.tbz2': [u'unstable', 1], u'fontforge-20070831.tbz2': [u'unstable', 0], u'foomatic-db-engine-3.0.20070508.tbz2': [u'unstable', 0], u'gst-plugins-v4l-0.10.14.tbz2': [u'unstable', 0], u'emerald-0.5.2.tbz2': [u'unstable', 1], u'gtk-doc-1.8-r2.tbz2': [u'unstable', 0], u'ntp-4.2.4_p3.tbz2': [u'unstable', 0], u'libvirt-0.3.2.tbz2': [u'unstable', 0], u'libsexy-0.1.11.tbz2': [u'unstable', 1], u'xplsprinters-1.0.1.tbz2': [u'unstable', 1], u'hfsutils-3.2.6-r5.tbz2': [u'unstable', 1], u'gst-plugins-base-0.10.14.tbz2': [u'unstable', 0], u'man-pages-pl-20070628.tbz2': [u'unstable', 0], u'gnome-backgrounds-2.18.3.tbz2': [u'unstable', 0], u'totem-2.18.3.tbz2': [u'unstable', 0], u'gtk-engines-2.10.2.tbz2': [u'unstable', 0], u'xft-7.0.tbz2': [u'unstable', 1], u'gedit-2.18.2.tbz2': [u'unstable', 0], u'gtk+-1.2.10-r12.tbz2': [u'unstable', 1], u'libkcddb-3.5.7.tbz2': [u'unstable', 1], u'openoffice-2.2.1.tbz2': [u'unstable', 0], u'Params-Validate-0.88.tbz2': [u'unstable', 1], u'kcontrol-3.5.7-r90.tbz2': [u'unstable', 1], u'cabextract-1.2.tbz2': [u'unstable', 1], u'rsync-2.6.9-r3.tbz2': [u'unstable', 0], u'kdialog-3.5.5.tbz2': [u'unstable', 1], u'pyorbit-2.14.3.tbz2': [u'unstable', 0], u'procps-3.2.7.tbz2': [u'unstable', 1], u'mailx-support-20060102-r1.tbz2': [u'unstable', 1], u'xset-1.0.3.tbz2': [u'unstable', 0], u'myspell-de-20060316.tbz2': [u'unstable', 1], u'tls-1.5.0-r1.tbz2': [u'unstable', 0], u'build-docbook-catalog-1.2.tbz2': [u'unstable', 1], u'xf86-input-joystick-1.2.3.tbz2': [u'unstable', 0], u'spamassassin-3.2.3.tbz2': [u'unstable', 0], u'screen-4.0.3.tbz2': [u'unstable', 1], u'libnet-1.21.tbz2': [u'unstable', 0], u'korn-3.5.7.tbz2': [u'unstable', 1], u'gtkhtml-3.6.2.tbz2': [u'unstable', 1], u'kbstateapplet-3.5.7.tbz2': [u'unstable', 1], u'mkfontdir-1.0.3.tbz2': [u'unstable', 1], u'xf86-video-trident-1.2.3.tbz2': [u'unstable', 1], u'kwin-3.5.7.tbz2': [u'unstable', 1], u'xdm-1.1.6.tbz2': [u'unstable', 0], u'xf86-input-jamstudio-1.1.0.tbz2': [u'unstable', 1], u'ntfsprogs-1.13.1-r1.tbz2': [u'unstable', 0], u'aspell-gl-0.50.0.tbz2': [u'unstable', 1], u'kcron-3.5.7.tbz2': [u'unstable', 1], u'blackdown-jdk-1.4.2.03-r16.tbz2': [u'unstable', 0], u'mplayer-1.0_rc1_p20070824.tbz2': [u'unstable', 0], u'ktouch-3.5.7.tbz2': [u'unstable', 1], u'kcminit-3.5.6.tbz2': [u'unstable', 1], u'gettext-0.16.1-r1.tbz2': [u'unstable', 0], u'fbgrab-1.0.tbz2': [u'unstable', 1], u'xorg-cf-files-1.0.2.tbz2': [u'unstable', 1], u'gtkglarea-1.99.0.tbz2': [u'unstable', 1], u'usbutils-0.72-r4.tbz2': [u'unstable', 1], u'xf86-input-magellan-1.1.1.tbz2': [u'unstable', 0], u'dhcpcd-3.1.5.tbz2': [u'unstable', 0], u'madplay-0.15.2b-r1.tbz2': [u'unstable', 1], u'servletapi-2.4-r5.tbz2': [u'unstable', 1], u'confuse-2.5.tbz2': [u'unstable', 1], u'miro-0.9.9.1.tbz2': [u'unstable', 0], u'nas-1.8b.tbz2': [u'unstable', 1], u'virtualbox-modules-1.5.0-t2.6.22_sabayon.tbz2': [u'unstable', 0], u'glibc-2.6.1.tbz2': [u'unstable', 0], u'gecko-sharp-0.12.tbz2': [u'unstable', 0], u'desktop-acceleration-helpers-3.0-r7.tbz2': [u'unstable', 0], u'apr-util-1.2.10.tbz2': [u'unstable', 0], u'accel-manager-1.3.5.tbz2': [u'unstable', 1], u'gnu-gs-fonts-std-8.11.tbz2': [u'unstable', 1], u'xml-commons-resolver-1.2.tbz2': [u'unstable', 1], u'damageproto-1.1.0.tbz2': [u'unstable', 1], u'ndiswrapper-1.48_rc2-t2.6.22_sabayon.tbz2': [u'unstable', 0], u'kxsldbg-3.5.7.tbz2': [u'unstable', 1], u'kfilereplace-3.5.7.tbz2': [u'unstable', 1], u'arts-3.5.5-r1.tbz2': [u'unstable', 1], u'suspend2-userui-0.7.1.tbz2': [u'unstable', 0], u'bluez-utils-3.18.tbz2': [u'unstable', 0], u'eselect-timidity-20061203.tbz2': [u'unstable', 1], u'udept-0.5.99.0.2.95-r1.tbz2': [u'unstable', 1], u'pylirc-0.0.5.tbz2': [u'unstable', 1], u'xdriinfo-1.0.2.tbz2': [u'unstable', 0], u'sound-juicer-2.16.4.tbz2': [u'unstable', 0], u'radeontool-1.5-r3.tbz2': [u'unstable', 1], u'gocr-0.44.tbz2': [u'unstable', 0], u'gst-plugins-theora-0.10.14.tbz2': [u'unstable', 0], u'device-mapper-1.02.22.tbz2': [u'unstable', 1], u'db-3.2.9-r11.tbz2': [u'unstable', 1], u'foomatic-db-ppds-20070508.tbz2': [u'unstable', 0], u'knotes-3.5.7.tbz2': [u'unstable', 1], u'scons-0.97.tbz2': [u'unstable', 0], u'pymad-0.6.tbz2': [u'unstable', 0], u'emerald-themes-0.5.2.tbz2': [u'unstable', 1], u'Graph-0.81.tbz2': [u'unstable', 0], u'libmng-1.0.9-r1.tbz2': [u'unstable', 1], u'cogito-0.18.2.tbz2': [u'unstable', 1], u'kbackgammon-3.5.7.tbz2': [u'unstable', 1], u'File-Temp-0.18.tbz2': [u'unstable', 0], u'kfloppy-3.5.7.tbz2': [u'unstable', 1], u'nautilus-2.18.3.tbz2': [u'unstable', 1], u'aspell-et-0.1.21.1.tbz2': [u'unstable', 1], u'kmix-3.5.7.tbz2': [u'unstable', 1], u'libifp-1.0.0.2.tbz2': [u'unstable', 1], u'kdebase-kioslaves-3.5.7-r1.tbz2': [u'unstable', 0], u'font-adobe-utopia-type1-1.0.1.tbz2': [u'unstable', 1], u'xf86-video-vga-4.1.0.tbz2': [u'unstable', 1], u'kreadconfig-3.5.6.tbz2': [u'unstable', 1], u'Event-RPC-0.90.tbz2': [u'unstable', 1], u'gnome-desktop-2.18.3.tbz2': [u'unstable', 0], u'rar-3.7.0.tbz2': [u'unstable', 0], u'kdm-3.5.7-r11.tbz2': [u'unstable', 1], u'metisse-0.4.0_rc4-r2.tbz2': [u'unstable', 0], u'openssl-0.9.8e-r2.tbz2': [u'unstable', 0], u'beagle-0.2.17.tbz2': [u'unstable', 1], u'pkgconfig-0.22.tbz2': [u'unstable', 1], u'openexr-1.4.0a.tbz2': [u'unstable', 1], u'mozilla-firefox-2.0.0.6.tbz2': [u'unstable', 0], u'db-4.5.20_p2.tbz2': [u'unstable', 1], u'dnsmasq-2.40.tbz2': [u'unstable', 0], u'polyester-1.0.2.tbz2': [u'unstable', 0], u'portaudio-18.1-r6.tbz2': [u'unstable', 1], u'aspell-de-0.60_pre20030222.tbz2': [u'unstable', 1], u'dangerdeep-0.3.0.tbz2': [u'unstable', 1], u'xf86-input-fpit-1.1.0-r1.tbz2': [u'unstable', 1], u'libxmlpp-2.13.1.tbz2': [u'unstable', 1], u'Test-Simple-0.70.tbz2': [u'unstable', 1], u'libdrm-2.3.0.tbz2': [u'unstable', 1], u'opensp-1.5.2-r1.tbz2': [u'unstable', 1], u'gst-plugins-alsa-0.10.14.tbz2': [u'unstable', 0], u'sdparm-1.01.tbz2': [u'unstable', 1], u'PodParser-1.35.tbz2': [u'unstable', 1], u'karm-3.5.7.tbz2': [u'unstable', 1], u'katomic-3.5.7.tbz2': [u'unstable', 1], u'pam_keyring-0.0.8.tbz2': [u'unstable', 1], u'alsa-utils-1.0.14.tbz2': [u'unstable', 0], u'mailbase-1.tbz2': [u'unstable', 1], u'kpager-3.5.7.tbz2': [u'unstable', 1], u'perl-DB_File-1.815.tbz2': [u'unstable', 1], u'font-util-1.0.1.tbz2': [u'unstable', 1], u'font-misc-misc-1.0.0.tbz2': [u'unstable', 1], u'xf86-input-mutouch-1.1.0.tbz2': [u'unstable', 1], u'xerces-2.9.0.tbz2': [u'unstable', 0], u'kfind-3.5.7.tbz2': [u'unstable', 1], u'kfax-3.5.7.tbz2': [u'unstable', 1], u'klines-3.5.7.tbz2': [u'unstable', 1], u'klipper-3.5.7.tbz2': [u'unstable', 1], u'korganizer-3.5.7-r1.tbz2': [u'unstable', 0], u'pam-0.99.8.1.tbz2': [u'unstable', 0], u'fox-1.6.27.tbz2': [u'unstable', 0], u'xf86-video-tseng-1.1.1.tbz2': [u'unstable', 1], u'pppconfig-2.3.17-r1.tbz2': [u'unstable', 0], u'timidity++-2.13.2-r5.tbz2': [u'unstable', 0], u'klaptopdaemon-3.5.7-r1.tbz2': [u'unstable', 0], u'nopaste-1992.tbz2': [u'unstable', 1], u'libkpgp-3.5.4.tbz2': [u'unstable', 1], u'afatech9005-firmware-2.tbz2': [u'unstable', 2], u'aspell-da-1.6.0.tbz2': [u'unstable', 1], u'fftw-2.1.5-r3.tbz2': [u'unstable', 0], u'dosbox-0.72.tbz2': [u'unstable', 0], u'knewsticker-3.5.7.tbz2': [u'unstable', 1], u'automake-1.5.tbz2': [u'unstable', 1], u'kbruch-3.5.7.tbz2': [u'unstable', 1], u'eselect-1.0.10.tbz2': [u'unstable', 0], u'ogmtools-1.5.tbz2': [u'unstable', 1], u'lightscribe-1.4.136.1.tbz2': [u'unstable', 1], u'evince-0.8.3.tbz2': [u'unstable', 0], u'avalon-logkit-2.1-r1.tbz2': [u'unstable', 0], u't1utils-1.32.tbz2': [u'unstable', 1], u'man-pages-nl-0.13.3.tbz2': [u'unstable', 1], u'kstart-3.5.6.tbz2': [u'unstable', 1], u'clamav-0.91.2.tbz2': [u'unstable', 0], u'diffutils-2.8.7-r2.tbz2': [u'unstable', 0], u'ftgl-2.1.2-r1.tbz2': [u'unstable', 1], u'openal-0.0.8-r2.tbz2': [u'unstable', 0], u'ed-0.8.tbz2': [u'unstable', 0], u'autoconf-2.61-r1.tbz2': [u'unstable', 0], u'cups-1.2.12.tbz2': [u'unstable', 0], u'javacup-0.11a_beta20060608.tbz2': [u'unstable', 0], u'libvncserver-0.9.1.tbz2': [u'unstable', 0], u'gnu-netcat-0.7.1-r1.tbz2': [u'unstable', 0], u'Cairo-1.04.1.tbz2': [u'unstable', 0], u'libkdcraw-0.1.1.tbz2': [u'unstable', 0], u'indent-2.2.9-r4.tbz2': [u'unstable', 0], u'libpq-8.2.4.tbz2': [u'unstable', 0], u'pmount-0.9.16.tbz2': [u'unstable', 0], u'glut-1.0.tbz2': [u'unstable', 1], u'kdebase-data-3.5.7.tbz2': [u'unstable', 1], u'Net-SSLeay-1.30.tbz2': [u'unstable', 1], u'control-center-2.18.1.tbz2': [u'unstable', 1], u'libXfixes-4.0.3.tbz2': [u'unstable', 1], u'man-pages-ru-0.98.tbz2': [u'unstable', 1], u'portato-0.8.5.tbz2': [u'unstable', 0], u'gnome-games-2.18.2.1.tbz2': [u'unstable', 0], u'libXpm-3.5.7.tbz2': [u'unstable', 0], u'db-1.85-r3.tbz2': [u'unstable', 1], u'tango-icon-theme-0.8.0.tbz2': [u'unstable', 1], u'tftp-hpa-0.48.tbz2': [u'unstable', 1], u'xf86vidmodeproto-2.2.2.tbz2': [u'unstable', 1], u'kpilot-3.5.5.tbz2': [u'unstable', 1], u'libsamplerate-0.1.2-r1.tbz2': [u'unstable', 1], u'hdparm-7.7.tbz2': [u'unstable', 0], u'gst-plugins-gconf-0.10.6.tbz2': [u'unstable', 0], u'myspell-es-20060316.tbz2': [u'unstable', 1], u'ksmiletris-3.5.7.tbz2': [u'unstable', 1], u'XML-Handler-YAWriter-0.23-r1.tbz2': [u'unstable', 1], u'unzip-5.52-r1.tbz2': [u'unstable', 1], u'gnome-doc-utils-0.10.3.tbz2': [u'unstable', 1], u'emul-linux-x86-gtklibs-11.0.tbz2': [u'unstable', 0], u'libXext-1.0.3.tbz2': [u'unstable', 1], u'netselect-0.3-r1.tbz2': [u'unstable', 1], u'zenity-2.18.2.tbz2': [u'unstable', 0], u'XML-XSLT-0.48.tbz2': [u'unstable', 1], u'glibmm-2.12.10.tbz2': [u'unstable', 0], u'nxclient-3.0.0-r3.tbz2': [u'unstable', 0], u'db-4.2.52_p4-r2.tbz2': [u'unstable', 1], u'gst-plugins-speex-0.10.6.tbz2': [u'unstable', 0], u'libgdiplus-1.2.5.tbz2': [u'unstable', 0], u'GD-2.35-r1.tbz2': [u'unstable', 0], u'xcursorgen-1.0.2.tbz2': [u'unstable', 0], u'xf86-video-s3-0.5.0.tbz2': [u'unstable', 1], u'util-macros-1.1.5.tbz2': [u'unstable', 1], u'font-adobe-utopia-75dpi-1.0.1.tbz2': [u'unstable', 1], u'baekmuk-fonts-2.2-r2.tbz2': [u'unstable', 1], u'kscd-3.5.7.tbz2': [u'unstable', 1], u'k3b-1.0.3.tbz2': [u'unstable', 0], u'acpid-1.0.6.tbz2': [u'unstable', 0], u'libXdmcp-1.0.2.tbz2': [u'unstable', 1], u'twisted-2.5.0.tbz2': [u'unstable', 1], u'emul-linux-x86-qtlibs-10.0-r1.tbz2': [u'unstable', 1], u'ksvg-3.5.7.tbz2': [u'unstable', 1], u'artsplugin-akode-3.5.7.tbz2': [u'unstable', 1], u'libsvg-0.1.4.tbz2': [u'unstable', 1], u'evolution-sharp-0.12.4.tbz2': [u'unstable', 0], u'File-Which-0.05.tbz2': [u'unstable', 1], u'pygtkglext-1.1.0.tbz2': [u'unstable', 1], u'xwininfo-1.0.3.tbz2': [u'unstable', 0], u'libgssglue-0.1.tbz2': [u'unstable', 0], u'sabayon-version-3.4-r2.tbz2': [u'unstable', 0], u'gtkhtml-2.6.3.tbz2': [u'unstable', 1], u'vorbis-tools-1.1.1-r5.tbz2': [u'unstable', 0], u'configobj-4.4.0-r1.tbz2': [u'unstable', 0], u'amarok-1.4.7.tbz2': [u'unstable', 0], u'rdesktop-1.5.0-r3.tbz2': [u'unstable', 0], u'gsm-1.0.12.tbz2': [u'unstable', 0], u'xf86-input-microtouch-1.1.1.tbz2': [u'unstable', 0], u'aspell-he-1.0.0.tbz2': [u'unstable', 0], u'knewsticker-scripts-3.5.7.tbz2': [u'unstable', 1], u'jack-3.1.1.tbz2': [u'unstable', 1], u'perl-PodParser-1.35.tbz2': [u'unstable', 1], u'pilot-link-0.11.8-r1.tbz2': [u'unstable', 1], u'libofa-0.9.3.tbz2': [u'unstable', 1], u'aspell-sr-0.60.tbz2': [u'unstable', 1], u'libkdeedu-3.5.7.tbz2': [u'unstable', 1], u'kdepim-kresources-3.5.7-r1.tbz2': [u'unstable', 0], u'p7zip-4.51.tbz2': [u'unstable', 0], u'emul-linux-x86-compat-1.0-r3.tbz2': [u'unstable', 1], u'SVG-2.33.tbz2': [u'unstable', 1], u'ark-3.5.7.tbz2': [u'unstable', 1], u'lacie-lightscribe-labeler-1.0.6.tbz2': [u'unstable', 1], u'kworldclock-3.5.7.tbz2': [u'unstable', 0], u'File-Find-Rule-0.30.tbz2': [u'unstable', 1], u'amule-2.2.0_pre20070920.tbz2': [u'unstable', 0], u'libstdc++-v3-3.3.6.tbz2': [u'unstable', 1], u'sudo-1.6.8_p12-r1.tbz2': [u'unstable', 1], u'font-cursor-misc-1.0.0.tbz2': [u'unstable', 1], u'libXp-1.0.0.tbz2': [u'unstable', 1], u'Compress-Zlib-2.005.tbz2': [u'unstable', 0], u'python-2.5.1-r2.tbz2': [u'unstable', 0], u'whois-4.7.22.tbz2': [u'unstable', 0], u'Error-0.17.008.tbz2': [u'unstable', 1], u'orca-2.18.1.tbz2': [u'unstable', 0], u'globespan-adsl-0.12.tbz2': [u'unstable', 0], u'vlc-0.8.6c.tbz2': [u'unstable', 0], u'klinkstatus-3.5.7.tbz2': [u'unstable', 1], u'libavc1394-0.5.3.tbz2': [u'unstable', 1], u'xfsprogs-2.9.3.tbz2': [u'unstable', 0], u'ca-certificates-20070303-r1.tbz2': [u'unstable', 0], u'trapproto-3.4.3.tbz2': [u'unstable', 1], u'kuser-3.5.7.tbz2': [u'unstable', 1], u'xorg-server-1.4-r2.tbz2': [u'unstable', 0], u'gst-plugins-flac-0.10.6.tbz2': [u'unstable', 0], u'skim-1.4.5.tbz2': [u'unstable', 1], u'libmcs-0.5.0.tbz2': [u'unstable', 0], u'pyvorbis-1.4-r2.tbz2': [u'unstable', 0], u'pessulus-2.16.2.tbz2': [u'unstable', 0], u'swt-3.3.tbz2': [u'unstable', 0], u'itcl-3.3-r1.tbz2': [u'unstable', 1], u'kpat-3.5.7.tbz2': [u'unstable', 1], u'junit-3.8.2-r1.tbz2': [u'unstable', 0], u'snack-2.2.10-r1.tbz2': [u'unstable', 0], u'aspell-eo-0.50.2.tbz2': [u'unstable', 1], u'myspell-nl-20060316.tbz2': [u'unstable', 1], u'fping-2.4_beta2-r1.tbz2': [u'unstable', 1], u'gnome-spell-1.0.7-r1.tbz2': [u'unstable', 1], u'gperf-3.0.3.tbz2': [u'unstable', 0], u'kcharselect-3.5.7.tbz2': [u'unstable', 1], u'myspell-ru-20060316.tbz2': [u'unstable', 1], u'perl-cleaner-1.04.3.tbz2': [u'unstable', 1], u'wine-0.9.45.tbz2': [u'unstable', 0], u'pixman-0.9.5.tbz2': [u'unstable', 0], u'vim-7.1.087.tbz2': [u'unstable', 0], u'autopano-sift-2.4.tbz2': [u'unstable', 1], u'hunspell-1.1.9.tbz2': [u'unstable', 0], u'md5deep-1.13.tbz2': [u'unstable', 0], u'libmix-2.05.tbz2': [u'unstable', 1], u'ufed-0.40-r6.tbz2': [u'unstable', 1], u'fox-wrapper-2.tbz2': [u'unstable', 1], u'gpgme-0.3.14-r1.tbz2': [u'unstable', 1], u'libsdl-1.2.12.tbz2': [u'unstable', 0], u'xcb-proto-1.0.tbz2': [u'unstable', 0], u'shash-0.2.6-r1.tbz2': [u'unstable', 1], u'ardour-2.0.5.tbz2': [u'unstable', 0], u'glade-2.12.1.tbz2': [u'unstable', 1], u'shadow-4.0.18.1-r1.tbz2': [u'unstable', 0], u'boehm-gc-7.0-r1.tbz2': [u'unstable', 0], u'font-bitstream-speedo-1.0.0.tbz2': [u'unstable', 1], u'perl-Digest-MD5-2.36.tbz2': [u'unstable', 1], u'mktemp-1.5.tbz2': [u'unstable', 1], u'setserial-2.17-r3.tbz2': [u'unstable', 1], u'kdesu-3.5.7.tbz2': [u'unstable', 1], u'kpf-3.5.7.tbz2': [u'unstable', 1], u'fluxbox-1.0_rc3_p5059.tbz2': [u'unstable', 0], u'pam_dotfile-0.7-r1.tbz2': [u'unstable', 1], u'kdeaccessibility-meta-3.5.7.tbz2': [u'unstable', 1], u'libsmbios-0.13.10.tbz2': [u'unstable', 0], u'man-pages-da-0.1.1.tbz2': [u'unstable', 1], u'libgnomeprint-2.18.1.tbz2': [u'unstable', 0], u'compiz-fusion-0.5.2.tbz2': [u'unstable', 1], u'zlib-1.2.3-r1.tbz2': [u'unstable', 1], u'dssi-0.9.1.tbz2': [u'unstable', 1], u'kmldonkey-0.10.1-r1.tbz2': [u'unstable', 0], u'picasa-2.2.2820.5.tbz2': [u'unstable', 1], u'kalzium-3.5.7.tbz2': [u'unstable', 1], u'kdnssd-3.5.7.tbz2': [u'unstable', 1], u'popt-1.10.7.tbz2': [u'unstable', 1], u'udftools-1.0.0b-r7.tbz2': [u'unstable', 0], u'XML-SAX-0.16.tbz2': [u'unstable', 0], u'libglademm-2.6.4.tbz2': [u'unstable', 0], u'cyrus-sasl-2.1.22-r2.tbz2': [u'unstable', 1], u'gcalctool-5.9.14.tbz2': [u'unstable', 1], u'lvm2-2.02.27.tbz2': [u'unstable', 0], u'foomatic-filters-3.0.20070501.tbz2': [u'unstable', 0], u'extutils-pkgconfig-1.07.tbz2': [u'unstable', 1], u'xtrap-1.0.2.tbz2': [u'unstable', 1], u'ctags-5.6-r3.tbz2': [u'unstable', 0], u'crystal-1.0.2.tbz2': [u'unstable', 1], u'ppp-2.4.4-r13.tbz2': [u'unstable', 0], u'perl-Time-Local-1.17.tbz2': [u'unstable', 1], u'librpcsecgss-0.16.tbz2': [u'unstable', 0], u'docbook-xml-dtd-4.4-r1.tbz2': [u'unstable', 1], u'HTML-Tagset-3.10.tbz2': [u'unstable', 1], u'mandvd-2.4-r2.tbz2': [u'unstable', 1], u'curl-7.17.0_pre20070828.tbz2': [u'unstable', 0], u'pango-1.16.5.tbz2': [u'unstable', 0], u'lilo-22.8-r1.tbz2': [u'unstable', 0], u'Archive-Tar-1.32.tbz2': [u'unstable', 0], u'vamps-0.99.2.tbz2': [u'unstable', 1], u'java-config-wrapper-0.14.tbz2': [u'unstable', 0], u'xvinfo-1.0.2.tbz2': [u'unstable', 0], u'gnome-python-2.18.2.tbz2': [u'unstable', 0], u'libmal-0.31.tbz2': [u'unstable', 1], u'python-updater-0.2.tbz2': [u'unstable', 0], u'wireshark-0.99.6-r1.tbz2': [u'unstable', 0], u'konqueror-akregator-3.5.7.tbz2': [u'unstable', 1], u'subtitleripper-0.3.4-r2.tbz2': [u'unstable', 1], u'xsetroot-1.0.2.tbz2': [u'unstable', 0], u'xlogo-1.0.1.tbz2': [u'unstable', 1], u'xf86-input-keyboard-1.2.2.tbz2': [u'unstable', 0], u'kdenetwork-kfile-plugins-3.5.7.tbz2': [u'unstable', 1], u'xf86-video-mga-1.4.7.tbz2': [u'unstable', 0], u'fifteenapplet-3.5.7.tbz2': [u'unstable', 1], u'net-tools-1.60-r13.tbz2': [u'unstable', 1], u'libnet-1.1.2.1-r1.tbz2': [u'unstable', 1], u'ksim-3.5.7.tbz2': [u'unstable', 1], u'cdrtools-2.01.01_alpha34.tbz2': [u'unstable', 0], u'opal-2.2.8.tbz2': [u'unstable', 1], u'ftpbase-0.01.tbz2': [u'unstable', 0], u'libXvMC-1.0.4.tbz2': [u'unstable', 1], u'kmoon-3.5.7.tbz2': [u'unstable', 1], u'keduca-3.5.7.tbz2': [u'unstable', 1], u'gparted-0.3.3.tbz2': [u'unstable', 1], u'busybox-1.7.0.tbz2': [u'unstable', 0], u'gnome-pilot-2.0.15.tbz2': [u'unstable', 1], u'tvtime-1.0.2-r1.tbz2': [u'unstable', 1], u'noatun-plugins-3.5.7.tbz2': [u'unstable', 1], u'cairomm-1.2.4.tbz2': [u'unstable', 1], u'kdebase-pam-7.tbz2': [u'unstable', 0], u'dpkg-1.13.25.tbz2': [u'unstable', 1], u'imlib2-1.4.0.tbz2': [u'unstable', 0], u'iceauth-1.0.2.tbz2': [u'unstable', 0], u'gnome-pilot-conduits-2.0.15.tbz2': [u'unstable', 1], u'sabayonlinux-artwork-3.40-r3.tbz2': [u'unstable', 1], u'aspell-ga-0.50.4.tbz2': [u'unstable', 1], u'DateTime-TimeZone-0.66.02.tbz2': [u'unstable', 0], u'gnome-session-2.18.3.tbz2': [u'unstable', 0], u'keyboard-configuration-helpers-2.2.tbz2': [u'unstable', 1], u'subversion-1.4.4-r4.tbz2': [u'unstable', 0], u'wv-1.2.3-r1.tbz2': [u'unstable', 1], u'gst-plugins-fluendo-mpegdemux-0.10.4.tbz2': [u'unstable', 1], u'tiff-3.8.2-r2.tbz2': [u'unstable', 1], u'gst-plugins-mpeg2dec-0.10.6.tbz2': [u'unstable', 0], u'ksync-3.5.6.tbz2': [u'unstable', 1], u'poppler-bindings-0.5.4.tbz2': [u'unstable', 1], u'xf86-video-savage-2.1.3.tbz2': [u'unstable', 0], u'nspr-4.6.7.tbz2': [u'unstable', 0], u'rp-l2tp-0.4-r1.tbz2': [u'unstable', 1], u'ladspa-sdk-1.12-r2.tbz2': [u'unstable', 1], u'libXrender-0.9.4.tbz2': [u'unstable', 0], u'metacity-2.18.5.tbz2': [u'unstable', 0], u'xkbcomp-1.0.3.tbz2': [u'unstable', 1], u'gentoolkit-dev-0.2.6.6.tbz2': [u'unstable', 0], u'kmailcvt-3.5.5.tbz2': [u'unstable', 1], u'yelp-2.18.1.tbz2': [u'unstable', 1], u'kdesktop-3.5.7-r10.tbz2': [u'unstable', 1], u'jack-audio-connection-kit-0.103.0.tbz2': [u'unstable', 0], u'foomatic-db-20070508.tbz2': [u'unstable', 0], u'kanagram-3.5.7.tbz2': [u'unstable', 1], u'resolvconf-gentoo-1.4.tbz2': [u'unstable', 0], u'tcsh-6.15-r2.tbz2': [u'unstable', 0], u'myspell-gl-20060316.tbz2': [u'unstable', 1], u'gconf-sharp-2.16.0.tbz2': [u'unstable', 1], u'acl-2.2.44.tbz2': [u'unstable', 0], u'perl-tk-804.027.tbz2': [u'unstable', 1], u'gmime-2.2.3.tbz2': [u'unstable', 1], u'vbetool-0.7.tbz2': [u'unstable', 1], u'docbook-sgml-dtd-4.4.tbz2': [u'unstable', 1], u'eselect-opengl-1.0.5.tbz2': [u'unstable', 1], u'kandy-3.5.7.tbz2': [u'unstable', 1], u'xload-1.0.2.tbz2': [u'unstable', 1], u'gail-1.18.0.tbz2': [u'unstable', 1], u'bridge-utils-1.2.tbz2': [u'unstable', 1], u'johntheripper-1.7.2-r2.tbz2': [u'unstable', 0], u'libgcrypt-1.2.4.tbz2': [u'unstable', 1], u'mesa-7.0.1.tbz2': [u'unstable', 0], u'lsof-4.78-r1.tbz2': [u'unstable', 0], u'artsplugin-audiofile-3.5.4.tbz2': [u'unstable', 1], u'atlantikdesigner-3.5.7.tbz2': [u'unstable', 1], u'libXxf86vm-1.0.1.tbz2': [u'unstable', 1], u'openldap-2.3.38.tbz2': [u'unstable', 0], u'ethtool-6.tbz2': [u'unstable', 0], u'compizconfig-backend-kconfig-0.5.2.tbz2': [u'unstable', 1], u'DateManip-5.44.tbz2': [u'unstable', 1], u'pyid3lib-0.5.1-r1.tbz2': [u'unstable', 0], u'lzo-1.08-r1.tbz2': [u'unstable', 1], u'zd1211-firmware-1.3.tbz2': [u'unstable', 1], u'docbook-sgml-utils-0.6.14.tbz2': [u'unstable', 1], u'pyogg-1.3-r1.tbz2': [u'unstable', 1], u'gucharmap-1.10.0.tbz2': [u'unstable', 1], u'sqlite-3.4.1.tbz2': [u'unstable', 0], u'qca-1.0-r2.tbz2': [u'unstable', 1], u'gcc-4.2.0.tbz2': [u'unstable', 0], u'libgnomekbd-2.18.2.tbz2': [u'unstable', 0], u'perl-Test-Simple-0.70.tbz2': [u'unstable', 1], u'dvd-slideshow-0.8.0.tbz2': [u'unstable', 1], u'noatun-3.5.7.tbz2': [u'unstable', 1], u'libkonq-3.5.7.tbz2': [u'unstable', 1], u'make-3.81.tbz2': [u'unstable', 1], u'kvm-36-t2.6.22_sabayon.tbz2': [u'unstable', 0], u'xf86-video-openchrome-9999.tbz2': [u'unstable', 1], u'gccmakedep-1.0.2.tbz2': [u'unstable', 1], u'IO-Socket-SSL-1.07.tbz2': [u'unstable', 0], u'fixesproto-4.0.tbz2': [u'unstable', 1], u'ucl-1.03.tbz2': [u'unstable', 1], u'normalize-0.7.7.tbz2': [u'unstable', 1], u'xf86-input-elo2300-1.1.1.tbz2': [u'unstable', 0], u'gtk-theme-switch-2.0.0_rc2-r2.tbz2': [u'unstable', 1], u'eyesapplet-3.5.7.tbz2': [u'unstable', 1], u'strace-4.5.16.tbz2': [u'unstable', 0], u'gst-plugins-neon-0.10.5.tbz2': [u'unstable', 0], u'expect-5.43.0.tbz2': [u'unstable', 1], u'fortune-mod-1.99.1-r2.tbz2': [u'unstable', 1], u'kdvi-3.5.7.tbz2': [u'unstable', 1], u'libbtctl-0.8.2.tbz2': [u'unstable', 1], u'atk-1.18.0.tbz2': [u'unstable', 1], u'chrpath-0.13.tbz2': [u'unstable', 1], u'font-sun-misc-1.0.0.tbz2': [u'unstable', 1], u'reiserfsprogs-3.6.19-r2.tbz2': [u'unstable', 0], u'xcb-util-0.2.tbz2': [u'unstable', 0], u'gtk-sharp-2.10.0.tbz2': [u'unstable', 3], u'file-roller-2.18.4.tbz2': [u'unstable', 0], u'coreutils-6.9-r1.tbz2': [u'unstable', 0], u'MIME-tools-5.420.tbz2': [u'unstable', 1], u'sdl-sound-1.0.1-r2.tbz2': [u'unstable', 1], u'mime-types-7.tbz2': [u'unstable', 1], u'festival-1.96_beta.tbz2': [u'unstable', 1], u'pygobject-2.12.3.tbz2': [u'unstable', 1], u'renamedlg-images-3.5.7.tbz2': [u'unstable', 1], u'dynamite-0.1.tbz2': [u'unstable', 1], u'Locale-gettext-1.05.tbz2': [u'unstable', 1], u'elfutils-0.127.tbz2': [u'unstable', 0], u'Storable-2.16.tbz2': [u'unstable', 1], u'libshout-2.2.2.tbz2': [u'unstable', 1], u'printproto-1.0.3.tbz2': [u'unstable', 1], u'gwenview-1.4.1.tbz2': [u'unstable', 1], u'xbitmaps-1.0.1.tbz2': [u'unstable', 1], u'jython-2.1-r11.tbz2': [u'unstable', 0], u'kvoctrain-3.5.7.tbz2': [u'unstable', 1], u'avahi-0.6.21.tbz2': [u'unstable', 0], u'libsndfile-1.0.17.tbz2': [u'unstable', 1], u'libwww-perl-5.805.tbz2': [u'unstable', 1], u'GD-SVG-0.28.tbz2': [u'unstable', 0], u'wxGTK-2.6.3.3.tbz2': [u'unstable', 1], u'xdelta-3.0-r1.tbz2': [u'unstable', 0], u'xorg-docs-1.4-r1.tbz2': [u'unstable', 0], u'Test-Harness-2.64.tbz2': [u'unstable', 1], u'ksynaptics-0.3.3.tbz2': [u'unstable', 1], u'libkpimidentities-3.5.7.tbz2': [u'unstable', 1], u'pyxml-0.8.4-r1.tbz2': [u'unstable', 0], u'gtk-vnc-0.1.0.tbz2': [u'unstable', 0], u'Crypt-SSLeay-0.55.tbz2': [u'unstable', 0], u'emul-linux-x86-baselibs-10.2.tbz2': [u'unstable', 1], u'kgpg-3.5.7.tbz2': [u'unstable', 1], u'baselayout-1.12.10-r4.tbz2': [u'unstable', 0], u'linuxwacom-0.7.4_p3.tbz2': [u'unstable', 1], u'libXv-1.0.3.tbz2': [u'unstable', 1], u'libopensync-0.22.tbz2': [u'unstable', 1], u'kig-3.5.7.tbz2': [u'unstable', 1], u'icon-slicer-0.3.tbz2': [u'unstable', 1], u'kdeartwork-wallpapers-3.5.6.tbz2': [u'unstable', 1], u'gnome-sharp-2.16.0.tbz2': [u'unstable', 1], u'mplayerplug-in-3.45.tbz2': [u'unstable', 0], u'bcm43xx-fwcutter-006.tbz2': [u'unstable', 1], u'pysqlite-2.3.5.tbz2': [u'unstable', 1], u'ksnake-3.5.7.tbz2': [u'unstable', 1], u'meanwhile-1.0.2.tbz2': [u'unstable', 1], u'libpng-1.2.19.tbz2': [u'unstable', 0], u'resourceproto-1.0.2.tbz2': [u'unstable', 1], u'numeric-24.2-r6.tbz2': [u'unstable', 0], u'xf86-input-mouse-1.2.2.tbz2': [u'unstable', 0], u'imlib-1.9.15-r1.tbz2': [u'unstable', 1], u'kpersonalizer-3.5.7.tbz2': [u'unstable', 1], u'Net-DBus-0.33.4.tbz2': [u'unstable', 1], u'Net-DNS-0.61.tbz2': [u'unstable', 0], u'smpeg-0.4.4-r9.tbz2': [u'unstable', 1], u'openobex-1.3.tbz2': [u'unstable', 1], u'wxGTK-2.8.4.0.tbz2': [u'unstable', 1], u'xrandr-1.2.2.tbz2': [u'unstable', 0], u'jre-1.4.2.tbz2': [u'unstable', 1], u'java-config-2.0.33-r1.tbz2': [u'unstable', 1], u'ksnapshot-3.5.7.tbz2': [u'unstable', 1], u'gnome-media-2.18.0-r1.tbz2': [u'unstable', 0], u'myspell-it-20060316.tbz2': [u'unstable', 1], u'glade-sharp-1.0.10.tbz2': [u'unstable', 1], u'XML-XPath-1.13.tbz2': [u'unstable', 1], u'gst-plugins-gnomevfs-0.10.14.tbz2': [u'unstable', 0], u'libkdegames-3.5.7.tbz2': [u'unstable', 1], u'pythondialog-2.7.tbz2': [u'unstable', 1], u'myspell-en-20060316.tbz2': [u'unstable', 1], u'id3-py-1.2.tbz2': [u'unstable', 1], u'kttsd-3.5.7.tbz2': [u'unstable', 1], u'skype-1.4.0.99.tbz2': [u'unstable', 0], u'speedtouch-1.3.1-r3.tbz2': [u'unstable', 1], u'Net-IP-1.25-r1.tbz2': [u'unstable', 1], u'dvdrip-0.98.8.tbz2': [u'unstable', 0], u'net-snmp-5.4.1-r1.tbz2': [u'unstable', 0], u'iso-codes-0.58.tbz2': [u'unstable', 1], u'kdeartwork-emoticons-3.5.4.tbz2': [u'unstable', 1], u'squashfs-tools-3.2_p2.tbz2': [u'unstable', 0], u'xrdb-1.0.4.tbz2': [u'unstable', 0], u'zip-2.32.tbz2': [u'unstable', 1], u'hwdata-gentoo-0.3.tbz2': [u'unstable', 1], u'xf86-input-hyperpen-1.1.0.tbz2': [u'unstable', 1], u'libXrandr-1.2.2.tbz2': [u'unstable', 0], u'Event-ExecFlow-0.63.tbz2': [u'unstable', 1], u'libwnck-2.18.3.tbz2': [u'unstable', 0], u'gnome-python-desktop-2.18.0.tbz2': [u'unstable', 1], u'xf86-input-tek4957-1.1.0.tbz2': [u'unstable', 1], u'gst-plugins-a52dec-0.10.6.tbz2': [u'unstable', 0], u'bin86-0.16.17.tbz2': [u'unstable', 1], u'gnome-icon-theme-2.18.0.tbz2': [u'unstable', 1], u'kdegames-meta-3.5.7.tbz2': [u'unstable', 1], u'libvisual-0.4.0.tbz2': [u'unstable', 1], u'timidity-eawpatches-12-r5.tbz2': [u'unstable', 1], u'docbook-sgml-dtd-4.1-r3.tbz2': [u'unstable', 1], u'xf86-video-siliconmotion-1.5.1.tbz2': [u'unstable', 1], u'kweather-3.5.7.tbz2': [u'unstable', 1], u'libgnomeui-2.18.1.tbz2': [u'unstable', 1], u'libgnomeprintui-2.18.0.tbz2': [u'unstable', 1], u'gmp-4.2.1-r1.tbz2': [u'unstable', 1], u'atlantik-3.5.7.tbz2': [u'unstable', 1], u'xf86miscproto-0.9.2.tbz2': [u'unstable', 1], u'libsvg-cairo-0.1.6.tbz2': [u'unstable', 1], u'gnome-main-menu-9999.tbz2': [u'unstable', 1], u'dbus-python-0.82.2.tbz2': [u'unstable', 0], u'yacc-1.9.1-r3.tbz2': [u'unstable', 1], u'URI-1.35.tbz2': [u'unstable', 1], u'javatoolkit-0.2.0-r1.tbz2': [u'unstable', 1], u'm17n-lib-1.3.4.tbz2': [u'unstable', 1], u'cddb-py-1.4.tbz2': [u'unstable', 1], u'kmail-3.5.7-r2.tbz2': [u'unstable', 0], u'man-pages-cs-0.16-r1.tbz2': [u'unstable', 1], u'xf86driproto-2.0.3.tbz2': [u'unstable', 1], u'gzip-1.3.12.tbz2': [u'unstable', 1], u'gle-3.1.0-r1.tbz2': [u'unstable', 1], u'giflib-4.1.4.tbz2': [u'unstable', 1], u'automake-1.9.6-r2.tbz2': [u'unstable', 1], u'libatomic_ops-1.2-r1.tbz2': [u'unstable', 0], u'aspell-ca-0.60.20040130.tbz2': [u'unstable', 0], u'kenolaba-3.5.7.tbz2': [u'unstable', 1], u'libuninameslist-20060907.tbz2': [u'unstable', 0], u'openvpn-2.0.7-r2.tbz2': [u'unstable', 1], u'dejavu-2.19.tbz2': [u'unstable', 0], u'x11vnc-0.9.2-r1.tbz2': [u'unstable', 0], u'knetworkmanager-0.2_pre20070702-r1.tbz2': [u'unstable', 1], u'kate-3.5.7-r1.tbz2': [u'unstable', 0], u'Number-Compare-0.01.tbz2': [u'unstable', 1], u'kdeartwork-kworldclock-3.5.7.tbz2': [u'unstable', 1], u'foomatic-filters-ppds-20070501.tbz2': [u'unstable', 0], u'libiconv-0.tbz2': [u'unstable', 1], u'audacity-1.3.3.tbz2': [u'unstable', 1], u'jdk-1.5.0.tbz2': [u'unstable', 1], u'ortp-0.7.1-r1.tbz2': [u'unstable', 1], u'mhash-0.9.9-r1.tbz2': [u'unstable', 0], u'inputproto-1.4.2.1.tbz2': [u'unstable', 0], u'xf86-video-dummy-0.2.0.tbz2': [u'unstable', 1], u'bzip2-1.0.4.tbz2': [u'unstable', 1], u'kdeedu-meta-3.5.7.tbz2': [u'unstable', 1], u'kicker-applets-3.5.7.tbz2': [u'unstable', 1], u'libkpimexchange-3.5.7.tbz2': [u'unstable', 1], u'gst-plugins-libvisual-0.10.14.tbz2': [u'unstable', 0], u'cowsay-3.03-r1.tbz2': [u'unstable', 0], u'ktuberling-3.5.7.tbz2': [u'unstable', 1], u'libieee1284-0.2.10.tbz2': [u'unstable', 0], u'commoncpp2-1.5.7.tbz2': [u'unstable', 0], u'aspell-ru-0.99.1.tbz2': [u'unstable', 1], u'libvisual-0.2.0.tbz2': [u'unstable', 1], u'eog-2.18.2.tbz2': [u'unstable', 0], u'libXdamage-1.1.1.tbz2': [u'unstable', 1], u'kpoker-3.5.7.tbz2': [u'unstable', 1], u'sdl-net-1.2.7.tbz2': [u'unstable', 0], u'libXft-2.1.12-r90.tbz2': [u'unstable', 1], u'graphviz-2.12.tbz2': [u'unstable', 1], u'quanta-3.5.7.tbz2': [u'unstable', 1], u'kiten-3.5.7.tbz2': [u'unstable', 1], u'warsow-0.3.2.tbz2': [u'unstable', 0], u'gtk-sharp-1.0.10.tbz2': [u'unstable', 1], u'parted-1.8.8.tbz2': [u'unstable', 0], u'gnome-speech-0.4.16.tbz2': [u'unstable', 0], u'gst-plugins-cdparanoia-0.10.14.tbz2': [u'unstable', 0], u'xineramaproto-1.1.2.tbz2': [u'unstable', 1], u'binutils-2.18.tbz2': [u'unstable', 0], u'deskbar-applet-2.18.1.tbz2': [u'unstable', 1], u'orange-0.3.tbz2': [u'unstable', 1], u'xfontsel-1.0.2.tbz2': [u'unstable', 1], u'emul-linux-x86-java-1.6.0.02.tbz2': [u'unstable', 0], u'rgb-1.0.1.tbz2': [u'unstable', 1], u'nm-applet-0.6.5-r1.tbz2': [u'unstable', 1], u'xinit-1.0.5-r1.tbz2': [u'unstable', 0], u'distcc-2.18.3-r10.tbz2': [u'unstable', 1], u'kbproto-1.0.3.tbz2': [u'unstable', 1], u'fusion-icon-9999.tbz2': [u'unstable', 1], u'PlRPC-0.2020-r1.tbz2': [u'unstable', 0], u'aspell-br-0.50.2.tbz2': [u'unstable', 1], u'gst-plugins-ffmpeg-0.10.2.tbz2': [u'unstable', 1], u'xf86-video-nsc-2.8.3.tbz2': [u'unstable', 0], u'automake-wrapper-3-r1.tbz2': [u'unstable', 1], u'font-bh-75dpi-1.0.0.tbz2': [u'unstable', 1], u'Crypt-SmbHash-0.12.tbz2': [u'unstable', 1], u'kdelibs-3.5.7-r10.tbz2': [u'unstable', 1], u'setxkbmap-1.0.4.tbz2': [u'unstable', 0], u'ksmserver-3.5.7.tbz2': [u'unstable', 1], u'kedit-3.5.7.tbz2': [u'unstable', 1], u'scim-1.4.7.tbz2': [u'unstable', 0], u'wget-1.10.2.tbz2': [u'unstable', 1], u'ntfs3g-1.826.tbz2': [u'unstable', 0], u'xgamma-1.0.2.tbz2': [u'unstable', 0], u'kjumpingcube-3.5.7.tbz2': [u'unstable', 1], u'mmpython-0.4.10.tbz2': [u'unstable', 1], u'libol-0.3.18.tbz2': [u'unstable', 1], u'netpbm-10.39.0.tbz2': [u'unstable', 0], u'openssh-4.7_p1-r1.tbz2': [u'unstable', 0], u'urlgrabber-3.0.0.tbz2': [u'unstable', 1], u'pam_ldap-183.tbz2': [u'unstable', 1], u'laptop-mode-tools-1.34.tbz2': [u'unstable', 0], u'apr-1.2.11.tbz2': [u'unstable', 2], u'kmouth-3.5.7.tbz2': [u'unstable', 1], u'pyparted-1.8.9.tbz2': [u'unstable', 0], u'keychain-2.6.8.tbz2': [u'unstable', 1], u'scim-m17n-0.2.2.tbz2': [u'unstable', 1], u'libgnome-2.18.0.tbz2': [u'unstable', 1], u'ipod-sharp-0.6.3.tbz2': [u'unstable', 0], u'xf86-video-cyrix-1.1.0.tbz2': [u'unstable', 1], u'c-ares-1.4.0.tbz2': [u'unstable', 0], u'aspell-is-0.51.1.0.tbz2': [u'unstable', 1], u'gscanbus-0.7.1.tbz2': [u'unstable', 1], u'dmxproto-2.2.2.tbz2': [u'unstable', 1], u'lame-3.97-r1.tbz2': [u'unstable', 0], u'ocrad-0.15.tbz2': [u'unstable', 1], u'libpixman-0.1.6.tbz2': [u'unstable', 1], u'enblend-3.0.tbz2': [u'unstable', 0], u'azureus-2.5.0.4-r1.tbz2': [u'unstable', 1], u'libdts-0.0.2-r5.tbz2': [u'unstable', 1], u'klamav-0.41.tbz2': [u'unstable', 1], u'eselect-emacs-1.2.tbz2': [u'unstable', 0], u'aspell-pl-6.0.20061121.0.tbz2': [u'unstable', 0], u'libXtst-1.0.3.tbz2': [u'unstable', 0], u'gnome-cups-manager-0.31-r2.tbz2': [u'unstable', 1], u'libXres-1.0.3.tbz2': [u'unstable', 1], u'gnome-applets-2.18.0-r2.tbz2': [u'unstable', 0], u'xf86-input-void-1.1.1.tbz2': [u'unstable', 0], u'liblazy-0.1.tbz2': [u'unstable', 1], u'setuptools-0.6_rc6.tbz2': [u'unstable', 0], u'nano-2.0.6.tbz2': [u'unstable', 0], u'evieext-1.0.2.tbz2': [u'unstable', 1], u'ktorrent-2.2.2.tbz2': [u'unstable', 0], u'gtk2-perl-1.145.tbz2': [u'unstable', 0], u'lcms-1.17.tbz2': [u'unstable', 0], u'pcmcia-2.6.13.tbz2': [u'unstable', 1], u'nvidia-settings-1.0.20070621.tbz2': [u'unstable', 0], u'kftpgrabber-0.8.1-r1.tbz2': [u'unstable', 0], u'font-adobe-100dpi-1.0.0.tbz2': [u'unstable', 1], u'librsvg-2.16.1-r2.tbz2': [u'unstable', 0], u'xf86-video-vmware-10.15.0.tbz2': [u'unstable', 1], u'emul-linux-x86-medialibs-10.2.tbz2': [u'unstable', 1], u'man-pages-ja-20070515.tbz2': [u'unstable', 0], u'powersave-0.14.0.tbz2': [u'unstable', 0], u'gst-plugins-xvideo-0.10.14.tbz2': [u'unstable', 0], u'rescan-scsi-bus-1.25.tbz2': [u'unstable', 0], u'kxkb-3.5.7.tbz2': [u'unstable', 1], u'aspell-uk-1.4.0.0.tbz2': [u'unstable', 0], u'kgamma-3.5.7.tbz2': [u'unstable', 1], u'init-0.tbz2': [u'unstable', 1], u'pam_pwdfile-0.99.tbz2': [u'unstable', 1], u'gnomevfs-sharp-2.16.0.tbz2': [u'unstable', 1], u'texi2html-1.76.tbz2': [u'unstable', 1], u'reswrap-3.2.0.tbz2': [u'unstable', 1], u'bluez-bluefw-1.0.tbz2': [u'unstable', 1], u'debianutils-2.23.1.tbz2': [u'unstable', 0], u'kdeartwork-kwin-styles-3.5.7.tbz2': [u'unstable', 1], u'glproto-1.4.8.tbz2': [u'unstable', 3], u'libcdio-0.78.2.tbz2': [u'unstable', 1], u'sane-backends-1.0.18-r4.tbz2': [u'unstable', 0], u'git-1.5.3.tbz2': [u'unstable', 0], u'alsa-firmware-1.0.14.tbz2': [u'unstable', 0], u'avalon-logkit-1.2-r2.tbz2': [u'unstable', 1], u'kdegraphics-meta-3.5.7.tbz2': [u'unstable', 1], u'xf86-video-tga-1.1.0.tbz2': [u'unstable', 1], u'libwpd-0.8.10.tbz2': [u'unstable', 0], u'soappy-0.12.0.tbz2': [u'unstable', 1], u'rhythmbox-0.10.1.tbz2': [u'unstable', 0], u'portage-utils-0.1.28.tbz2': [u'unstable', 0], u'libvorbis-1.2.0.tbz2': [u'unstable', 0], u'xextproto-7.0.2.tbz2': [u'unstable', 1], u'module-build-0.28.08.tbz2': [u'unstable', 0], u'secpolicy-3.5.6.tbz2': [u'unstable', 1], u'unionfs-utils-0.1.tbz2': [u'unstable', 1], u'jre-1.6.0.tbz2': [u'unstable', 1], u'ktip-3.5.7.tbz2': [u'unstable', 1], u'xinetd-2.3.14.tbz2': [u'unstable', 0], u'bind-tools-9.4.1_p1.tbz2': [u'unstable', 0], u'xfs-1.0.4.tbz2': [u'unstable', 1], u'kwalletmanager-3.5.7.tbz2': [u'unstable', 1], u'kitchensync-3.5.7.tbz2': [u'unstable', 1], u'kmines-3.5.7.tbz2': [u'unstable', 1], u'xf86-video-v4l-0.1.1.tbz2': [u'unstable', 1], u'xscreensaver-5.03.tbz2': [u'unstable', 0], u'encodings-1.0.2.tbz2': [u'unstable', 1], u'xev-1.0.2.tbz2': [u'unstable', 1], u'portmap-6.0.tbz2': [u'unstable', 0], u'kochi-substitute-20030809-r3.tbz2': [u'unstable', 1], u'icon-naming-utils-0.8.2-r1.tbz2': [u'unstable', 0], u'raidutils-0.0.6-r2.tbz2': [u'unstable', 1], u'wesnoth-1.2.6.tbz2': [u'unstable', 0], u'docbook-xml-simple-dtd-4.1.2.4-r2.tbz2': [u'unstable', 1], u'xfsdump-2.2.45.tbz2': [u'unstable', 0], u'Geography-Countries-1.4.tbz2': [u'unstable', 1], u'xrefresh-1.0.2.tbz2': [u'unstable', 1], u'gtkspell-2.0.11-r1.tbz2': [u'unstable', 1], u'xhost-1.0.2.tbz2': [u'unstable', 0], u'STLport-5.1.2.tbz2': [u'unstable', 1], u'gsf-sharp-0.8.tbz2': [u'unstable', 1], u'perl-File-Temp-0.18.tbz2': [u'unstable', 0], u'libXxf86misc-1.0.1.tbz2': [u'unstable', 1], u'libgpg-error-1.5.tbz2': [u'unstable', 1], u'sablotron-1.0.3.tbz2': [u'unstable', 1], u'automake-1.6.3.tbz2': [u'unstable', 1], u'fuse-2.7.0.tbz2': [u'unstable', 0], u'dd-rescue-1.12.tbz2': [u'unstable', 1], u'libgpod-0.5.2.tbz2': [u'unstable', 0], u'ffmpeg-0.4.9_p20070616-r1.tbz2': [u'unstable', 0], u'gnome-mag-0.14.6.tbz2': [u'unstable', 0], u'xcmiscproto-1.1.2.tbz2': [u'unstable', 1], u'IO-Compress-Base-2.005.tbz2': [u'unstable', 0], u'kdemultimedia-kappfinder-data-3.5.7.tbz2': [u'unstable', 1], u'myspell-ga-20060316.tbz2': [u'unstable', 1], u'pinentry-0.7.3.tbz2': [u'unstable', 0], u'readline-5.2_p7.tbz2': [u'unstable', 0], u'less-406.tbz2': [u'unstable', 0], u'konqueror-3.5.7-r2.tbz2': [u'unstable', 0], u'jre-1.5.0.tbz2': [u'unstable', 1], u'ktnef-3.5.7.tbz2': [u'unstable', 1], u'man-pages-es-1.55-r1.tbz2': [u'unstable', 1], u'djvu-3.5.19-r1.tbz2': [u'unstable', 0], u'xeyes-1.0.1.tbz2': [u'unstable', 1], u'gdb-6.6-r2.tbz2': [u'unstable', 1], u'sdl-image-1.2.6.tbz2': [u'unstable', 0], u'sun-javamail-1.4.tbz2': [u'unstable', 1], u'kde-meta-3.5.7.tbz2': [u'unstable', 1], u'compiz-fusion-plugins-extra-0.5.2.tbz2': [u'unstable', 1], u'timezone-data-2007g.tbz2': [u'unstable', 0], u'compizconfig-backend-gconf-0.5.2.tbz2': [u'unstable', 1], u'linux-atm-2.4.1-r2.tbz2': [u'unstable', 1], u'libart_lgpl-2.3.19-r1.tbz2': [u'unstable', 1], u'libsoup-2.2.100.tbz2': [u'unstable', 1], u'kdeadmin-meta-3.5.7.tbz2': [u'unstable', 1], u'gnome-common-2.12.0.tbz2': [u'unstable', 1], u'lisa-3.5.7.tbz2': [u'unstable', 1], u'perl-Time-HiRes-1.97.07.tbz2': [u'unstable', 1], u'libXau-1.0.3.tbz2': [u'unstable', 1], u'monodoc-1.2.5.tbz2': [u'unstable', 0], u'ekiga-2.0.9.tbz2': [u'unstable', 0], u'jfsutils-1.1.12.tbz2': [u'unstable', 0], u'gst-plugins-sidplay-0.10.6.tbz2': [u'unstable', 0], u'pyrex-0.9.5.1a.tbz2': [u'unstable', 1], u'prism54-firmware-1.0.4.3.tbz2': [u'unstable', 1], u'librss-3.5.6.tbz2': [u'unstable', 1], u'libXt-1.0.5.tbz2': [u'unstable', 1], u'automake-1.10.tbz2': [u'unstable', 1], u'xjavac-20041208-r5.tbz2': [u'unstable', 0], u'bdftopcf-1.0.0.tbz2': [u'unstable', 1], u'telnet-bsd-1.2-r1.tbz2': [u'unstable', 1], u'gst-plugins-faad-0.10.5.tbz2': [u'unstable', 0], u'findutils-4.3.8-r1.tbz2': [u'unstable', 0], u'pycrypto-2.0.1-r6.tbz2': [u'unstable', 1], u'libgksu-2.0.5.tbz2': [u'unstable', 1], u'xf86-input-evdev-1.1.5-r1.tbz2': [u'unstable', 1], u'rp-pppoe-3.8-r1.tbz2': [u'unstable', 1], u'smplayer-0.5.59.tbz2': [u'unstable', 0], u'pax-utils-0.1.16.tbz2': [u'unstable', 0], u'libFS-1.0.0.tbz2': [u'unstable', 1], u'ant-core-1.7.0.tbz2': [u'unstable', 1], u't1lib-5.0.2.tbz2': [u'unstable', 1], u'libpaper-1.1.21.tbz2': [u'unstable', 1], u'ipw3945d-1.7.22-r10.tbz2': [u'unstable', 1], u'gnome-menus-2.18.3.tbz2': [u'unstable', 0], u'libiec61883-1.1.0.tbz2': [u'unstable', 1], u'kontact-specialdates-3.5.7.tbz2': [u'unstable', 1], u'slang-1.4.9-r2.tbz2': [u'unstable', 1], u'gst-plugins-musepack-0.10.5.tbz2': [u'unstable', 0], u'liblo-0.23.tbz2': [u'unstable', 1], u'kdeartwork-meta-3.5.7.tbz2': [u'unstable', 1], u'libnjb-2.2.5-r1.tbz2': [u'unstable', 0], u'xine-lib-1.1.8.tbz2': [u'unstable', 0], u'madwifi-ng-0.9.4-t2.6.22_sabayon.tbz2': [u'unstable', 1], u'gnome-vfsmm-2.18.0.tbz2': [u'unstable', 1], u'bio2jack-0.7.tbz2': [u'unstable', 1], u'gnome2-user-docs-2.18.2.tbz2': [u'unstable', 0], u'libksba-1.0.2.tbz2': [u'unstable', 0], u'openh323-1.18.0-r1.tbz2': [u'unstable', 1], u'networkmanager-vpnc-0.7.0.tbz2': [u'unstable', 1], u'wvdial-1.60.tbz2': [u'unstable', 0], u'gst-plugins-lame-0.10.6.tbz2': [u'unstable', 0], u'glib-perl-1.144.tbz2': [u'unstable', 1], u'kdepim-wizards-3.5.7.tbz2': [u'unstable', 1], u'HTML-Tree-3.23.tbz2': [u'unstable', 1], u'boost-build-1.34.1.tbz2': [u'unstable', 0], u'autoconf-2.13.tbz2': [u'unstable', 1], u'bcel-5.2.tbz2': [u'unstable', 1], u'Convert-ASN1-0.21.tbz2': [u'unstable', 1], u'docbook-xml-dtd-4.1.2-r6.tbz2': [u'unstable', 1], u'kscreensaver-3.5.7.tbz2': [u'unstable', 1], u'libdv-1.0.0-r2.tbz2': [u'unstable', 1], u'linuxtv-dvb-headers-3.1.tbz2': [u'unstable', 1], u'gpgme-1.1.5.tbz2': [u'unstable', 1], u'portatosourceview-2.16.1.tbz2': [u'unstable', 1], u'xf86-input-summa-1.1.0.tbz2': [u'unstable', 1], u'etcproposals-1.3.tbz2': [u'unstable', 1], u'libintl-0.tbz2': [u'unstable', 1], u'compiz-0.5.2.tbz2': [u'unstable', 1], u'cmake-2.4.7-r1.tbz2': [u'unstable', 0], u'libotf-0.9.6.tbz2': [u'unstable', 0], u'kdemultimedia-arts-3.5.7.tbz2': [u'unstable', 1], u'AnyEvent-2.5.3.tbz2': [u'unstable', 0], u'xf86-video-apm-1.1.1.tbz2': [u'unstable', 1], u'emul-linux-x86-xlibs-10.1.tbz2': [u'unstable', 0], u'icu-3.6-r1.tbz2': [u'unstable', 0], u'openjade-1.3.2-r1.tbz2': [u'unstable', 1], u'khangman-3.5.7.tbz2': [u'unstable', 1], u'soundkonverter-0.3.4.tbz2': [u'unstable', 0], u'iwidgets-4.0.1-r1.tbz2': [u'unstable', 0], u'gimp-print-4.2.7.tbz2': [u'unstable', 1], u'xv-3.10a-r14.tbz2': [u'unstable', 0], u'xf86-input-spaceorb-1.1.1.tbz2': [u'unstable', 0], u'evilred-0.2.tbz2': [u'unstable', 1], u'pommed-1.8.tbz2': [u'unstable', 0], u'xf86-video-i810-2.1.1.tbz2': [u'unstable', 0], u'lsdvd-0.16.tbz2': [u'unstable', 1], u'krdc-3.5.7.tbz2': [u'unstable', 1], u'xf86-input-magictouch-1.0.0.5.tbz2': [u'unstable', 1], u'libdaemon-0.12.tbz2': [u'unstable', 1], u'xf86-input-dynapro-1.1.1.tbz2': [u'unstable', 0], u'sun-jms-1.1-r2.tbz2': [u'unstable', 1], u'libcroco-0.6.1.tbz2': [u'unstable', 1], u'libmovtar-0.1.3-r1.tbz2': [u'unstable', 1], u'libgda-1.2.4.tbz2': [u'unstable', 1], u'x264-svn-20070325.tbz2': [u'unstable', 1], u'luit-1.0.2.tbz2': [u'unstable', 1], u'gd-2.0.35.tbz2': [u'unstable', 0], u'psutils-1.17.tbz2': [u'unstable', 1], u'zopeinterface-3.0.1-r1.tbz2': [u'unstable', 1], u'certmanager-3.5.7-r1.tbz2': [u'unstable', 0], u'perl-libnet-1.21.tbz2': [u'unstable', 0], u'gtkhtml-sharp-2.16.0.tbz2': [u'unstable', 1], u'libfontenc-1.0.4.tbz2': [u'unstable', 1], u'synce-librapi2-0.9.1.tbz2': [u'unstable', 1], u'Archive-Zip-1.20.tbz2': [u'unstable', 0], u'notification-daemon-0.3.7.tbz2': [u'unstable', 1], u'm17n-db-1.3.4.tbz2': [u'unstable', 1], u'libgnomemm-2.0.1.tbz2': [u'unstable', 1], u'tar-1.18-r2.tbz2': [u'unstable', 0], u'kommander-3.5.7.tbz2': [u'unstable', 1], u'Text-Iconv-1.4.tbz2': [u'unstable', 1], u'libnotify-0.4.4.tbz2': [u'unstable', 1], u'kdenetwork-filesharing-3.5.7.tbz2': [u'unstable', 1], u'docbook-xml-dtd-4.3-r1.tbz2': [u'unstable', 1], u'ssmtp-2.61-r2.tbz2': [u'unstable', 1], u'edb-1.0.5.007.tbz2': [u'unstable', 1], u'et131x-1.2.3-r1-t2.6.22_sabayon.tbz2': [u'unstable', 1], u'bsf-2.4.0-r1.tbz2': [u'unstable', 0], u'aspell-sv-0.51.0.tbz2': [u'unstable', 1], u'ddcxinfo-knoppix-bin-0.6.tbz2': [u'unstable', 1], u'alsa-headers-1.0.14.tbz2': [u'unstable', 0], u'font-ibm-type1-1.0.0.tbz2': [u'unstable', 1], u'attr-2.4.38.tbz2': [u'unstable', 0], u'Parse-Yapp-1.05-r1.tbz2': [u'unstable', 1], u'libquicktime-1.0.0.tbz2': [u'unstable', 1], u'esound-0.2.38-r1.tbz2': [u'unstable', 0], u'ccsm-0.5.2.tbz2': [u'unstable', 1], u'vixie-cron-4.1-r10.tbz2': [u'unstable', 1], u'rt73-firmware-1.8.tbz2': [u'unstable', 1], u'bc-1.06.95.tbz2': [u'unstable', 1], u'libkdenetwork-3.5.7.tbz2': [u'unstable', 1], u'equo-9999-r3.tbz2': [u'unstable', 0], u'pigment-0.1.5.tbz2': [u'unstable', 1], u'mutagen-1.12.tbz2': [u'unstable', 0], u'gst-plugins-dv-0.10.6.tbz2': [u'unstable', 0], u'man-pages-2.64.tbz2': [u'unstable', 0], u'libertas-firmware-5.220.10.tbz2': [u'unstable', 1], u'alsa-tools-1.0.14.tbz2': [u'unstable', 0], u'xf86-video-ati-6.6.3.tbz2': [u'unstable', 1], u'libgnomemm-2.18.0.tbz2': [u'unstable', 1], u'Text-Glob-0.08.tbz2': [u'unstable', 0], u'glew-1.3.5.tbz2': [u'unstable', 0], u'konquest-3.5.7.tbz2': [u'unstable', 1], u'sessreg-1.0.3.tbz2': [u'unstable', 0], u'libmp4v2-1.5.0.1.tbz2': [u'unstable', 1], u'twisted-web-0.7.0.tbz2': [u'unstable', 1], u'dmidecode-2.9.tbz2': [u'unstable', 1], u'networkstatus-3.5.7.tbz2': [u'unstable', 1], u'kmplot-3.5.7.tbz2': [u'unstable', 1], u'alacarte-0.11.3-r1.tbz2': [u'unstable', 0], u'tcmplex-panteltje-0.4.7.tbz2': [u'unstable', 1], u'kmag-3.5.7.tbz2': [u'unstable', 1], u'mono-tools-1.2.4.tbz2': [u'unstable', 0], u'libXinerama-1.0.2.tbz2': [u'unstable', 1], u'rt61-firmware-1.2.tbz2': [u'unstable', 1], u'kopete-3.5.7-r1.tbz2': [u'unstable', 0], u'ifplugd-0.28-r8.tbz2': [u'unstable', 1], u'gtkhtml-3.12.3.tbz2': [u'unstable', 1], u'docbook-xml-simple-dtd-1.0-r1.tbz2': [u'unstable', 1], u'taglib-1.4-r1.tbz2': [u'unstable', 1], u'kdemultimedia-kfile-plugins-3.5.7.tbz2': [u'unstable', 1], u'pyopengl-2.0.1.09-r1.tbz2': [u'unstable', 1], u'libnl-1.0_pre6.tbz2': [u'unstable', 1], u'xf86-video-fbdev-0.3.1.tbz2': [u'unstable', 1], u'freetype-1.3.1-r5.tbz2': [u'unstable', 1], u'sg3_utils-1.24.tbz2': [u'unstable', 0], u'ncompress-4.2.4.2.tbz2': [u'unstable', 0], u'aalib-1.4_rc5.tbz2': [u'unstable', 1], u'autotrace-0.31.1-r2.tbz2': [u'unstable', 0], u'libtheora-1.0_alpha7-r1.tbz2': [u'unstable', 0], u'xdg-utils-1.0.2.tbz2': [u'unstable', 0], u'pyopenssl-0.6-r1.tbz2': [u'unstable', 1], u'Coherence-0.2.1.tbz2': [u'unstable', 1], u'newt-0.52.2.tbz2': [u'unstable', 1], u'airsnort-0.2.7e.tbz2': [u'unstable', 1], u'xf86-video-neomagic-1.1.1.tbz2': [u'unstable', 1], u'font-adobe-utopia-100dpi-1.0.1.tbz2': [u'unstable', 1], u'xsetpointer-1.0.1.tbz2': [u'unstable', 1], u'sandbox-1.2.18.1.tbz2': [u'unstable', 1], u'kiconedit-3.5.7.tbz2': [u'unstable', 1], u'po4a-0.32-r1.tbz2': [u'unstable', 0], u'apr-0.9.12.tbz2': [u'unstable', 1], u'evolution-2.10.3.tbz2': [u'unstable', 0], u'id3lib-3.8.3-r6.tbz2': [u'unstable', 0], u'file-4.21-r1.tbz2': [u'unstable', 0], u'kwordquiz-3.5.7.tbz2': [u'unstable', 1], u'gnome-screensaver-2.18.2-r1.tbz2': [u'unstable', 0], u'e2fsprogs-1.40.2-r10.tbz2': [u'unstable', 1], u'cpufrequtils-002-r3.tbz2': [u'unstable', 0], u'elisa-0.1.6-r1.tbz2': [u'unstable', 1], u'libIDL-0.8.8.tbz2': [u'unstable', 1], u'libxcb-1.0.tbz2': [u'unstable', 0], u'chillispot-1.1.0.tbz2': [u'unstable', 0], u'konq-plugins-3.5.7.tbz2': [u'unstable', 1], u'filezilla-3.0.0.tbz2': [u'unstable', 0], u'aspell-fi-0.7.0.tbz2': [u'unstable', 1], u'pwgen-2.05.tbz2': [u'unstable', 1], u'knode-3.5.7.tbz2': [u'unstable', 1], u'jbigkit-1.6-r1.tbz2': [u'unstable', 1], u'nasm-0.98.39-r3.tbz2': [u'unstable', 1], u'sharutils-4.6.3.tbz2': [u'unstable', 1], u'perl-Scalar-List-Utils-1.19.tbz2': [u'unstable', 1], u'libutempter-1.1.5.tbz2': [u'unstable', 1], u'ubuntulooks-0.9.12.tbz2': [u'unstable', 1], u'kdeaddons-meta-3.5.7.tbz2': [u'unstable', 1], u'xf86bigfontproto-1.1.2.tbz2': [u'unstable', 1], u'libbonobo-2.18.0.tbz2': [u'unstable', 1], u'kviewshell-3.5.7.tbz2': [u'unstable', 1], u'kdnssd-avahi-0.1.2.tbz2': [u'unstable', 1], u'gnupg-2.0.6.tbz2': [u'unstable', 0], u'libgsf-1.14.6.tbz2': [u'unstable', 0], u'scrnsaverproto-1.1.0.tbz2': [u'unstable', 1], u'gst-plugins-ximagesrc-0.10.6.tbz2': [u'unstable', 0], u'gst-plugins-mad-0.10.6.tbz2': [u'unstable', 0], u'kdeartwork-icewm-themes-3.5.7.tbz2': [u'unstable', 1], u'mc-4.6.1-r4.tbz2': [u'unstable', 0], u'wpa_supplicant-0.5.8.tbz2': [u'unstable', 0], u'Class-Singleton-1.03.tbz2': [u'unstable', 1], u'libao-pulse-0.9.3.tbz2': [u'unstable', 1], u'libmcrypt-2.5.8.tbz2': [u'unstable', 0], u'drkonqi-3.5.7.tbz2': [u'unstable', 1], u'imake-1.0.2.tbz2': [u'unstable', 1], u'gst-plugins-x-0.10.14.tbz2': [u'unstable', 0], u'kdenetwork-meta-3.5.7.tbz2': [u'unstable', 1], u'libglademm-2.0.1.tbz2': [u'unstable', 1], u'manencode-1.0.tbz2': [u'unstable', 0], u'kdeartwork-kscreensaver-3.5.7.tbz2': [u'unstable', 1], u'kdegraphics-kfile-plugins-3.5.7.tbz2': [u'unstable', 1], u'wvstreams-4.4.tbz2': [u'unstable', 0], u'gamin-0.1.9.tbz2': [u'unstable', 0], u'libmad-0.15.1b-r4.tbz2': [u'unstable', 0], u'culmus-0.101-r1.tbz2': [u'unstable', 1], u'audiofile-0.2.6-r3.tbz2': [u'unstable', 1], u'Digest-SHA1-2.11.tbz2': [u'unstable', 1], u'libglade-2.6.1.tbz2': [u'unstable', 0], u'digikam-0.9.2.tbz2': [u'unstable', 0], u'HTML-Parser-3.56.tbz2': [u'unstable', 1], u'ncftp-3.2.0.tbz2': [u'unstable', 1], u'nvidia-drivers-100.14.19-r10-t2.6.22_sabayon.tbz2': [u'unstable', 0], u'hplip-2.7.7-r2.tbz2': [u'unstable', 0], u'xf86-video-glint-1.1.1.tbz2': [u'unstable', 1], u'man-pages-it-2.43.tbz2': [u'unstable', 1], u'mt-st-0.9b.tbz2': [u'unstable', 1], u'XML-SAX-Writer-0.50.tbz2': [u'unstable', 1], u'libxklavier-3.2.tbz2': [u'unstable', 0], u'openslp-1.2.1-r1.tbz2': [u'unstable', 0], u'lzo-2.02-r1.tbz2': [u'unstable', 3], u'xine-ui-0.99.5.tbz2': [u'unstable', 0], u'bash-3.2_p17-r1.tbz2': [u'unstable', 0], u'qt-3.3.8-r3.tbz2': [u'unstable', 0], u'Sys-Syslog-0.18.tbz2': [u'unstable', 1], u'eselect-oodict-20061117.tbz2': [u'unstable', 1], u'font-screen-cyrillic-1.0.1.tbz2': [u'unstable', 1], u'automake-1.7.9-r1.tbz2': [u'unstable', 1], u'DateTime-0.39.tbz2': [u'unstable', 0], u'libtar-1.2.11-r1.tbz2': [u'unstable', 1], u'hwinfo-13.28.tbz2': [u'unstable', 0], u'IO-Compress-Zlib-2.005.tbz2': [u'unstable', 0], u'gpu-detector-1.9.9.tbz2': [u'unstable', 1], u'enscript-1.6.4-r3.tbz2': [u'unstable', 1], u'wine-doors-0.1.tbz2': [u'unstable', 1], u'swig-1.3.31.tbz2': [u'unstable', 1], u'libXScrnSaver-1.1.2.tbz2': [u'unstable', 1], u'java-config-1.3.7.tbz2': [u'unstable', 1], u'nexuiz-2.3.tbz2': [u'unstable', 1], u'font-sony-misc-1.0.0.tbz2': [u'unstable', 1], u'sgml-common-0.6.3-r5.tbz2': [u'unstable', 1], u'libsigc++-2.0.17.tbz2': [u'unstable', 3], u'gstreamer-0.10.14.tbz2': [u'unstable', 0], u'lightscribe-simplelabeler-1.4.128.1.tbz2': [u'unstable', 1], u'netkit-fingerd-0.17-r3.tbz2': [u'unstable', 1], u'libkmime-3.5.7.tbz2': [u'unstable', 1], u'xf86-video-sisusb-0.8.1.tbz2': [u'unstable', 1], u'kregexpeditor-3.5.7.tbz2': [u'unstable', 1], u'libgnomecanvasmm-2.16.0.tbz2': [u'unstable', 1], u'inkscape-0.45.1.tbz2': [u'unstable', 1], u'wireless-tools-29_pre22.tbz2': [u'unstable', 0], u'syslog-ng-2.0.5.tbz2': [u'unstable', 0], u'gnome-keyring-manager-2.18.0.tbz2': [u'unstable', 1], u'libtool-1.5.24.tbz2': [u'unstable', 0], u'DBD-SQLite-1.13.tbz2': [u'unstable', 1], u'ksysguard-3.5.7.tbz2': [u'unstable', 1], u'xf86dga-1.0.2.tbz2': [u'unstable', 1], u'libkscan-3.5.7.tbz2': [u'unstable', 1], u'digest-base-1.15.tbz2': [u'unstable', 1], u'simgear-0.3.10.tbz2': [u'unstable', 1], u'gtk+-2.10.14.tbz2': [u'unstable', 0], u'portage-2.1.3.9.tbz2': [u'unstable', 1], u'Text-CharWidth-0.04.tbz2': [u'unstable', 1], u'libtasn1-1.1.tbz2': [u'unstable', 0], u'xtrans-1.0.4.tbz2': [u'unstable', 0], u'mailx-8.1.2.20050715-r1.tbz2': [u'unstable', 1], u'language-configuration-helpers-1.2.0.tbz2': [u'unstable', 1], u'xloadimage-4.1-r5.tbz2': [u'unstable', 0], u'tk-8.4.15.tbz2': [u'unstable', 0], u'murrine-0.10.tbz2': [u'unstable', 1], u'commons-cli-1.0-r5.tbz2': [u'unstable', 1], u'mbrola-3.0.1h-r4.tbz2': [u'unstable', 1], u'libXmu-1.0.3.tbz2': [u'unstable', 1], u'ettercap-0.7.3-r2.tbz2': [u'unstable', 1], u'kfouleggs-3.5.7.tbz2': [u'unstable', 1], u'nucleo-0.6-r2.tbz2': [u'unstable', 1], u'virt-manager-0.5.0.tbz2': [u'unstable', 0], u'dcraw-8.73.tbz2': [u'unstable', 0], u'kbd-1.13-r1.tbz2': [u'unstable', 0], u'gst-plugins-ogg-0.10.14.tbz2': [u'unstable', 0], u'xvkbd-2.8.tbz2': [u'unstable', 1], u'patch-2.5.9-r1.tbz2': [u'unstable', 1], u'pidgin-2.1.1.tbz2': [u'unstable', 0], u'which-2.16.tbz2': [u'unstable', 1], u'libXi-1.1.3.tbz2': [u'unstable', 0], u'kppp-3.5.7.tbz2': [u'unstable', 1], u'servletapi-2.3-r3.tbz2': [u'unstable', 1], u'jakarta-regexp-1.3-r4.tbz2': [u'unstable', 1], u'kdeutils-meta-3.5.7.tbz2': [u'unstable', 1], u'gnome-terminal-2.18.1.tbz2': [u'unstable', 0], u'cryptsetup-luks-1.0.4-r3.tbz2': [u'unstable', 1], u'libipoddevice-0.5.3.tbz2': [u'unstable', 0], u'f-spot-0.4.0.tbz2': [u'unstable', 0], u'libreadline-java-0.8.0-r2.tbz2': [u'unstable', 1], u'kmrml-3.5.7.tbz2': [u'unstable', 1], u'liblrdf-0.4.0.tbz2': [u'unstable', 1], u'XML-LibXML-Common-0.13.tbz2': [u'unstable', 1], u'traceroute-2.0.8-r2.tbz2': [u'unstable', 0], u'libao-0.8.6-r3.tbz2': [u'unstable', 1], u'libkipi-0.1.5.tbz2': [u'unstable', 1], u'truecrypt-4.3a-t2.6.22_sabayon.tbz2': [u'unstable', 0], u'xf86-video-s3virge-1.9.1.tbz2': [u'unstable', 1], u'automake-1.8.5-r3.tbz2': [u'unstable', 1], u'nevow-0.9.0.tbz2': [u'unstable', 1], u'a52dec-0.7.4-r5.tbz2': [u'unstable', 1], u'povray-3.6.1-r2.tbz2': [u'unstable', 1], u'automake-1.4_p6.tbz2': [u'unstable', 1], u'libpcap-0.9.7.tbz2': [u'unstable', 0], u'kpowersave-0.6.2.tbz2': [u'unstable', 0], u'xdialog-2.3.1.tbz2': [u'unstable', 1], u'font-alias-1.0.1.tbz2': [u'unstable', 1], u'gnome-system-monitor-2.18.2.tbz2': [u'unstable', 0], u'ghostscript-esp-8.15.4.tbz2': [u'unstable', 1], u'sysvinit-2.86-r9.tbz2': [u'unstable', 0], u'manslide-1.7.1.tbz2': [u'unstable', 0], u'ipw3945-ucode-1.14.2.tbz2': [u'unstable', 1], u'swh-plugins-0.4.15.tbz2': [u'unstable', 0], u'ruby-config-0.3.2.tbz2': [u'unstable', 1], u'cpio-2.9.tbz2': [u'unstable', 0], u'scanssh-2.1.tbz2': [u'unstable', 1], u'kolourpaint-3.5.7.tbz2': [u'unstable', 1], u'libevent-1.3d.tbz2': [u'unstable', 0], u'pulseaudio-0.9.6-r1.tbz2': [u'unstable', 0], u'ExtUtils-CBuilder-0.19.tbz2': [u'unstable', 0], u'libexif-0.6.16.tbz2': [u'unstable', 0], u'help2man-1.36.4.tbz2': [u'unstable', 1], u'IO-Socket-INET6-2.51.tbz2': [u'unstable', 1], u'libcap-1.10-r10.tbz2': [u'unstable', 1], u'lirc-0.8.2-r1.tbz2': [u'unstable', 0], u'wxpython-2.6.3.3.tbz2': [u'unstable', 1], u'linux-wlan-ng-firmware-0.2.2.tbz2': [u'unstable', 1], u'libksieve-3.5.7.tbz2': [u'unstable', 1], u'xauth-1.0.2.tbz2': [u'unstable', 1], u'krec-3.5.7.tbz2': [u'unstable', 1], u'hal-info-20070618.tbz2': [u'unstable', 1], u'hotplug-base-20040401.tbz2': [u'unstable', 1], u'ksame-3.5.7.tbz2': [u'unstable', 1], u'ttmkfdir-3.0.9-r3.tbz2': [u'unstable', 1], u'xorg-x11-7.3.tbz2': [u'unstable', 0], u'sysfsutils-2.1.0.tbz2': [u'unstable', 1], u'Digest-HMAC-1.01-r1.tbz2': [u'unstable', 1], u'glu-7.0.tbz2': [u'unstable', 1], u'gtkmm-2.2.12.tbz2': [u'unstable', 1], u'IO-String-1.08.tbz2': [u'unstable', 1], u'shared-mime-info-0.22.tbz2': [u'unstable', 0], u'kspaceduel-3.5.7.tbz2': [u'unstable', 1], u'urt-3.1b-r1.tbz2': [u'unstable', 1], u'xwud-1.0.1.tbz2': [u'unstable', 1], u'cdparanoia-3.9.8-r5.tbz2': [u'unstable', 1], u'libmpeg3-1.7.tbz2': [u'unstable', 0], u'gnutls-2.0.0.tbz2': [u'unstable', 0], u'kdepim-kioslaves-3.5.7-r1.tbz2': [u'unstable', 0], u'ksig-3.5.7.tbz2': [u'unstable', 1], u'gnome-utils-2.18.1.tbz2': [u'unstable', 1], u'kicker-3.5.7-r13.tbz2': [u'unstable', 0], u'mozilla-launcher-1.56.tbz2': [u'unstable', 1], u'kcalc-3.5.7.tbz2': [u'unstable', 1], u'libsidplay-1.36.59.tbz2': [u'unstable', 0], u'kget-3.5.7.tbz2': [u'unstable', 1], u'pykde-3.16.0-r1.tbz2': [u'unstable', 0], u'scim-qtimm-0.9.4-r1.tbz2': [u'unstable', 0], u'dbus-glib-0.74.tbz2': [u'unstable', 0], u'prism54-usb-firmware-1.0.4.3.tbz2': [u'unstable', 1], u'links-2.1_pre28-r1.tbz2': [u'unstable', 0], u'alsa-lib-1.0.14a-r1.tbz2': [u'unstable', 0], u'sun-jdk-1.5.0.12.tbz2': [u'unstable', 0], u'kooka-3.5.7.tbz2': [u'unstable', 1], u'sox-13.0.0.tbz2': [u'unstable', 1], u'libgnomecanvas-2.14.0.tbz2': [u'unstable', 1], u'libnfsidmap-0.20.tbz2': [u'unstable', 0], u'xf86-video-i128-1.2.1.tbz2': [u'unstable', 1], u'libsigc++-1.2.5.tbz2': [u'unstable', 1], u'kaddressbook-plugins-3.5.7.tbz2': [u'unstable', 1], u'bug-buddy-2.18.1.tbz2': [u'unstable', 1], u'makedepend-1.0.1.tbz2': [u'unstable', 1], u'gst-plugins-vorbis-0.10.14.tbz2': [u'unstable', 0], u'hddtemp-0.3_beta15-r3.tbz2': [u'unstable', 0], u'twolame-0.3.10.tbz2': [u'unstable', 1], u'DateTime-Locale-0.34.tbz2': [u'unstable', 1], u'autoconf-wrapper-4-r3.tbz2': [u'unstable', 1], u'libXprintUtil-1.0.1.tbz2': [u'unstable', 1], u'mpg123-0.65.tbz2': [u'unstable', 1], u'libmikmod-3.1.11-r4.tbz2': [u'unstable', 1], u'kdeadmin-kfile-plugins-3.5.7.tbz2': [u'unstable', 1], u'font-winitzki-cyrillic-1.0.0.tbz2': [u'unstable', 1], u'libsoundtouch-1.3.1-r1.tbz2': [u'unstable', 1], u'khotkeys-3.5.7.tbz2': [u'unstable', 1], u'man-pages-de-0.5.tbz2': [u'unstable', 1], u'libwmf-0.2.8.4.tbz2': [u'unstable', 1], u'libmpcdec-1.2.6.tbz2': [u'unstable', 0], u'xf86rushproto-1.1.2.tbz2': [u'unstable', 1], u'libprojectm-0.99-r1.tbz2': [u'unstable', 1], u'consolekit-0.2.1.tbz2': [u'unstable', 1], u'glib-1.2.10-r5.tbz2': [u'unstable', 1], u'rpm2targz-9.0-r6.tbz2': [u'unstable', 0], u'kdeartwork-iconthemes-3.5.7.tbz2': [u'unstable', 1], u'xf86-video-rendition-4.1.3.tbz2': [u'unstable', 1], u'xf86-input-calcomp-1.1.1.tbz2': [u'unstable', 0], u'kwifimanager-3.5.7.tbz2': [u'unstable', 1], u'sdl-gfx-2.0.16.tbz2': [u'unstable', 1], u'knetattach-3.5.7.tbz2': [u'unstable', 1], u'libXcursor-1.1.9.tbz2': [u'unstable', 0], u'twm-1.0.3.tbz2': [u'unstable', 1], u'ksirc-3.5.7.tbz2': [u'unstable', 1], u'evolution-exchange-2.10.3.tbz2': [u'unstable', 0], u'nfs-utils-1.1.0-r1.tbz2': [u'unstable', 0], u'gst-plugins-oss-0.10.6.tbz2': [u'unstable', 0], u'nss-3.11.7.tbz2': [u'unstable', 0], u'jpeg-6b-r8.tbz2': [u'unstable', 1], u'Time-modules-2006.0814.tbz2': [u'unstable', 1], u'arphicfonts-0.1.20060928.tbz2': [u'unstable', 1], u'com_err-1.40.2.tbz2': [u'unstable', 1], u'renderproto-0.9.3.tbz2': [u'unstable', 0], u'libusb-0.1.12-r1.tbz2': [u'unstable', 1], u'libkdepim-3.5.7-r1.tbz2': [u'unstable', 0], u'sed-4.1.5.tbz2': [u'unstable', 1], u'tsclient-0.148.tbz2': [u'unstable', 1], u'PyQt4-4.3.tbz2': [u'unstable', 0], u'kcheckpass-3.5.7.tbz2': [u'unstable', 0], u'db-4.3.29-r2.tbz2': [u'unstable', 1], u'cksfv-1.3.9.tbz2': [u'unstable', 1], u'speex-1.2_beta2.tbz2': [u'unstable', 0], u'libkexif-0.2.5.tbz2': [u'unstable', 1], u'glib-2.12.13.tbz2': [u'unstable', 0], u'ss-1.40.2.tbz2': [u'unstable', 1], u'pcmciautils-014-r1.tbz2': [u'unstable', 1], u'gnome2-vfs-perl-1.061.tbz2': [u'unstable', 1], u'xf86-input-vmmouse-12.4.2.tbz2': [u'unstable', 0], u'libXfont-1.3.1.tbz2': [u'unstable', 0], u'mingetty-1.07-r1.tbz2': [u'unstable', 1], u'libjingle-0.3.11.tbz2': [u'unstable', 0], u'live-2007.02.20.tbz2': [u'unstable', 1], u'klibc-1.5.tbz2': [u'unstable', 0], u'eventlog-0.2.5.tbz2': [u'unstable', 0], u'bcprov-1.37.tbz2': [u'unstable', 0], u'Unicode-String-2.09.tbz2': [u'unstable', 1], u'udev-115-r1.tbz2': [u'unstable', 1], u'gnome-vfs-2.18.1.tbz2': [u'unstable', 1], u'gst-plugins-pango-0.10.14.tbz2': [u'unstable', 0], u'kpdf-3.5.7-r2.tbz2': [u'unstable', 0], u'gst-plugins-dvdread-0.10.6.tbz2': [u'unstable', 0], u'pam_console-0.99.7.0.2.7-r1.tbz2': [u'unstable', 0], u'gnuconfig-20070724.tbz2': [u'unstable', 0], u'lilo-config-3.5.7.tbz2': [u'unstable', 1], u'libgnomecanvasmm-2.0.1.tbz2': [u'unstable', 1], u'Tie-IxHash-1.21-r1.tbz2': [u'unstable', 1], u'nsplugins-3.5.7.tbz2': [u'unstable', 1], u'imagemagick-6.3.5.tbz2': [u'unstable', 1], u'gconfmm-2.18.0.tbz2': [u'unstable', 1], u'gtksourceview-1.8.5.tbz2': [u'unstable', 1], u'libcddb-1.3.0.tbz2': [u'unstable', 1], u'fftw-3.1.2.tbz2': [u'unstable', 2], u'gtkhtml-3.14.3-r1.tbz2': [u'unstable', 0], u'cairo-1.4.10.tbz2': [u'unstable', 0], u'wv2-0.2.3.tbz2': [u'unstable', 1], u'myspell-eo-20060316.tbz2': [u'unstable', 1], u'kdemultimedia-meta-3.5.7.tbz2': [u'unstable', 1], u'atmel-firmware-1.3.tbz2': [u'unstable', 1], u'libxml2-2.6.29.tbz2': [u'unstable', 0], u'pvr-firmware-20070217.tbz2': [u'unstable', 1], u'kgeography-3.5.7.tbz2': [u'unstable', 1], u'blinken-3.5.7.tbz2': [u'unstable', 1], u'perl-Test-Harness-2.64.tbz2': [u'unstable', 1], u'blackdown-jre-1.4.2.03-r14.tbz2': [u'unstable', 0], u'libperl-5.8.8-r1.tbz2': [u'unstable', 1], u'gnome-keyring-0.8.1.tbz2': [u'unstable', 1], u'lynx-2.8.6-r2.tbz2': [u'unstable', 0], u'hicolor-icon-theme-0.10.tbz2': [u'unstable', 1], u'xkbprint-1.0.1.tbz2': [u'unstable', 1], u'xf86-video-imstt-1.1.0.tbz2': [u'unstable', 1], u'hotplug-20040923-r2.tbz2': [u'unstable', 1], u'docbook2X-0.8.8.tbz2': [u'unstable', 0], u'libdvdread-0.9.7.tbz2': [u'unstable', 1], u'k9copy-1.1.3.tbz2': [u'unstable', 0], u'proftpd-1.3.1_rc3.tbz2': [u'unstable', 0], u'loudmouth-1.2.3.tbz2': [u'unstable', 0], u'netscape-flash-9.0.48.0-r1.tbz2': [u'unstable', 0], u'xml-commons-external-1.3.04.tbz2': [u'unstable', 1], u'gok-1.2.5.tbz2': [u'unstable', 0], u'dhcp-3.1.0.tbz2': [u'unstable', 0], u'imaging-1.1.6.tbz2': [u'unstable', 1], u'gcc-config-1.4.0-r2.tbz2': [u'unstable', 0], u'vte-0.16.8.tbz2': [u'unstable', 0], u'iputils-20070202.tbz2': [u'unstable', 1], u'xvid-1.1.3.tbz2': [u'unstable', 0], u'sysinfo-1.8.2.tbz2': [u'unstable', 1], u'liblbxutil-1.0.1.tbz2': [u'unstable', 1], u'gtkglarea-1.2.3-r1.tbz2': [u'unstable', 1], u'nuvola-1.0-r1.tbz2': [u'unstable', 1], u'mesa-progs-7.0.1.tbz2': [u'unstable', 0], u'notify-python-0.1.1.tbz2': [u'unstable', 0], u'dietlibc-0.31_pre20070612.tbz2': [u'unstable', 0], u'perl-digest-base-1.15.tbz2': [u'unstable', 1], u'font-bh-100dpi-1.0.0.tbz2': [u'unstable', 1], u'gtkhtml-3.2.5.tbz2': [u'unstable', 1], u'net6-1.3.5.tbz2': [u'unstable', 0], u'kde-i18n-3.5.7.tbz2': [u'unstable', 1], u'libbinio-1.4.tbz2': [u'unstable', 1], u'kdebluetooth-1.0_beta6.tbz2': [u'unstable', 0], u'File-Spec-3.25.tbz2': [u'unstable', 0], u'tunepimp-0.5.3.tbz2': [u'unstable', 1], u'XML-Parser-2.34-r1.tbz2': [u'unstable', 0], u'gnome-themes-2.18.1.tbz2': [u'unstable', 1], u'aspell-sl-0.50.0.tbz2': [u'unstable', 1], u'get-live-help-0.1.9.tbz2': [u'unstable', 0], u'vte-sharp-2.16.0.tbz2': [u'unstable', 1], u'kshisen-3.5.7.tbz2': [u'unstable', 1], u'hashalot-0.3-r2.tbz2': [u'unstable', 1], u'lskat-3.5.7.tbz2': [u'unstable', 1], u'xkeyboard-config-0.9.tbz2': [u'unstable', 0], u'pwdb-0.62.tbz2': [u'unstable', 1], u'antlr-2.7.7.tbz2': [u'unstable', 1], u'libogg-1.1.3.tbz2': [u'unstable', 1], u'libdnet-1.11-r1.tbz2': [u'unstable', 0], u'kdebugdialog-3.5.6.tbz2': [u'unstable', 1], u'XML-NamespaceSupport-1.09.tbz2': [u'unstable', 1], u'sun-jdk-1.6.0.02.tbz2': [u'unstable', 0], u'libXfontcache-1.0.4.tbz2': [u'unstable', 1], u'ghostscript-0.tbz2': [u'unstable', 1], u'fontconfig-2.4.2.tbz2': [u'unstable', 1], u'tsocks-1.8_beta5-r2.tbz2': [u'unstable', 1], u'akregator-3.5.7-r1.tbz2': [u'unstable', 0]}
# initialize the database
dbconn = etpDatabase(readOnly = False, noUpload = True)
dbconn.initializeDatabase()
# sync packages directory
activatorTools.packages(["sync","--ask"])
# now fill the database
pkgbranches = os.listdir(etpConst['packagesbindir'])
pkgbranches = [x for x in pkgbranches if os.path.isdir(etpConst['packagesbindir']+"/"+x)]
#print revisionsMatch
for mybranch in pkgbranches:
pkglist = os.listdir(etpConst['packagesbindir']+"/"+mybranch)
# filter .md5
_pkglist = []
for i in pkglist:
if not i.endswith(etpConst['packageshashfileext']):
_pkglist.append(i)
pkglist = _pkglist
if (not pkglist):
continue
print_info(green(" * ")+red("Reinitializing Entropy database for branch ")+bold(mybranch)+red(" using Packages in the repository ..."))
currCounter = 0
atomsnumber = len(pkglist)
import reagentTools
for pkg in pkglist:
print_info(darkgreen(" [")+red(mybranch)+darkgreen("] ")+red("Analyzing: ")+bold(pkg), back = True)
currCounter += 1
print_info(darkgreen(" [")+red(mybranch)+darkgreen("] ")+green("(")+ blue(str(currCounter))+"/"+red(str(atomsnumber))+green(") ")+red("Analyzing ")+bold(pkg)+red(" ..."), back = True)
etpData = reagentTools.extractPkgData(etpConst['packagesbindir']+"/"+mybranch+"/"+pkg, mybranch)
# remove disgregated package
revisionAvail = revisionsMatch.get(os.path.basename(etpData['download']),None)
addRevision = 0
if (revisionAvail):
if mybranch == revisionAvail[0]:
addRevision = revisionAvail[1]+1
# fill the db entry
idpk, revision, etpDataUpdated, accepted = dbconn.addPackage(etpData, revision = addRevision, wantedBranch = mybranch)
print_info(darkgreen(" [")+red(mybranch)+darkgreen("] ")+green("(")+ blue(str(currCounter))+"/"+red(str(atomsnumber))+green(") ")+red("Analyzing ")+bold(pkg)+red(". Revision: ")+blue(str(addRevision)))
dbconn.commitChanges()
# regen dependstable
reagentTools.dependsTableInitialize(dbconn, False)
dbconn.closeDB()
print_info(green(" * ")+red("Entropy database has been reinitialized using binary packages available"))
# used by reagent
elif (options[0] == "search"):
mykeywords = options[1:]
if (len(mykeywords) == 0):
print_error(yellow(" * ")+red("Not enough parameters"))
sys.exit(302)
if (not os.path.isfile(etpConst['etpdatabasefilepath'])):
print_error(yellow(" * ")+red("Entropy Datbase does not exist"))
sys.exit(303)
# search tool
print_info(green(" * ")+red("Searching ..."))
# open read only
dbconn = etpDatabase(True)
foundCounter = 0
for mykeyword in mykeywords:
results = dbconn.searchPackages(mykeyword)
for result in results:
foundCounter += 1
print
print_info(green(" * ")+bold(dbconn.retrieveCategory(result[1])+"/"+dbconn.retrieveName(result[1]))) # package atom
print_info(red("\t Atom: ")+blue(result[0]))
print_info(red("\t Name: ")+blue(dbconn.retrieveName(result[1])))
print_info(red("\t Version: ")+blue(dbconn.retrieveVersion(result[1])))
tag = dbconn.retrieveVersionTag(result[1])
if (tag):
print_info(red("\t Tag: ")+blue(tag))
description = dbconn.retrieveDescription(result[1])
if (description):
print_info(red("\t Description: ")+description)
flags = dbconn.retrieveCompileFlags(result[1])
print_info(red("\t CHOST: ")+blue(flags[0]))
print_info(red("\t CFLAGS: ")+darkred(flags[1]))
print_info(red("\t CXXFLAGS: ")+darkred(flags[2]))
website = dbconn.retrieveHomepage(result[1])
if (website):
print_info(red("\t Website: ")+website)
flags = string.join(dbconn.retrieveUseflags(result[1])," ")
if (flags):
print_info(red("\t USE Flags: ")+blue(flags))
print_info(red("\t License: ")+bold(dbconn.retrieveLicense(result[1])))
keywords = string.join(dbconn.retrieveKeywords(result[1])," ")
binkeywords = string.join(dbconn.retrieveBinKeywords(result[1])," ")
print_info(red("\t Source keywords: ")+darkblue(keywords))
print_info(red("\t Binary keywords: ")+green(binkeywords))
print_info(red("\t Package branch: ")+dbconn.retrieveBranch(result[1]))
print_info(red("\t Download relative URL: ")+dbconn.retrieveDownloadURL(result[1]))
print_info(red("\t Package Checksum: ")+green(dbconn.retrieveDigest(result[1])))
sources = dbconn.retrieveSources(result[1])
if (sources):
print_info(red("\t Sources"))
for source in sources:
print_info(darkred("\t # Source package: ")+yellow(source))
slot = dbconn.retrieveSlot(result[1])
if (slot):
print_info(red("\t Slot: ")+yellow(slot))
else:
print_info(red("\t Slot: ")+yellow("Not set"))
'''
mirrornames = []
for x in sources:
if x.startswith("mirror://"):
mirrorname = x.split("/")[2]
mirrornames.append(mirrorname)
for mirror in mirrornames:
mirrorlinks = dbconn.retrieveMirrorInfo(mirror)
print_info(red("\t mirror://"+mirror+" = ")+str(string.join(mirrorlinks," "))) # I don't need to print mirrorlinks
'''
dependencies = dbconn.retrieveDependencies(result[1])
if (dependencies):
print_info(red("\t Dependencies"))
for dep in dependencies:
print_info(darkred("\t # Depends on: ")+dep)
#print_info(red("\t Blah: ")+result[20]) --> it's a dup of [21]
conflicts = dbconn.retrieveConflicts(result[1])
if (conflicts):
print_info(red("\t Conflicts with"))
for conflict in conflicts:
print_info(darkred("\t # Conflict: ")+conflict)
api = dbconn.retrieveApi(result[1])
print_info(red("\t Entry API: ")+green(str(api)))
date = dbconn.retrieveDateCreation(result[1])
print_info(red("\t Package Creation date: ")+str(entropyTools.convertUnixTimeToHumanTime(int(date))))
revision = dbconn.retrieveRevision(result[1])
print_info(red("\t Entry revision: ")+str(revision))
#print result
dbconn.closeDB()
if (foundCounter == 0):
print_warning(red(" * ")+red("Nothing found."))
else:
print
elif (options[0] == "create-empty-database"):
mypath = options[1:]
if len(mypath) == 0:
print_error(yellow(" * ")+red("Not enough parameters"))
sys.exit(303)
if (os.path.dirname(mypath[0]) != '') and (not os.path.isdir(os.path.dirname(mypath[0]))):
print_error(green(" * ")+red("Supplied directory does not exist."))
sys.exit(304)
print_info(green(" * ")+red("Initializing an empty database file with Entropy structure ..."),back = True)
connection = sqlite.connect(mypath[0])
cursor = connection.cursor()
for sql in etpSQLInitDestroyAll.split(";"):
if sql:
cursor.execute(sql+";")
del sql
for sql in etpSQLInit.split(";"):
if sql:
cursor.execute(sql+";")
connection.commit()
cursor.close()
connection.close()
print_info(green(" * ")+red("Entropy database file ")+bold(mypath[0])+red(" successfully initialized."))
elif (options[0] == "stabilize") or (options[0] == "unstabilize"): # FIXME: adapt to the new branches structure
if options[0] == "stabilize":
stable = True
else:
stable = False
if (stable):
print_info(green(" * ")+red("Collecting packages that would be marked stable ..."), back = True)
else:
print_info(green(" * ")+red("Collecting packages that would be marked unstable ..."), back = True)
myatoms = options[1:]
if len(myatoms) == 0:
print_error(yellow(" * ")+red("Not enough parameters"))
sys.exit(303)
# is world?
if myatoms[0] == "world":
# open db in read only
dbconn = etpDatabase(readOnly = True)
if (stable):
pkglist = dbconn.listUnstablePackages()
else:
pkglist = dbconn.listStablePackages()
# This is the list of all the packages available in Entropy
dbconn.closeDB()
else:
pkglist = []
for atom in myatoms:
# validate atom
dbconn = etpDatabase(readOnly = True)
if (stable):
pkg = dbconn.searchPackagesInBranch(atom,"unstable")
else:
pkg = dbconn.searchPackagesInBranch(atom,"stable")
for x in pkg:
pkglist.append(x[0])
# filter dups
pkglist = list(set(pkglist))
# check if atoms were found
if len(pkglist) == 0:
print
print_error(yellow(" * ")+red("No packages found."))
sys.exit(303)
# show what would be done
if (stable):
print_info(green(" * ")+red("These are the packages that would be marked stable:"))
else:
print_info(green(" * ")+red("These are the packages that would be marked unstable:"))
for pkg in pkglist:
print_info(red("\t (*) ")+bold(pkg))
# ask to continue
rc = entropyTools.askquestion(" Would you like to continue ?")
if rc == "No":
sys.exit(0)
# now mark them as stable
print_info(green(" * ")+red("Marking selected packages ..."))
# open db
dbconn = etpDatabase(readOnly = False, noUpload = True)
import re
for pkg in pkglist:
print_info(green(" * ")+red("Marking package: ")+bold(pkg)+red(" ..."), back = True)
rc, action = dbconn.stabilizePackage(pkg,stable)
# @rc: True if updated, False if not
# @action: action taken: "stable" for stabilized package, "unstable" for unstabilized package
if (rc):
print_info(green(" * ")+red("Package: ")+bold(pkg)+red(" needs to be marked ")+bold(action), back = True)
# change download database parameter name
download = dbconn.retrievePackageVar(pkg, "download", branch = action)
# change action with the opposite:
if action == "stable":
# move to unstable
oppositeAction = "unstable"
else:
oppositeAction = "stable"
oldpkgfilename = os.path.basename(download)
download = re.subn("-"+oppositeAction,"-"+action, download)
if download[1]: # if the name has been converted
newpkgfilename = os.path.basename(download[0])
# change download parameter in the database entry
dbconn.writePackageParameter(pkg, "download", download[0], action)
print_info(green(" * ")+yellow("Updating local package name"))
# change filename locally
if os.path.isfile(etpConst['packagesbindir']+"/"+oldpkgfilename):
os.rename(etpConst['packagesbindir']+"/"+oldpkgfilename,etpConst['packagesbindir']+"/"+newpkgfilename)
print_info(green(" * ")+yellow("Updating local package checksum"))
# update md5
if os.path.isfile(etpConst['packagesbindir']+"/"+oldpkgfilename+etpConst['packageshashfileext']):
f = open(etpConst['packagesbindir']+"/"+oldpkgfilename+etpConst['packageshashfileext'])
oldMd5 = f.readline().strip()
f.close()
newMd5 = re.subn(oldpkgfilename, newpkgfilename, oldMd5)
if newMd5[1]:
f = open(etpConst['packagesbindir']+"/"+newpkgfilename+etpConst['packageshashfileext'],"w")
f.write(newMd5[0]+"\n")
f.flush()
f.close()
# remove old
os.remove(etpConst['packagesbindir']+"/"+oldpkgfilename+etpConst['packageshashfileext'])
else: # old md5 does not exist
entropyTools.createHashFile(etpConst['packagesbindir']+"/"+newpkgfilename)
print_info(green(" * ")+yellow("Updating remote package information"))
# change filename remotely
ftp = mirrorTools.handlerFTP(uri)
ftp.setCWD(etpConst['binaryurirelativepath'])
if (ftp.isFileAvailable(etpConst['packagesbindir']+"/"+oldpkgfilename)):
# rename tbz2
ftp.renameFile(oldpkgfilename,newpkgfilename)
# remove old .md5
ftp.deleteFile(oldpkgfilename+etpConst['packageshashfileext'])
# upload new .md5 if found
if os.path.isfile(etpConst['packagesbindir']+"/"+newpkgfilename+etpConst['packageshashfileext']):
ftp.uploadFile(etpConst['packagesbindir']+"/"+newpkgfilename+etpConst['packageshashfileext'],ascii = True)
dbconn.commitChanges()
print_info(green(" * ")+red("All the selected packages have been marked as requested. Have fun."))
dbconn.closeDB()
elif (options[0] == "remove"):
print_info(green(" * ")+red("Scanning packages that would be removed ..."), back = True)
myopts = options[1:]
_myopts = []
branch = ''
for opt in myopts:
if (opt.startswith("--branch=")) and (len(opt.split("=")) == 2):
try:
branch = opt.split("=")[1]
idx = etpConst['branches'].index(branch)
etpConst['branch'] = branch
except:
pass
else:
_myopts.append(opt)
myopts = _myopts
if len(myopts) == 0:
print_error(yellow(" * ")+red("Not enough parameters"))
sys.exit(303)
pkglist = []
dbconn = etpDatabase(readOnly = True)
for atom in myopts:
pkg = dbconn.atomMatch(atom)
if pkg[0] != -1:
pkglist.append(pkg[0])
# filter dups
pkglist = list(set(pkglist))
# check if atoms were found
if len(pkglist) == 0:
print
dbconn.closeDB()
print_error(yellow(" * ")+red("No packages found."))
sys.exit(303)
print_info(green(" * ")+red("These are the packages that would be removed from the database:"))
for pkg in pkglist:
pkgatom = dbconn.retrieveAtom(pkg)
branch = dbconn.retrieveBranch(pkg)
print_info(red("\t (*) ")+bold(pkgatom)+blue(" [")+red(branch)+blue("]"))
dbconn.closeDB()
# ask to continue
rc = entropyTools.askquestion(" Would you like to continue ?")
if rc == "No":
sys.exit(0)
# now mark them as stable
print_info(green(" * ")+red("Removing selected packages ..."))
# open db
dbconn = etpDatabase(readOnly = False, noUpload = True)
for pkg in pkglist:
pkgatom = dbconn.retrieveAtom(pkg)
print_info(green(" * ")+red("Removing package: ")+bold(pkgatom)+red(" ..."), back = True)
dbconn.removePackage(pkg)
dbconn.commitChanges()
print_info(green(" * ")+red("All the selected packages have been removed as requested. To remove online binary packages, just run Activator."))
dbconn.closeDB()
# used by reagent
elif (options[0] == "statistics"):
print_info(green(" [LOCAL DB STATISTIC]\t\t")+red("Information"))
# fetch total packages
dbconn = etpDatabase(readOnly = True)
totalpkgs = len(dbconn.listAllPackages())
totalstablepkgs = len(dbconn.listStablePackages())
totalunstablepkgs = len(dbconn.listUnstablePackages())
print_info(green(" Total Installed Packages\t\t")+red(str(totalpkgs)))
print_info(green(" Total Stable Packages\t\t")+red(str(totalstablepkgs)))
print_info(green(" Total Unstable Packages\t\t")+red(str(totalunstablepkgs)))
activatorTools.syncRemoteDatabases(justStats = True)
dbconn.closeDB()
# used by reagent
# FIXME: complete this with some automated magic
elif (options[0] == "md5check"):
print_info(green(" * ")+red("Integrity verification of the selected packages:"))
mypackages = options[1:]
dbconn = etpDatabase(readOnly = True)
# statistic vars
pkgMatch = 0
pkgNotMatch = 0
pkgDownloadedSuccessfully = 0
pkgDownloadedError = 0
worldSelected = False
if (len(mypackages) == 0):
# check world
# create packages list
worldSelected = True
pkgs2check = dbconn.listAllPackages()
elif (mypackages[0] == "world"):
# check world
# create packages list
worldSelected = True
pkgs2check = dbconn.listAllPackages()
else:
# catch the names
pkgs2check = []
for pkg in mypackages:
results = dbconn.searchPackages(pkg)
for i in results:
pkgs2check.append(i)
if (not worldSelected):
print_info(red(" This is the list of the packages that would be checked:"))
else:
print_info(red(" All the packages in the Entropy Packages repository will be checked."))
toBeDownloaded = []
availList = []
for pkginfo in pkgs2check:
pkgatom = pkginfo[0]
idpackage = pkginfo[1]
pkgbranch = pkginfo[2]
pkgfile = dbconn.retrieveDownloadURL(idpackage)
pkgfile = os.path.basename(pkgfile)
if (os.path.isfile(etpConst['packagesbindir']+"/"+pkgbranch+"/"+pkgfile)):
if (not worldSelected): print_info(green(" - [PKG AVAILABLE] ")+red(pkgatom)+" -> "+bold(pkgfile))
availList.append(idpackage)
elif (os.path.isfile(etpConst['packagessuploaddir']+"/"+pkgbranch+"/"+pkgfile)):
if (not worldSelected): print_info(green(" - [RUN ACTIVATOR] ")+darkred(pkgatom)+" -> "+bold(pkgfile))
else:
if (not worldSelected): print_info(green(" - [MUST DOWNLOAD] ")+yellow(pkgatom)+" -> "+bold(pkgfile))
toBeDownloaded.append([idpackage,pkgfile,pkgbranch])
if (not databaseRequestNoAsk):
rc = entropyTools.askquestion(" Would you like to continue ?")
if rc == "No":
sys.exit(0)
notDownloadedPackages = []
if (toBeDownloaded != []):
print_info(red(" Starting to download missing files..."))
for uri in etpConst['activatoruploaduris']:
if (notDownloadedPackages != []):
print_info(red(" Trying to search missing or broken files on another mirror ..."))
toBeDownloaded = notDownloadedPackages
notDownloadedPackages = []
for pkg in toBeDownloaded:
rc = activatorTools.downloadPackageFromMirror(uri,pkg[1],pkg[2])
if (rc is None):
notDownloadedPackages.append([pkg[1],pkg[2]])
if (rc == False):
notDownloadedPackages.append([pkg[1],pkg[2]])
if (rc == True):
pkgDownloadedSuccessfully += 1
availList.append(pkg[0])
if (notDownloadedPackages == []):
print_info(red(" All the binary packages have been downloaded successfully."))
break
if (notDownloadedPackages != []):
print_warning(red(" These are the packages that cannot be found online:"))
for i in notDownloadedPackages:
pkgDownloadedError += 1
print_warning(red(" * ")+yellow(i[0])+" in "+blue(i[1]))
print_warning(red(" They won't be checked."))
brokenPkgsList = []
totalcounter = str(len(availList))
currentcounter = 0
for pkg in availList:
currentcounter += 1
pkgfile = dbconn.retrieveDownloadURL(pkg)
pkgbranch = dbconn.retrieveBranch(pkg)
pkgfile = os.path.basename(pkgfile)
print_info(" ("+red(str(currentcounter))+"/"+blue(totalcounter)+") "+red("Checking hash of ")+yellow(pkgfile)+red(" in branch: ")+blue(pkgbranch)+red(" ..."), back = True)
storedmd5 = dbconn.retrieveDigest(pkg)
result = entropyTools.compareMd5(etpConst['packagesbindir']+"/"+pkgbranch+"/"+pkgfile,storedmd5)
if (result):
# match !
pkgMatch += 1
#print_info(red(" Package ")+yellow(pkg)+green(" is healthy. Checksum: ")+yellow(storedmd5), back = True)
else:
pkgNotMatch += 1
print_error(red(" Package ")+yellow(pkgfile)+red(" in branch: ")+blue(pkgbranch)+red(" is _NOT_ healthy !!!! Stored checksum: ")+yellow(storedmd5))
brokenPkgsList.append([pkgfile,pkgbranch])
dbconn.closeDB()
if (brokenPkgsList != []):
print_info(blue(" * This is the list of the BROKEN packages: "))
for bp in brokenPkgsList:
print_info(red(" * Package file: ")+bold(bp[0])+red(" in branch: ")+blue(bp[1]))
# print stats
print_info(blue(" * Statistics: "))
print_info(yellow(" Number of checked packages:\t\t")+str(pkgMatch+pkgNotMatch))
print_info(green(" Number of healthy packages:\t\t")+str(pkgMatch))
print_info(red(" Number of broken packages:\t\t")+str(pkgNotMatch))
if (pkgDownloadedSuccessfully > 0) or (pkgDownloadedError > 0):
print_info(green(" Number of downloaded packages:\t\t")+str(pkgDownloadedSuccessfully+pkgDownloadedError))
print_info(green(" Number of happy downloads:\t\t")+str(pkgDownloadedSuccessfully))
print_info(red(" Number of failed downloads:\t\t")+str(pkgDownloadedError))
############
# Functions and Classes
#####################################################################################
# this class simply describes the current database status
class databaseStatus:
def __init__(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus.__init__ called.")
self.databaseBumped = False
self.databaseInfoCached = False
self.databaseLock = False
#self.database
self.databaseDownloadLock = False
self.databaseAlreadyTainted = False
if os.path.isfile(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabasetaintfile']):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus: database tainted.")
self.databaseAlreadyTainted = True
def isDatabaseAlreadyBumped(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus: already bumped? "+str(self.databaseBumped))
return self.databaseBumped
def isDatabaseAlreadyTainted(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus: tainted? "+str(self.databaseAlreadyTainted))
return self.databaseAlreadyTainted
def setDatabaseTaint(self,bool):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus: setting database taint to: "+str(bool))
self.databaseAlreadyTainted = bool
def setDatabaseBump(self,bool):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus: setting database bump to: "+str(bool))
self.databaseBumped = bool
def setDatabaseLock(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus: Locking database (upload)")
self.databaseLock = True
def unsetDatabaseLock(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus: Unlocking database (upload)")
self.databaseLock = False
def getDatabaseLock(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus: getting database lock info (upload), status: "+str(self.databaseLock))
return self.databaseLock
def setDatabaseDownloadLock(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus: Locking database (download)")
self.databaseDownloadLock = True
def unsetDatabaseDownloadLock(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus: Unlocking database (download)")
self.databaseDownloadLock = False
def getDatabaseDownloadLock(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"DatabaseStatus: getting database lock info (download), status: "+str(self.databaseDownloadLock))
return self.databaseDownloadLock
class etpDatabase:
def __init__(self, readOnly = False, noUpload = False, dbFile = etpConst['etpdatabasefilepath'], clientDatabase = False, xcache = True):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"etpDatabase.__init__ called.")
self.readOnly = readOnly
self.noUpload = noUpload
self.packagesRemoved = False
self.packagesAdded = False
self.clientDatabase = clientDatabase
self.xcache = xcache
# caching dictionaries
self.databaseCache = {}
self.matchCache = {} # dependencies resolving
if (self.clientDatabase):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"etpDatabase: database opened by Entropy client, file: "+str(dbFile))
# if the database is opened readonly, we don't need to lock the online status
self.connection = sqlite.connect(dbFile)
self.cursor = self.connection.cursor()
# set the table read only
return
if (self.readOnly):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"etpDatabase: database opened readonly, file: "+str(dbFile))
# if the database is opened readonly, we don't need to lock the online status
self.connection = sqlite.connect(dbFile)
self.cursor = self.connection.cursor()
# set the table read only
return
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"etpDatabase: database opened in read/write mode, file: "+str(dbFile))
import mirrorTools
import activatorTools
# check if the database is locked locally
if os.path.isfile(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabaselockfile']):
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"etpDatabase: database already locked")
print_info(red(" * ")+red("Entropy database is already locked by you :-)"))
else:
# check if the database is locked REMOTELY
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_NORMAL,"etpDatabase: starting to lock and sync database")
print_info(red(" * ")+red(" Locking and Syncing Entropy database ..."), back = True)
for uri in etpConst['activatoruploaduris']:
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"etpDatabase: connecting to "+uri)
ftp = mirrorTools.handlerFTP(uri)
ftp.setCWD(etpConst['etpurirelativepath'])
if (ftp.isFileAvailable(etpConst['etpdatabaselockfile'])) and (not os.path.isfile(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabaselockfile'])):
import time
print_info(red(" * ")+bold("WARNING")+red(": online database is already locked. Waiting up to 2 minutes..."), back = True)
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"etpDatabase: online database already locked. Waiting 2 minutes")
unlocked = False
for x in range(120):
time.sleep(1)
if (not ftp.isFileAvailable(etpConst['etpdatabaselockfile'])):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_NORMAL,"etpDatabase: online database has been unlocked !")
print_info(red(" * ")+bold("HOORAY")+red(": online database has been unlocked. Locking back and syncing..."))
unlocked = True
break
if (unlocked):
break
dbLog.log(ETP_LOGPRI_ERROR,ETP_LOGLEVEL_NORMAL,"etpDatabase: online database has not been unlocked in time. Giving up.")
# time over
print_info(red(" * ")+bold("ERROR")+red(": online database has not been unlocked. Giving up. Who the hell is working on it? Damn, it's so frustrating for me. I'm a piece of python code with a soul dude!"))
# FIXME show the lock status
print_info(yellow(" * ")+green("Mirrors status table:"))
dbstatus = activatorTools.getMirrorsLock()
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"etpDatabase: showing mirrors status table:")
for db in dbstatus:
if (db[1]):
db[1] = red("Locked")
else:
db[1] = green("Unlocked")
if (db[2]):
db[2] = red("Locked")
else:
db[2] = green("Unlocked")
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE," "+entropyTools.extractFTPHostFromUri(db[0])+": DATABASE: "+db[1]+" | DOWNLOAD: "+db[2])
print_info(bold("\t"+entropyTools.extractFTPHostFromUri(db[0])+": ")+red("[")+yellow("DATABASE: ")+db[1]+red("] [")+yellow("DOWNLOAD: ")+db[2]+red("]"))
ftp.closeConnection()
sys.exit(320)
# if we arrive here, it is because all the mirrors are unlocked so... damn, LOCK!
activatorTools.lockDatabases(True)
# ok done... now sync the new db, if needed
activatorTools.syncRemoteDatabases(self.noUpload)
self.connection = sqlite.connect(dbFile,timeout=300.0)
self.cursor = self.connection.cursor()
def closeDB(self):
# if the class is opened readOnly, close and forget
if (self.readOnly):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"closeDB: closing database opened in readonly.")
#self.connection.rollback()
self.cursor.close()
self.connection.close()
return
# if it's equo that's calling the function, just save changes and quit
if (self.clientDatabase):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"closeDB: closing database opened by Entropy Client.")
self.commitChanges()
self.cursor.close()
self.connection.close()
return
# Cleanups if at least one package has been removed
# Please NOTE: the client database does not need it
if (self.packagesRemoved):
self.cleanupUseflags()
self.cleanupSources()
self.cleanupDependencies()
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"closeDB: closing database opened in read/write.")
# FIXME verify all this shit, for now it works...
if (entropyTools.dbStatus.isDatabaseAlreadyTainted()) and (not entropyTools.dbStatus.isDatabaseAlreadyBumped()):
# bump revision, setting DatabaseBump causes the session to just bump once
entropyTools.dbStatus.setDatabaseBump(True)
self.revisionBump()
if (not entropyTools.dbStatus.isDatabaseAlreadyTainted()):
# we can unlock it, no changes were made
import activatorTools
activatorTools.lockDatabases(False)
else:
print_info(yellow(" * ")+green("Mirrors have not been unlocked. Run activator."))
self.cursor.close()
self.connection.close()
def commitChanges(self):
if (not self.readOnly):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"commitChanges: writing changes to database.")
try:
self.connection.commit()
except:
pass
self.taintDatabase()
else:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_VERBOSE,"commitChanges: discarding changes to database (opened readonly).")
self.discardChanges() # is it ok?
def taintDatabase(self):
if (self.clientDatabase): # if it's equo to open it, this should be avoided
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"taintDatabase: called by Entropy client, won't do anything.")
return
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"taintDatabase: called.")
# taint the database status
f = open(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabasetaintfile'],"w")
f.write(etpConst['currentarch']+" database tainted\n")
f.flush()
f.close()
entropyTools.dbStatus.setDatabaseTaint(True)
def untaintDatabase(self):
if (self.clientDatabase): # if it's equo to open it, this should be avoided
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"untaintDatabase: called by Entropy client, won't do anything.")
return
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"untaintDatabase: called.")
entropyTools.dbStatus.setDatabaseTaint(False)
# untaint the database status
entropyTools.spawnCommand("rm -f "+etpConst['etpdatabasedir']+"/"+etpConst['etpdatabasetaintfile'])
def revisionBump(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"revisionBump: called.")
if (not os.path.isfile(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabaserevisionfile'])):
revision = 0
else:
f = open(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabaserevisionfile'],"r")
revision = int(f.readline().strip())
revision += 1
f.close()
f = open(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabaserevisionfile'],"w")
f.write(str(revision)+"\n")
f.flush()
f.close()
def isDatabaseTainted(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isDatabaseTainted: called.")
if os.path.isfile(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabasetaintfile']):
return True
return False
def discardChanges(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"discardChanges: called.")
self.connection.rollback()
# never use this unless you know what you're doing
def initializeDatabase(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"initializeDatabase: called.")
for sql in etpSQLInitDestroyAll.split(";"):
if sql:
self.cursor.execute(sql+";")
del sql
for sql in etpSQLInit.split(";"):
if sql:
self.cursor.execute(sql+";")
self.commitChanges()
# this function manages the submitted package
# if it does not exist, it fires up addPackage
# otherwise it fires up updatePackage
def handlePackage(self, etpData, forcedRevision = -1, forcedBranch = False):
if (self.readOnly):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"handlePackage: Cannot handle this in read only.")
raise Exception, "What are you trying to do?"
# prepare versiontag
versiontag = ""
if (etpData['versiontag']):
versiontag = "-"+etpData['versiontag']
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"handlePackage: called.")
if (not self.isPackageAvailable(etpData['category']+"/"+etpData['name']+"-"+etpData['version']+versiontag)):
if (forcedRevision < 0):
forcedRevision = 0
if (forcedBranch):
idpk, revision, etpDataUpdated, accepted = self.addPackage(etpData, revision = forcedRevision, wantedBranch = etpData['branch'])
else:
idpk, revision, etpDataUpdated, accepted = self.addPackage(etpData, revision = forcedRevision)
else:
idpk, revision, etpDataUpdated, accepted = self.updatePackage(etpData, forcedRevision) # branch and revision info will be overwritten
return idpk, revision, etpDataUpdated, accepted
# FIXME: default add an unstable package ~~ use indexes
def addPackage(self, etpData, revision = 0, wantedBranch = "unstable"):
if (self.readOnly):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addPackage: Cannot handle this in read only.")
raise Exception, "What are you trying to do?"
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addPackage: called.")
# if a similar package, in the same branch exists, mark for removal
searchsimilar = self.searchSimilarPackages(etpData['category']+"/"+etpData['name'], branch = wantedBranch)
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_NORMAL,"addPackage: here is the list of similar packages (that will be removed) found for "+etpData['category']+"/"+etpData['name']+": "+str(searchsimilar))
removelist = []
for oldpkg in searchsimilar:
# get the package slot
idpackage = oldpkg[1]
slot = self.retrieveSlot(idpackage)
if (etpData['slot'] == slot):
# remove!
removelist.append(idpackage)
for pkg in removelist:
self.removePackage(pkg)
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addPackage: inserting: ")
for ln in etpData:
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"\t "+ln+": "+str(etpData[ln]))
# create new category if it doesn't exist
catid = self.isCategoryAvailable(etpData['category'])
if (catid == -1):
# create category
catid = self.addCategory(etpData['category'])
# create new license if it doesn't exist
licid = self.isLicenseAvailable(etpData['license'])
if (licid == -1):
# create category
licid = self.addLicense(etpData['license'])
# look for configured versiontag
versiontag = ""
if (etpData['versiontag']):
versiontag = "-"+etpData['versiontag']
# baseinfo
self.cursor.execute(
'INSERT into baseinfo VALUES '
'(NULL,?,?,?,?,?,?,?,?,?,?)'
, ( etpData['category']+"/"+etpData['name']+"-"+etpData['version']+versiontag,
catid,
etpData['name'],
etpData['version'],
etpData['versiontag'],
revision,
wantedBranch,
etpData['slot'],
licid,
etpData['etpapi'],
)
)
self.connection.commit()
idpackage = self.cursor.lastrowid
# create new idflag if it doesn't exist
idflags = self.areCompileFlagsAvailable(etpData['chost'],etpData['cflags'],etpData['cxxflags'])
if (idflags == -1):
# create category
idflags = self.addCompileFlags(etpData['chost'],etpData['cflags'],etpData['cxxflags'])
# extrainfo
self.cursor.execute(
'INSERT into extrainfo VALUES '
'(?,?,?,?,?,?,?,?)'
, ( idpackage,
etpData['description'],
etpData['homepage'],
etpData['download'],
etpData['size'],
idflags,
etpData['digest'],
etpData['datecreation'],
)
)
# content, a list
for file in etpData['content']:
self.cursor.execute(
'INSERT into content VALUES '
'(?,?)'
, ( idpackage,
file,
)
)
# counter, if != -1
if etpData['counter'] != -1:
self.cursor.execute(
'INSERT into counters VALUES '
'(?,?)'
, ( etpData['counter'],
idpackage,
)
)
# on disk size
try:
self.cursor.execute(
'INSERT into sizes VALUES '
'(?,?)'
, ( idpackage,
etpData['disksize'],
)
)
except:
# create sizes table, temp hack
self.createSizesTable()
self.cursor.execute(
'INSERT into sizes VALUES '
'(?,?)'
, ( idpackage,
etpData['disksize'],
)
)
# dependencies, a list
for dep in etpData['dependencies']:
iddep = self.isDependencyAvailable(dep)
if (iddep == -1):
# create category
iddep = self.addDependency(dep)
self.cursor.execute(
'INSERT into dependencies VALUES '
'(?,?)'
, ( idpackage,
iddep,
)
)
# provide
for atom in etpData['provide']:
self.cursor.execute(
'INSERT into provide VALUES '
'(?,?)'
, ( idpackage,
atom,
)
)
# is it a system package?
if etpData['systempackage']:
self.cursor.execute(
'INSERT into systempackages VALUES '
'(?)'
, ( idpackage,
)
)
# create new protect if it doesn't exist
idprotect = self.isProtectAvailable(etpData['config_protect'])
if (idprotect == -1):
# create category
idprotect = self.addProtect(etpData['config_protect'])
# fill configprotect
self.cursor.execute(
'INSERT into configprotect VALUES '
'(?,?)'
, ( idpackage,
idprotect,
)
)
idprotect = self.isProtectAvailable(etpData['config_protect_mask'])
if (idprotect == -1):
# create category
idprotect = self.addProtect(etpData['config_protect_mask'])
# fill configprotect
self.cursor.execute(
'INSERT into configprotectmask VALUES '
'(?,?)'
, ( idpackage,
idprotect,
)
)
# conflicts, a list
for conflict in etpData['conflicts']:
self.cursor.execute(
'INSERT into conflicts VALUES '
'(?,?)'
, ( idpackage,
conflict,
)
)
# mirrorlinks, always update the table
for mirrordata in etpData['mirrorlinks']:
mirrorname = mirrordata[0]
mirrorlist = mirrordata[1]
# remove old
self.removeMirrorEntries(mirrorname)
# add new
self.addMirrors(mirrorname,mirrorlist)
# sources, a list
for source in etpData['sources']:
idsource = self.isSourceAvailable(source)
if (idsource == -1):
# create category
idsource = self.addSource(source)
self.cursor.execute(
'INSERT into sources VALUES '
'(?,?)'
, ( idpackage,
idsource,
)
)
# useflags, a list
for flag in etpData['useflags']:
iduseflag = self.isUseflagAvailable(flag)
if (iduseflag == -1):
# create category
iduseflag = self.addUseflag(flag)
self.cursor.execute(
'INSERT into useflags VALUES '
'(?,?)'
, ( idpackage,
iduseflag,
)
)
# create new keyword if it doesn't exist
for key in etpData['keywords']:
idkeyword = self.isKeywordAvailable(key)
if (idkeyword == -1):
# create category
idkeyword = self.addKeyword(key)
self.cursor.execute(
'INSERT into keywords VALUES '
'(?,?)'
, ( idpackage,
idkeyword,
)
)
for key in etpData['binkeywords']:
idbinkeyword = self.isKeywordAvailable(key)
if (idbinkeyword == -1):
# create category
idbinkeyword = self.addKeyword(key)
self.cursor.execute(
'INSERT into binkeywords VALUES '
'(?,?)'
, ( idpackage,
idbinkeyword,
)
)
self.packagesAdded = True
self.commitChanges()
return idpackage, revision, etpData, True
# Update already available atom in db
# returns True,revision if the package has been updated
# returns False,revision if not
def updatePackage(self, etpData, forcedRevision = -1):
if (self.readOnly):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"updatePackage: Cannot handle this in read only.")
raise Exception, "What are you trying to do?"
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"updatePackage: called.")
# prepare versiontag
versiontag = ""
if (etpData['versiontag']):
versiontag = "-"+etpData['versiontag']
# build atom string
pkgatom = etpData['category'] + "/" + etpData['name'] + "-" + etpData['version']+versiontag
# if client opened the database, before starting the update, remove previous entries - same atom, all branches
if (self.clientDatabase):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"updatePackage: client request. Removing duplicated entries.")
atomInfos = self.searchPackages(pkgatom)
for atomInfo in atomInfos:
idpackage = atomInfo[1]
self.removePackage(idpackage)
if (forcedRevision < 0):
forcedRevision = 0 # FIXME: this shouldn't happen
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_NORMAL,"updatePackage: removal complete. Now spawning addPackage.")
x,y,z,accepted = self.addPackage(etpData, revision = forcedRevision, wantedBranch = etpData['branch'])
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_NORMAL,"updatePackage: returned back from addPackage.")
return x,y,z,accepted
else:
# update package in etpData['branch']
# get its package revision
idpackage = self.getIDPackage(pkgatom,etpData['branch'])
if (forcedRevision == -1):
if (idpackage != -1):
curRevision = self.retrieveRevision(idpackage)
else:
curRevision = 0
else:
curRevision = forcedRevision
if (idpackage != -1): # remove old package in branch
self.removePackage(idpackage)
if (forcedRevision == -1):
curRevision += 1
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_NORMAL,"updatePackage: current revision set to "+str(curRevision))
# add the new one
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_NORMAL,"updatePackage: complete. Now spawning addPackage.")
x,y,z,accepted = self.addPackage(etpData, revision = curRevision, wantedBranch = etpData['branch'])
return x,y,z,accepted
def removePackage(self,idpackage):
if (self.readOnly):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"removePackage: Cannot handle this in read only.")
raise Exception, "What are you trying to do?"
key = self.retrieveAtom(idpackage)
branch = self.retrieveBranch(idpackage)
# clean package cache
xcached = self.databaseCache.get(int(idpackage), None)
if xcached:
try:
del self.databaseCache[int(idpackage)]
except:
pass
self.matchCache = {} # dependencies handling cache
idpackage = str(idpackage)
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_NORMAL,"removePackage: trying to remove (if exists) -> "+idpackage+":"+str(key)+" | branch: "+branch)
# baseinfo
self.cursor.execute('DELETE FROM baseinfo WHERE idpackage = '+idpackage)
# extrainfo
self.cursor.execute('DELETE FROM extrainfo WHERE idpackage = '+idpackage)
# content
self.cursor.execute('DELETE FROM content WHERE idpackage = '+idpackage)
# dependencies
self.cursor.execute('DELETE FROM dependencies WHERE idpackage = '+idpackage)
# provide
self.cursor.execute('DELETE FROM provide WHERE idpackage = '+idpackage)
# conflicts
self.cursor.execute('DELETE FROM conflicts WHERE idpackage = '+idpackage)
# protect
self.cursor.execute('DELETE FROM configprotect WHERE idpackage = '+idpackage)
# protect_mask
self.cursor.execute('DELETE FROM configprotectmask WHERE idpackage = '+idpackage)
# sources
self.cursor.execute('DELETE FROM sources WHERE idpackage = '+idpackage)
# useflags
self.cursor.execute('DELETE FROM useflags WHERE idpackage = '+idpackage)
# keywords
self.cursor.execute('DELETE FROM keywords WHERE idpackage = '+idpackage)
# binkeywords
self.cursor.execute('DELETE FROM binkeywords WHERE idpackage = '+idpackage)
# systempackage
self.cursor.execute('DELETE FROM systempackages WHERE idpackage = '+idpackage)
try:
# cpunter
self.cursor.execute('DELETE FROM counters WHERE idpackage = '+idpackage)
except:
pass
try:
# on disk sizes
self.cursor.execute('DELETE FROM sizes WHERE idpackage = '+idpackage)
except:
pass
# Remove from installedtable if exists
self.removePackageFromInstalledTable(idpackage)
# Remove from dependstable if exists
self.removePackageFromDependsTable(idpackage)
# need a final cleanup
self.packagesRemoved = True
self.commitChanges()
def removeMirrorEntries(self,mirrorname):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"removeMirrors: removing entries for mirror -> "+str(mirrorname))
self.cursor.execute('DELETE FROM mirrorlinks WHERE mirrorname = "'+mirrorname+'"')
self.commitChanges()
def addMirrors(self,mirrorname,mirrorlist):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addMirrors: adding Mirror list for "+str(mirrorname)+" -> "+str(mirrorlist))
for x in mirrorlist:
self.cursor.execute(
'INSERT into mirrorlinks VALUES '
'(?,?)', (mirrorname,x,)
)
self.commitChanges()
def addCategory(self,category):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addCategory: adding Package Category -> "+str(category))
self.cursor.execute(
'INSERT into categories VALUES '
'(NULL,?)', (category,)
)
# get info about inserted value and return
cat = self.isCategoryAvailable(category)
if cat != -1:
self.commitChanges()
return cat
raise Exception, "I tried to insert a category but then, fetching it returned -1. There's something broken."
def addProtect(self,protect):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addProtect: adding CONFIG_PROTECT/CONFIG_PROTECT_MASK -> "+str(protect))
self.cursor.execute(
'INSERT into configprotectreference VALUES '
'(NULL,?)', (protect,)
)
# get info about inserted value and return
prt = self.isProtectAvailable(protect)
if prt != -1:
return prt
raise Exception, "I tried to insert a protect but then, fetching it returned -1. There's something broken."
def addSource(self,source):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addSource: adding Package Source -> "+str(source))
self.cursor.execute(
'INSERT into sourcesreference VALUES '
'(NULL,?)', (source,)
)
# get info about inserted value and return
src = self.isSourceAvailable(source)
if src != -1:
return src
raise Exception, "I tried to insert a source but then, fetching it returned -1. There's something broken."
def addDependency(self,dependency):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addDependency: adding Package Dependency -> "+str(dependency))
self.cursor.execute(
'INSERT into dependenciesreference VALUES '
'(NULL,?)', (dependency,)
)
# get info about inserted value and return
dep = self.isDependencyAvailable(dependency)
if dep != -1:
return dep
raise Exception, "I tried to insert a dependency but then, fetching it returned -1. There's something broken."
def addKeyword(self,keyword):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addKeyword: adding Keyword -> "+str(keyword))
self.cursor.execute(
'INSERT into keywordsreference VALUES '
'(NULL,?)', (keyword,)
)
# get info about inserted value and return
key = self.isKeywordAvailable(keyword)
if key != -1:
return key
raise Exception, "I tried to insert a keyword but then, fetching it returned -1. There's something broken."
def addUseflag(self,useflag):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addUseflag: adding Keyword -> "+str(useflag))
self.cursor.execute(
'INSERT into useflagsreference VALUES '
'(NULL,?)', (useflag,)
)
# get info about inserted value and return
use = self.isUseflagAvailable(useflag)
if use != -1:
return use
raise Exception, "I tried to insert a useflag but then, fetching it returned -1. There's something broken."
def addLicense(self,license):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addLicense: adding License -> "+str(license))
self.cursor.execute(
'INSERT into licenses VALUES '
'(NULL,?)', (license,)
)
# get info about inserted value and return
lic = self.isLicenseAvailable(license)
if lic != -1:
return lic
raise Exception, "I tried to insert a license but then, fetching it returned -1. There's something broken."
#addCompileFlags(etpData['chost'],etpData['cflags'],etpData['cxxflags'])
def addCompileFlags(self,chost,cflags,cxxflags):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addCompileFlags: adding Flags -> "+chost+"|"+cflags+"|"+cxxflags)
self.cursor.execute(
'INSERT into flags VALUES '
'(NULL,?,?,?)', (chost,cflags,cxxflags,)
)
# get info about inserted value and return
idflag = self.areCompileFlagsAvailable(chost,cflags,cxxflags)
if idflag != -1:
return idflag
raise Exception, "I tried to insert a flag tuple but then, fetching it returned -1. There's something broken."
def setDigest(self, idpackage, digest):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"setChecksum: setting new digest for idpackage: "+str(idpackage)+" -> "+str(digest))
self.cursor.execute('UPDATE extrainfo SET digest = "'+str(digest)+'" WHERE idpackage = "'+str(idpackage)+'"')
def cleanupUseflags(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"cleanupUseflags: called.")
self.cursor.execute('SELECT idflag FROM useflagsreference')
idflags = set([])
for row in self.cursor:
idflags.add(row[0])
# now parse them into useflags table
orphanedFlags = idflags.copy()
for idflag in idflags:
self.cursor.execute('SELECT idflag FROM useflags WHERE idflag = '+str(idflag))
for row in self.cursor:
orphanedFlags.remove(row[0])
break
# now we have orphans that can be removed safely
for idoflag in orphanedFlags:
self.cursor.execute('DELETE FROM useflagsreference WHERE idflag = '+str(idoflag))
for row in self.cursor:
x = row # really necessary ?
def cleanupSources(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"cleanupSources: called.")
self.cursor.execute('SELECT idsource FROM sourcesreference')
idsources = set([])
for row in self.cursor:
idsources.add(row[0])
# now parse them into useflags table
orphanedSources = idsources.copy()
for idsource in idsources:
self.cursor.execute('SELECT idsource FROM sources WHERE idsource = '+str(idsource))
for row in self.cursor:
orphanedSources.remove(row[0])
break
# now we have orphans that can be removed safely
for idosrc in orphanedSources:
self.cursor.execute('DELETE FROM sourcesreference WHERE idsource = '+str(idosrc))
for row in self.cursor:
x = row # really necessary ?
def cleanupDependencies(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"cleanupDependencies: called.")
self.cursor.execute('SELECT iddependency FROM dependenciesreference')
iddeps = set([])
for row in self.cursor:
iddeps.add(row[0])
# now parse them into useflags table
orphanedDeps = iddeps.copy()
for iddep in iddeps:
self.cursor.execute('SELECT iddependency FROM dependencies WHERE iddependency = '+str(iddep))
for row in self.cursor:
orphanedDeps.remove(row[0])
break
# now we have orphans that can be removed safely
for idodep in orphanedDeps:
self.cursor.execute('DELETE FROM dependenciesreference WHERE iddependency = '+str(idodep))
for row in self.cursor:
x = row # really necessary ?
# WARNING: this function must be kept in sync with Entropy database schema
# returns True if equal
# returns False if not
# FIXME: this must be fixed to work with branches
def comparePackagesData(self, etpData, pkgAtomToQuery, branchToQuery = "unstable"):
# fill content - get idpackage
idpackage = self.getIDPackage(pkgAtomToQuery,branchToQuery)
# get data
myEtpData = self.getPackageData(idpackage)
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"comparePackagesData: called for "+str(etpData['name'])+" and "+str(myEtpData['name'])+" | branch: "+branchToQuery)
for i in etpData:
if etpData[i] != myEtpData[i]:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_VERBOSE,"comparePackagesData: they don't match")
return False
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"comparePackagesData: they match")
return True
def getIDPackage(self, atom, branch = "unstable"):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"getIDPackage: retrieving package ID for "+atom+" | branch: "+branch)
self.cursor.execute('SELECT "IDPACKAGE" FROM baseinfo WHERE atom = "'+atom+'" AND branch = "'+branch+'"')
idpackage = -1
for row in self.cursor:
idpackage = int(row[0])
break
return idpackage
def getIDPackageFromFileInBranch(self, file, branch = "unstable"):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"getIDPackageFromFile: retrieving package ID for file "+file+" | branch: "+branch)
self.cursor.execute('SELECT idpackage FROM content WHERE file = "'+file+'"')
idpackages = []
for row in self.cursor:
idpackages.append(row[0])
result = []
for pkg in idpackages:
self.cursor.execute('SELECT idpackage FROM baseinfo WHERE idpackage = "'+str(pkg)+'" and branch = "'+branch+'"')
for row in self.cursor:
result.append(row[0])
return result
def getIDPackagesFromFile(self, file):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"getIDPackageFromFile: retrieving package ID for file "+file)
self.cursor.execute('SELECT idpackage FROM content WHERE file = "'+file+'"')
idpackages = []
for row in self.cursor:
idpackages.append(row[0])
return idpackages
def getIDCategory(self, category):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"getIDCategory: retrieving category ID for "+str(category))
self.cursor.execute('SELECT "idcategory" FROM categories WHERE category = "'+str(category)+'"')
idcat = -1
for row in self.cursor:
idcat = int(row[0])
break
return idcat
def getIDPackageFromBinaryPackage(self,packageName):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"getIDPackageFromBinaryPackage: retrieving package ID for "+atom+" | branch: "+branch)
self.cursor.execute('SELECT "IDPACKAGE" FROM baseinfo WHERE download = "'+etpConst['binaryurirelativepath']+packageName+'"')
idpackage = -1
for row in self.cursor:
idpackage = int(row[0])
break
return idpackage
def getPackageData(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"getPackageData: retrieving etpData for package ID for "+str(idpackage))
data = {}
data['name'] = self.retrieveName(idpackage)
data['version'] = self.retrieveVersion(idpackage)
data['versiontag'] = self.retrieveVersionTag(idpackage)
data['description'] = self.retrieveDescription(idpackage)
data['category'] = self.retrieveCategory(idpackage)
flags = self.retrieveCompileFlags(idpackage)
data['chost'] = flags[0]
data['cflags'] = flags[1]
data['cxxflags'] = flags[2]
data['homepage'] = self.retrieveHomepage(idpackage)
data['useflags'] = self.retrieveUseflags(idpackage)
data['license'] = self.retrieveLicense(idpackage)
data['keywords'] = self.retrieveKeywords(idpackage)
data['binkeywords'] = self.retrieveBinKeywords(idpackage)
data['branch'] = self.retrieveBranch(idpackage)
data['download'] = self.retrieveDownloadURL(idpackage)
data['digest'] = self.retrieveDigest(idpackage)
data['sources'] = self.retrieveSources(idpackage)
data['counter'] = self.retrieveCounter(idpackage)
if (self.isSystemPackage(idpackage)):
data['systempackage'] = 'xxx'
else:
data['systempackage'] = ''
data['config_protect'] = self.retrieveProtect(idpackage)
data['config_protect_mask'] = self.retrieveProtectMask(idpackage)
mirrornames = []
for x in data['sources']:
if x.startswith("mirror://"):
mirrorname = x.split("/")[2]
mirrornames.append(mirrorname)
data['mirrorlinks'] = []
for mirror in mirrornames:
mirrorlinks = self.retrieveMirrorInfo(mirror)
data['mirrorlinks'].append([mirror,mirrorlinks])
data['slot'] = self.retrieveSlot(idpackage)
data['content'] = self.retrieveContent(idpackage)
data['dependencies'] = self.retrieveDependencies(idpackage)
data['provide'] = self.retrieveProvide(idpackage)
data['conflicts'] = self.retrieveConflicts(idpackage)
data['etpapi'] = self.retrieveApi(idpackage)
data['datecreation'] = self.retrieveDateCreation(idpackage)
data['size'] = self.retrieveSize(idpackage)
data['disksize'] = self.retrieveOnDiskSize(idpackage)
return data
def retrieveAtom(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveAtom: retrieving Atom for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveAtom',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "atom" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
atom = ''
for row in self.cursor:
atom = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveAtom'] = atom
return atom
def retrieveBranch(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveBranch: retrieving Branch for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveBranch',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "branch" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
br = ''
for row in self.cursor:
br = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveBranch'] = br
return br
def retrieveDownloadURL(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveDownloadURL: retrieving download URL for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveDownloadURL',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "download" FROM extrainfo WHERE idpackage = "'+str(idpackage)+'"')
download = ''
for row in self.cursor:
download = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveDownloadURL'] = download
return download
def retrieveDescription(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveDescription: retrieving description for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveDescription',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "description" FROM extrainfo WHERE idpackage = "'+str(idpackage)+'"')
description = ''
for row in self.cursor:
description = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveDescription'] = description
return description
def retrieveHomepage(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveHomepage: retrieving Homepage for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveHomepage',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "homepage" FROM extrainfo WHERE idpackage = "'+str(idpackage)+'"')
home = ''
for row in self.cursor:
home = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveHomepage'] = home
return home
def retrieveCounter(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveCounter: retrieving Counter for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveCounter',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
counter = -1
try:
self.cursor.execute('SELECT "counter" FROM counters WHERE idpackage = "'+str(idpackage)+'"')
for row in self.cursor:
counter = row[0]
break
except:
pass
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveCounter'] = counter
return counter
# in bytes
def retrieveSize(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveSize: retrieving Size for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveSize',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "size" FROM extrainfo WHERE idpackage = "'+str(idpackage)+'"')
size = 'N/A'
for row in self.cursor:
size = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveSize'] = size
return size
# in bytes
def retrieveOnDiskSize(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveOnDiskSize: retrieving On Disk Size for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveOnDiskSize',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
try:
self.cursor.execute('SELECT size FROM sizes WHERE idpackage = "'+str(idpackage)+'"')
except:
# table does not exist?
return 0
size = 0
for row in self.cursor:
size = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveOnDiskSize'] = size
return size
def retrieveDigest(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveDigest: retrieving Digest for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveDigest',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "digest" FROM extrainfo WHERE idpackage = "'+str(idpackage)+'"')
digest = ''
for row in self.cursor:
digest = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveDigest'] = digest
return digest
def retrieveName(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveName: retrieving Name for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveName',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "name" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
name = ''
for row in self.cursor:
name = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveName'] = name
return name
def retrieveVersion(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveVersion: retrieving Version for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveVersion',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "version" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
ver = ''
for row in self.cursor:
ver = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveVersion'] = ver
return ver
def retrieveRevision(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveRevision: retrieving Revision for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveRevision',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "revision" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
rev = ''
for row in self.cursor:
rev = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveRevision'] = rev
return rev
def retrieveDateCreation(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveDateCreation: retrieving Creation Date for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveDateCreation',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "datecreation" FROM extrainfo WHERE idpackage = "'+str(idpackage)+'"')
date = 'N/A'
for row in self.cursor:
date = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveDateCreation'] = date
return date
def retrieveApi(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveApi: retrieving Database API for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveApi',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "etpapi" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
api = -1
for row in self.cursor:
api = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveApi'] = api
return api
def retrieveUseflags(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveUseflags: retrieving USE flags for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveUseflags',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "idflag" FROM useflags WHERE idpackage = "'+str(idpackage)+'"')
idflgs = []
for row in self.cursor:
idflgs.append(row[0])
flags = []
for idflg in idflgs:
self.cursor.execute('SELECT "flagname" FROM useflagsreference WHERE idflag = "'+str(idflg)+'"')
for row in self.cursor:
flags.append(row[0])
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveUseflags'] = flags
return flags
def retrieveConflicts(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveConflicts: retrieving Conflicts for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveConflicts',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "conflict" FROM conflicts WHERE idpackage = "'+str(idpackage)+'"')
confl = []
for row in self.cursor:
confl.append(row[0])
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveConflicts'] = confl
return confl
def retrieveProvide(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveProvide: retrieving Provide for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveProvide',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "atom" FROM provide WHERE idpackage = "'+str(idpackage)+'"')
provide = []
for row in self.cursor:
provide.append(row[0])
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveProvide'] = provide
return provide
def retrieveDependencies(self, idpackage):
self.cursor.execute('SELECT iddependency FROM dependencies WHERE idpackage = "'+str(idpackage)+'"')
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveDependencies',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
iddeps = []
for row in self.cursor:
iddeps.append(row[0])
deps = []
for iddep in iddeps:
self.cursor.execute('SELECT dependency FROM dependenciesreference WHERE iddependency = "'+str(iddep)+'"')
for row in self.cursor:
deps.append(row[0])
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveDependencies'] = deps
return deps
def retrieveIdDependencies(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveDependencies: retrieving Dependencies for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveIdDependencies',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT iddependency FROM dependencies WHERE idpackage = "'+str(idpackage)+'"')
iddeps = []
for row in self.cursor:
iddeps.append(row[0])
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveIdDependencies'] = iddeps
return iddeps
def retrieveBinKeywords(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveBinKeywords: retrieving Binary Keywords for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveBinKeywords',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "idkeyword" FROM binkeywords WHERE idpackage = "'+str(idpackage)+'"')
idkws = []
for row in self.cursor:
idkws.append(row[0])
kw = []
for idkw in idkws:
self.cursor.execute('SELECT "keywordname" FROM keywordsreference WHERE idkeyword = "'+str(idkw)+'"')
for row in self.cursor:
kw.append(row[0])
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveBinKeywords'] = kw
return kw
def retrieveKeywords(self, idpackage):
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveKeywords',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveKeywords: retrieving Keywords for package ID "+str(idpackage))
self.cursor.execute('SELECT "idkeyword" FROM keywords WHERE idpackage = "'+str(idpackage)+'"')
idkws = []
for row in self.cursor:
idkws.append(row[0])
kw = []
for idkw in idkws:
self.cursor.execute('SELECT "keywordname" FROM keywordsreference WHERE idkeyword = "'+str(idkw)+'"')
for row in self.cursor:
kw.append(row[0])
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveKeywords'] = kw
return kw
def retrieveProtect(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveProtect: retrieving CONFIG_PROTECT for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveProtect',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "idprotect" FROM configprotect WHERE idpackage = "'+str(idpackage)+'"')
idprotect = -1
for row in self.cursor:
idprotect = row[0]
break
protect = ''
if idprotect == -1:
return protect
self.cursor.execute('SELECT "protect" FROM configprotectreference WHERE idprotect = "'+str(idprotect)+'"')
for row in self.cursor:
protect = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveProtect'] = protect
return protect
def retrieveProtectMask(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveProtectMask: retrieving CONFIG_PROTECT_MASK for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveProtectMask',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "idprotect" FROM configprotectmask WHERE idpackage = "'+str(idpackage)+'"')
idprotect = -1
for row in self.cursor:
idprotect = row[0]
break
protect = ''
if idprotect == -1:
return protect
self.cursor.execute('SELECT "protect" FROM configprotectreference WHERE idprotect = "'+str(idprotect)+'"')
for row in self.cursor:
protect = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveProtectMask'] = protect
return protect
def retrieveSources(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveSources: retrieving Sources for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveSources',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT idsource FROM sources WHERE idpackage = "'+str(idpackage)+'"')
idsources = []
for row in self.cursor:
idsources.append(row[0])
sources = []
for idsource in idsources:
self.cursor.execute('SELECT source FROM sourcesreference WHERE idsource = "'+str(idsource)+'"')
for row in self.cursor:
sources.append(row[0])
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveSources'] = sources
return sources
def retrieveContent(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveContent: retrieving Content for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveContent',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "file" FROM content WHERE idpackage = "'+str(idpackage)+'"')
fl = []
for row in self.cursor:
fl.append(row[0])
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveContent'] = fl
return fl
def retrieveSlot(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveSlot: retrieving Slot for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveSlot',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "slot" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
ver = ''
for row in self.cursor:
ver = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveSlot'] = ver
return ver
def retrieveVersionTag(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveVersionTag: retrieving Version TAG for package ID "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveVersionTag',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "versiontag" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
ver = ''
for row in self.cursor:
ver = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveVersionTag'] = ver
return ver
def retrieveMirrorInfo(self, mirrorname):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveMirrorInfo: retrieving Mirror info for mirror name "+str(mirrorname))
self.cursor.execute('SELECT "mirrorlink" FROM mirrorlinks WHERE mirrorname = "'+str(mirrorname)+'"')
mirrorlist = []
for row in self.cursor:
mirrorlist.append(row[0])
return mirrorlist
def retrieveCategory(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveCategory: retrieving Category for package ID for "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveCategory',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "idcategory" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
cat = ''
for row in self.cursor:
cat = row[0]
break
# now get the category name
self.cursor.execute('SELECT "category" FROM categories WHERE idcategory = '+str(cat))
cat = -1
for row in self.cursor:
cat = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveCategory'] = cat
return cat
def retrieveLicense(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveLicense: retrieving License for package ID for "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveLicense',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "idlicense" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
lic = -1
for row in self.cursor:
lic = row[0]
break
# now get the license name
self.cursor.execute('SELECT "license" FROM licenses WHERE idlicense = '+str(lic))
licname = ''
for row in self.cursor:
licname = row[0]
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveLicense'] = licname
return licname
def retrieveCompileFlags(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveCompileFlags: retrieving CHOST,CFLAGS,CXXFLAGS for package ID for "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('retrieveCompileFlags',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
self.cursor.execute('SELECT "idflags" FROM extrainfo WHERE idpackage = "'+str(idpackage)+'"')
idflag = -1
for row in self.cursor:
idflag = row[0]
break
# now get the flags
self.cursor.execute('SELECT chost,cflags,cxxflags FROM flags WHERE idflags = '+str(idflag))
flags = ["N/A","N/A","N/A"]
for row in self.cursor:
flags = row
break
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['retrieveCompileFlags'] = flags
return flags
def retrieveDepends(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveDepends: called for idpackage "+str(idpackage))
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('searchDepends',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
# sanity check on the table
sanity = self.isDependsTableSane() #FIXME: perhaps running this only on a client database?
if (not sanity):
return -2 # table does not exist or is broken, please regenerate and re-run
iddeps = []
self.cursor.execute('SELECT iddependency FROM dependstable WHERE idpackage = "'+str(idpackage)+'"')
for row in self.cursor:
iddeps.append(row[0])
result = []
for iddep in iddeps:
#print iddep
self.cursor.execute('SELECT idpackage FROM dependencies WHERE iddependency = "'+str(iddep)+'"')
for row in self.cursor:
result.append(row[0])
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['searchDepends'] = result
return result
# You must provide the full atom to this function
# WARNING: this function does not support branches !!!
def isPackageAvailable(self,pkgkey):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isPackageAvailable: called.")
pkgkey = entropyTools.removePackageOperators(pkgkey)
result = []
self.cursor.execute('SELECT idpackage FROM baseinfo WHERE atom = "'+pkgkey+'"')
for row in self.cursor:
result.append(row)
if result == []:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isPackageAvailable: "+pkgkey+" not available.")
return False
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isPackageAvailable: "+pkgkey+" available.")
return True
def isIDPackageAvailable(self,idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isIDPackageAvailable: called.")
result = []
self.cursor.execute('SELECT idpackage FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
for row in self.cursor:
result.append(row[0])
if result == []:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isIDPackageAvailable: "+str(idpackage)+" not available.")
return False
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isIDPackageAvailable: "+str(idpackage)+" available.")
return True
# This version is more specific and supports branches
def isSpecificPackageAvailable(self, pkgkey, branch):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isSpecificPackageAvailable: called.")
pkgkey = entropyTools.removePackageOperators(pkgkey)
result = []
self.cursor.execute('SELECT idpackage FROM baseinfo WHERE atom = "'+pkgkey+'" AND branch = "'+branch+'"')
for row in self.cursor:
result.append(row[0])
if result == []:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isSpecificPackageAvailable: "+pkgkey+" | branch: "+branch+" -> not found.")
return False
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isSpecificPackageAvailable: "+pkgkey+" | branch: "+branch+" -> found !")
return True
def isCategoryAvailable(self,category):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isCategoryAvailable: called.")
result = -1
self.cursor.execute('SELECT idcategory FROM categories WHERE category = "'+category+'"')
for row in self.cursor:
result = row[0]
if result == -1:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isCategoryAvailable: "+category+" not available.")
return result
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isCategoryAvailable: "+category+" available.")
return result
def isProtectAvailable(self,protect):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isProtectAvailable: called.")
result = -1
self.cursor.execute('SELECT idprotect FROM configprotectreference WHERE protect = "'+protect+'"')
for row in self.cursor:
result = row[0]
if result == -1:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isProtectAvailable: "+protect+" not available.")
return result
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isProtectAvailable: "+protect+" available.")
return result
def isSourceAvailable(self,source):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isSourceAvailable: called.")
result = -1
self.cursor.execute('SELECT idsource FROM sourcesreference WHERE source = "'+source+'"')
for row in self.cursor:
result = row[0]
if result == -1:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isSourceAvailable: "+source+" not available.")
return result
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isSourceAvailable: "+source+" available.")
return result
def isDependencyAvailable(self,dependency):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isDependencyAvailable: called.")
result = -1
self.cursor.execute('SELECT iddependency FROM dependenciesreference WHERE dependency = "'+dependency+'"')
for row in self.cursor:
result = row[0]
if result == -1:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isDependencyAvailable: "+dependency+" not available.")
return result
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isDependencyAvailable: "+dependency+" available.")
return result
def isKeywordAvailable(self,keyword):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isKeywordAvailable: called.")
result = -1
self.cursor.execute('SELECT idkeyword FROM keywordsreference WHERE keywordname = "'+keyword+'"')
for row in self.cursor:
result = row[0]
if result == -1:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isKeywordAvailable: "+keyword+" not available.")
return result
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isKeywordAvailable: "+keyword+" available.")
return result
def isUseflagAvailable(self,useflag):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isUseflagAvailable: called.")
result = -1
self.cursor.execute('SELECT idflag FROM useflagsreference WHERE flagname = "'+useflag+'"')
for row in self.cursor:
result = row[0]
if result == -1:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isUseflagAvailable: "+useflag+" not available.")
return result
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isUseflagAvailable: "+useflag+" available.")
return result
def isCounterAvailable(self,counter):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isCounterAvailable: called.")
result = False
self.cursor.execute('SELECT counter FROM counters WHERE counter = "'+str(counter)+'"')
for row in self.cursor:
result = True
if (result):
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isCounterAvailable: "+str(counter)+" not available.")
else:
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isCounterAvailable: "+str(counter)+" available.")
return result
def isLicenseAvailable(self,license):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isLicenseAvailable: called.")
result = -1
self.cursor.execute('SELECT idlicense FROM licenses WHERE license = "'+license+'"')
for row in self.cursor:
result = row[0]
if result == -1:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isLicenseAvailable: "+license+" not available.")
return result
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isLicenseAvailable: "+license+" available.")
return result
def isSystemPackage(self,idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isSystemPackage: called.")
''' caching '''
if (self.xcache):
cached = self.databaseCache.get(int(idpackage), None)
if cached:
rslt = self.databaseCache[int(idpackage)].get('isSystemPackage',None)
if rslt:
return rslt
else:
self.databaseCache[int(idpackage)] = {}
result = -1
self.cursor.execute('SELECT idpackage FROM systempackages WHERE idpackage = "'+str(idpackage)+'"')
for row in self.cursor:
result = row[0]
break
rslt = False
if result != -1:
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isSystemPackage: package is in system.")
rslt = True
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isSystemPackage: package is NOT in system.")
''' caching '''
if (self.xcache):
self.databaseCache[int(idpackage)]['isSystemPackage'] = rslt
return rslt
def areCompileFlagsAvailable(self,chost,cflags,cxxflags):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"areCompileFlagsAvailable: called.")
result = -1
self.cursor.execute('SELECT idflags FROM flags WHERE chost = "'+chost+'" AND cflags = "'+cflags+'" AND cxxflags = "'+cxxflags+'"')
for row in self.cursor:
result = row[0]
if result == -1:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"areCompileFlagsAvailable: flags tuple "+chost+"|"+cflags+"|"+cxxflags+" not available.")
return result
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"areCompileFlagsAvailable: flags tuple "+chost+"|"+cflags+"|"+cxxflags+" available.")
return result
def searchBelongs(self, file, like = False):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchBelongs: called for "+file)
result = []
if (like):
self.cursor.execute('SELECT idpackage FROM content WHERE file LIKE "'+file+'"')
else:
self.cursor.execute('SELECT idpackage FROM content WHERE file = "'+file+'"')
for row in self.cursor:
result.append(row[0])
return result
def searchPackages(self, keyword, sensitive = False):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchPackages: called for "+keyword)
result = []
if (sensitive):
self.cursor.execute('SELECT atom,idpackage,branch FROM baseinfo WHERE atom LIKE "%'+keyword+'%"')
else:
self.cursor.execute('SELECT atom,idpackage,branch FROM baseinfo WHERE LOWER(atom) LIKE "%'+string.lower(keyword)+'%"')
for row in self.cursor:
result.append(row)
return result
def searchProvide(self, keyword):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchProvide: called for "+keyword)
idpackage = []
self.cursor.execute('SELECT idpackage FROM provide WHERE atom = "'+keyword+'"')
for row in self.cursor:
idpackage = row[0]
break
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
result = []
for row in self.cursor:
result = row
break
return result
def searchProvideInBranch(self, keyword, branch):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchProvideInBranch: called for "+keyword+" and branch: "+branch)
idpackage = []
self.cursor.execute('SELECT idpackage FROM provide WHERE atom = "'+keyword+'"')
for row in self.cursor:
idpackage = row[0]
break
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"')
result = []
for row in self.cursor:
data = row
idpackage = data[1]
pkgbranch = self.retrieveBranch(idpackage)
if (branch == pkgbranch):
result.append(data)
break
return result
def searchPackagesInBranch(self, keyword, branch, sensitive = False):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchPackagesInBranch: called.")
result = []
if (sensitive):
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE atom LIKE "%'+keyword+'%" AND branch = "'+branch+'"')
else:
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE LOWER(atom) LIKE "%'+string.lower(keyword)+'%" AND branch = "'+branch+'"')
for row in self.cursor:
result.append(row)
return result
def searchPackagesByDescription(self, keyword):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchPackagesByDescription: called for "+keyword)
idpkgs = []
self.cursor.execute('SELECT idpackage FROM extrainfo WHERE LOWER(description) LIKE "%'+string.lower(keyword)+'%"')
for row in self.cursor:
idpkgs.append(row[0])
result = []
for idpk in idpkgs:
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE idpackage = "'+str(idpk)+'"')
for row in self.cursor:
result.append(row)
return result
def searchPackagesByName(self, keyword, sensitive = False):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchPackagesByName: called for "+keyword)
result = []
if (sensitive):
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE name = "'+keyword+'"')
else:
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE LOWER(name) = "'+string.lower(keyword)+'"')
for row in self.cursor:
result.append(row)
return result
def searchPackagesByNameAndCategory(self, name, category, sensitive = False):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchPackagesByNameAndCategory: called for name: "+name+" and category: "+category)
result = []
# get category id
idcat = -1
self.cursor.execute('SELECT idcategory FROM categories WHERE category = "'+category+'"')
for row in self.cursor:
idcat = row[0]
break
if idcat == -1:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"searchPackagesByNameAndCategory: Category "+category+" not available.")
return result
if (sensitive):
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE name = "'+name+'" AND idcategory ='+str(idcat))
else:
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE LOWER(name) = "'+string.lower(name)+'" AND idcategory ='+str(idcat))
for row in self.cursor:
result.append(row)
return result
def searchPackagesInBranchByName(self, keyword, branch, sensitive = False):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchPackagesInBranchByName: called for "+keyword)
result = []
if (sensitive):
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE name = "'+keyword+'" AND branch = "'+branch+'"')
else:
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE LOWER(name) = "'+string.lower(keyword)+'" AND branch = "'+branch+'"')
for row in self.cursor:
result.append(row)
return result
def searchPackagesInBranchByNameAndCategory(self, name, category, branch, sensitive = False):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchPackagesInBranchByNameAndCategory: called for "+name+" and category "+category)
result = []
# get category id
idcat = -1
self.cursor.execute('SELECT idcategory FROM categories WHERE category = "'+category+'"')
for row in self.cursor:
idcat = row[0]
break
if idcat == -1:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"searchPackagesInBranchByNameAndCategory: Category "+category+" not available.")
return result
if (sensitive):
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE name = "'+name+'" AND idcategory = '+str(idcat)+' AND branch = "'+branch+'"')
else:
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE LOWER(name) = "'+string.lower(name)+'" AND idcategory = '+str(idcat)+' AND branch = "'+branch+'"')
for row in self.cursor:
result.append(row)
return result
def searchPackagesInBranchByNameAndVersionAndCategory(self, name, version, category, branch, sensitive = False):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchPackagesInBranchByNameAndVersionAndCategoryAndTag: called for "+name+" and version "+version+" and category "+category+" | branch "+branch)
result = []
# get category id
idcat = -1
self.cursor.execute('SELECT idcategory FROM categories WHERE category = "'+category+'"')
for row in self.cursor:
idcat = row[0]
break
if idcat == -1:
dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"searchPackagesInBranchByNameAndVersionAndCategoryAndTag: Category "+category+" not available.")
return result
if (sensitive):
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE name = "'+name+'" AND version = "'+version+'" AND idcategory = '+str(idcat)+' AND branch = "'+branch+'"')
else:
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE LOWER(name) = "'+string.lower(name)+'" AND version = "'+version+'" AND idcategory = '+str(idcat)+' AND branch = "'+branch+'"')
for row in self.cursor:
result.append(row)
return result
# this function search packages with the same pkgcat/pkgname
# you must provide something like: media-sound/amarok
# optionally, you can add version too.
def searchSimilarPackages(self, atom, branch = "unstable"):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchSimilarPackages: called for "+atom+" | branch: "+branch)
category = atom.split("/")[0]
name = atom.split("/")[1]
# get category id
idcategory = self.getIDCategory(category)
result = []
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE idcategory = "'+str(idcategory)+'" AND LOWER(name) = "'+string.lower(name)+'" AND branch = "'+branch+'"')
for row in self.cursor:
result.append(row)
return result
def listAllPackages(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"listAllPackages: called.")
self.cursor.execute('SELECT atom,idpackage,branch FROM baseinfo')
result = []
for row in self.cursor:
result.append(row)
return result
def listAllCounters(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"listAllCounters: called.")
self.cursor.execute('SELECT counter,idpackage FROM counters')
result = []
for row in self.cursor:
result.append(row)
return result
def listAllIdpackages(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"listAllIdpackages: called.")
self.cursor.execute('SELECT idpackage FROM baseinfo')
result = []
for row in self.cursor:
result.append(row[0])
return result
def listAllDependencies(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"listAllDependencies: called.")
self.cursor.execute('SELECT * FROM dependenciesreference')
result = []
for row in self.cursor:
result.append(row)
return result
def listIdpackageDependencies(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"listIdpackageDependencies: called.")
self.cursor.execute('SELECT iddependency FROM dependencies where idpackage = "'+str(idpackage)+'"')
iddeps = []
for row in self.cursor:
iddeps.append(row[0])
result = []
for iddep in iddeps:
self.cursor.execute('SELECT iddependency,dependency FROM dependenciesreference where iddependency = "'+str(iddep)+'"')
for row in self.cursor:
result.append(row)
return result
### DEPRECATED
def listAllPackagesTbz2(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"listAllPackagesTbz2: called.")
result = []
pkglist = self.listAllPackages()
for pkg in pkglist:
idpackage = pkg[1]
url = self.retrieveDownloadURL(idpackage)
if url:
result.append(url)
# filter dups?
if (result):
result = list(set(result))
result.sort()
return result
def listBranchPackagesTbz2(self, branch):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"listBranchPackagesTbz2: called with "+str(branch))
result = []
pkglist = self.listBranchPackages(branch)
for pkg in pkglist:
idpackage = pkg[1]
url = self.retrieveDownloadURL(idpackage)
if url:
result.append(os.path.basename(url))
# filter dups?
if (result):
result = list(set(result))
result.sort()
return result
def listBranchPackages(self, branch):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"listBranchPackages: called with "+str(branch))
result = []
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE branch = "'+str(branch)+'"')
for row in self.cursor:
result.append(row)
return result
# FIXME: remove this, we don't just have stable/unstable branches
def searchStablePackages(self,atom):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchStablePackages: called for "+atom)
category = atom.split("/")[0]
name = atom.split("/")[1]
result = []
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE category = "'+category+'" AND name = "'+name+'" AND branch = "stable"')
for row in self.cursor:
result.append(row)
return result
# FIXME: also remove this
def searchUnstablePackages(self,atom):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchUnstablePackages: called for "+atom)
category = atom.split("/")[0]
name = atom.split("/")[1]
result = []
self.cursor.execute('SELECT atom,idpackage FROM baseinfo WHERE category = "'+category+'" AND name = "'+name+'" AND branch = "stable"')
for row in self.cursor:
result.append(row)
return result
def stabilizePackage(self,atom,stable = True):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"stabilizePackage: called for "+atom+" | branch stable? -> "+str(stable))
action = "unstable"
removeaction = "stable"
if (stable):
action = "stable"
removeaction = "unstable"
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"stabilizePackage: add action: "+action+" | remove action: "+removeaction)
if (self.isSpecificPackageAvailable(atom, removeaction)):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"stabilizePackage: there's something old that needs to be removed.")
idpackage = self.getIDPackage(atom, branch = removeaction)
pkgname = self.retrieveName(idpackage)
# get its pkgcat
category = self.retrieveCategory(idpackage)
# search packages with similar pkgcat/name marked as stable
slot = self.retrieveSlot(idpackage)
# we need to get rid of them
results = self.searchStablePackages(category+"/"+pkgname)
removelist = []
for result in results:
myidpackage = result[1]
# have a look if the slot matches
#print result
myslot = self.retrieveSlot(myidpackage)
if (myslot == slot):
removelist.append(result[1])
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"stabilizePackage: removelist: "+str(removelist))
for pkg in removelist:
self.removePackage(pkg)
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"stabilizePackage: updating "+atom+" setting branch: "+action)
self.cursor.execute('UPDATE baseinfo SET branch = "'+action+'" WHERE idpackage = "'+idpackage+'"')
self.commitChanges()
return True,action
return False,action
########################################################
####
## Client Database API / but also used by server part
#
def addPackageToInstalledTable(self, idpackage, repositoryName):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addPackageToInstalledTable: called for "+str(idpackage)+" and repository "+str(repositoryName))
self.cursor.execute(
'INSERT into installedtable VALUES '
'(?,?)'
, ( idpackage,
repositoryName,
)
)
self.commitChanges()
def retrievePackageFromInstalledTable(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrievePackageFromInstalledTable: called. ")
result = 'Not available'
try:
self.cursor.execute('SELECT repositoryname FROM installedtable WHERE idpackage = "'+str(idpackage)+'"')
for row in self.cursor:
result = row[0]
break
except:
pass
return result
def removePackageFromInstalledTable(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"removePackageFromInstalledTable: called for "+str(idpackage))
try:
self.cursor.execute('DELETE FROM installedtable WHERE idpackage = '+str(idpackage))
self.commitChanges()
except:
self.createInstalledTable()
def removePackageFromDependsTable(self, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"removePackageFromDependsTable: called for "+str(idpackage))
try:
self.cursor.execute('DELETE FROM dependstable WHERE idpackage = '+str(idpackage))
self.commitChanges()
return 0
except:
return 1 # need reinit
def removeDependencyFromDependsTable(self, iddependency):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"removeDependencyFromDependsTable: called for "+str(iddependency))
try:
self.cursor.execute('DELETE FROM dependstable WHERE iddependency = '+str(iddependency))
self.commitChanges()
return 0
except:
return 1 # need reinit
# temporary/compat functions
def createDependsTable(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"createDependsTable: called.")
self.cursor.execute('DROP TABLE IF EXISTS dependstable;')
self.cursor.execute('CREATE TABLE dependstable ( iddependency INTEGER PRIMARY KEY, idpackage INTEGER );')
# this will be removed when dependstable is refilled properly
self.cursor.execute(
'INSERT into dependstable VALUES '
'(?,?)'
, ( -1,
-1,
)
)
self.commitChanges()
def sanitizeDependsTable(self):
self.cursor.execute('DELETE FROM dependstable where iddependency = -1')
self.commitChanges()
def isDependsTableSane(self):
sane = True
try:
self.cursor.execute('SELECT iddependency FROM dependstable WHERE iddependency = -1')
except:
return False # table does not exist, please regenerate and re-run
for row in self.cursor:
sane = False
break
return sane
def createSizesTable(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"createSizesTable: called.")
self.cursor.execute('DROP TABLE IF EXISTS sizes;')
self.cursor.execute('CREATE TABLE sizes ( idpackage INTEGER, size INTEGER );')
self.commitChanges()
def createInstalledTable(self):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"createInstalledTable: called.")
self.cursor.execute('DROP TABLE IF EXISTS installedtable;')
self.cursor.execute('CREATE TABLE installedtable ( idpackage INTEGER, repositoryname VARCHAR );')
self.commitChanges()
def addDependRelationToDependsTable(self, iddependency, idpackage):
dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addDependRelationToDependsTable: called for iddependency "+str(iddependency)+" and idpackage "+str(idpackage))
self.cursor.execute(
'INSERT into dependstable VALUES '
'(?,?)'
, ( iddependency,
idpackage,
)
)
self.commitChanges()
########################################################
####
## Dependency handling functions
#
'''
@description: matches the user chosen package name+ver, if possibile, in a single repository
@input atom: string
@input dbconn: database connection
@output: the package id, if found, otherwise -1 plus the status, 0 = ok, 1 = not found, 2 = need more info, 3 = cannot use direction without specifying version
'''
def atomMatch(self, atom, caseSensitive = True):
if (self.xcache):
cached = self.matchCache.get(atom)
if cached:
return cached['result']
# check for direction
strippedAtom = entropyTools.dep_getcpv(atom)
if atom.endswith("*"):
strippedAtom += "*"
direction = atom[0:len(atom)-len(strippedAtom)]
#print direction
#print strippedAtom
#print isspecific(strippedAtom)
#print direction
justname = entropyTools.isjustname(strippedAtom)
#print justname
pkgversion = ''
if (not justname):
# strip tag
if strippedAtom.split("-")[len(strippedAtom.split("-"))-1].startswith("t"):
strippedAtom = string.join(strippedAtom.split("-t")[:len(strippedAtom.split("-t"))-1],"-t")
# get version
data = entropyTools.catpkgsplit(strippedAtom)
if data == None:
return -1,3 # atom is badly formatted
pkgversion = data[2]+"-"+data[3]
pkgtag = ''
if atom.split("-")[len(atom.split("-"))-1].startswith("t"):
pkgtag = atom.split("-")[len(atom.split("-"))-1]
#print "TAG: "+pkgtag
#print data
#print pkgversion
#print pkgtag
pkgkey = entropyTools.dep_getkey(strippedAtom)
if len(pkgkey.split("/")) == 2:
pkgname = pkgkey.split("/")[1]
pkgcat = pkgkey.split("/")[0]
else:
pkgname = pkgkey.split("/")[0]
pkgcat = "null"
#print dep_getkey(strippedAtom)
myBranchIndex = etpConst['branches'].index(etpConst['branch'])
# IDs found in the database that match our search
foundIDs = []
for idx in range(myBranchIndex+1)[::-1]: # reverse order
#print "Searching into -> "+etpConst['branches'][idx]
# search into the less stable, if found, break, otherwise continue
results = self.searchPackagesInBranchByName(pkgname, etpConst['branches'][idx], caseSensitive)
# if it's a PROVIDE, search with searchProvide
if (not results):
results = self.searchProvideInBranch(pkgkey,etpConst['branches'][idx])
# now validate
if (not results):
#print "results is empty"
continue # search into a stabler branch
elif (len(results) > 1):
#print "results > 1"
# if it's because category differs, it's a problem
foundCat = ""
cats = []
for result in results:
idpackage = result[1]
cat = self.retrieveCategory(idpackage)
cats.append(cat)
if (cat == pkgcat):
foundCat = cat
break
# if categories are the same...
if (not foundCat) and (len(cats) > 0):
cats = entropyTools.filterDuplicatedEntries(cats)
if len(cats) == 1:
foundCat = cats[0]
if (not foundCat) and (pkgcat == "null"):
# got the issue
# gosh, return and complain
self.matchCache[atom] = {}
self.matchCache[atom]['result'] = -1,2
return -1,2
# I can use foundCat
pkgcat = foundCat
# we need to search using the category
results = self.searchPackagesInBranchByNameAndCategory(pkgname,pkgcat,etpConst['branches'][idx], caseSensitive)
# validate again
if (not results):
continue # search into a stabler branch
# if we get here, we have found the needed IDs
foundIDs = results
break
else:
#print "results == 1"
foundIDs.append(results[0])
break
if (foundIDs):
# now we have to handle direction
if (direction) or (direction == '' and not justname) or (direction == '' and not justname and strippedAtom.endswith("*")):
# check if direction is used with justname, in this case, return an error
if (justname):
#print "justname"
self.matchCache[atom] = {}
self.matchCache[atom]['result'] = -1,3
return -1,3 # error, cannot use directions when not specifying version
if (direction == "~") or (direction == "=") or (direction == '' and not justname) or (direction == '' and not justname and strippedAtom.endswith("*")): # any revision within the version specified OR the specified version
if (direction == '' and not justname):
direction = "="
#print direction+" direction"
# remove revision (-r0 if none)
if (direction == "="):
if (pkgversion.split("-")[len(pkgversion.split("-"))-1] == "r0"):
pkgversion = string.join(pkgversion.split("-")[:len(pkgversion.split("-"))-1],"-")
if (direction == "~"):
pkgversion = string.join(pkgversion.split("-")[:len(pkgversion.split("-"))-1],"-")
#print pkgversion
dbpkginfo = []
for list in foundIDs:
idpackage = list[1]
dbver = self.retrieveVersion(idpackage)
if (direction == "~"):
if dbver.startswith(pkgversion):
# found
dbpkginfo.append([idpackage,dbver])
else:
dbtag = self.retrieveVersionTag(idpackage)
#print pkgversion
# media-libs/test-1.2* support
if pkgversion.endswith("*"):
testpkgver = pkgversion[:len(pkgversion)-1]
#print testpkgver
combodb = dbver+dbtag
combopkg = testpkgver+pkgtag
#print combodb
#print combopkg
if combodb.startswith(combopkg):
dbpkginfo.append([idpackage,dbver])
else:
if (dbver+dbtag == pkgversion+pkgtag):
# found
dbpkginfo.append([idpackage,dbver])
if (not dbpkginfo):
# no version available
if (direction == "~"): # if the atom with the same version (any rev) is not found, fallback to the first available
for list in foundIDs:
idpackage = list[1]
dbver = self.retrieveVersion(idpackage)
dbpkginfo.append([idpackage,dbver])
if (not dbpkginfo):
self.matchCache[atom] = {}
self.matchCache[atom]['result'] = -1,1
return -1,1
versions = []
for x in dbpkginfo:
versions.append(x[1])
# who is newer ?
versionlist = entropyTools.getNewerVersion(versions)
newerPackage = dbpkginfo[versions.index(versionlist[0])]
# now look if there's another package with the same category, name, version, but different tag
newerPkgName = self.retrieveName(newerPackage[0])
newerPkgCategory = self.retrieveCategory(newerPackage[0])
newerPkgVersion = self.retrieveVersion(newerPackage[0])
newerPkgBranch = self.retrieveBranch(newerPackage[0])
similarPackages = self.searchPackagesInBranchByNameAndVersionAndCategory(newerPkgName, newerPkgVersion, newerPkgCategory, newerPkgBranch, caseSensitive)
#print newerPackage
#print similarPackages
if (len(similarPackages) > 1):
# gosh, there are packages with the same name, version, category
# we need to parse version tag
versionTags = []
for pkg in similarPackages:
versionTags.append(self.retrieveVersionTag(pkg[1]))
versiontaglist = entropyTools.getNewerVersionTag(versionTags)
newerPackage = similarPackages[versionTags.index(versiontaglist[0])]
#print newerPackage
#print newerPackage[1]
self.matchCache[atom] = {}
self.matchCache[atom]['result'] = newerPackage[0],0
return newerPackage[0],0
elif (direction.find(">") != -1) or (direction.find("<") != -1): # FIXME: add slot scopes
#print direction+" direction"
# remove revision (-r0 if none)
if pkgversion.split("-")[len(pkgversion.split("-"))-1] == "r0":
# remove
pkgversion = string.join(pkgversion.split("-")[:len(pkgversion.split("-"))-1],"-")
dbpkginfo = []
for list in foundIDs:
idpackage = list[1]
dbver = self.retrieveVersion(idpackage)
cmp = entropyTools.compareVersions(pkgversion,dbver)
if direction == ">": # the --deep mode should really act on this
if (cmp < 0):
# found
dbpkginfo.append([idpackage,dbver])
elif direction == "<":
if (cmp > 0):
# found
dbpkginfo.append([idpackage,dbver])
elif direction == ">=": # the --deep mode should really act on this
if (cmp <= 0):
# found
dbpkginfo.append([idpackage,dbver])
elif direction == "<=":
if (cmp >= 0):
# found
dbpkginfo.append([idpackage,dbver])
if (not dbpkginfo):
# this version is not available
self.matchCache[atom] = {}
self.matchCache[atom]['result'] = -1,1
return -1,1
versions = []
for x in dbpkginfo:
versions.append(x[1])
# who is newer ?
versionlist = entropyTools.getNewerVersion(versions) ## FIXME: this is already running in --deep mode, maybe adding a function that is more gentle with pulling dependencies?
newerPackage = dbpkginfo[versions.index(versionlist[0])]
# now look if there's another package with the same category, name, version, but different tag
newerPkgName = self.retrieveName(newerPackage[0])
newerPkgCategory = self.retrieveCategory(newerPackage[0])
newerPkgVersion = self.retrieveVersion(newerPackage[0])
newerPkgBranch = self.retrieveBranch(newerPackage[0])
similarPackages = self.searchPackagesInBranchByNameAndVersionAndCategory(newerPkgName, newerPkgVersion, newerPkgCategory, newerPkgBranch)
#print newerPackage
#print similarPackages
if (len(similarPackages) > 1):
# gosh, there are packages with the same name, version, category
# we need to parse version tag
versionTags = []
for pkg in similarPackages:
versionTags.append(self.retrieveVersionTag(pkg[1]))
versiontaglist = entropyTools.getNewerVersionTag(versionTags)
newerPackage = similarPackages[versionTags.index(versiontaglist[0])]
#print newerPackage
#print newerPackage[1]
self.matchCache[atom] = {}
self.matchCache[atom]['result'] = newerPackage[0],0
return newerPackage[0],0
else:
self.matchCache[atom] = {}
self.matchCache[atom]['result'] = -1,1
return -1,1
else:
# not set, just get the newer version
versionIDs = []
for list in foundIDs:
versionIDs.append(self.retrieveVersion(list[1]))
versionlist = entropyTools.getNewerVersion(versionIDs)
newerPackage = foundIDs[versionIDs.index(versionlist[0])]
# now look if there's another package with the same category, name, version, tag
newerPkgName = self.retrieveName(newerPackage[1])
newerPkgCategory = self.retrieveCategory(newerPackage[1])
newerPkgVersion = self.retrieveVersion(newerPackage[1])
newerPkgBranch = self.retrieveBranch(newerPackage[1])
similarPackages = self.searchPackagesInBranchByNameAndVersionAndCategory(newerPkgName, newerPkgVersion, newerPkgCategory, newerPkgBranch)
if (len(similarPackages) > 1):
# gosh, there are packages with the same name, version, category
# we need to parse version tag
versionTags = []
for pkg in similarPackages:
versionTags.append(self.retrieveVersionTag(pkg[1]))
versiontaglist = entropyTools.getNewerVersionTag(versionTags)
newerPackage = similarPackages[versionTags.index(versiontaglist[0])]
self.matchCache[atom] = {}
self.matchCache[atom]['result'] = newerPackage[1],0
return newerPackage[1],0
else:
# package not found in any branch
self.matchCache[atom] = {}
self.matchCache[atom]['result'] = -1,1
return -1,1