[pacman-dev] Broken database with wrong requiredby fields
Dan McGee
dpmcgee at gmail.com
Mon Jul 16 09:11:09 EDT 2007
On 7/16/07, Xavier <shiningxc at gmail.com> wrote:
> On Sat, Jul 14, 2007 at 04:16:46PM -0400, Dan McGee wrote:
> > Hello,
> >
> > This is an automated email from the git hooks/update script, it was
> > generated because a ref change was pushed to the repository.
> >
> > Updating branch, master,
> > via f0ea21cffca62c566c5e4d2c540c70fb891b9f4c (commit)
> > via ce1fb07436279b2ac70bdad91cf81db550292322 (commit)
> > via edcefb1d58115d4b5ae65e258f7eb53f33d21172 (commit)
> > via b5ab4bffb785aa92c89ff2fee1c0c9a980367cd0 (commit)
> > via 9f9086573a74311913f0d86f5d1e826f2996b35a (commit)
> > from 1c9f30b9fab998e2d89dd307a90122618d746cb6 (commit)
> >
> > - Log -----------------------------------------------------------------
> > commit f0ea21cffca62c566c5e4d2c540c70fb891b9f4c
> > Author: Dan McGee <dan at archlinux.org>
> > Date: Sat Jul 14 09:34:39 2007 -0400
> >
> > Ensure requiredby entries are removed during an upgrade
> >
> > This fixes the failure of the requiredby004 pactest in a not so pretty way,
> > but it gets the job done. I purposely used the extremely long name of
> > PM_TRANS_TYPE_REMOVEUPGRADE to be both clear and in the hope that someone
> > else will figure out a better solution.
> >
> > Original idea from Nagy Gabor, patch updated and cleaned for current code.
> >
> > Signed-off-by: Dan McGee <dan at archlinux.org>
> >
>
>
> I'm wondering if all the wrong requiredby entries caused by this bug is a
> problem or not.
> Anyway, I was curious about how broken my current database was, so I made a very
> hackish change to pacman to check it.
> It isn't meant for inclusion, it's just for showing that it's done very
> easily, and so you can run it on your own database to see how it is.
>
> If it's useful, we might then discuss about how it could be properly
> implemented (probably just another query option, but which one and also
> in which file should that little check function go ?).
>
> First the result here :
> src/pacman/pacman -Q | grep wrong
> wrong requiredby field ffmpeg for package amrnb
> wrong requiredby field libldap for package db
> wrong requiredby field skype for package dbus
> wrong requiredby field libglade for package docbook-xml
> wrong requiredby field gcc-gcj for package libart-lgpl
> wrong requiredby field gtk2 for package libjpeg
> wrong requiredby field pidgin for package libnetworkmanager
> wrong requiredby field audacious-plugins for package libsamplerate
> wrong requiredby field centericq for package libstdc++5
> wrong requiredby field screen for package pam
> wrong requiredby field sshfs for package pkgconfig
> wrong requiredby field pycairo for package python-numeric
> wrong requiredby field skype for package qt
> wrong requiredby field openoffice-base for package ttf-bitstream-vera
> wrong requiredby field kazehakase for package xulrunner
>
> I checked several of these, in each case it's dependencies that were dropped during an upgrade.
>
>
> diff --git a/src/pacman/deptest.c b/src/pacman/deptest.c
> index 0f149b2..7dde740 100644
> --- a/src/pacman/deptest.c
> +++ b/src/pacman/deptest.c
> @@ -83,4 +83,26 @@ int pacman_deptest(alpm_list_t *targets)
> return(retval);
> }
>
> +
> +int pacman_check(pmpkg_t *pkg)
> +{
> + int retval = 0;
> + alpm_list_t *reqs, *deps;
> +
> + for(reqs = alpm_pkg_get_requiredby(pkg); reqs; reqs = reqs->next) {
> + int found = 0;
> + char *reqname = reqs->data;
> + pmpkg_t *reqpkg = alpm_db_get_pkg(alpm_option_get_localdb(), reqname);
> + for(deps = alpm_pkg_get_depends(reqpkg); deps && !found; deps = deps->next) {
> + pmdepend_t *dep = alpm_splitdep(deps->data);
> + found = alpm_depcmp(pkg, dep);
> + }
> + if(!found) {
> + printf("wrong requiredby field %s for package %s\n", reqname, alpm_pkg_get_name(pkg));
> + retval++;
> + }
> + }
> + return(retval);
> +}
> +
> /* vim: set ts=2 sw=2 noet: */
> diff --git a/src/pacman/query.c b/src/pacman/query.c
> index f6c6b5d..87b2a82 100644
> --- a/src/pacman/query.c
> +++ b/src/pacman/query.c
> @@ -390,6 +390,8 @@ int pacman_query(alpm_list_t *targets)
> const char *pkgname = alpm_pkg_get_name(pkg);
> const char *pkgver = alpm_pkg_get_version(pkg);
>
> + pacman_check(pkg);
> +
> if(config->op_q_info) {
> dump_pkg_full(pkg, config->op_q_info);
> }
> @@ -433,6 +435,8 @@ int pacman_query(alpm_list_t *targets)
> continue;
> }
>
> + pacman_check(pkg);
> +
> /* find a target */
> if(config->op_q_info) {
> dump_pkg_full(pkg, config->op_q_info);
You could add it to the DB test function, probably in the backend part
of it. I think this is a valid thing to check.
-Dan
More information about the pacman-dev
mailing list