|
|
levels: | levels: |
| |
MEDIUM The upper boundary for medium dependencies. | MEDIUM The upper boundary for medium dependencies. |
|
MEDIUM_SOFT The upper boundary for medium-soft dependencies. |
SOFT The upper boundary for soft dependencies. | SOFT The upper boundary for soft dependencies. |
MIN The lower boundary for soft dependencies. | MIN The lower boundary for soft dependencies. |
""" | """ |
__slots__ = ("__weakref__", "satisfied", "buildtime", "runtime") |
__slots__ = ("__weakref__", "satisfied", "buildtime", "runtime", "runtime_post") |
MEDIUM = -1 | MEDIUM = -1 |
SOFT = -2 |
MEDIUM_SOFT = -2 |
MIN = -4 |
SOFT = -3 |
|
MIN = -6 |
def __init__(self, **kwargs): | def __init__(self, **kwargs): |
for myattr in self.__slots__: | for myattr in self.__slots__: |
if myattr == "__weakref__": | if myattr == "__weakref__": |
|
|
return 0 | return 0 |
if self.runtime: | if self.runtime: |
return -1 | return -1 |
|
if self.runtime_post: |
|
return -2 |
if self.buildtime: | if self.buildtime: |
return -2 |
return -3 |
if self.runtime: | if self.runtime: |
return -3 |
return -4 |
return -4 |
if self.runtime_post: |
|
return -5 |
|
return -6 |
def __lt__(self, other): | def __lt__(self, other): |
return self.__int__() < other | return self.__int__() < other |
def __le__(self, other): | def __le__(self, other): |
|
|
# Post Depend -- Add to the list without a parent, as it depends | # Post Depend -- Add to the list without a parent, as it depends |
# on a package being present AND must be built after that package. | # on a package being present AND must be built after that package. |
if not self.select_dep(myroot, edepend["PDEPEND"], myparent=mp, | if not self.select_dep(myroot, edepend["PDEPEND"], myparent=mp, |
myuse=myuse, priority=DepPriority(), rev_deps=True, |
myuse=myuse, priority=DepPriority(runtime_post=True), |
parent_arg=arg): | parent_arg=arg): |
return 0 | return 0 |
except ValueError, e: | except ValueError, e: |
|
|
"""Recursively gather a group of nodes that RDEPEND on | """Recursively gather a group of nodes that RDEPEND on |
eachother. This ensures that they are merged as a group | eachother. This ensures that they are merged as a group |
and get their RDEPENDs satisfied as soon as possible.""" | and get their RDEPENDs satisfied as soon as possible.""" |
def gather_deps(mergeable_nodes, selected_nodes, node): |
def gather_deps(ignore_priority, |
|
mergeable_nodes, selected_nodes, node): |
if node in selected_nodes: | if node in selected_nodes: |
return True | return True |
if node not in mergeable_nodes: | if node not in mergeable_nodes: |
return False | return False |
selected_nodes.add(node) | selected_nodes.add(node) |
for child in mygraph.child_nodes(node, | for child in mygraph.child_nodes(node, |
ignore_priority=DepPriority.SOFT): |
ignore_priority=ignore_priority): |
if not gather_deps( |
if not gather_deps(ignore_priority, |
mergeable_nodes, selected_nodes, child): | mergeable_nodes, selected_nodes, child): |
return False | return False |
return True | return True |
mergeable_nodes = set(nodes) | mergeable_nodes = set(nodes) |
for node in nodes: |
for ignore_priority in xrange(DepPriority.SOFT, |
selected_nodes = set() |
DepPriority.MEDIUM_SOFT + 1): |
if gather_deps( |
for node in nodes: |
mergeable_nodes, selected_nodes, node): |
selected_nodes = set() |
|
if gather_deps(ignore_priority, |
|
mergeable_nodes, selected_nodes, node): |
|
break |
|
else: |
|
selected_nodes = None |
|
if selected_nodes: |
break | break |
else: |
|
selected_nodes = None |
|
| |
|
if selected_nodes and ignore_priority > DepPriority.SOFT: |
|
# Try to merge ignored medium deps as soon as possible. |
|
for node in selected_nodes: |
|
children = set(mygraph.child_nodes(node)) |
|
soft = children.difference( |
|
mygraph.child_nodes(node, |
|
ignore_priority=DepPriority.SOFT)) |
|
medium_soft = children.difference( |
|
mygraph.child_nodes(node, |
|
ignore_priority=DepPriority.MEDIUM_SOFT)) |
|
medium_soft.difference_update(soft) |
|
for child in medium_soft: |
|
if child in selected_nodes: |
|
continue |
|
# TODO: Try harder to make these nodes get |
|
# merged absolutely as soon as possible. |
|
asap_nodes.append(child) |
|
|
if not selected_nodes: | if not selected_nodes: |
if not myblockers.is_empty(): | if not myblockers.is_empty(): |
"""A blocker couldn't be circumnavigated while keeping all | """A blocker couldn't be circumnavigated while keeping all |