86 lines
2.4 KiB
Python
86 lines
2.4 KiB
Python
#!/usr/bin/python
|
|
|
|
import ri_data
|
|
|
|
from xml.dom import minidom
|
|
import os.path
|
|
|
|
dep_xml = os.path.join(os.path.dirname(__file__), '../xml/dependency.xml')
|
|
|
|
class Depending:
|
|
''' Class recording depending relation '''
|
|
dict={}
|
|
def __init__(self, n):
|
|
self.name = n
|
|
self.depending = set()
|
|
# flag for resolve recursive
|
|
self.resolved = False
|
|
Depending.dict[n] = self
|
|
|
|
def resolve_recursive(self):
|
|
if self.resolved: return
|
|
for d in self.depending:
|
|
Depending.dict[d].resolve_recursive()
|
|
tmp=set(self.depending)
|
|
for d in self.depending:
|
|
tmp.update(Depending.dict[d].depending)
|
|
self.depending = tmp
|
|
self.resolved = True
|
|
|
|
class Depended:
|
|
''' Class recording depended by relation '''
|
|
dict={}
|
|
def __init__(self, n):
|
|
self.name = n
|
|
self.depended_by = set()
|
|
Depended.dict[n] = self
|
|
|
|
def construct_depending():
|
|
xml_doc = minidom.parse(dep_xml)
|
|
xml_root = xml_doc.firstChild
|
|
xml_dict = {}
|
|
for n in xml_root.childNodes:
|
|
if n.nodeType == n.ELEMENT_NODE and n.nodeName == 'package':
|
|
xml_dict[n.attributes['name'].value] = n
|
|
Depending(n.attributes['name'].value)
|
|
|
|
for d in Depending.dict.values():
|
|
n = xml_dict[d.name]
|
|
for r in n.getElementsByTagName('runtime'):
|
|
for dep in r.getElementsByTagName('depending'):
|
|
d.depending.add(dep.attributes['package'].value)
|
|
|
|
def resolve_recursive_depending():
|
|
for d in Depending.dict.values():
|
|
d.resolve_recursive()
|
|
|
|
def construct_depended():
|
|
for d in Depending.dict.values():
|
|
for dep in d.depending:
|
|
if not Depended.dict.has_key(dep):
|
|
Depended(dep)
|
|
Depended.dict[dep].depended_by.add(d.name)
|
|
|
|
def get_extra_depending():
|
|
l = []
|
|
for g in ri_data.Group.dict.values():
|
|
if g.install != 'no':
|
|
l.extend([ p for p in g.mandatory ])
|
|
if g.selection == 'manual':
|
|
l.extend([ p[0] for p in g.optional if p[1] == 'yes' ])
|
|
else:
|
|
l.extend([ p[0] for p in g.optional ])
|
|
|
|
set1 = set(l)
|
|
set2 = set(set1)
|
|
|
|
for d in set1:
|
|
set2.update(Depending.dict[d].depending)
|
|
|
|
res = {}
|
|
for d in set2.difference(set1):
|
|
res[d] = Depended.dict[d].depended_by.intersection(set1)
|
|
|
|
return res
|
|
|