diff options
author | Dan McGee <dan@archlinux.org> | 2011-07-05 21:18:16 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2011-07-06 04:38:32 +0200 |
commit | 043931ca452f6b231eb5b9b0863329843677bd2a (patch) | |
tree | be7dc14140b098e90174dd7457f39bf57f1a809b | |
parent | e2f00abe26c530a380ef687e50d91e07c6ba57c4 (diff) | |
download | pacman-043931ca452f6b231eb5b9b0863329843677bd2a.tar.gz pacman-043931ca452f6b231eb5b9b0863329843677bd2a.tar.xz |
Rework -Si display logic
We did some funny stuff here before to allow specifying fully-qualified
package names, such as 'testing/gcc' or 'core/gcc'. However, it was done
by duplicating code, not to mention an early escape if a repository
could not be found for an early target. Something like `pacman -Si
foo/bar core/gcc' would not give expected results, although `pacman -Si
bar gcc' would.
Clean up the code, remove strncpy() usage, and clarify the error
messages a bit.
Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r-- | src/pacman/sync.c | 78 |
1 files changed, 29 insertions, 49 deletions
diff --git a/src/pacman/sync.c b/src/pacman/sync.c index 26c9ccca..5e1643e4 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -443,32 +443,27 @@ static int sync_info(alpm_list_t *syncs, alpm_list_t *targets) if(targets) { for(i = targets; i; i = alpm_list_next(i)) { - int foundpkg = 0; + const char *target = alpm_list_getdata(i); + char *name = strdup(target); + char *repo, *pkgstr; + int foundpkg = 0, founddb = 0; - char target[512]; /* TODO is this enough space? */ - char *repo = NULL, *pkgstr = NULL; - - strncpy(target, i->data, 512); - pkgstr = strchr(target, '/'); + pkgstr = strchr(name, '/'); if(pkgstr) { - alpm_db_t *db = NULL; - repo = target; + repo = name; *pkgstr = '\0'; ++pkgstr; + } else { + repo = NULL; + pkgstr = name; + } - for(j = syncs; j; j = alpm_list_next(j)) { - db = alpm_list_getdata(j); - if(strcmp(repo, alpm_db_get_name(db)) == 0) { - break; - } - db = NULL; - } - - if(!db) { - pm_fprintf(stderr, ALPM_LOG_ERROR, - _("repository '%s' does not exist\n"), repo); - return 1; + for(j = syncs; j; j = alpm_list_next(j)) { + alpm_db_t *db = alpm_list_getdata(j); + if(repo && strcmp(repo, alpm_db_get_name(db)) != 0) { + continue; } + founddb = 1; for(k = alpm_db_get_pkgcache(db); k; k = alpm_list_next(k)) { alpm_pkg_t *pkg = alpm_list_getdata(k); @@ -479,34 +474,19 @@ static int sync_info(alpm_list_t *syncs, alpm_list_t *targets) break; } } + } - if(!foundpkg) { - pm_fprintf(stderr, ALPM_LOG_ERROR, - _("package '%s' was not found in repository '%s'\n"), pkgstr, repo); - ret++; - } - } else { - pkgstr = target; - - for(j = syncs; j; j = alpm_list_next(j)) { - alpm_db_t *db = alpm_list_getdata(j); - - for(k = alpm_db_get_pkgcache(db); k; k = alpm_list_next(k)) { - alpm_pkg_t *pkg = alpm_list_getdata(k); - - if(strcmp(alpm_pkg_get_name(pkg), pkgstr) == 0) { - dump_pkg_full(pkg, PKG_FROM_SYNCDB, config->op_s_info > 1); - foundpkg = 1; - break; - } - } - } - if(!foundpkg) { - pm_fprintf(stderr, ALPM_LOG_ERROR, - _("package '%s' was not found\n"), pkgstr); - ret++; - } + if(!founddb) { + pm_fprintf(stderr, ALPM_LOG_ERROR, + _("repository '%s' does not exist\n"), repo); + ret++; + } + if(!foundpkg) { + pm_fprintf(stderr, ALPM_LOG_ERROR, + _("package '%s' was not found\n"), target); + ret++; } + free(name); } } else { for(i = syncs; i; i = alpm_list_next(i)) { @@ -630,7 +610,7 @@ static int process_pkg(alpm_pkg_t *pkg) return 0; } -static int process_group(alpm_list_t *dbs, char *group) +static int process_group(alpm_list_t *dbs, const char *group) { int ret = 0; alpm_list_t *i; @@ -676,7 +656,7 @@ cleanup: return ret; } -static int process_targname(alpm_list_t *dblist, char *targname) +static int process_targname(alpm_list_t *dblist, const char *targname) { alpm_pkg_t *pkg = alpm_find_dbs_satisfier(config->handle, dblist, targname); @@ -695,7 +675,7 @@ static int process_targname(alpm_list_t *dblist, char *targname) return process_group(dblist, targname); } -static int process_target(char *target) +static int process_target(const char *target) { /* process targets */ char *targstring = strdup(target); |