[yum-git] Branch 'yum-3_2_X' - 2 commits - yum/misc.py yum/packages.py yum/sqlitesack.py

Seth Vidal skvidal at linux.duke.edu
Mon Jul 14 15:30:07 UTC 2008


 yum/misc.py       |   10 ++
 yum/packages.py   |  255 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 yum/sqlitesack.py |   17 +++
 3 files changed, 281 insertions(+), 1 deletion(-)

New commits:
commit 7a862409f84de04924535b5ca28f935ef70747ca
Merge: 8ce231d... c2fff31...
Author: Seth Vidal <skvidal at fedoraproject.org>
Date:   Mon Jul 14 11:27:42 2008 -0400

    Merge branch 'yum-3_2_X' of ssh://login.linux.duke.edu/home/groups/yum/git/yum into yum-3_2_X
    
    * 'yum-3_2_X' of ssh://login.linux.duke.edu/home/groups/yum/git/yum:
      Fix available comparison in "all" mode, use new .ver*() methods

commit 8ce231d8dbc22f2148b1dd3c8956740298cebfef
Author: Seth Vidal <skvidal at fedoraproject.org>
Date:   Mon Jul 14 11:27:24 2008 -0400

    move the xml-generating-bits into yum proper - out of createrepo

diff --git a/yum/misc.py b/yum/misc.py
index 5a59ee4..a587eb6 100644
--- a/yum/misc.py
+++ b/yum/misc.py
@@ -565,6 +565,16 @@ def to_str(obj):
         obj = str(obj)
     return obj
 
+def to_xml(item, attrib=False):
+    import xml.sax.saxutils
+    item = to_utf8(item) # verify this does enough conversion
+    item = item.rstrip()
+    if attrib:
+        item = xml.sax.saxutils.escape(item, entities={'"':"&quot;"})
+    else:
+        item = xml.sax.saxutils.escape(item)
+    return item
+
 def get_my_lang_code():
     import locale
     mylang = locale.getlocale()
diff --git a/yum/packages.py b/yum/packages.py
index 527b4a5..014064d 100644
--- a/yum/packages.py
+++ b/yum/packages.py
@@ -565,6 +565,12 @@ class YumAvailablePackage(PackageObject, RpmBase):
         return self._committime_ret
 
     committime = property(_committime)
+    
+    # FIXME test this to see if it causes hell elsewhere
+    def _checksum(self):
+        "Returns the 'default' checksum"
+        return self.checksums[0][1]
+    checksum = property(_checksum)
 
     def getDiscNum(self):
         if self.basepath is None:
@@ -730,6 +736,226 @@ class YumAvailablePackage(PackageObject, RpmBase):
                 csumid = 0
             self._checksums.append((ctype, csum, csumid))
 
