pacman+libalpm: handle search errors
Previously, pacman treated no matches and an error during search the same. To fix this, alpm_db_search now returns its status as an int and instead takes the to be returned list as a param. Allowing front ends to easily differentiate between errors and no matches. Signed-off-by: morganamilo <morganamilo@gmail.com> Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
parent
94982d0061
commit
27f354a787
6 changed files with 42 additions and 18 deletions
|
@ -997,9 +997,11 @@ alpm_list_t *alpm_db_get_groupcache(alpm_db_t *db);
|
||||||
/** Searches a database with regular expressions.
|
/** Searches a database with regular expressions.
|
||||||
* @param db pointer to the package database to search in
|
* @param db pointer to the package database to search in
|
||||||
* @param needles a list of regular expressions to search for
|
* @param needles a list of regular expressions to search for
|
||||||
* @return the list of packages matching all regular expressions on success, NULL on error
|
* @param ret the list of packages matching all regular expressions
|
||||||
|
* @return 0 on success, -1 on error (pm_errno is set accordingly)
|
||||||
*/
|
*/
|
||||||
alpm_list_t *alpm_db_search(alpm_db_t *db, const alpm_list_t *needles);
|
int alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
|
||||||
|
alpm_list_t **ret);
|
||||||
|
|
||||||
typedef enum _alpm_db_usage_t {
|
typedef enum _alpm_db_usage_t {
|
||||||
ALPM_DB_USAGE_SYNC = 1,
|
ALPM_DB_USAGE_SYNC = 1,
|
||||||
|
|
|
@ -298,12 +298,14 @@ alpm_list_t SYMEXPORT *alpm_db_get_groupcache(alpm_db_t *db)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Searches a database. */
|
/** Searches a database. */
|
||||||
alpm_list_t SYMEXPORT *alpm_db_search(alpm_db_t *db, const alpm_list_t *needles)
|
int SYMEXPORT alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
|
||||||
|
alpm_list_t **ret)
|
||||||
{
|
{
|
||||||
ASSERT(db != NULL, return NULL);
|
ASSERT(db != NULL && ret != NULL && *ret == NULL,
|
||||||
|
RET_ERR(db->handle, ALPM_ERR_WRONG_ARGS, -1));
|
||||||
db->handle->pm_errno = ALPM_ERR_OK;
|
db->handle->pm_errno = ALPM_ERR_OK;
|
||||||
|
|
||||||
return _alpm_db_search(db, needles);
|
return _alpm_db_search(db, needles, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets the usage bitmask for a repo */
|
/** Sets the usage bitmask for a repo */
|
||||||
|
@ -396,13 +398,13 @@ int _alpm_db_cmp(const void *d1, const void *d2)
|
||||||
return strcmp(db1->treename, db2->treename);
|
return strcmp(db1->treename, db2->treename);
|
||||||
}
|
}
|
||||||
|
|
||||||
alpm_list_t *_alpm_db_search(alpm_db_t *db, const alpm_list_t *needles)
|
int _alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
|
||||||
|
alpm_list_t **ret)
|
||||||
{
|
{
|
||||||
const alpm_list_t *i, *j, *k;
|
const alpm_list_t *i, *j, *k;
|
||||||
alpm_list_t *ret = NULL;
|
|
||||||
|
|
||||||
if(!(db->usage & ALPM_DB_USAGE_SEARCH)) {
|
if(!(db->usage & ALPM_DB_USAGE_SEARCH)) {
|
||||||
return NULL;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy the pkgcache- we will free the list var after each needle */
|
/* copy the pkgcache- we will free the list var after each needle */
|
||||||
|
@ -415,12 +417,12 @@ alpm_list_t *_alpm_db_search(alpm_db_t *db, const alpm_list_t *needles)
|
||||||
if(i->data == NULL) {
|
if(i->data == NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ret = NULL;
|
*ret = NULL;
|
||||||
targ = i->data;
|
targ = i->data;
|
||||||
_alpm_log(db->handle, ALPM_LOG_DEBUG, "searching for target '%s'\n", targ);
|
_alpm_log(db->handle, ALPM_LOG_DEBUG, "searching for target '%s'\n", targ);
|
||||||
|
|
||||||
if(regcomp(®, targ, REG_EXTENDED | REG_NOSUB | REG_ICASE | REG_NEWLINE) != 0) {
|
if(regcomp(®, targ, REG_EXTENDED | REG_NOSUB | REG_ICASE | REG_NEWLINE) != 0) {
|
||||||
RET_ERR(db->handle, ALPM_ERR_INVALID_REGEX, NULL);
|
RET_ERR(db->handle, ALPM_ERR_INVALID_REGEX, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(j = list; j; j = j->next) {
|
for(j = list; j; j = j->next) {
|
||||||
|
@ -463,18 +465,18 @@ alpm_list_t *_alpm_db_search(alpm_db_t *db, const alpm_list_t *needles)
|
||||||
_alpm_log(db->handle, ALPM_LOG_DEBUG,
|
_alpm_log(db->handle, ALPM_LOG_DEBUG,
|
||||||
"search target '%s' matched '%s' on package '%s'\n",
|
"search target '%s' matched '%s' on package '%s'\n",
|
||||||
targ, matched, name);
|
targ, matched, name);
|
||||||
ret = alpm_list_add(ret, pkg);
|
*ret = alpm_list_add(*ret, pkg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free the existing search list, and use the returned list for the
|
/* Free the existing search list, and use the returned list for the
|
||||||
* next needle. This allows for AND-based package searching. */
|
* next needle. This allows for AND-based package searching. */
|
||||||
alpm_list_free(list);
|
alpm_list_free(list);
|
||||||
list = ret;
|
list = *ret;
|
||||||
regfree(®);
|
regfree(®);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns a new package cache from db.
|
/* Returns a new package cache from db.
|
||||||
|
|
|
@ -87,7 +87,8 @@ alpm_db_t *_alpm_db_new(const char *treename, int is_local);
|
||||||
void _alpm_db_free(alpm_db_t *db);
|
void _alpm_db_free(alpm_db_t *db);
|
||||||
const char *_alpm_db_path(alpm_db_t *db);
|
const char *_alpm_db_path(alpm_db_t *db);
|
||||||
int _alpm_db_cmp(const void *d1, const void *d2);
|
int _alpm_db_cmp(const void *d1, const void *d2);
|
||||||
alpm_list_t *_alpm_db_search(alpm_db_t *db, const alpm_list_t *needles);
|
int _alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
|
||||||
|
alpm_list_t **ret);
|
||||||
alpm_db_t *_alpm_db_register_local(alpm_handle_t *handle);
|
alpm_db_t *_alpm_db_register_local(alpm_handle_t *handle);
|
||||||
alpm_db_t *_alpm_db_register_sync(alpm_handle_t *handle, const char *treename,
|
alpm_db_t *_alpm_db_register_sync(alpm_handle_t *handle, const char *treename,
|
||||||
int level);
|
int level);
|
||||||
|
|
|
@ -518,12 +518,13 @@ void print_groups(alpm_pkg_t *pkg)
|
||||||
* @param db the database we're searching
|
* @param db the database we're searching
|
||||||
* @param targets the targets we're searching for
|
* @param targets the targets we're searching for
|
||||||
* @param show_status show if the package is also in the local db
|
* @param show_status show if the package is also in the local db
|
||||||
|
* @return -1 on error, 0 if there were matches, 1 if there were not
|
||||||
*/
|
*/
|
||||||
int dump_pkg_search(alpm_db_t *db, alpm_list_t *targets, int show_status)
|
int dump_pkg_search(alpm_db_t *db, alpm_list_t *targets, int show_status)
|
||||||
{
|
{
|
||||||
int freelist = 0;
|
int freelist = 0;
|
||||||
alpm_db_t *db_local;
|
alpm_db_t *db_local;
|
||||||
alpm_list_t *i, *searchlist;
|
alpm_list_t *i, *searchlist = NULL;
|
||||||
unsigned short cols;
|
unsigned short cols;
|
||||||
const colstr_t *colstr = &config->colstr;
|
const colstr_t *colstr = &config->colstr;
|
||||||
|
|
||||||
|
@ -533,7 +534,9 @@ int dump_pkg_search(alpm_db_t *db, alpm_list_t *targets, int show_status)
|
||||||
|
|
||||||
/* if we have a targets list, search for packages matching it */
|
/* if we have a targets list, search for packages matching it */
|
||||||
if(targets) {
|
if(targets) {
|
||||||
searchlist = alpm_db_search(db, targets);
|
if(alpm_db_search(db, targets, &searchlist) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
freelist = 1;
|
freelist = 1;
|
||||||
} else {
|
} else {
|
||||||
searchlist = alpm_db_get_pkgcache(db);
|
searchlist = alpm_db_get_pkgcache(db);
|
||||||
|
|
|
@ -233,7 +233,15 @@ targcleanup:
|
||||||
static int query_search(alpm_list_t *targets)
|
static int query_search(alpm_list_t *targets)
|
||||||
{
|
{
|
||||||
alpm_db_t *db_local = alpm_get_localdb(config->handle);
|
alpm_db_t *db_local = alpm_get_localdb(config->handle);
|
||||||
return dump_pkg_search(db_local, targets, 0);
|
int ret = dump_pkg_search(db_local, targets, 0);
|
||||||
|
if(ret == -1) {
|
||||||
|
alpm_errno_t err = alpm_errno(config->handle);
|
||||||
|
pm_printf(ALPM_LOG_ERROR, "search failed: %s\n", alpm_strerror(err));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned short pkg_get_locality(alpm_pkg_t *pkg)
|
static unsigned short pkg_get_locality(alpm_pkg_t *pkg)
|
||||||
|
|
|
@ -311,7 +311,15 @@ static int sync_search(alpm_list_t *syncs, alpm_list_t *targets)
|
||||||
|
|
||||||
for(i = syncs; i; i = alpm_list_next(i)) {
|
for(i = syncs; i; i = alpm_list_next(i)) {
|
||||||
alpm_db_t *db = i->data;
|
alpm_db_t *db = i->data;
|
||||||
found += !dump_pkg_search(db, targets, 1);
|
int ret = dump_pkg_search(db, targets, 1);
|
||||||
|
|
||||||
|
if(ret == -1) {
|
||||||
|
alpm_errno_t err = alpm_errno(config->handle);
|
||||||
|
pm_printf(ALPM_LOG_ERROR, "search failed: %s\n", alpm_strerror(err));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
found += !ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (found == 0);
|
return (found == 0);
|
||||||
|
|
Loading…
Add table
Reference in a new issue