On 4/25/07, Gijs Hollestelle <[EMAIL PROTECTED]> wrote:
On 4/25/07, Jeremy Katz <[EMAIL PROTECTED]> wrote:
> Okay, simpler case is cpio.
>
> What's happening is that I have multiple kernels installed.  We
> overwrite the kernel provs in goneprovs and thus only check with one of
> their provides, not both.  Which then leads to results which leave out
> the fact that libraw1394 depends on the newer of the two kernels I have
> installed.
Good catch!

I've updated the patch. Now instead of constructing goneprovs and
gonefiles as dicts with goneprovs[name] = prov
I do goneprovs[prov] = 1 and when we need the name we get it as
prov[0] this avoids the issue you mentioned and probably saves a few
bytes of memory as well ;-)
Looks like I jumped the gun there.. there was a reason the hash was
built up as it was..

I did it the right way now, goneprovs[name] is now a list of provs. So
in the kernel case goneprovs[kernel] will be ['prov1','prov2'].

Attached is an updated patch

Greets,
 Gijs
Index: depsolve.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/depsolve.py,v
retrieving revision 1.163
diff -u -r1.163 depsolve.py
--- depsolve.py	24 Apr 2007 21:02:50 -0000	1.163
+++ depsolve.py	25 Apr 2007 18:07:33 -0000
@@ -758,6 +758,8 @@
         # ((name, version, release), (needname, needversion), flags, suggest, sense)
 
 
+        goneprovs = {}
+        gonefiles = {}
         ret = []
         for txmbr in self.tsInfo.getMembers():
             
@@ -772,9 +774,10 @@
             if txmbr.output_state in TS_INSTALL_STATES:
                 ret.extend(self._checkInstall(txmbr))
             elif txmbr.output_state in TS_REMOVE_STATES:
-                ret.extend(self._checkRemove(txmbr))
+                self._updateRemove(txmbr,goneprovs,gonefiles)
             self.dcobj.already_seen[txmbr] = 1
             
+        ret.extend(self._checkRemove(goneprovs,gonefiles))
         return ret
 
     def resolveDeps(self):
@@ -985,7 +988,7 @@
                     
         return ret
 
-    def _checkRemove(self, txmbr):
+    def _updateRemove(self, txmbr, goneprovs, gonefiles):
         po = txmbr.po
         provs = po.returnPrco('provides')
 
@@ -1003,11 +1006,7 @@
             for f in newpo.filelist:
                 newpoprovs[(f, None, (None, None, None))] = 1
 
-        ret = []
         self._removing = []
-        goneprovs = {}
-        gonefiles = {}
-        removes = {}
         
         # iterate over the provides of the package being removed
         # and see what's actually going away
@@ -1018,35 +1017,44 @@
                 continue
             if newpoprovs.has_key(prov):
                 continue
-            if not prov[0][0] == "/":
-                goneprovs[prov[0]] = prov
+            name = prov[0]
+            if not name[0] == "/":
+                where = goneprovs
             else:
-                gonefiles[prov[0]] = prov
+                where = gonefiles
+            if not where.has_key(name):
+                where[name] = []
+            where[name].append(prov)
 
+    def _checkRemove(self, goneprovs, gonefiles):
+        removes = {}
+        ret = []
         # now see what from the rpmdb really requires these
-        for (provname, prov) in goneprovs.items() + gonefiles.items():
+        for (provname, provs) in goneprovs.items() + gonefiles.items():
             instrequirers = []
             for pkgtup in self.rpmdb.whatRequires(provname, None, None):
                 instpo = self.getInstalledPackageObject(pkgtup)
                 instrequirers.append(instpo)
             
-            self.verbose_logger.log(logginglevels.DEBUG_4, "looking to see what requires %s of %s", prov, po)
-            removes[prov] = self._requiredByPkg(prov, instrequirers)
+            for prov in provs:
+                removes[prov] = self._requiredByPkg(prov, instrequirers)
 
         # now, let's see if anything that we're installing requires anything
         # that this provides
         for txmbr in self.tsInfo.getMembersWithState(None, TS_INSTALL_STATES):
             for r in txmbr.po.requires_names:
-                prov = None
-                if r in goneprovs.keys():
-                    prov = goneprovs[r]
+                if r in goneprovs:
+                    provs = goneprovs[r]
                 elif r[0] == "/" and r in gonefiles:
-                    prov = gonefiles[r]
+                    provs = gonefiles[r]
+                else:
+                    continue
 
-                if prov and not removes.has_key(prov):
-                    removes[prov] = self._requiredByPkg(prov, [txmbr.po])
-                elif prov:
-                    removes[prov].extend(self._requiredByPkg(prov, [txmbr.po]))                        
+                for prov in provs:
+                    if prov and not removes.has_key(prov):
+                        removes[prov] = self._requiredByPkg(prov, [txmbr.po])
+                    elif prov:
+                        removes[prov].extend(self._requiredByPkg(prov, [txmbr.po]))                        
 
         # now we know what needs to be removed and the provide causing it
         # to be removed.  let's stick them in the ret list
_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel

Reply via email to