+# from here down this is for dumping a package object back out to metadata
+    
+    
+    def _return_remote_location(self):
+        # break self.remote_url up into smaller pieces
+        base = os.path.dirname(self.remote_url)
+        href = os.path.basename(self.remote_url)
+        msg = """<location xml:base="%s" href="%s"/>\n""" % (
+                  misc.to_xml(base,attrib=True), misc.to_xml(href, attrib=True))
+        return msg
+        
+    def _dump_base_items(self):
+        
+        packager = url = ''
+        if self.packager:
+            packager = misc.to_xml(self.packager)
+        
+        if self.url:
+            url = misc.to_xml(self.url)
+                    
+        msg = """
+  <name>%s</name>
+  <arch>%s</arch>
+  <version epoch="%s" ver="%s" rel="%s"/>
+  <checksum type="sha" pkgid="YES">%s</checksum>
+  <summary>%s</summary>
+  <description>%s</description>
+  <packager>%s</packager>
+  <url>%s</url>
+  <time file="%s" build="%s"/>
+  <size package="%s" installed="%s" archive="%s"/>\n""" % (self.name, 
+         self.arch, self.epoch, self.ver, self.rel, self.checksum, 
+         misc.to_xml(self.summary), misc.to_xml(self.description), packager, 
+         url, self.filetime, self.buildtime, self.packagesize, self.size, 
+         self.archivesize)
+        
+        msg += self._return_remote_location()
+        return msg
+
+    def _dump_format_items(self):
+        msg = "  <format>\n"
+        if self.license:
+            msg += """    <rpm:license>%s</rpm:license>\n""" % misc.to_xml(self.license)
+        else:
+            msg += """    <rpm:license/>\n"""
+            
+        if self.vendor:
+            msg += """    <rpm:vendor>%s</rpm:vendor>\n""" % misc.to_xml(self.vendor)
+        else:
+            msg += """    <rpm:vendor/>\n"""
+            
+        if self.group:
+            msg += """    <rpm:group>%s</rpm:group>\n""" % misc.to_xml(self.group)
+        else:
+            msg += """    <rpm:group/>\n"""
+            
+        if self.buildhost:
+            msg += """    <rpm:buildhost>%s</rpm:buildhost>\n""" % misc.to_xml(self.buildhost)
+        else:
+            msg += """    <rpm:buildhost/>\n"""
+            
+        if self.sourcerpm:
+            msg += """    <rpm:sourcerpm>%s</rpm:sourcerpm>\n""" % misc.to_xml(self.sourcerpm)
+        msg +="""    <rpm:header-range start="%s" end="%s"/>""" % (self.hdrstart,
+                                                               self.hdrend)
+        msg += self._dump_pco('provides')
+        msg += self._dump_requires()
+        msg += self._dump_pco('conflicts')         
+        msg += self._dump_pco('obsoletes')         
+        msg += self._dump_files(True)
+        msg += """\n  </format>"""
+        return msg
+
+    def _dump_pco(self, pcotype):
+           
+        msg = ""
+        mylist = getattr(self, pcotype)
+        if mylist: msg = "\n    <rpm:%s>\n" % pcotype
+        for (name, flags, (e,v,r)) in mylist:
+            pcostring = '''      <rpm:entry name="%s"''' % name
+            if flags:
+                pcostring += ''' flags="%s"''' % flags
+                if e:
+                    pcostring += ''' epoch="%s"''' % e
+                if v:
+                    pcostring += ''' ver="%s"''' % v
+                if r:
+                    pcostring += ''' rel="%s"''' % r
+                    
+            pcostring += "/>\n"
+            msg += pcostring
+            
+        if mylist: msg += "    </rpm:%s>" % pcotype
+        return msg
+    
+    def _return_primary_files(self, list_of_files=None):
+        fileglobs = ['.*bin\/.*', '^\/etc\/.*', '^\/usr\/lib\/sendmail$']
+        file_re = []
+        for glob in fileglobs:
+            file_re.append(re.compile(glob))        
+
+
+        returns = {}
+        if list_of_files is None:
+            list_of_files = self.returnFileEntries('file')
+        for item in list_of_files:
+            if item is None:
+                continue
+            for glob in file_re:
+                if glob.match(item):
+                    returns[item] = 1
+        return returns.keys()
+
+    def _return_primary_dirs(self):
+        dirglobs = ['.*bin\/.*', '^\/etc\/.*']
+        dir_re = []
+        
+        for glob in dirglobs:
+            dir_re.append(re.compile(glob))
+
+        returns = {}
+        for item in self.returnFileEntries('dir'):
+            if item is None:
+                continue
+            for glob in dir_re:
+                if glob.match(item):
+                    returns[item] = 1
+        return returns.keys()
+        
+        
+    def _dump_files(self, primary=False):
+        msg =""
+        if not primary:
+            files = self.returnFileEntries('file')
+            dirs = self.returnFileEntries('dir')
+            ghosts = self.returnFileEntries('ghost')
+        else:
+            files = self._return_primary_files()
+            ghosts = self._return_primary_files(list_of_files = self.returnFileEntries('ghost'))
+            dirs = self._return_primary_dirs()
+                
+        for fn in files:
+            msg += """    <file>%s</file>\n""" % misc.to_xml(fn)
+        for fn in dirs:
+            msg += """    <file type="dir">%s</file>\n""" % misc.to_xml(fn)
+        for fn in ghosts:
+            msg += """    <file type="ghost">%s</file>\n""" % misc.to_xml(fn)
+        
+        return msg
+
+
+    def _requires_with_pre(self):
+        raise NotImplementedError()
+                    
+    def _dump_requires(self):
+        """returns deps in format"""
+        mylist = self._requires_with_pre()
+
+        msg = ""
+
+        if mylist: msg = "\n    <rpm:requires>\n"
+        for (name, flags, (e,v,r),pre) in mylist:
+            if name.startswith('rpmlib('):
+                continue
+            prcostring = '''      <rpm:entry name="%s"''' % name
+            if flags:
+                prcostring += ''' flags="%s"''' % flags
+                if e:
+                    prcostring += ''' epoch="%s"''' % e
+                if v:
+                    prcostring += ''' ver="%s"''' % v
+                if r:
+                    prcostring += ''' rel="%s"''' % r
+            if pre:
+                prcostring += ''' pre="%s"''' % pre
+                    
+            prcostring += "/>\n"
+            msg += prcostring
+            
+        if mylist: msg += "    </rpm:requires>"
+        return msg
+
+    def _dump_changelog(self, clog_limit):
+        if not self.changelog:
+            return ""
+        msg = "\n"
+        clog_count = 0
+        for (ts, author, content) in reversed(sorted(self.changelog)):
+            if clog_limit and clog_count >= clog_limit:
+                break
+            clog_count += 1
+            msg += '''<changelog author="%s" date="%s">%s</changelog>\n''' % (
+                        misc.to_xml(author, attrib=True), str(ts), misc.to_xml(content))
+        return msg
+
+    def xml_dump_primary_metadata(self):
+        msg = """\n<package type="rpm">"""
+        msg += self._dump_base_items()
+        msg += self._dump_format_items()
+        msg += """\n</package>"""
+        return msg
+
+    def xml_dump_filelists_metadata(self):
+        msg = """\n<package pkgid="%s" name="%s" arch="%s">
+    <version epoch="%s" ver="%s" rel="%s"/>\n""" % (self.checksum, self.name, 
+                                     self.arch, self.epoch, self.ver, self.rel)
+        msg += self._dump_files()
+        msg += "</package>\n"
+        return msg
+
+    def xml_dump_other_metadata(self, clog_limit=0):
+        msg = """\n<package pkgid="%s" name="%s" arch="%s">
+    <version epoch="%s" ver="%s" rel="%s"/>\n""" % (self.checksum, self.name, 
+                                     self.arch, self.epoch, self.ver, self.rel)
+        msg += self._dump_changelog(clog_limit)
+        msg += "\n</package>\n"
+        return msg
+
+
+
 
 class YumHeaderPackage(YumAvailablePackage):
     """Package object built from an rpm header"""
