buildframework/helium/sf/python/pythoncore/lib/symrec.py
changeset 628 7c4a911dc066
parent 588 c7c26511138f
child 645 b8d81fa19e7d
equal deleted inserted replaced
588:c7c26511138f 628:7c4a911dc066
    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")