27 import csv |
27 import csv |
28 |
28 |
29 LOGGER = logging.getLogger("symrec") |
29 LOGGER = logging.getLogger("symrec") |
30 logging.basicConfig(level=logging.INFO) |
30 logging.basicConfig(level=logging.INFO) |
31 |
31 |
32 def _cleanup_list(input): |
32 def _cleanup_list(input_): |
33 """cleanup list""" |
33 """cleanup list""" |
34 result = [] |
34 result = [] |
35 for chars in input: |
35 for chars in input_: |
36 if chars is not None and chars.strip() != "": |
36 if chars is not None and chars.strip() != "": |
37 result.append(chars) |
37 result.append(chars) |
38 return result |
38 return result |
39 |
39 |
40 def xml_setattr(node, attr, value): |
40 def xml_setattr(node, attr, value): |
54 the output in a structure way. |
54 the output in a structure way. |
55 indent = current indentation |
55 indent = current indentation |
56 addindent = indentation to add to higher levels |
56 addindent = indentation to add to higher levels |
57 newl = newline string |
57 newl = newline string |
58 """ |
58 """ |
|
59 # pylint: disable=W0212 |
59 writer.write(indent + "<" + self.tagName) |
60 writer.write(indent + "<" + self.tagName) |
60 |
61 |
61 attrs = self._get_attributes() |
62 attrs = self._get_attributes() |
62 a_names = attrs.keys() |
63 a_names = attrs.keys() |
63 a_names.sort() |
64 a_names.sort() |
109 """instructions""" |
110 """instructions""" |
110 result = [] |
111 result = [] |
111 for instr in self.__xml.getElementsByTagName('instructions'): |
112 for instr in self.__xml.getElementsByTagName('instructions'): |
112 result.append(instr.getAttribute('name')) |
113 result.append(instr.getAttribute('name')) |
113 return result |
114 return result |
|
115 |
114 |
116 |
115 class ReleaseMetadata(object): |
117 class ReleaseMetadata(object): |
116 """ Create or read Metadata XML from SYMREC/SYMDEC. """ |
118 """ Create or read Metadata XML from SYMREC/SYMDEC. """ |
117 |
119 |
118 def __init__(self, filename, service=None, product=None, release=None): |
120 def __init__(self, filename, service=None, product=None, release=None): |
139 self.service = service |
141 self.service = service |
140 if product != None: |
142 if product != None: |
141 self.product = product |
143 self.product = product |
142 if release != None: |
144 if release != None: |
143 self.release = release |
145 self.release = release |
144 elif service!=None and product!=None and release!=None: |
146 elif service != None and product != None and release != None: |
145 self._xml = xml.dom.minidom.Document() |
147 self._xml = xml.dom.minidom.Document() |
146 self._releaseInformation = self._xml.createElement(u"releaseInformation") |
148 self._releaseInformation = self._xml.createElement(u"releaseInformation") |
147 self._xml.appendChild(self._releaseInformation) |
149 self._xml.appendChild(self._releaseInformation) |
148 self._releaseDetails = self._xml.createElement(u'releaseDetails') |
150 self._releaseDetails = self._xml.createElement(u'releaseDetails') |
149 self._releaseInformation.appendChild(self._releaseDetails) |
151 self._releaseInformation.appendChild(self._releaseDetails) |
168 self._releaseInformation.appendChild(self._releaseFiles) |
170 self._releaseInformation.appendChild(self._releaseFiles) |
169 |
171 |
170 # releaseFiles |
172 # releaseFiles |
171 self._releaseInformation.appendChild(self._xml.createElement(u'externalFiles')) |
173 self._releaseInformation.appendChild(self._xml.createElement(u'externalFiles')) |
172 else: |
174 else: |
173 raise Exception("Error metadata file doesn't exists.") |
175 raise IOError("Error metadata file doesn't exists.") |
174 |
|
175 |
176 |
176 def get_dependsof(self): |
177 def get_dependsof(self): |
177 """ Return a ReleaseMetada object pointing to the dependency release. """ |
178 """ Return a ReleaseMetada object pointing to the dependency release. """ |
178 if self.dependsof_service != None and self.dependsof_product != None and self.dependsof_release != None: |
179 if self.dependsof_service != None and self.dependsof_product != None and self.dependsof_release != None: |
179 filename = os.path.join(os.path.dirname(self._filename), "../../..", |
180 filename = os.path.join(os.path.dirname(self._filename), "../../..", |
182 self.dependsof_release) |
183 self.dependsof_release) |
183 return ReleaseMetadata(find_latest_metadata(filename)) |
184 return ReleaseMetadata(find_latest_metadata(filename)) |
184 else: |
185 else: |
185 return None |
186 return None |
186 |
187 |
187 |
|
188 def set_dependsof(self, filename): |
188 def set_dependsof(self, filename): |
189 """ Setting the dependency release. """ |
189 """ Setting the dependency release. """ |
190 metadata = ReleaseMetadata(filename) |
190 metadata = ReleaseMetadata(filename) |
191 self.dependsof_service = metadata.service |
191 self.dependsof_service = metadata.service |
192 self.dependsof_product = metadata.product |
192 self.dependsof_product = metadata.product |
193 self.dependsof_release = metadata.release |
193 self.dependsof_release = metadata.release |
194 |
194 |
195 def add_package(self, name, type=None, default=True, filters=None, extract="single", md5checksum=None, size=None): |
195 def add_package(self, name, type_=None, default=True, filters=None, extract="single", md5checksum=None, size=None): |
196 """ Adding a package to the metadata file. """ |
196 """ Adding a package to the metadata file. """ |
197 # check if update mode |
197 # check if update mode |
198 package = None |
198 package = None |
199 |
199 |
200 for pkg in self._xml.getElementsByTagName('package'): |
200 for pkg in self._xml.getElementsByTagName('package'): |
206 if package is None: |
206 if package is None: |
207 package = self._xml.createElement(u'package') |
207 package = self._xml.createElement(u'package') |
208 self._releaseFiles.appendChild(package) |
208 self._releaseFiles.appendChild(package) |
209 |
209 |
210 xml_setattr(package, 'name', os.path.basename(name)) |
210 xml_setattr(package, 'name', os.path.basename(name)) |
211 if type != None: |
211 if type_ != None: |
212 xml_setattr(package, 'type', type) |
212 xml_setattr(package, 'type', type_) |
213 else: |
213 else: |
214 xml_setattr(package, 'type', os.path.splitext(name)[1].lstrip('.')) |
214 xml_setattr(package, 'type', os.path.splitext(name)[1].lstrip('.')) |
215 xml_setattr(package, 'default', str(default).lower()) |
215 xml_setattr(package, 'default', str(default).lower()) |
216 xml_setattr(package, 'extract', extract) |
216 xml_setattr(package, 'extract', extract) |
217 if filters and len(filters)>0: |
217 if filters and len(filters)>0: |
222 xml_setattr(package, 's60filter', '') |
222 xml_setattr(package, 's60filter', '') |
223 if md5checksum != None: |
223 if md5checksum != None: |
224 xml_setattr(package, unicode("md5checksum"), unicode(md5checksum)) |
224 xml_setattr(package, unicode("md5checksum"), unicode(md5checksum)) |
225 if size != None: |
225 if size != None: |
226 xml_setattr(package, unicode("size"), unicode(size)) |
226 xml_setattr(package, unicode("size"), unicode(size)) |
227 |
|
228 |
227 |
229 def keys(self): |
228 def keys(self): |
230 """keys""" |
229 """keys""" |
231 keys = [] |
230 keys = [] |
232 for pkg in self._releaseFiles.getElementsByTagName('package'): |
231 for pkg in self._releaseFiles.getElementsByTagName('package'): |
248 md5checksum = pkg.getAttribute('md5checksum') |
247 md5checksum = pkg.getAttribute('md5checksum') |
249 if pkg.hasAttribute(u'size'): |
248 if pkg.hasAttribute(u'size'): |
250 size = pkg.getAttribute('size') |
249 size = pkg.getAttribute('size') |
251 return {'type': pkg.getAttribute('type'), 'extract': pkg.getAttribute('extract'), 'default': (pkg.getAttribute('default')=="true"), \ |
250 return {'type': pkg.getAttribute('type'), 'extract': pkg.getAttribute('extract'), 'default': (pkg.getAttribute('default')=="true"), \ |
252 'filters': filters, 's60filter': s60filters, 'md5checksum': md5checksum, 'size': size} |
251 'filters': filters, 's60filter': s60filters, 'md5checksum': md5checksum, 'size': size} |
253 raise Exception("Key '%s' not found." % key) |
252 raise KeyError("Key '%s' not found." % key) |
254 |
253 |
255 def __setitem__(self, key, value): |
254 def __setitem__(self, key, value): |
256 self.add_package(key, value['type'], value['default'], value['filters'], value['extract'], value['md5checksum'], value['size']) |
255 self.add_package(key, value['type'], value['default'], value['filters'], value['extract'], value['md5checksum'], value['size']) |
257 |
256 |
258 def set_releasedetails_info(self, name, value, details="releaseID"): |
257 def set_releasedetails_info(self, name, value, details="releaseID"): |
400 dependency = self.get_dependsof() |
399 dependency = self.get_dependsof() |
401 if dependency != None: |
400 if dependency != None: |
402 return ValidateReleaseMetadata(dependency.filename).is_valid(checkmd5) |
401 return ValidateReleaseMetadata(dependency.filename).is_valid(checkmd5) |
403 return True |
402 return True |
404 |
403 |
|
404 |
405 class MetadataMerger(object): |
405 class MetadataMerger(object): |
406 """ Merge packages definition to the root metadata. """ |
406 """ Merge packages definition to the root metadata. """ |
407 |
407 |
408 def __init__(self, metadata): |
408 def __init__(self, metadata): |
409 """ Construct a metadata merger providing root metadata filename. """ |
409 """ Construct a metadata merger providing root metadata filename. """ |
422 return self._metadata.xml() |
422 return self._metadata.xml() |
423 |
423 |
424 def save(self, filename = None): |
424 def save(self, filename = None): |
425 """ Saving the XML into the provided filename. """ |
425 """ Saving the XML into the provided filename. """ |
426 return self._metadata.save(filename) |
426 return self._metadata.save(filename) |
|
427 |
427 |
428 |
428 class Metadata2TDD(ReleaseMetadata): |
429 class Metadata2TDD(ReleaseMetadata): |
429 """ Convert Metadata to a TDD file """ |
430 """ Convert Metadata to a TDD file """ |
430 def __init__(self, filename, includes=None, excludes=None): |
431 def __init__(self, filename, includes=None, excludes=None): |
431 ReleaseMetadata.__init__(self, filename) |
432 ReleaseMetadata.__init__(self, filename) |
474 metadatas.append(filename) |
475 metadatas.append(filename) |
475 # reverse the order... |
476 # reverse the order... |
476 metadatas.sort(reverse=True) |
477 metadatas.sort(reverse=True) |
477 if len(metadatas) > 0: |
478 if len(metadatas) > 0: |
478 return os.path.normpath(os.path.join(releasedir, metadatas[0])) |
479 return os.path.normpath(os.path.join(releasedir, metadatas[0])) |
479 except Exception, exc: |
480 except (IOError, OSError), exc: |
480 LOGGER.error(exc) |
481 LOGGER.error(exc) |
481 return None |
482 return None |
482 return None |
483 return None |
|
484 |
483 |
485 |
484 class ValidateReleaseMetadataCached(ValidateReleaseMetadata): |
486 class ValidateReleaseMetadataCached(ValidateReleaseMetadata): |
485 """ Cached version of the metadata validation. """ |
487 """ Cached version of the metadata validation. """ |
486 def __init__(self, filename, cachefile=None): |
488 def __init__(self, filename, cachefile=None): |
487 ValidateReleaseMetadata.__init__(self, filename) |
489 ValidateReleaseMetadata.__init__(self, filename) |
536 f_file = open(self.__cachefile, "wb") |
538 f_file = open(self.__cachefile, "wb") |
537 writer = csv.writer(f_file) |
539 writer = csv.writer(f_file) |
538 writer.writerows(metadatas) |
540 writer.writerows(metadatas) |
539 f_file.close() |
541 f_file.close() |
540 |
542 |
|
543 |
541 class ValidateTicklerReleaseMetadata(ValidateReleaseMetadataCached): |
544 class ValidateTicklerReleaseMetadata(ValidateReleaseMetadataCached): |
542 """ This class validate if a metadata file is stored in the correct location and |
545 """ This class validate if a metadata file is stored in the correct location and |
543 if all deps exists. |
546 if all deps exists. |
544 """ |
547 """ |
545 def __init__(self, filename): |
548 def __init__(self, filename): |
546 ReleaseMetadata.__init__(self, filename) |
549 ValidateReleaseMetadataCached.__init__(self, filename) |
547 self.location = os.path.dirname(filename) |
550 self.location = os.path.dirname(filename) |
548 |
551 |
549 def is_valid(self, checkmd5=True): |
552 def is_valid(self, checkmd5=True): |
550 """ Run the validation mechanism. """ |
553 """ Run the validation mechanism. """ |
551 tickler_path = os.path.join(self.location,"TICKLER") |
554 tickler_path = os.path.join(self.location,"TICKLER") |