Re: Patch: weak dependencies for createrepo

Michael Schroeder <[email protected]> Thu, 13 Mar 2014 12:31:51 +0100
Newsgroups gmane.linux.rpm.metadata
Message-ID <[email protected]>
--ikeVEW9yuYc//A+q
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Tue, Feb 25, 2014 at 02:36:54PM +0100, Michael Schroeder wrote:
> attached is what I currently use to have createrepo emit weak dependencies.
> Things are a bit complicated because I still need to support the old
> tags, feel free to remove that part if you don't like it.
> 
> yum-metadata-parser-1.1.2-weakdeps.patch:
>     'createrepo --update' needs to parse the old metadata, and since
>     some time it uses the yum-metadata-parser (aka sqlitecache) package
>     to do the job. Thus we need to support weak dependencies here as well.
> 
> yum-3.4.3-suse-missing-tags.patch:
>     adds support for the new tags. The old tags are not exported, so
>     I had to use the numeric values here.
> 
> Feel free to beatify my code ;)

Attached is a simpler version of yum-3.4.3-suse-missing-tags.patch.
(yum-metadata-parser-1.1.2-weakdeps.patch is still needed.)

Cheers,
  Michael.

-- 
Michael Schroeder                                   [email protected]
SUSE LINUX Products GmbH,  GF Jeff Hawn, HRB 16746 AG Nuernberg
main(_){while(_=~getchar())putchar(~_-1/(~(_|32)/13*2-11)*13);}

--ikeVEW9yuYc//A+q
Content-Type: text/x-patch; charset=us-ascii
Content-Disposition: attachment; filename="yum-3.4.3-suse-missing-tags.patch"

--- ./yum/mdparser.py.orig	2014-03-13 11:04:20.753615026 +0000
+++ ./yum/mdparser.py	2014-03-13 11:04:51.698614971 +0000
@@ -155,7 +155,8 @@ class PrimaryEntry(BaseEntry):
                 p[name] = child.text
 
             elif name in ('provides', 'requires', 'conflicts', 
-                          'obsoletes'):
+                          'obsoletes',
+                          'suggests', 'enhances', 'recommends', 'supplements'):
                 self.prco[name] = self.getPrco(child)
 
             elif name == 'header-range':
--- ./yum/packages.py.orig	2014-03-13 11:04:20.758615026 +0000
+++ ./yum/packages.py	2014-03-13 11:08:42.633614562 +0000
@@ -412,6 +412,10 @@ class RpmBase(object):
         self.prco['conflicts'] = [] # (name, flag, (e,v,r))
         self.prco['requires'] = [] # (name, flag, (e,v,r))
         self.prco['provides'] = [] # (name, flag, (e,v,r))
+        self.prco['suggests'] = [] # (name, flag, (e,v,r))
+        self.prco['enhances'] = [] # (name, flag, (e,v,r))
+        self.prco['recommends'] = [] # (name, flag, (e,v,r))
+        self.prco['supplements'] = [] # (name, flag, (e,v,r))
         self.files = {}
         self.files['file'] = []
         self.files['dir'] = []
@@ -615,6 +619,10 @@ class RpmBase(object):
     provides = property(fget=lambda self: self.returnPrco('provides'))
     obsoletes = property(fget=lambda self: self.returnPrco('obsoletes'))
     conflicts = property(fget=lambda self: self.returnPrco('conflicts'))
+    suggests = property(fget=lambda self: self.returnPrco('suggests'))
+    enhances = property(fget=lambda self: self.returnPrco('enhances'))
+    recommends = property(fget=lambda self: self.returnPrco('recommends'))
+    supplements = property(fget=lambda self: self.returnPrco('supplements'))
     provides_names = property(fget=lambda self: self.returnPrcoNames('provides'))
     requires_names = property(fget=lambda self: self.returnPrcoNames('requires'))
     conflicts_names = property(fget=lambda self: self.returnPrcoNames('conflicts'))
