[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.
Thoughts?
Cheers,
Michael.
--
Michael Schroeder mls at suse.de
SUSE LINUX Products GmbH, GF Markus Rex, HRB 16746 AG Nuernberg
main(_){while(_=~getchar())putchar(~_-1/(~(_|32)/13*2-11)*13);}
More information about the Rpm-maint
mailing list