[pacman-dev] Pacman doesn't handle properly the multiple satisfiers, localdb corruption

Xavier shiningxc at gmail.com
Mon Jul 16 11:32:13 EDT 2007


On Mon, Jul 16, 2007 at 05:13:25PM +0200, ngaba at petra.hos.u-szeged.hu wrote:
> > Oh yes, please, clean that update_depends function, trying to read it almost
> > killed me. (so go with case 1 I guess).
> OK, but one more question:
> tranc.c:461:
> if(trans->packages && trans->type == PM_TRANS_TYPE_REMOVE) {
>       if(_alpm_pkg_find(dep->name, handle->trans->packages)) {
>               continue;
>       }
> }
> Should I keep this or remove?
> I prefer remove, but I'm not sure.
> Pro (for keeping): this reduces the slow disk write in many cases 
> (usually there is dependency between the removed packages)
> Contra: this breaks libalpm hierarchy, it assumes that the 
> remove_commit will be successful; if not, or user break or... then the 
> database can become corrupted (however, extra requiredby is not a big 
> trouble, as you said), so this is a bit unsafe.

Yes indeed, it might be safer to remove.
Besides, there was a comment that was removed at some point (not sure when),
but it was there at the point where that update_depends function was
created.
This function was actually refactored from several places, so that's a good
thing, but in the same time, a part of it was duplicated, I fail to see why.

http://projects.archlinux.org/git/?p=pacman.git;a=commitdiff;h=92ad5565128d4e6546437b2f28e90cced7c11e03#patch5

the comment I'm referring to :

+               /* XXX: this is a hack...if this dependency is in the transaction targets
+                * of a remove transaction no need to update its requiredby info:
+                * it is in the process of being removed (if not already done!) */
+               /* TODO I wonder if we can just skip this, the few extra operations won't be
+                * a huge deal either way */
+               if(handle->trans && handle->trans->packages
+                        && handle->trans->type == PM_TRANS_TYPE_REMOVE) {
+                       if(_alpm_pkg_isin(dep.name, handle->trans->packages)) {
+                               continue;
+                       }
+               }

and duplicated part is everything after this :
/* Ensure package has the right newpkg */

which became this in the current code:
/* this is cheating... we call this function to populate the package */




More information about the pacman-dev mailing list