@@ -1122,6 +1130,10 @@ class YumAvailablePackage(PackageObject,
         msg += self._dump_requires()
         msg += self._dump_pco('conflicts')         
         msg += self._dump_pco('obsoletes')         
+        msg += self._dump_pco('suggests')
+        msg += self._dump_pco('enhances')
+        msg += self._dump_pco('recommends')
+        msg += self._dump_pco('supplements')
         msg += self._dump_files(True)
         if msg[-1] != '\n':
             msg += """\n"""
@@ -1358,13 +1370,35 @@ class YumHeaderPackage(YumAvailablePacka
     def _get_hdr(self):
         return self.hdr
 
+    def _populatePrcoFiltered(self, ds, prcotype, andmask, resmask):
+        name = [] 
+        flag = [] 
+        vers = [] 
+        for dsel in ds:
+           if ds.Flags() & andmask == resmask:
+               name.append(ds.N())
+               flag.append(ds.Flags())
+               vers.append(ds.EVR())
+        if name:
+            name = map(misc.share_data, name)
+            flag = map(rpmUtils.miscutils.flagToString, flag)
+            flag = map(misc.share_data, flag)
+            vers = map(rpmUtils.miscutils.stringToVersion, vers)
+            vers = map(lambda x: (misc.share_data(x[0]), misc.share_data(x[1]),
+                                  misc.share_data(x[2])), vers)
+            self.prco[prcotype] = map(misc.share_data, zip(name,flag,vers))
+
     def _populatePrco(self):
         "Populate the package object with the needed PRCO interface."
 
-        tag2prco = { "OBSOLETE": misc.share_data("obsoletes"),
-                     "CONFLICT": misc.share_data("conflicts"),
-                     "REQUIRE":  misc.share_data("requires"),
-                     "PROVIDE":  misc.share_data("provides") }
+        tag2prco = { "OBSOLETE":   misc.share_data("obsoletes"),
+                     "CONFLICT":   misc.share_data("conflicts"),
+                     "REQUIRE":    misc.share_data("requires"),
+                     "PROVIDE":    misc.share_data("provides"),
+                     "SUGGEST":    misc.share_data("suggests"),
+                     "ENHANCE":    misc.share_data("enhances"),
+                     "RECOMMEND":  misc.share_data("recommends"),
+                     "SUPPLEMENT": misc.share_data("supplements") }
         hdr = self._get_hdr()
         for tag in tag2prco:
             name = hdr[getattr(rpm, 'RPMTAG_%sNAME' % tag)]
@@ -1383,6 +1417,17 @@ class YumHeaderPackage(YumAvailablePacka
 
             prcotype = tag2prco[tag]
             self.prco[prcotype] = map(misc.share_data, zip(name,flag,vers))
+
+        if not self.prco["suggests"] and not self.prco["recommends"]:
+            ds = hdr.dsFromHeader(1156)
+            if ds:
+                self._populatePrcoFiltered(ds, misc.share_data("suggests"), 1 << 27, 0)
+                self._populatePrcoFiltered(ds, misc.share_data("recommends"), 1 << 27, 1 << 27)
+        if not self.prco["enhances"] and not self.prco["supplements"]:
+            ds = hdr.dsFromHeader(1159)
+            if ds:
+                self._populatePrcoFiltered(ds, misc.share_data("enhances"), 1 << 27, 0)
+                self._populatePrcoFiltered(ds, misc.share_data("supplements"), 1 << 27, 1 << 27)
     
     def tagByName(self, tag):
         warnings.warn("tagByName() will go away in a furture version of Yum.\n",
--- ./yum/sqlitesack.py.orig	2014-03-13 11:04:20.770615026 +0000
+++ ./yum/sqlitesack.py	2014-03-13 11:04:51.700614971 +0000
@@ -179,7 +179,11 @@ class YumAvailablePackageSqlite(YumAvail
         self.prco = { 'obsoletes': (),
                       'conflicts': (),
                       'requires': (),
-                      'provides': () }
+                      'provides': (),
+                      'suggests': (),
+                      'enhances': (),
+                      'recommends': (),
+                      'supplements': () }
         self.sack = repo.sack
         self.repoid = repo.id
         self.repo = repo

--ikeVEW9yuYc//A+q
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Rpm-metadata mailing list
[email protected]
http://lists.baseurl.org/mailman/listinfo/rpm-metadata

--ikeVEW9yuYc//A+q--