diff options
author | Dan McGee <dan@archlinux.org> | 2011-07-06 20:37:18 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2011-07-14 22:59:57 +0200 |
commit | 8f72ffbc4521008897fff0819cae4c80f8405391 (patch) | |
tree | 0e9f73c51695acce2ac477f927d0f890ba1f9c18 | |
parent | 0fe93bc34c4f463fbaeaa8be7a00e10bc0bc8b4d (diff) | |
download | pacman-8f72ffbc4521008897fff0819cae4c80f8405391.tar.gz pacman-8f72ffbc4521008897fff0819cae4c80f8405391.tar.xz |
Make alpm_db_set_pkgreason() arguments more sane
This can only ever operate on the local database, and a local package at
that. Change the function signature to take a handle and package object,
add the relevant asserts, and ensure the frontend can detect the package
not found condition when finding packages to pass to this method.
Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r-- | lib/libalpm/alpm.h | 7 | ||||
-rw-r--r-- | lib/libalpm/db.c | 34 | ||||
-rw-r--r-- | src/pacman/database.c | 3 |
3 files changed, 25 insertions, 19 deletions
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index c7cab043..6e1e4bc4 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -476,12 +476,13 @@ alpm_list_t *alpm_db_get_groupcache(alpm_db_t *db); alpm_list_t *alpm_db_search(alpm_db_t *db, const alpm_list_t* needles); /** Set install reason for a package in db. - * @param db pointer to the package database - * @param name the name of the package + * @param handle the context handle + * @param pkg the package to update * @param reason the new install reason * @return 0 on success, -1 on error (pm_errno is set accordingly) */ -int alpm_db_set_pkgreason(alpm_db_t *db, const char *name, alpm_pkgreason_t reason); +int alpm_db_set_pkgreason(alpm_handle_t *handle, alpm_pkg_t *pkg, + alpm_pkgreason_t reason); /** @} */ diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index af27047f..0c2b26aa 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -241,12 +241,17 @@ int SYMEXPORT alpm_db_get_valid(alpm_db_t *db) /** Get a package entry from a package database. */ alpm_pkg_t SYMEXPORT *alpm_db_get_pkg(alpm_db_t *db, const char *name) { + alpm_pkg_t *pkg; ASSERT(db != NULL, return NULL); db->handle->pm_errno = 0; ASSERT(name != NULL && strlen(name) != 0, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, NULL)); - return _alpm_db_get_pkgfromcache(db, name); + pkg = _alpm_db_get_pkgfromcache(db, name); + if(!pkg) { + RET_ERR(db->handle, ALPM_ERR_PKG_NOT_FOUND, NULL); + } + return pkg; } /** Get the package cache of a package database. */ @@ -287,19 +292,18 @@ alpm_list_t SYMEXPORT *alpm_db_search(alpm_db_t *db, const alpm_list_t* needles) } /** Set install reason for a package in db. */ -int SYMEXPORT alpm_db_set_pkgreason(alpm_db_t *db, const char *name, alpm_pkgreason_t reason) +int SYMEXPORT alpm_db_set_pkgreason(alpm_handle_t *handle, alpm_pkg_t *pkg, + alpm_pkgreason_t reason) { - ASSERT(db != NULL, return -1); - db->handle->pm_errno = 0; - /* TODO assert db == db_local ? shouldn't need a db param at all here... */ - ASSERT(name != NULL, RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1)); - - alpm_pkg_t *pkg = _alpm_db_get_pkgfromcache(db, name); - if(pkg == NULL) { - RET_ERR(db->handle, ALPM_ERR_PKG_NOT_FOUND, -1); - } - - _alpm_log(db->handle, ALPM_LOG_DEBUG, "setting install reason %u for %s/%s\n", reason, db->treename, name); + CHECK_HANDLE(handle, return -1); + ASSERT(pkg != NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1)); + ASSERT(pkg->origin == PKG_FROM_LOCALDB, + RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1)); + ASSERT(pkg->origin_data.db == handle->db_local, + RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1)); + + _alpm_log(handle, ALPM_LOG_DEBUG, + "setting install reason %u for %s\n", reason, pkg->name); if(alpm_pkg_get_reason(pkg) == reason) { /* we are done */ return 0; @@ -307,8 +311,8 @@ int SYMEXPORT alpm_db_set_pkgreason(alpm_db_t *db, const char *name, alpm_pkgrea /* set reason (in pkgcache) */ pkg->reason = reason; /* write DESC */ - if(_alpm_local_db_write(db, pkg, INFRQ_DESC)) { - RET_ERR(db->handle, ALPM_ERR_DB_WRITE, -1); + if(_alpm_local_db_write(handle->db_local, pkg, INFRQ_DESC)) { + RET_ERR(handle, ALPM_ERR_DB_WRITE, -1); } return 0; diff --git a/src/pacman/database.c b/src/pacman/database.c index 41efdd3d..3e4a672f 100644 --- a/src/pacman/database.c +++ b/src/pacman/database.c @@ -66,7 +66,8 @@ int pacman_database(alpm_list_t *targets) db_local = alpm_option_get_localdb(config->handle); for(i = targets; i; i = alpm_list_next(i)) { char *pkgname = i->data; - if(alpm_db_set_pkgreason(db_local, pkgname, reason) == -1) { + alpm_pkg_t *pkg = alpm_db_get_pkg(db_local, pkgname); + if(!pkg || alpm_db_set_pkgreason(config->handle, pkg, reason)) { pm_printf(ALPM_LOG_ERROR, _("could not set install reason for package %s (%s)\n"), pkgname, alpm_strerror(alpm_errno(config->handle))); retval = 1; |