2 from operator import itemgetter
3 from tic.utils.rpmmisc import meetRequireVersion
6 def make_view_data(pkg_group):
7 logger = logging.getLogger(__name__)
9 def _select_provide_rpm(capability, require):
11 if require.get('ver') is not None:
12 for provide in capability:
13 ver_data = provide['data']
14 if not ver_data.get('ver'):
15 ver_data = pkg_dict.get(provide['name']).get('version')
16 if meetRequireVersion(require, ver_data):
17 provide_list.append(provide)
19 provide_list = capability
22 for provide in provide_list:
23 result.append(pkg_dict[provide['name']])
27 def set_meta_require(meta_info):
28 meta_nodes = meta_info.get('nodes')
29 for child_meta in meta_nodes:
30 refer_count[child_meta['id']] += 1
31 set_meta_require(child_meta)
33 pkg_info = pkg_dict[meta_info['text']]
34 for dep_tag in ['requires', 'recommends']:
35 if pkg_info.get(dep_tag):
36 for req in pkg_info.get(dep_tag):
38 if req['name'] in provides:
39 targets = _select_provide_rpm(provides[req['name']], req)
40 elif req['name'] in files:
41 targets.append(pkg_dict.get(files[req['name']][0]))
42 elif req['name'] in pkg_dict:
43 targets.append(pkg_dict.get(req['name']))
45 # the dependent package does not exist.
49 # The meta-pkg of the other group are excluded.
50 if not pkg.get('meta'):
51 refer_count[pkg['id']] += 1
52 meta_nodes.append(make_node(pkg))
54 def make_node(pkg_info):
55 return dict(id=pkg_info['id'], text=pkg_info['name'], nodes=[])
57 # view_data for tree view on web-ui
59 # temporary dictionary for referencing meta
65 pkg_dict = pkg_group['pkg_dict']
66 provides = pkg_group['provides']
67 files = pkg_group['files']
68 refer_count = [0] * len(pkg_dict)
70 # sort by pkg_name ([0]:name, [1]:root, [2]:sub1)
71 meta_info = pkg_group.get('meta_info')
72 meta_info['root'] = sorted(meta_info['root'], key=itemgetter(0))
73 meta_info['sub1'] = sorted(meta_info['sub1'], key=itemgetter(0))
74 meta_info['sub2'] = sorted(meta_info['sub2'], key=itemgetter(0))
77 for root in meta_info['root']:
78 root_node = make_node(pkg_dict[root[0]])
79 view_ref[root[0]] = root_node
80 view_data.append(root_node)
82 for sub1 in meta_info['sub1']:
83 sub1_node = make_node(pkg_dict[sub1[0]])
84 view_ref[sub1[0]] = sub1_node
86 if sub1[1] in view_ref:
88 view_ref[sub1[1]]['nodes'].append(sub1_node)
90 # If root-meta does not exist, sub1 is added to top-level
91 view_data.append(sub1_node)
93 for sub2 in meta_info['sub2']:
94 sub2_node = make_node(pkg_dict[sub2[0]])
95 view_ref[sub2[0]] = sub2_node
97 if sub2[2] in view_ref:
98 view_ref[sub2[2]]['nodes'].append(sub2_node)
100 elif sub2[1] in view_ref:
101 # If sub1-meta does not exist, sub2 is added to child of root-meta
102 view_ref[sub2[1]]['nodes'].append(sub2_node)
104 # If root-meta/sub1-meta does not exist, sub1 is added to top-level
105 view_data.append(sub2_node)
107 # configure meta dependency tree (requires)
108 for meta_pkg in view_data:
109 refer_count[meta_pkg['id']] += 1
110 set_meta_require(meta_pkg)
112 #The remaining rpms are grouped into a MISC tree
114 misc_info['text'] = 'MISC'
115 misc_info['nodes'] = []
116 for k, v in pkg_dict.iteritems():
117 # Pkg is not referenced from Meta-pkg
118 if refer_count[v['id']] == 0:
119 misc_info['nodes'].append(make_node(v))
121 logger.info('meta: %d, misc: %d', len(view_ref), len(misc_info['nodes']))
123 view_data.append(misc_info)