开发者日志--基础代码

开发者日志-3 上游结构分析1

  • 首先从上游的包依赖构造上游的数据结构,此结构主要包括包名、版本,以及其依赖的包名,为每一个包创建一个节点,根据依赖关系为每个节点添加其父亲(被依赖的)和孩子(自己依赖的)。
    开发者日志--基础代码_第1张图片

  • 该结构是混乱的(例如上图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)

开发者日志-4 上游结构分析2

  • 该部分先使用python的network.DiGraph()来表示其结构。代码主要从出度、入度、介中心系数、聚类系数四个方面来分析。

    • 出度、入度
      直接统计每个节点parent和children的长度即可,该分析不依赖与图结构,可直接分析统计,并做图。
    • 介中心系数
      直接调用nx.degree_centrality(self.g)来分析每个节点的重要性,计算后统计并做图。
    • 聚类分析
      直接调用nx.clustering(self.g)来分析,对每个节点的结果,统计并作图。

参考论文:

[1]A_graph_method_of_package_dependency_analysis_on_Linux_Operating_system

你可能感兴趣的:(python)