@@ -879,7 +1105,34 @@ class YumHeaderPackage(YumAvailablePackage):
 
     def returnChecksums(self):
         raise NotImplementedError()
-        
+
+    def _is_pre_req(self, flag):
+        """check the flags for a requirement, return 1 or 0 whether or not requires
+           is a pre-requires or a not"""
+        # FIXME this should probably be put in rpmUtils.miscutils since 
+        # - that's what it is
+        newflag = flag
+        if flag is not None:
+            newflag = flag & rpm.RPMSENSE_PREREQ
+            if newflag == rpm.RPMSENSE_PREREQ:
+                return 1
+            else:
+                return 0
+        return 0
+
+    def _requires_with_pre(self):
+        """returns requires with pre-require bit"""
+        name = self.hdr[rpm.RPMTAG_REQUIRENAME]
+        lst = self.hdr[rpm.RPMTAG_REQUIREFLAGS]
+        flag = map(flagToString, lst)
+        pre = map(self._is_pre_req, lst)
+        lst = self.hdr[rpm.RPMTAG_REQUIREVERSION]
+        vers = map(stringToVersion, lst)
+        if name is not None:
+            lst = zip(name, flag, vers, pre)
+        mylist = misc.unique(lst)
+        return mylist
+
 class _CountedReadFile:
     """ Has just a read() method, and keeps a count so we can find out how much
         has been read. Implemented so we can get the real size of the file from
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 2949df4..15e916b 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -242,6 +242,23 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
                 self.prco[prcotype].append(_share_data(prco_set))
 
         return RpmBase.returnPrco(self, prcotype, printable)
+    
+    def _requires_with_pre(self):
+        """returns requires with pre-require bit"""
+        sql = "SELECT name, version, release, epoch, flags,pre " \
+              "FROM requires WHERE pkgKey = ?"
+        cur = self._sql_MD('primary', sql, (self.pkgKey,))
+        requires = []
+        for ob in cur:
+            pre = "0"
+            if ob['pre'].lower() in ['TRUE', 1]:
+                pre = "1"
+            prco_set = (_share_data(ob['name']), _share_data(ob['flags']),
+                        (_share_data(ob['epoch']),
+                         _share_data(ob['version']),
+                         _share_data(ob['release'])), pre)
+            requires.append(prco_set)
+        return requires
 
 class YumSqlitePackageSack(yumRepo.YumPackageSack):
     """ Implementation of a PackageSack that uses sqlite cache instead of fully



More information about the Yum-cvs-commits mailing list