* [gentoo-commits] gentoolkit r761 - in tags: . gentoolkit-dev-0.2.6.14/src/imlate
@ 2010-03-30 11:15 Christian Ruppert (idl0r)
0 siblings, 0 replies; only message in thread
From: Christian Ruppert (idl0r) @ 2010-03-30 11:15 UTC (permalink / raw
To: gentoo-commits
Author: idl0r
Date: 2010-03-30 11:15:33 +0000 (Tue, 30 Mar 2010)
New Revision: 761
Added:
tags/gentoolkit-dev-0.2.6.14/
tags/gentoolkit-dev-0.2.6.14/src/imlate/imlate
Removed:
tags/gentoolkit-dev-0.2.6.14/src/imlate/imlate
Log:
Tagging the gentoolkit-dev-0.2.6.14 release
Deleted: tags/gentoolkit-dev-0.2.6.14/src/imlate/imlate
===================================================================
--- trunk/gentoolkit-dev/src/imlate/imlate 2010-03-28 21:45:22 UTC (rev 759)
+++ tags/gentoolkit-dev-0.2.6.14/src/imlate/imlate 2010-03-30 11:15:33 UTC (rev 761)
@@ -1,477 +0,0 @@
-#!/usr/bin/python
-# Copyright 1999-2010 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Id: $
-# Author: Christian Ruppert <idl0r@gentoo.org>
-
-# Python 2.6 compatibility
-from __future__ import print_function
-
-VERSION = "1.0.0"
-
-# works just with stable keywords!
-MAIN_ARCH = "auto" # can be overridden by -m ARCH
-TARGET_ARCH = "auto" # can be overridden by -t ARCH
-# auto means e.g.:
-# MAIN_ARCH = amd64
-# TARGET_ARCH = ~amd64
-# That will show you general stable candidates for amd64.
-# The arch will be taken from your portage settings (e.g. make.conf).
-
-################################
-# do not change anything below #
-################################
-
-from os.path import join, basename
-from sys import stderr, stdout
-from os import stat
-from time import time
-from xml.dom import minidom, NotFoundErr
-from xml.parsers.expat import ExpatError
-# TODO: just import needed stuff to safe memory/time and maybe use "as foo"
-import portage
-import portage.versions
-
-if __name__ == "__main__":
- from optparse import OptionParser
- from time import gmtime, strftime
-
-# override/change portage module settings
-def _portage_settings( var, value, settings = None ):
- if not settings:
- settings = portage.settings
-
- settings.unlock()
- settings[var] = value
- # backup_changes is very important since it can cause trouble,
- # if we do not backup our changes!
- settings.backup_changes( var )
- settings.lock()
-
-# add stuff to our imlate dict
-def _add_ent( imlate, cat, pkg, ver, our_ver ):
- if not cat in list(imlate.keys()):
- imlate[cat] = {}
- if not pkg in list(imlate[cat].keys()):
- imlate[cat][pkg] = []
-
- imlate[cat][pkg].append( ver )
- imlate[cat][pkg].append( our_ver )
-
- return imlate
-
-def _fill( width, line, fill = " " ):
- while len( line ) < width:
- line = "%s%s" % ( str( line ), str( fill ) )
- return line
-
-# create a hopefully pretty result
-def show_result( conf, pkgs ):
- # X - len(colX) = space to fill
- col1 = 40
- col2 = 20
-
- _header = "%s candidates for 'gentoo' on '%s'"
- _helper = "category/package[:SLOT] our version best version"
- _cand = ""
- header = ""
-
- if conf["FILE"] == "stdout":
- out = stdout
- elif conf["FILE"] == "stderr":
- out = stderr
- else:
- out = open( conf["FILE"], "w" )
-
- if conf["STABLE"] and conf["KEYWORD"]:
- _cand = "%i Stable and %i Keyword(~)" % ( conf["STABLE_SUM"],
- conf["KEYWORD_SUM"] )
- elif conf["STABLE"]:
- _cand = "%i Stable" % conf["STABLE_SUM"]
- elif conf["KEYWORD"]:
- _cand = "%i Keyword(~)" % conf["KEYWORD_SUM"]
-
- header = _header % ( _cand, conf["MAIN_ARCH"] )
-
- print("Generated on: %s" % conf["TIME"], file=out)
- print(_fill( len( header ), "", "=" ), file=out)
- print(header, file=out)
- print(_fill( len( header ), "", "=" ), file=out)
- print(file=out)
-
- print(_helper, file=out)
- print(_fill( len( _helper ), "", "-" ), file=out)
-
- for cat in sorted( pkgs.keys() ):
- print("%s/" % cat, file=out)
- for pkg in sorted( pkgs[cat].keys() ):
- print("%s%s%s" % ( _fill( col1, ( " %s" % pkg ) ),
- _fill( col2, pkgs[cat][pkg][1] ),
- pkgs[cat][pkg][0] ), file=out)
-
- if conf["FILE"] != "stdout":
- out.close()
-
-def _get_metadata(metadata, element, tag):
- values = []
-
- try:
- metadatadom = minidom.parse(metadata)
- except ExpatError as e:
- raise ExpatError("%s: %s" % (metadata, e,))
-
- try:
- elements = metadatadom.getElementsByTagName(element)
- if not elements:
- return values
- except NotFoundErr:
- return values
-
- try:
- for _element in elements:
- node = _element.getElementsByTagName(tag)
-
- if tag == "herd" and (not node or not node[0].childNodes):
-# print >> stderr, "'%s' is missing a <herd> tag or it is empty," % metadata
-# print >> stderr, "please file a bug at https://bugs.gentoo.org and refer to http://www.gentoo.org/proj/en/devrel/handbook/handbook.xml?part=2&chap=4"
- values.append("no-herd")
- continue
-
- values.append(node[0].childNodes[0].data)
- except NotFoundErr:
- raise NotFoundErr("%s: Malformed input: missing 'flag' tag(s)" % (metadata))
-
- metadatadom.unlink()
- return values
-
-def is_maintainer(maintainer, metadata):
- data = []
-
- if maintainer == None:
- return True
-
- mtainer = maintainer.split(",")
-
- data = _get_metadata(metadata, "maintainer", "email")
-
- if not data and len(maintainer) == 0:
- return True
- elif not data and len(maintainer) > 0:
- return False
- else:
- for addy in data:
- for contact in mtainer:
- if addy == contact:
- return True
- if addy.startswith(contact):
- return True
- return False
-
-def is_herd(herd, metadata):
- data = []
-
- if herd == None:
- return True
-
- hrd = herd.split(",")
- data = _get_metadata(metadata, "pkgmetadata", "herd")
-
- if not data and len(herd) == 0:
- return True
- elif not data and len(herd) > 0:
- return False
- else:
- for hd in data:
- for hd2 in hrd:
- if hd == hd2:
- return True
- if hd.startswith(hd2):
- return True
-
- return False
-
-
-# fetch a list of arch (just stable) packages
-# -* is important to be sure that just arch is used
-def get_packages( conf ):
- _pkgs = {}
-
- _portage_settings( "ACCEPT_KEYWORDS", ( "-* %s" % str( conf["TARGET_ARCH"] ) ),
- conf["portdb"].settings )
-
- for cp in conf["portdb"].dbapi.cp_all():
- cpvrs = []
- slots = {}
-
- if conf["USER_PKGS"]:
- if not cp in conf["USER_PKGS"]:
- continue
-
- # None is important to match also on empty string
- if conf["MAINTAINER"] != None:
- if not is_maintainer(conf["MAINTAINER"], join(conf["PORTDIR"], cp, "metadata.xml")):
- continue
- if conf["HERD"] != None:
- if not is_herd(conf["HERD"], join(conf["PORTDIR"], cp, "metadata.xml")):
- continue
-
- cpvrs = conf["portdb"].dbapi.match( cp )
-
- for cpvr in cpvrs:
- slot = conf["portdb"].dbapi.aux_get( cpvr, ["SLOT"] )[0]
- if not slot in slots:
- slots[slot] = []
- slots[slot].append(cpvr)
-
- for slot in sorted(slots):
- cpvr = portage.versions.best( slots[slot] )
-
- if cpvr:
- ( cat, pkg, ver, rev ) = portage.versions.catpkgsplit( cpvr )
-
- if not cat in list(_pkgs.keys()):
- _pkgs[cat] = {}
- if not pkg in list(_pkgs[cat].keys()):
- _pkgs[cat][pkg] = []
-
- if rev != "r0":
- ver = "%s-%s" % ( ver, rev )
-
- _pkgs[cat][pkg].append( ver )
-
- return _pkgs
-
-# compare get_packages() against MAIN_ARCH
-def get_imlate( conf, pkgs ):
- _portage_settings( "ACCEPT_KEYWORDS", ( "-* %s" % str( conf["MAIN_ARCH"] ) ),
- conf["portdb"].settings )
-
- stable = str( conf["MAIN_ARCH"].lstrip("~") )
- testing = "~%s" % stable
- exclude = "-%s" % stable
- exclude_all = "-*"
-
- imlate = {}
-
- for cat in sorted( pkgs.keys() ):
- for pkg in sorted( pkgs[cat].keys() ):
- for vr in pkgs[cat][pkg]:
- cpvr = ""
- abs_pkg = ""
- kwds = ""
- our = ""
- our_ver = ""
- mtime = 0
- slot = 0
-
- # 0 = none(default), 1 = testing(~arch), 2 = stable(arch),
- # 3 = exclude(-arch), 4 = exclude_all(-*)
- # -* would be overridden by ~arch or arch
- kwd_type = 0
-
- cpvr = "%s/%s-%s" % ( cat, pkg, vr )
-
- # absolute ebuild path for mtime check
- abs_pkg = join( conf["PORTDIR"], cat, pkg, basename( cpvr ) )
- abs_pkg = "%s.ebuild" % str( abs_pkg )
-
- kwds = conf["portdb"].dbapi.aux_get( cpvr, ["KEYWORDS"] )[0]
-
- # FIXME: %s is bad.. maybe even cast it, else there are issues because its unicode
- slot = ":%s" % conf["portdb"].dbapi.aux_get( cpvr, ["SLOT"] )[0]
- if slot == ":0":
- slot = ""
-
- # sorted() to keep the right order
- # e.g. -* first, -arch second, arch third and ~arch fourth
- # -* -foo ~arch
- # example: -* would be overridden by ~arch
- for kwd in sorted( kwds.split() ):
- if kwd == stable:
- kwd_type = 2
- break
- elif kwd == exclude:
- kwd_type = 3
- break
- elif kwd == exclude_all:
- kwd_type = 4
- elif kwd == testing:
- kwd_type = 1
- break
-
- # ignore -arch and already stabilized packages
- if kwd_type == 3 or kwd_type == 2:
- continue
- # drop packages with -* and without ~arch or arch
- # even if there is another version which includes arch or ~arch
- if kwd_type == 4:
- continue
- # drop "stable candidates" with mtime < 30 days
- # Shall we use gmtime/UTC here?
- if kwd_type == 1:
- mtime = int( ( time() - stat( abs_pkg ).st_mtime ) / 60 / 60 / 24 )
- if mtime < conf["MTIME"]:
- continue
-
- # look for an existing stable version
- our = portage.versions.best( conf["portdb"].dbapi.match( "%s/%s%s" % ( cat, pkg, slot ) ) )
- if our:
- _foo = portage.versions.pkgsplit( our )
- our_ver = _foo[1]
- if _foo[2] != "r0":
- our_ver = "%s-%s" % ( our_ver, _foo[2] )
- else:
- our_ver = ""
-
- # we just need the version if > our_ver
- if our_ver:
- if portage.versions.vercmp( our_ver, vr ) >= 0:
- continue
-
- if kwd_type == 1 and conf["STABLE"]:
- imlate = _add_ent( imlate, cat, ("%s%s" % (pkg, slot)), vr, our_ver )
- conf["STABLE_SUM"] += 1
- elif kwd_type == 0 and conf["KEYWORD"]:
- conf["KEYWORD_SUM"] += 1
- imlate = _add_ent( imlate, cat, ( "~%s%s" % (pkg, slot) ),
- vr, our_ver )
-
- return imlate
-
-# fetch portage related settings
-def get_settings( conf = None ):
- if not isinstance( conf, dict ) and conf:
- raise TypeError("conf must be dict() or None")
- if not conf:
- conf = {}
-
- # TODO: maybe we should improve it a bit ;)
- mysettings = portage.config( config_incrementals = portage.const.INCREMENTALS, local_config = False )
-
- if conf["MAIN_ARCH"] == "auto":
- conf["MAIN_ARCH"] = "%s" % mysettings["ACCEPT_KEYWORDS"].split(" ")[0].lstrip("~")
- if conf["TARGET_ARCH"] == "auto":
- conf["TARGET_ARCH"] = "~%s" % mysettings["ACCEPT_KEYWORDS"].split(" ")[0].lstrip("~")
-
- # TODO: exclude overlay categories from check
- if conf["CATEGORIES"]:
- _mycats = []
- for _cat in conf["CATEGORIES"].split(","):
- _cat = _cat.strip()
- _mycats.append(_cat )
- if _cat not in mysettings.categories:
- raise ValueError("invalid category for -C switch '%s'" % _cat)
- mysettings.categories = _mycats
-
- # maybe thats not necessary because we override porttrees below..
- _portage_settings( "PORTDIR_OVERLAY", "", mysettings )
- trees = portage.create_trees()
- trees["/"]["porttree"].settings = mysettings
- portdb = trees["/"]["porttree"]
- portdb.dbapi.settings = mysettings
- portdb.dbapi.porttrees = [portage.portdb.porttree_root]
- # does it make sense to remove _all_ useless stuff or just leave it as it is?
- #portdb.dbapi._aux_cache_keys.clear()
- #portdb.dbapi._aux_cache_keys.update(["EAPI", "KEYWORDS", "SLOT"])
-
- conf["PORTDIR"] = portage.settings["PORTDIR"]
- conf["portdb"] = portdb
-
- return conf
-
-
-# just for standalone
-def main():
- conf = {}
- pkgs = {}
-
- parser = OptionParser( version = "%prog " + VERSION )
- parser.usage = "%prog [options] [category/package] ..."
- parser.disable_interspersed_args()
-
- parser.add_option( "-f", "--file", dest = "filename", action = "store", type = "string",
- help = "write result into FILE [default: %default]", metavar = "FILE", default = "stdout" )
- parser.add_option( "-m", "--main", dest = "main_arch", action = "store", type = "string",
- help = "set main ARCH (e.g. your arch) [default: %default]", metavar = "ARCH", default = MAIN_ARCH )
- parser.add_option( "-t", "--target", dest = "target_arch", action = "store", type = "string",
- help = "set target ARCH (e.g. x86) [default: %default]", metavar = "ARCH", default = TARGET_ARCH )
- parser.add_option( "--mtime", dest = "mtime", action = "store", type = "int",
- help = "set minimum MTIME in days [default: %default]", metavar = "MTIME", default = 30 )
-
- # TODO: leave a good comment here (about True/False) :)
- parser.add_option( "-s", "--stable", dest = "stable", action = "store_true", default = False,
- help = "just show stable candidates (e.g. -s and -k is the default result) [default: True]" )
- parser.add_option( "-k", "--keyword", dest = "keyword", action = "store_true", default = False,
- help = "just show keyword candidates (e.g. -s and -k is the default result) [default: True]" )
-
- parser.add_option( "-M", "--maintainer", dest = "maintainer", action = "store", type = "string",
- help = "Show only packages from the specified maintainer", metavar = "MAINTAINER", default = None)
-
- parser.add_option( "-H", "--herd", dest = "herd", action = "store", type = "string",
- help = "Show only packages from the specified herd", metavar = "HERD", default = None)
-
-# # EXPERIMENTAL
-# parser.add_option( "-e", "--experimental", dest = "experimental", action = "store_true", default = False,
-# help = "enables experimental functions/features (have a look for # EXPERIMENTAL comments in the source) [default: %default]" )
-
- parser.add_option( "-C", "--category", "--categories", dest = "categories", action = "store", default = None,
- metavar = "CATEGORIES",
- help = "just check in the specified category/categories (comma separated) [default: %default]")
-
- ( options, args ) = parser.parse_args()
-
- if len( args ) > 0:
- conf["USER_PKGS"] = args
- else:
- conf["USER_PKGS"] = []
-
- # cleanup optparse
- try:
- parser.destroy()
- except AttributeError:
- # to be at least python 2.4 compatible
- del parser._short_opt
- del parser._long_opt
- del parser.defaults
-
- # generated timestamp (UTC)
- conf["TIME"] = strftime( "%a %b %d %H:%M:%S %Z %Y", gmtime() )
-
- # package counter
- conf["KEYWORD_SUM"] = 0
- conf["STABLE_SUM"] = 0
-
- if not options.main_arch in portage.archlist and options.main_arch != "auto":
- raise ValueError("invalid MAIN ARCH defined!")
- if not options.target_arch in portage.archlist and options.target_arch != "auto":
- raise ValueError("invalid TARGET ARCH defined!")
-
- conf["MAIN_ARCH"] = options.main_arch
- conf["TARGET_ARCH"] = options.target_arch
-
- conf["FILE"] = options.filename
- conf["MTIME"] = options.mtime
-
- if not options.stable and not options.keyword:
- conf["STABLE"] = True
- conf["KEYWORD"] = True
- else:
- conf["STABLE"] = options.stable
- conf["KEYWORD"] = options.keyword
-
-# conf["EXPERIMENTAL"] = options.experimental
- conf["CATEGORIES"] = options.categories
-
- conf["MAINTAINER"] = options.maintainer
- conf["HERD"] = options.herd
-
- # append to our existing
- conf = get_settings( conf )
- pkgs = get_packages( conf )
- pkgs = get_imlate( conf, pkgs )
-
- show_result( conf, pkgs )
-
-if __name__ == "__main__":
- main()
-
Copied: tags/gentoolkit-dev-0.2.6.14/src/imlate/imlate (from rev 760, trunk/gentoolkit-dev/src/imlate/imlate)
===================================================================
--- tags/gentoolkit-dev-0.2.6.14/src/imlate/imlate (rev 0)
+++ tags/gentoolkit-dev-0.2.6.14/src/imlate/imlate 2010-03-30 11:15:33 UTC (rev 761)
@@ -0,0 +1,477 @@
+#!/usr/bin/python
+# Copyright 1999-2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+# Author: Christian Ruppert <idl0r@gentoo.org>
+
+# Python 2.6 compatibility
+from __future__ import print_function
+
+VERSION = "1.0.0"
+
+# works just with stable keywords!
+MAIN_ARCH = "auto" # can be overridden by -m ARCH
+TARGET_ARCH = "auto" # can be overridden by -t ARCH
+# auto means e.g.:
+# MAIN_ARCH = amd64
+# TARGET_ARCH = ~amd64
+# That will show you general stable candidates for amd64.
+# The arch will be taken from your portage settings (e.g. make.conf).
+
+################################
+# do not change anything below #
+################################
+
+from os.path import join, basename
+from sys import stderr, stdout
+from os import stat
+from time import time
+from xml.dom import minidom, NotFoundErr
+from xml.parsers.expat import ExpatError
+# TODO: just import needed stuff to safe memory/time and maybe use "as foo"
+import portage
+import portage.versions
+
+if __name__ == "__main__":
+ from optparse import OptionParser
+ from time import gmtime, strftime
+
+# override/change portage module settings
+def _portage_settings( var, value, settings = None ):
+ if not settings:
+ settings = portage.settings
+
+ settings.unlock()
+ settings[var] = value
+ # backup_changes is very important since it can cause trouble,
+ # if we do not backup our changes!
+ settings.backup_changes( var )
+ settings.lock()
+
+# add stuff to our imlate dict
+def _add_ent( imlate, cat, pkg, ver, our_ver ):
+ if not cat in list(imlate.keys()):
+ imlate[cat] = {}
+ if not pkg in list(imlate[cat].keys()):
+ imlate[cat][pkg] = []
+
+ imlate[cat][pkg].append( ver )
+ imlate[cat][pkg].append( our_ver )
+
+ return imlate
+
+def _fill( width, line, fill = " " ):
+ while len( line ) < width:
+ line = "%s%s" % ( str( line ), str( fill ) )
+ return line
+
+# create a hopefully pretty result
+def show_result( conf, pkgs ):
+ # X - len(colX) = space to fill
+ col1 = 40
+ col2 = 20
+
+ _header = "%s candidates for 'gentoo' on '%s'"
+ _helper = "category/package[:SLOT] our version best version"
+ _cand = ""
+ header = ""
+
+ if conf["FILE"] == "stdout":
+ out = stdout
+ elif conf["FILE"] == "stderr":
+ out = stderr
+ else:
+ out = open( conf["FILE"], "w" )
+
+ if conf["STABLE"] and conf["KEYWORD"]:
+ _cand = "%i Stable and %i Keyword(~)" % ( conf["STABLE_SUM"],
+ conf["KEYWORD_SUM"] )
+ elif conf["STABLE"]:
+ _cand = "%i Stable" % conf["STABLE_SUM"]
+ elif conf["KEYWORD"]:
+ _cand = "%i Keyword(~)" % conf["KEYWORD_SUM"]
+
+ header = _header % ( _cand, conf["MAIN_ARCH"] )
+
+ print("Generated on: %s" % conf["TIME"], file=out)
+ print(_fill( len( header ), "", "=" ), file=out)
+ print(header, file=out)
+ print(_fill( len( header ), "", "=" ), file=out)
+ print(file=out)
+
+ print(_helper, file=out)
+ print(_fill( len( _helper ), "", "-" ), file=out)
+
+ for cat in sorted( pkgs.keys() ):
+ print("%s/" % cat, file=out)
+ for pkg in sorted( pkgs[cat].keys() ):
+ print("%s%s%s" % ( _fill( col1, ( " %s" % pkg ) ),
+ _fill( col2, pkgs[cat][pkg][1] ),
+ pkgs[cat][pkg][0] ), file=out)
+
+ if conf["FILE"] != "stdout":
+ out.close()
+
+def _get_metadata(metadata, element, tag):
+ values = []
+
+ try:
+ metadatadom = minidom.parse(metadata)
+ except ExpatError as e:
+ raise ExpatError("%s: %s" % (metadata, e,))
+
+ try:
+ elements = metadatadom.getElementsByTagName(element)
+ if not elements:
+ return values
+ except NotFoundErr:
+ return values
+
+ try:
+ for _element in elements:
+ node = _element.getElementsByTagName(tag)
+
+ if tag == "herd" and (not node or not node[0].childNodes):
+# print >> stderr, "'%s' is missing a <herd> tag or it is empty," % metadata
+# print >> stderr, "please file a bug at https://bugs.gentoo.org and refer to http://www.gentoo.org/proj/en/devrel/handbook/handbook.xml?part=2&chap=4"
+ values.append("no-herd")
+ continue
+
+ values.append(node[0].childNodes[0].data)
+ except NotFoundErr:
+ raise NotFoundErr("%s: Malformed input: missing 'flag' tag(s)" % (metadata))
+
+ metadatadom.unlink()
+ return values
+
+def is_maintainer(maintainer, metadata):
+ data = []
+
+ if maintainer == None:
+ return True
+
+ mtainer = maintainer.split(",")
+
+ data = _get_metadata(metadata, "maintainer", "email")
+
+ if not data and len(maintainer) == 0:
+ return True
+ elif not data and len(maintainer) > 0:
+ return False
+ else:
+ for addy in data:
+ for contact in mtainer:
+ if addy == contact:
+ return True
+ if addy.startswith(contact):
+ return True
+ return False
+
+def is_herd(herd, metadata):
+ data = []
+
+ if herd == None:
+ return True
+
+ hrd = herd.split(",")
+ data = _get_metadata(metadata, "pkgmetadata", "herd")
+
+ if not data and len(herd) == 0:
+ return True
+ elif not data and len(herd) > 0:
+ return False
+ else:
+ for hd in data:
+ for hd2 in hrd:
+ if hd == hd2:
+ return True
+ if hd.startswith(hd2):
+ return True
+
+ return False
+
+
+# fetch a list of arch (just stable) packages
+# -* is important to be sure that just arch is used
+def get_packages( conf ):
+ _pkgs = {}
+
+ _portage_settings( "ACCEPT_KEYWORDS", ( "-* %s" % str( conf["TARGET_ARCH"] ) ),
+ conf["portdb"].settings )
+
+ for cp in conf["portdb"].dbapi.cp_all():
+ cpvrs = []
+ slots = {}
+
+ if conf["USER_PKGS"]:
+ if not cp in conf["USER_PKGS"]:
+ continue
+
+ # None is important to match also on empty string
+ if conf["MAINTAINER"] != None:
+ if not is_maintainer(conf["MAINTAINER"], join(conf["PORTDIR"], cp, "metadata.xml")):
+ continue
+ if conf["HERD"] != None:
+ if not is_herd(conf["HERD"], join(conf["PORTDIR"], cp, "metadata.xml")):
+ continue
+
+ cpvrs = conf["portdb"].dbapi.match( cp )
+
+ for cpvr in cpvrs:
+ slot = conf["portdb"].dbapi.aux_get( cpvr, ["SLOT"] )[0]
+ if not slot in slots:
+ slots[slot] = []
+ slots[slot].append(cpvr)
+
+ for slot in sorted(slots):
+ cpvr = portage.versions.best( slots[slot] )
+
+ if cpvr:
+ ( cat, pkg, ver, rev ) = portage.versions.catpkgsplit( cpvr )
+
+ if not cat in list(_pkgs.keys()):
+ _pkgs[cat] = {}
+ if not pkg in list(_pkgs[cat].keys()):
+ _pkgs[cat][pkg] = []
+
+ if rev != "r0":
+ ver = "%s-%s" % ( ver, rev )
+
+ _pkgs[cat][pkg].append( ver )
+
+ return _pkgs
+
+# compare get_packages() against MAIN_ARCH
+def get_imlate( conf, pkgs ):
+ _portage_settings( "ACCEPT_KEYWORDS", ( "-* %s" % str( conf["MAIN_ARCH"] ) ),
+ conf["portdb"].settings )
+
+ stable = str( conf["MAIN_ARCH"].lstrip("~") )
+ testing = "~%s" % stable
+ exclude = "-%s" % stable
+ exclude_all = "-*"
+
+ imlate = {}
+
+ for cat in sorted( pkgs.keys() ):
+ for pkg in sorted( pkgs[cat].keys() ):
+ for vr in pkgs[cat][pkg]:
+ cpvr = ""
+ abs_pkg = ""
+ kwds = ""
+ our = ""
+ our_ver = ""
+ mtime = 0
+ slot = 0
+
+ # 0 = none(default), 1 = testing(~arch), 2 = stable(arch),
+ # 3 = exclude(-arch), 4 = exclude_all(-*)
+ # -* would be overridden by ~arch or arch
+ kwd_type = 0
+
+ cpvr = "%s/%s-%s" % ( cat, pkg, vr )
+
+ # absolute ebuild path for mtime check
+ abs_pkg = join( conf["PORTDIR"], cat, pkg, basename( cpvr ) )
+ abs_pkg = "%s.ebuild" % str( abs_pkg )
+
+ kwds = conf["portdb"].dbapi.aux_get( cpvr, ["KEYWORDS"] )[0]
+
+ # FIXME: %s is bad.. maybe even cast it, else there are issues because its unicode
+ slot = ":%s" % conf["portdb"].dbapi.aux_get( cpvr, ["SLOT"] )[0]
+ if slot == ":0":
+ slot = ""
+
+ # sorted() to keep the right order
+ # e.g. -* first, -arch second, arch third and ~arch fourth
+ # -* -foo ~arch
+ # example: -* would be overridden by ~arch
+ for kwd in sorted( kwds.split() ):
+ if kwd == stable:
+ kwd_type = 2
+ break
+ elif kwd == exclude:
+ kwd_type = 3
+ break
+ elif kwd == exclude_all:
+ kwd_type = 4
+ elif kwd == testing:
+ kwd_type = 1
+ break
+
+ # ignore -arch and already stabilized packages
+ if kwd_type == 3 or kwd_type == 2:
+ continue
+ # drop packages with -* and without ~arch or arch
+ # even if there is another version which includes arch or ~arch
+ if kwd_type == 4:
+ continue
+ # drop "stable candidates" with mtime < 30 days
+ # Shall we use gmtime/UTC here?
+ if kwd_type == 1:
+ mtime = int( ( time() - stat( abs_pkg ).st_mtime ) / 60 / 60 / 24 )
+ if mtime < conf["MTIME"]:
+ continue
+
+ # look for an existing stable version
+ our = portage.versions.best( conf["portdb"].dbapi.match( "%s/%s%s" % ( cat, pkg, slot ) ) )
+ if our:
+ _foo = portage.versions.pkgsplit( our )
+ our_ver = _foo[1]
+ if _foo[2] != "r0":
+ our_ver = "%s-%s" % ( our_ver, _foo[2] )
+ else:
+ our_ver = ""
+
+ # we just need the version if > our_ver
+ if our_ver:
+ if portage.versions.vercmp( our_ver, vr ) >= 0:
+ continue
+
+ if kwd_type == 1 and conf["STABLE"]:
+ imlate = _add_ent( imlate, cat, ("%s%s" % (pkg, slot)), vr, our_ver )
+ conf["STABLE_SUM"] += 1
+ elif kwd_type == 0 and conf["KEYWORD"]:
+ conf["KEYWORD_SUM"] += 1
+ imlate = _add_ent( imlate, cat, ( "~%s%s" % (pkg, slot) ),
+ vr, our_ver )
+
+ return imlate
+
+# fetch portage related settings
+def get_settings( conf = None ):
+ if not isinstance( conf, dict ) and conf:
+ raise TypeError("conf must be dict() or None")
+ if not conf:
+ conf = {}
+
+ # TODO: maybe we should improve it a bit ;)
+ mysettings = portage.config( config_incrementals = portage.const.INCREMENTALS, local_config = False )
+
+ if conf["MAIN_ARCH"] == "auto":
+ conf["MAIN_ARCH"] = "%s" % mysettings["ACCEPT_KEYWORDS"].split(" ")[0].lstrip("~")
+ if conf["TARGET_ARCH"] == "auto":
+ conf["TARGET_ARCH"] = "~%s" % mysettings["ACCEPT_KEYWORDS"].split(" ")[0].lstrip("~")
+
+ # TODO: exclude overlay categories from check
+ if conf["CATEGORIES"]:
+ _mycats = []
+ for _cat in conf["CATEGORIES"].split(","):
+ _cat = _cat.strip()
+ _mycats.append(_cat )
+ if _cat not in mysettings.categories:
+ raise ValueError("invalid category for -C switch '%s'" % _cat)
+ mysettings.categories = _mycats
+
+ # maybe thats not necessary because we override porttrees below..
+ _portage_settings( "PORTDIR_OVERLAY", "", mysettings )
+ trees = portage.create_trees()
+ trees["/"]["porttree"].settings = mysettings
+ portdb = trees["/"]["porttree"]
+ portdb.dbapi.settings = mysettings
+ portdb.dbapi.porttrees = [portage.portdb.porttree_root]
+ # does it make sense to remove _all_ useless stuff or just leave it as it is?
+ #portdb.dbapi._aux_cache_keys.clear()
+ #portdb.dbapi._aux_cache_keys.update(["EAPI", "KEYWORDS", "SLOT"])
+
+ conf["PORTDIR"] = portage.settings["PORTDIR"]
+ conf["portdb"] = portdb
+
+ return conf
+
+
+# just for standalone
+def main():
+ conf = {}
+ pkgs = {}
+
+ parser = OptionParser( version = "%prog " + VERSION )
+ parser.usage = "%prog [options] [category/package] ..."
+ parser.disable_interspersed_args()
+
+ parser.add_option( "-f", "--file", dest = "filename", action = "store", type = "string",
+ help = "write result into FILE [default: %default]", metavar = "FILE", default = "stdout" )
+ parser.add_option( "-m", "--main", dest = "main_arch", action = "store", type = "string",
+ help = "set main ARCH (e.g. your arch) [default: %default]", metavar = "ARCH", default = MAIN_ARCH )
+ parser.add_option( "-t", "--target", dest = "target_arch", action = "store", type = "string",
+ help = "set target ARCH (e.g. x86) [default: %default]", metavar = "ARCH", default = TARGET_ARCH )
+ parser.add_option( "--mtime", dest = "mtime", action = "store", type = "int",
+ help = "set minimum MTIME in days [default: %default]", metavar = "MTIME", default = 30 )
+
+ # TODO: leave a good comment here (about True/False) :)
+ parser.add_option( "-s", "--stable", dest = "stable", action = "store_true", default = False,
+ help = "just show stable candidates (e.g. -s and -k is the default result) [default: True]" )
+ parser.add_option( "-k", "--keyword", dest = "keyword", action = "store_true", default = False,
+ help = "just show keyword candidates (e.g. -s and -k is the default result) [default: True]" )
+
+ parser.add_option( "-M", "--maintainer", dest = "maintainer", action = "store", type = "string",
+ help = "Show only packages from the specified maintainer", metavar = "MAINTAINER", default = None)
+
+ parser.add_option( "-H", "--herd", dest = "herd", action = "store", type = "string",
+ help = "Show only packages from the specified herd", metavar = "HERD", default = None)
+
+# # EXPERIMENTAL
+# parser.add_option( "-e", "--experimental", dest = "experimental", action = "store_true", default = False,
+# help = "enables experimental functions/features (have a look for # EXPERIMENTAL comments in the source) [default: %default]" )
+
+ parser.add_option( "-C", "--category", "--categories", dest = "categories", action = "store", default = None,
+ metavar = "CATEGORIES",
+ help = "just check in the specified category/categories (comma separated) [default: %default]")
+
+ ( options, args ) = parser.parse_args()
+
+ if len( args ) > 0:
+ conf["USER_PKGS"] = args
+ else:
+ conf["USER_PKGS"] = []
+
+ # cleanup optparse
+ try:
+ parser.destroy()
+ except AttributeError:
+ # to be at least python 2.4 compatible
+ del parser._short_opt
+ del parser._long_opt
+ del parser.defaults
+
+ # generated timestamp (UTC)
+ conf["TIME"] = strftime( "%a %b %d %H:%M:%S %Z %Y", gmtime() )
+
+ # package counter
+ conf["KEYWORD_SUM"] = 0
+ conf["STABLE_SUM"] = 0
+
+ if not options.main_arch in portage.archlist and options.main_arch != "auto":
+ raise ValueError("invalid MAIN ARCH defined!")
+ if not options.target_arch in portage.archlist and options.target_arch != "auto":
+ raise ValueError("invalid TARGET ARCH defined!")
+
+ conf["MAIN_ARCH"] = options.main_arch
+ conf["TARGET_ARCH"] = options.target_arch
+
+ conf["FILE"] = options.filename
+ conf["MTIME"] = options.mtime
+
+ if not options.stable and not options.keyword:
+ conf["STABLE"] = True
+ conf["KEYWORD"] = True
+ else:
+ conf["STABLE"] = options.stable
+ conf["KEYWORD"] = options.keyword
+
+# conf["EXPERIMENTAL"] = options.experimental
+ conf["CATEGORIES"] = options.categories
+
+ conf["MAINTAINER"] = options.maintainer
+ conf["HERD"] = options.herd
+
+ # append to our existing
+ conf = get_settings( conf )
+ pkgs = get_packages( conf )
+ pkgs = get_imlate( conf, pkgs )
+
+ show_result( conf, pkgs )
+
+if __name__ == "__main__":
+ main()
+
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2010-03-30 11:15 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-30 11:15 [gentoo-commits] gentoolkit r761 - in tags: . gentoolkit-dev-0.2.6.14/src/imlate Christian Ruppert (idl0r)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox