2 # Copyright (c) 2016 Samsung Electronics Co., Ltd
4 # Licensed under the Flora License, Version 1.1 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://floralicense.org/license/
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
21 from lxml import etree
22 from tic.utils.error import TICError
23 from tic.utils.rpmmisc import archPolicies, default_arch
24 from tic.config import configmgr
27 META_PREFIX = configmgr.regularexp['meta_prefix']
28 META_PREFIX_ROOT = configmgr.regularexp['meta_prefix_root']
29 META_PREFIX_SUB1 = configmgr.regularexp['meta_prefix_sub1']
30 META_PATTERN = re.compile(''.join(['^', META_PREFIX, configmgr.regularexp['meta_pattern']]), re.I)
31 META_SUB1_PATTERN = re.compile(configmgr.regularexp['meta_sub1_pattern'])
32 META_SUB2_PATTERN = re.compile(configmgr.regularexp['meta_sub2_pattern'])
34 PROFILE_PATTERN = re.compile(configmgr.regularexp['profile_pattern'])
36 class RepodataParser(object):
38 def __init__(self, arch, repodata_list):
40 self.repodata_list = repodata_list
42 def _xml_parse(self, pkg_group, pkg_list, tag_dic):
44 def _set_version(element, tag):
45 if 'ver' in tag.attrib:
46 element['ver'] = tag.attrib['ver']
47 if 'rel' in tag.attrib:
48 element['rel'] = tag.attrib['rel']
49 if 'epoch' in tag.attrib:
50 element['epoch'] = tag.attrib['epoch']
51 if 'flags' in tag.attrib:
52 element['flags'] = tag.attrib['flags']
54 pkg_dict = pkg_group.get('pkg_dict')
55 provides_dict = pkg_group.get('provides')
56 files_dict = pkg_group.get('files')
57 meta_info = pkg_group.get('meta_info')
58 pkg_id = len(pkg_dict)
61 pkg_name = pkg.findtext(tag_dic['name'])
63 # check whether a package is duplicated.
64 if pkg_name in pkg_dict:
65 # TODO: Apply to policy of duplication
66 # logger.warning('package(%s) is duplicated. exclude this package', pkg_name)
70 pkg_info['id'] = pkg_id
71 pkg_info['name'] = pkg_name
72 pkg_info['arch'] = pkg.findtext(tag_dic['arch'])
73 pkg_info['summary'] = pkg.findtext(tag_dic['summary'])
74 pkg_info['selfChecked'] = False # for web-ui tree
75 # Parsing meta-pkg using meta naming rule
76 meta_match = META_PATTERN.search(pkg_info['name'])
77 if meta_match is not None:
78 if meta_match.group('meta') == 'root':
79 meta_info['root'].append([pkg_info['name'], pkg_info['summary']])
80 pkg_info['meta'] = 'root'
81 elif meta_match.group('meta') == 'sub1':
82 sub1_match = META_SUB1_PATTERN.search(meta_match.group('pkgname'))
83 meta_info['sub1'].append([pkg_info['name'],
84 ''.join([META_PREFIX_ROOT, sub1_match.group('root')]),
86 pkg_info['meta'] = 'sub1'
87 elif meta_match.group('meta') == 'sub2':
88 sub2_match = META_SUB2_PATTERN.search(meta_match.group('pkgname'))
89 meta_info['sub2'].append([pkg_info['name'],
90 ''.join([META_PREFIX_ROOT, sub2_match.group('root')]),
91 ''.join([META_PREFIX_SUB1, sub2_match.group('root'),'-', sub2_match.group('sub1')]),
93 pkg_info['meta'] = 'sub2'
94 elif meta_match.group('meta') == 'category':
95 pkg_info['meta'] = 'category'
96 # 0: pkg_name, 1: category_name
97 meta_info['category'].append([pkg_info['name'], meta_match.group('pkgname')])
99 # building-blocks.rpm, etc...
100 pkg_info['meta'] = 'etc'
103 profile_match = PROFILE_PATTERN.search(pkg_info['name']);
104 if profile_match and profile_match.group('profile'):
105 pkg_info['profile'] = profile_match.group('profile')
107 pkg_info['profile'] = None
109 ver_tag = pkg.find(tag_dic['version'])
110 pkg_info['version'] = {'epoch':ver_tag.attrib['epoch'],
111 'ver':ver_tag.attrib['ver'],
112 'rel':ver_tag.attrib['rel']}
113 pkg_info['checksum'] = pkg.findtext(tag_dic['checksum'])
114 pkg_info['description'] = pkg.findtext(tag_dic['description'])
115 pkg_info['location'] = pkg.find(tag_dic['location']).attrib['href']
116 size_tag = pkg.find(tag_dic['size'])
117 pkg_info['size'] = size_tag.attrib['package']
118 pkg_info['installed'] = size_tag.attrib['installed']
120 format_tag = pkg.find(tag_dic['format'])
121 if(format_tag is not None):
122 requires_tag = format_tag.find(tag_dic['requires'])
123 if requires_tag is not None:
125 for rpm in requires_tag:
126 require = dict(name= rpm.attrib['name'])
127 _set_version(require, rpm)
128 dep_list.append(require)
129 pkg_info['requires'] = dep_list
130 provides_tag = format_tag.find(tag_dic['provides'])
131 if provides_tag is not None:
133 for rpm in provides_tag:
134 provide = dict(name= rpm.attrib['name'])
135 _set_version(provide, rpm)
136 if provide.get('ver') and not provide.get('rel') and pkg_info['version']['rel']:
137 provide['rel'] = pkg_info['version']['rel']
139 if rpm.attrib['name'] in provides_dict:
140 provides_dict[rpm.attrib['name']].append({'name': pkg_name, 'data': provide})
142 provides_dict[rpm.attrib['name']] = [{'name': pkg_name, 'data': provide}]
143 dep_list.append(provide)
144 pkg_info['provides'] = dep_list
145 conflicts_tag = format_tag.find(tag_dic['conflicts'])
146 if conflicts_tag is not None:
148 for rpm in conflicts_tag:
149 conflict = dict(name= rpm.attrib['name'])
150 _set_version(conflict, rpm)
151 dep_list.append(conflict)
152 pkg_info['conflicts'] = dep_list
153 recommends_tag = format_tag.find(tag_dic['recommends'])
154 if recommends_tag is not None:
156 for rpm in recommends_tag:
157 recommend = dict(name=rpm.attrib['name'])
158 _set_version(recommend, rpm)
159 dep_list.append(recommend)
160 pkg_info['recommends'] = dep_list
161 suggests_tag = format_tag.find(tag_dic['suggests'])
162 if suggests_tag is not None:
164 for rpm in suggests_tag:
165 suggests = dict(name= rpm.attrib['name'])
166 dep_list.append(suggests)
167 pkg_info['suggests'] = dep_list
168 file_tag = format_tag.find(tag_dic['file'])
169 if file_tag is not None:
171 for file_t in format_tag.findall(tag_dic['file']):
172 if file_t.text in files_dict:
173 files_dict[file_t.text].append(pkg_name)
175 files_dict[file_t.text] = [pkg_name]
176 dep_list.append(file_t.text)
177 pkg_info['file'] = dep_list
178 pkg_dict[pkg_name] = pkg_info
181 def _prepare_requires_id(self, pkg_group):
182 logger = logging.getLogger(__name__)
183 pkg_list = pkg_group.get('pkg_list')
184 pkg2id = pkg_group.get('pkg2id')
185 provides2id = pkg_group.get('provides2id')
186 file2id = pkg_group.get('file2id')
188 for pkg_id in range(len(pkg_list)):
189 requires = pkg_list[pkg_id].get('requires')
190 if requires is not None:
191 for req_info in requires:
192 req_name = req_info['name']
193 #TODO: Determine dependency search order
194 if req_name in provides2id:
195 #TODO: Select a package in provides (version?)
196 req_info['id'] = provides2id[req_name][0]['id']
197 elif req_name in pkg2id:
198 req_info['id'] = pkg2id[req_name]
199 elif req_name in file2id:
200 req_info['id'] = file2id[req_name][0]['id']
202 #TODO: Exception Check
203 # the dependent package does not exist.
204 logger.warning('"%s" required by "%s" does not exist.', req_name, pkg_list[pkg_id].get('name'))
206 def _get_tagname(self, root):
208 # xmlns = re.sub('metadata$', '', root.tag)
209 tags['metadata'] = '{%s}metadata' % root.nsmap[None]
210 tags['package'] = '{%s}package' % root.nsmap[None]
211 tags['name'] = '{%s}name' % root.nsmap[None]
212 tags['arch'] = '{%s}arch' % root.nsmap[None]
213 tags['version'] = '{%s}version' % root.nsmap[None]
214 tags['checksum'] = '{%s}checksum' % root.nsmap[None]
215 tags['summary'] = '{%s}summary' % root.nsmap[None]
216 tags['description'] = '{%s}description' % root.nsmap[None]
217 tags['location'] = '{%s}location' % root.nsmap[None]
218 tags['size'] = '{%s}size' % root.nsmap[None]
219 tags['format'] = '{%s}format' % root.nsmap[None]
220 tags['requires'] = '{%s}requires' % root.nsmap['rpm']
221 tags['provides'] = '{%s}provides' % root.nsmap['rpm']
222 tags['conflicts'] = '{%s}conflicts' % root.nsmap['rpm']
223 tags['suggests'] = '{%s}suggests' % root.nsmap['rpm']
224 tags['recommends'] = '{%s}recommends' % root.nsmap['rpm']
225 tags['file'] = '{%s}file' % root.nsmap[None]
228 def _filtering_data_based_arch(self, xml_list, tag_dic):
230 for xml_root in xml_list:
232 for pkg_elm in xml_root.findall(tag_dic['package']):
233 pkg_arch = pkg_elm.findtext(tag_dic['arch'])
234 if pkg_arch not in archPolicies[self.arch] and pkg_arch not in default_arch:
236 if not pkg_data.get(pkg_arch):
237 pkg_data[pkg_arch] = []
238 pkg_data[pkg_arch].append(pkg_elm)
239 ret_list.append(pkg_data)
243 logger = logging.getLogger(__name__)
244 if not self.repodata_list:
249 for repodata in self.repodata_list:
250 tree = etree.parse(repodata['primary'])
251 xml_list.append(tree.getroot())
252 except etree.XMLSyntaxError as e:
254 raise TICError(configmgr.message['xml_parse_error'] % ('primary', repodata['baseurl']))
256 tag_dic = self._get_tagname(xml_list[0])
258 # TODO: temporary code (should be deleted)
259 #meta_string='<?xml version="1.0" encoding="UTF-8"?><metadata xmlns="http://linux.duke.edu/metadata/common" xmlns:rpm="http://linux.duke.edu/metadata/rpm" packages="1467"><package type="rpm"><name>building-blocks-category-domains</name><arch>armv7l</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>Simple DirectMedia Layer</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="armv7l/SDL2-2.0.4-4.2.armv7l.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /><rpm:suggests><rpm:entry name="building-blocks-root-metapkg" /></rpm:suggests></format></package><package type="rpm"><name>building-blocks-category-presets</name><arch>armv7l</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>Simple DirectMedia Layer</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="armv7l/SDL2-2.0.4-4.2.armv7l.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /><rpm:suggests><rpm:entry name="building-blocks-root-metapkg2" /></rpm:suggests></format></package><package type="rpm"><name>building-blocks-root-metapkg2</name><arch>armv7l</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>Meta root pkg2</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="armv7l/SDL2-2.0.4-4.2.armv7l.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /></format></package><package type="rpm"><name>building-blocks-root-metapkg</name><arch>armv7l</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>Meta root pkg1</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="armv7l/SDL2-2.0.4-4.2.armv7l.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /><rpm:requires><rpm:entry name="building-blocks-sub1-metapkg-extsub1" /><rpm:entry name="building-blocks-sub1-metapkg-extsub2" /></rpm:requires></format></package><package type="rpm"><name>building-blocks-sub1-metapkg-extsub1</name><arch>armv7l</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub1-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="armv7l/SDL2-2.0.4-4.2.armv7l.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /><rpm:requires><rpm:entry name="building-blocks-sub2-metapkg-extsub1-exts1sub1" /></rpm:requires></format></package><package type="rpm"><name>building-blocks-sub2-metapkg-extsub1-exts1sub1</name><arch>armv7l</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub2-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="armv7l/SDL2-2.0.4-4.2.armv7l.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /><rpm:conflicts><rpm:entry name="building-blocks-sub2-metapkg-extsub1-exts1sub2" /></rpm:conflicts></format></package><package type="rpm"><name>building-blocks-sub2-metapkg-extsub1-exts1sub2</name><arch>armv7l</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub2-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="armv7l/SDL2-2.0.4-4.2.armv7l.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /><rpm:conflicts><rpm:entry name="building-blocks-sub2-metapkg-extsub1-exts1sub1" /></rpm:conflicts></format></package><package type="rpm"><name>building-blocks-sub1-metapkg-extsub2</name><arch>armv7l</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub1-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="armv7l/SDL2-2.0.4-4.2.armv7l.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /><rpm:requires><rpm:entry name="building-blocks-sub2-metapkg-extsub2-exts2sub1" /><rpm:entry name="SDL2" /></rpm:requires></format></package><package type="rpm"><name>building-blocks-sub2-metapkg-extsub2-exts2sub1</name><arch>armv7l</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub2-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="armv7l/SDL2-2.0.4-4.2.armv7l.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /></format></package><package type="rpm"><name>building-blocks-sub2-metapkg-extsub2-exts2sub2</name><arch>armv7l</arch><version epoch="0" ver="2.0.4" rel="4.2" vcs="platform/upstream/SDL#5f9405ba696ad79a0e05150430fe69e874f8280d" /><checksum type="sha256" pkgid="YES">6f74666eb89e1addc4ce75e25f3e639bbfdd8798fc848a6b7027501070567dcf</checksum><summary>sub2-extension</summary><description>This is the Simple DirectMedia Layer, a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</description><packager /><url>http://www.libsdl.org/</url><time file="1476718677" build="1476718668" /><size package="264245" installed="956696" archive="957124" /><location href="armv7l/SDL2-2.0.4-4.2.armv7l.rpm" /><format><rpm:license>Zlib and SGI-B-2.0</rpm:license><rpm:vendor>tizen</rpm:vendor><rpm:group>System Environment/Libraries</rpm:group><rpm:buildhost>w36</rpm:buildhost><rpm:sourcerpm>SDL2-2.0.4-4.2.src.rpm</rpm:sourcerpm><rpm:header-range start="280" end="5958" /><rpm:requires><rpm:entry name="SDL2" /></rpm:requires></format></package></metadata>'
260 #xml_list.append(etree.fromstring(meta_string))
262 filter_data = self._filtering_data_based_arch(xml_list, tag_dic)
264 pkg_group = dict(pkg_dict={},
269 meta_info=dict(root=[], sub1=[], sub2=[], category=[]))
271 # parses the repodata (primary.xml)
272 # for xml_root in xml_list:
273 # self._xml_parse(pkg_group, xml_root, tag_dic)
274 for xml_data in filter_data:
275 for arch in archPolicies[self.arch]:
277 self._xml_parse(pkg_group, xml_data[arch], tag_dic)
279 for arch in default_arch:
281 self._xml_parse(pkg_group, xml_data[arch], tag_dic)
283 # set the requires id
284 #self._prepare_requires_id(pkg_group)