from gentoolkit.atom import Atom
from gentoolkit.cpv import CPV
from gentoolkit.helpers import uniqify
-from gentoolkit.dbapi import PORTDB, VARDB
from gentoolkit.query import Query
# =======
# Classes
# =======
-class Dependencies(CPV):
+class Dependencies(Query):
"""Access a package's dependencies and reverse dependencies.
Example usage:
>>> from gentoolkit.dependencies import Dependencies
- >>> portage = Dependencies('sys-apps/portage-2.1.6.13')
+ >>> portage = Dependencies('sys-apps/portage-9999')
>>> portage
- <Dependencies 'sys-apps/portage-2.1.6.13'>
+ <Dependencies 'sys-apps/portage-9999'>
>>> # All methods return gentoolkit.atom.Atom instances
... portage.get_depend()
- [<Atom '>=dev-lang/python-2.5'>, <Atom '<dev-lang/python-3.0'>, ...]
+ ... # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
+ [<Atom 'python3? =dev-lang/python-3*'>,
+ <Atom '!python3? >=dev-lang/python-2.7'>, ...]
"""
- def __init__(self, cpv, op='', parser=None):
- if isinstance(cpv, CPV):
- self.__dict__.update(cpv.__dict__)
- else:
- CPV.__init__(self, cpv)
-
- self.operator = op
- self.atom = self.operator + self.cpv
+ def __init__(self, query, parser=None):
+ Query.__init__(self, query)
self.use = []
self.depatom = str()
# Try to use the Portage tree first, since emerge only uses the tree
# when calculating dependencies
try:
- result = PORTDB.aux_get(self.cpv, envvars)
+ result = portage.db[portage.root]["porttree"].dbapi.aux_get(self.cpv, envvars)
except KeyError:
try:
- result = VARDB.aux_get(self.cpv, envvars)
+ result = portage.db[portage.root]["vartree"].dbapi.aux_get(self.cpv, envvars)
except KeyError:
return []
return result
max_depth=1,
printer_fn=None,
# The rest of these are only used internally:
- depth=0,
+ depth=1,
seen=None,
depcache=None,
result=None
except KeyError:
pkgdep = Query(dep.atom).find_best()
depcache[dep.atom] = pkgdep
- if pkgdep and pkgdep.cpv in seen:
+ if not pkgdep:
continue
- if depth < max_depth or max_depth <= 0:
-
+ elif pkgdep.cpv in seen:
+ continue
+ if depth <= max_depth or max_depth == 0:
if printer_fn is not None:
printer_fn(depth, pkgdep, dep)
- if not pkgdep:
- continue
+ result.append((depth,pkgdep))
seen.add(pkgdep.cpv)
- result.append((
- depth,
- pkgdep.deps.graph_depends(
- max_depth=max_depth,
- printer_fn=printer_fn,
- # The rest of these are only used internally:
- depth=depth+1,
- seen=seen,
- depcache=depcache,
- result=result
- )
- ))
-
- if depth == 0:
- return result
- return pkgdep
+ if depth < max_depth or max_depth == 0:
+ # result is passed in and added to directly
+ # so rdeps is disposable
+ rdeps = pkgdep.deps.graph_depends(
+ max_depth=max_depth,
+ printer_fn=printer_fn,
+ # The rest of these are only used internally:
+ depth=depth+1,
+ seen=seen,
+ depcache=depcache,
+ result=result
+ )
+ return result
def graph_reverse_depends(
self,
if tok[0] == '!':
# We're not interested in blockers
continue
- atom = Atom(tok)
- if use_conditional is not None:
- atom.use_conditional = use_conditional
- result.append(atom)
+ # skip it if it's empty
+ if tok and tok != '':
+ atom = Atom(tok)
+ if use_conditional is not None:
+ atom.use_conditional = use_conditional
+ result.append(atom)
+ else:
+ message = "dependencies.py: _parser() found an empty " +\
+ "dep string token for: %s, deps= %s"
+ raise errors.GentoolkitInvalidAtom(message %(self.cpv, deps))
return result