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