[Rpm-maint] Conflicts on files not symmetric

Michael Schroeder mls at suse.de
Fri Sep 19 09:07:04 UTC 2008

Hi rpm-4 and rpm-5,

while implementing virtual triggers I stumbled over the fact
that conflicts on files only work in one direction. Example:

Package A contains /foo
Package B has "Conflicts: /foo"

If A is already installed and one tries to install B, a dependency
conflict is reported:
    error: Failed dependencies:
	    /foo conflicts with B-1-1.i586

If B is already installed and one tries to install A, no error
is displayed and the package is installed.

So, is this a known bug? Is it worth fixing?

If this needs fixing, here's an idea: As it probably costs too
much time to test each file in the file list for conflicts, how
about creating a index of the conflicts first and only test
the files that match the index?

I.e. add a function

char *rpmdbKeyIterator(rpmdbMatchIterator mi) {
    int rc, xx;
    dbiIndex dbi; 

    dbi = dbiOpen(mi->mi_db, mi->mi_rpmtag, 0);
    if (mi->mi_dbc == NULL)
        xx = dbiCopen(dbi, dbi->dbi_txnid, &mi->mi_dbc, mi->mi_cflags);
    rc = dbiGet(dbi, mi->mi_dbc, &mi->mi_key, &mi->mi_data, DB_NEXT);
    if (rc) 
        return 0;
    if (mi->mi_keyp)
        free((char *)mi->mi_keyp);
    mi->mi_keyp = (void *)xmalloc(mi->mi_key.size + 1);
    memcpy((char *)mi->mi_keyp, mi->mi_key.data, mi->mi_key.size);
    ((char *)mi->mi_keyp)[mi->mi_key.size] = 0; 
    mi->mi_keylen = mi->mi_key.size;
    return (char *)mi->mi_keyp;

to rpmdb.c, then use

    mi = rpmtsInitIterator(ts, RPMTAG_CONFLICTNAME, 0, 0);
    while ((key = rpmdbKeyIterator(mi)) != 0)

to create an array of basenames, sort it and then go through the
filelist and match only if bsearch for the basename returns true.



Michael Schroeder                                   mls at suse.de
SUSE LINUX Products GmbH, GF Markus Rex, HRB 16746 AG Nuernberg

More information about the Rpm-maint mailing list