[TIC-CORE] fix provide's version handling
[archive/20170607/tools/tic-core.git] / tic / parser / view_parser.py
1 import logging
2 from operator import itemgetter
3
4
5 def make_view_data(pkg_group):
6     logger = logging.getLogger(__name__)
7     
8     def set_meta_require(meta_info):
9         meta_nodes = meta_info.get('nodes')
10         for child_meta in meta_nodes:
11             refer_count[child_meta['id']] += 1
12             set_meta_require(child_meta)
13             
14         req_list = pkg_dict[meta_info['text']].get('requires')
15         if req_list is not None:
16             for req in req_list:
17                 if provides.get(req['name']):
18                     provide_info = provides[req['name']][0]
19                     pkg_name = provide_info['name']
20                     if 'meta' not in pkg_dict[pkg_name]:
21                         child_pkg = pkg_dict[pkg_name]
22                         meta_nodes.append(make_node(child_pkg))
23                         refer_count[child_pkg['id']] += 1
24                     else:
25                         # The meta-pkg of the other group are excluded.
26                         # the dependent package does not exist.
27                         pass
28                 
29     def make_node(pkg_info):
30         return dict(id=pkg_info['id'], text=pkg_info['name'], nodes=[])
31             
32     # view_data for tree view on web-ui
33     view_data = []
34     # temporary dictionary for referencing meta
35     view_ref = {}
36     
37     if not pkg_group:
38         return view_data
39       
40     pkg_dict = pkg_group['pkg_dict']
41     provides = pkg_group['provides']
42     refer_count = [0] * len(pkg_dict)
43     
44     # sort by pkg_name ([0]:name, [1]:root, [2]:sub1)
45     meta_info = pkg_group.get('meta_info')
46     meta_info['root'] = sorted(meta_info['root'], key=itemgetter(0))
47     meta_info['sub1'] = sorted(meta_info['sub1'], key=itemgetter(0))
48     meta_info['sub2'] = sorted(meta_info['sub2'], key=itemgetter(0))
49     
50     # make tree of meta
51     for root in meta_info['root']:
52         root_node = make_node(pkg_dict[root[0]])
53         view_ref[root[0]] = root_node
54         view_data.append(root_node)
55         
56     for sub1 in meta_info['sub1']:
57         sub1_node = make_node(pkg_dict[sub1[0]])
58         view_ref[sub1[0]] = sub1_node
59         # search root
60         if sub1[1] in view_ref:
61             # add to root node
62             view_ref[sub1[1]]['nodes'].append(sub1_node)
63         else:
64             # If root-meta does not exist, sub1 is added to top-level
65             view_data.append(sub1_node)
66             
67     for sub2 in meta_info['sub2']:
68         sub2_node = make_node(pkg_dict[sub2[0]])
69         view_ref[sub2[0]] = sub2_node
70         # search sub1
71         if sub2[2] in view_ref:
72             view_ref[sub2[2]]['nodes'].append(sub2_node)
73         # search root    
74         elif sub2[1] in view_ref: 
75             # If sub1-meta does not exist, sub2 is added to child of root-meta
76             view_ref[sub2[1]]['nodes'].append(sub2_node)
77         else:
78             # If root-meta/sub1-meta does not exist, sub1 is added to top-level
79             view_data.append(sub2_node)
80     
81     # configure meta dependency tree (requires)
82     for meta_pkg in view_data:
83         refer_count[meta_pkg['id']] += 1
84         set_meta_require(meta_pkg)
85     
86     #The remaining rpms are grouped into a MISC tree
87     misc_info = {}
88     misc_info['text'] = 'MISC'
89     misc_info['nodes'] = []
90     for k, v in pkg_dict.iteritems():
91         # Pkg is not referenced from Meta-pkg
92         if refer_count[v['id']] == 0:
93             misc_info['nodes'].append(make_node(v))
94             
95     logger.info('meta: %d, misc: %d', len(view_ref), len(misc_info['nodes']))
96     
97     view_data.append(misc_info)
98     
99     return view_data
100