#!/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