diff options
author | Dan McGee <dan@archlinux.org> | 2007-03-12 04:47:58 +0000 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2007-03-12 04:47:58 +0000 |
commit | 0203fabe544ab54adf4ac9a91904e3b5ba114a8d (patch) | |
tree | 98faeb63a02c26242f084f585258e58c1caa8dc2 /lib/libalpm/trans.c | |
parent | ba1806f5aca616390355a4258f7edb43ab8b0b66 (diff) | |
download | pacman-0203fabe544ab54adf4ac9a91904e3b5ba114a8d.tar.xz |
* Fix an issue where the same dependency was recorded multiple times in the
'required by' field.
Diffstat (limited to 'lib/libalpm/trans.c')
-rw-r--r-- | lib/libalpm/trans.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index 3c58d8c8..1198292f 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -254,6 +254,7 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg) { alpm_list_t *i, *j; alpm_list_t *depends = NULL; + const char *pkgname; pmdb_t *localdb; ALPM_LOG_FUNC; @@ -262,10 +263,12 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg) ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1)); ASSERT(pkg != NULL, RET_ERR(PM_ERR_PKG_INVALID, -1)); + pkgname = alpm_pkg_get_name(pkg); depends = alpm_pkg_get_depends(pkg); + if(depends) { _alpm_log(PM_LOG_DEBUG, _("updating dependency packages 'requiredby' fields for %s-%s"), - pkg->name, pkg->version); + pkgname, pkg->version); } else { _alpm_log(PM_LOG_DEBUG, _("package has no dependencies, no other packages to update")); } @@ -302,16 +305,20 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg) found_provides = 1; /* this is cheating... we call this function to populate the package */ - alpm_pkg_get_requiredby(deppkg); + alpm_list_t *rqdby = alpm_pkg_get_requiredby(deppkg); - _alpm_log(PM_LOG_DEBUG, _("updating 'requiredby' field for package '%s'"), alpm_pkg_get_name(deppkg)); + _alpm_log(PM_LOG_DEBUG, _("updating 'requiredby' field for package '%s'"), + alpm_pkg_get_name(deppkg)); if(trans->type == PM_TRANS_TYPE_REMOVE) { void *data = NULL; - deppkg->requiredby = alpm_list_remove(deppkg->requiredby, - alpm_pkg_get_name(pkg), _alpm_str_cmp, &data); + rqdby = alpm_list_remove(rqdby, pkgname, _alpm_str_cmp, &data); FREE(data); + deppkg->requiredby = rqdby; } else { - deppkg->requiredby = alpm_list_add(deppkg->requiredby, strdup(alpm_pkg_get_name(pkg))); + if(!alpm_list_find_str(rqdby, pkgname)) { + rqdby = alpm_list_add(rqdby, strdup(pkgname)); + deppkg->requiredby = rqdby; + } } if(_alpm_db_write(localdb, deppkg, INFRQ_DEPENDS)) { @@ -328,16 +335,20 @@ int _alpm_trans_update_depends(pmtrans_t *trans, pmpkg_t *pkg) } /* this is cheating... we call this function to populate the package */ - alpm_pkg_get_requiredby(deppkg); + alpm_list_t *rqdby = alpm_pkg_get_requiredby(deppkg); - _alpm_log(PM_LOG_DEBUG, _("updating 'requiredby' field for package '%s'"), deppkg->name); + _alpm_log(PM_LOG_DEBUG, _("updating 'requiredby' field for package '%s'"), + alpm_pkg_get_name(deppkg)); if(trans->type == PM_TRANS_TYPE_REMOVE) { void *data = NULL; - deppkg->requiredby = alpm_list_remove(deppkg->requiredby, - alpm_pkg_get_name(pkg), _alpm_str_cmp, &data); + rqdby = alpm_list_remove(rqdby, pkgname, _alpm_str_cmp, &data); FREE(data); + deppkg->requiredby = rqdby; } else { - deppkg->requiredby = alpm_list_add(deppkg->requiredby, strdup(alpm_pkg_get_name(pkg))); + if(!alpm_list_find_str(rqdby, pkgname)) { + rqdby = alpm_list_add(rqdby, strdup(pkgname)); + deppkg->requiredby = rqdby; + } } if(_alpm_db_write(localdb, deppkg, INFRQ_DEPENDS)) { |