首先从上游的包依赖构造上游的数据结构,此结构主要包括包名、版本,以及其依赖的包名,为每一个包创建一个节点,根据依赖关系为每个节点添加其父亲(被依赖的)和孩子(自己依赖的)。
该结构是混乱的(例如上图A1和AAA相互依赖),有些节点处于循环之中,因此不适合用树结构来模拟,可以套用到图结构中。
代码如下
for p in packages:
name = p.getElementsByTagName('name')[0]
name = name.childNodes[0].data
ver = p.getElementsByTagName('version')[0]
ver = ver.getAttribute('ver')
if find(nodeList, name, ver) is not None:
# print(name.childNodes[0].data)
ne = find(nodeList, name, ver)
else:
ne = Node(name, ver)
nodeList.append(ne)
rpm_list = p.getElementsByTagName('rpm:entry')
for rpm in rpm_list:
if rpm.getAttribute('name') == ne.name:
continue
if rpm.getAttribute('ver') != '':
ver = rpm.getAttribute('ver')
else:
ver = 'no'
nodeReq = find(nodeList, rpm.getAttribute('name'), ver)
if nodeReq is not None:
nodeReq.haschildren = True
nodeReq.children.append(ne)
else:
nodeReq = Node(rpm.getAttribute('name'), ver)
nodeReq.haschildren = True
nodeReq.children.append(ne)
nodeList.append(nodeReq)
ne.addReq(nodeReq)
该部分先使用python的network.DiGraph()
来表示其结构。代码主要从出度、入度、介中心系数、聚类系数四个方面来分析。
nx.degree_centrality(self.g)
来分析每个节点的重要性,计算后统计并做图。nx.clustering(self.g)
来分析,对每个节点的结果,统计并作图。参考论文:
[1]A_graph_method_of_package_dependency_analysis_on_Linux_Operating_system