Files
new_install/python/ri_dep.py
2010-08-04 13:29:48 +08:00

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