diff options
author | Chantry Xavier <shiningxc@gmail.com> | 2007-06-02 18:34:01 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2007-06-02 18:44:43 +0200 |
commit | fe2c58fc9211dfc1d50c145397b947325abd1bdc (patch) | |
tree | ebe0802c11be98bd38a88abbdadf3a8f6d359f04 | |
parent | fb10e0c797b649dc036bc0432dc77cffaabbc56d (diff) | |
download | pacman-fe2c58fc9211dfc1d50c145397b947325abd1bdc.tar.gz pacman-fe2c58fc9211dfc1d50c145397b947325abd1bdc.tar.xz |
Move parts of pacman_query into subfunctions (query_search, query_group, query_isfile)
Clean up pacman_query so functionality is actually in functions, similar to how
sync.c is organized. After doing this, it is easy to see similarity in the code
between sync.c and query.c, so we should be able to consolidate some of this.
Signed-off-by: Chantry Xavier <shiningxc@gmail.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r-- | src/pacman/query.c | 414 | ||||
-rw-r--r-- | src/pacman/sync.c | 27 |
2 files changed, 248 insertions, 193 deletions
diff --git a/src/pacman/query.c b/src/pacman/query.c index fde093a4..7df16b17 100644 --- a/src/pacman/query.c +++ b/src/pacman/query.c @@ -1,8 +1,8 @@ /* * query.c - * - * Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org> - * + * + * Copyright (c) 2002-2007 by Judd Vinet <jvinet@zeroflux.org> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ @@ -59,101 +59,202 @@ static char *resolve_path(const char* file) } -static void query_fileowner(pmdb_t *db, char *filename) +static int query_fileowner(alpm_list_t *targets) { - struct stat buf; - int found = 0; - char *rpath; - alpm_list_t *i, *j; + int ret = 0; + alpm_list_t *t; - if(db == NULL) { - return; - } - if(filename == NULL || strlen(filename) == 0) { + if(targets == NULL) { fprintf(stderr, _("error: no file was specified for --owns\n")); - return; + return(1); } - if(stat(filename, &buf) == -1) { - fprintf(stderr, _("error: failed to read file '%s': %s\n"), - filename, strerror(errno)); - return; - } - - if(S_ISDIR(buf.st_mode)) { - fprintf(stderr, _("error: cannot determine ownership of a directory\n")); - return; - } + for(t = targets; t; t = alpm_list_next(t)) { + int found = 0; + char *filename = alpm_list_getdata(t); + char *rpath; + struct stat buf; + alpm_list_t *i, *j; + + if(stat(filename, &buf) == -1) { + fprintf(stderr, _("error: failed to read file '%s': %s\n"), + filename, strerror(errno)); + ret++; + continue; + } - if(!(rpath = resolve_path(filename))) { - fprintf(stderr, _("error: cannot determine real path for '%s': %s\n"), - filename, strerror(errno)); - return; - } + if(S_ISDIR(buf.st_mode)) { + fprintf(stderr, _("error: cannot determine ownership of a directory\n")); + ret++; + continue; + } - for(i = alpm_db_getpkgcache(db); i && !found; i = alpm_list_next(i)) { - pmpkg_t *info = alpm_list_getdata(i); + if(!(rpath = resolve_path(filename))) { + fprintf(stderr, _("error: cannot determine real path for '%s': %s\n"), + filename, strerror(errno)); + ret++; + continue; + } - for(j = alpm_pkg_get_files(info); j && !found; j = alpm_list_next(j)) { - char path[PATH_MAX], *ppath; - snprintf(path, PATH_MAX, "%s%s", alpm_option_get_root(), (const char *)alpm_list_getdata(j)); + for(i = alpm_db_getpkgcache(db_local); i && !found; i = alpm_list_next(i)) { + pmpkg_t *info = alpm_list_getdata(i); - ppath = resolve_path(path); + for(j = alpm_pkg_get_files(info); j && !found; j = alpm_list_next(j)) { + char path[PATH_MAX], *ppath; + snprintf(path, PATH_MAX, "%s%s", + alpm_option_get_root(), (const char *)alpm_list_getdata(j)); - if(ppath && strcmp(ppath, rpath) == 0) { - printf(_("%s is owned by %s %s\n"), rpath, alpm_pkg_get_name(info), alpm_pkg_get_version(info)); - found = 1; - } + ppath = resolve_path(path); - free(ppath); + if(ppath && strcmp(ppath, rpath) == 0) { + printf(_("%s is owned by %s %s\n"), rpath, + alpm_pkg_get_name(info), alpm_pkg_get_version(info)); + found = 1; + } + free(ppath); + } } - } - if(!found) { - fprintf(stderr, _("error: No package owns %s\n"), filename); + if(!found) { + fprintf(stderr, _("error: No package owns %s\n"), filename); + ret++; + } + free(rpath); } - free(rpath); + return ret; } -int pacman_query(alpm_list_t *targets) +/* search the local database for a matching package */ +static int query_search(alpm_list_t *targets) { - alpm_list_t *sync_dbs = NULL, *i, *j, *k; - pmpkg_t *info = NULL; - char *package = NULL; - int ret = 0; + alpm_list_t *i, *searchlist; + int freelist; + + /* if we have a targets list, search for packages matching it */ + if(targets) { + searchlist = alpm_db_search(db_local, targets); + freelist = 1; + } else { + searchlist = alpm_db_getpkgcache(db_local); + freelist = 0; + } + if(searchlist == NULL) { + return(1); + } - if(config->op_q_search) { - alpm_list_t *searchlist = alpm_db_search(db_local, targets); - if(searchlist == NULL) { - return(0); + for(i = searchlist; i; i = alpm_list_next(i)) { + char *group = NULL; + alpm_list_t *grp; + pmpkg_t *pkg = alpm_list_getdata(i); + + printf("local/%s %s", alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg)); + + /* print the package size with the output if ShowSize option set */ + if(alpm_option_get_showsize()) { + /* Convert byte size to MB */ + double mbsize = alpm_pkg_get_size(pkg) / (1024.0 * 1024.0); + + printf(" [%.2f MB]", mbsize); } - for(i = searchlist; i; i = alpm_list_next(i)) { - char *group = NULL; - alpm_list_t *grp; - pmpkg_t *pkg = alpm_list_getdata(i); - printf("local/%s %s", alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg)); + if((grp = alpm_pkg_get_groups(pkg)) != NULL) { + group = alpm_list_getdata(grp); + printf(" (%s)", (char *)alpm_list_getdata(grp)); + } - /* print the package size with the output if ShowSize option set */ - if(alpm_option_get_showsize()) { - /* Convert byte size to MB */ - double mbsize = alpm_pkg_get_size(pkg) / (1024.0 * 1024.0); + /* we need a newline and initial indent first */ + printf("\n "); + indentprint(alpm_pkg_get_desc(pkg), 4); + printf("\n"); + } + /* we only want to free if the list was a search list */ + if(freelist) { + alpm_list_free(searchlist); + } + return(0); +} - printf(" [%.2f MB]", mbsize); - } +static int query_group(alpm_list_t *targets) +{ + alpm_list_t *i, *j; + char *package = NULL; + int ret = 0; + if(targets == NULL) { + for(j = alpm_db_getgrpcache(db_local); j; j = alpm_list_next(j)) { + pmgrp_t *grp = alpm_list_getdata(j); + alpm_list_t *p, *pkgnames; + const char *grpname; + + grpname = alpm_grp_get_name(grp); + pkgnames = alpm_grp_get_pkgs(grp); - if((grp = alpm_pkg_get_groups(pkg)) != NULL) { - group = alpm_list_getdata(grp); - printf(" (%s)\n ", (char *)alpm_list_getdata(grp)); + for(p = pkgnames; p; p = alpm_list_next(p)) { + printf("%s %s\n", grpname, (char *)alpm_list_getdata(p)); + } + } + } else { + for(i = targets; i; i = alpm_list_next(i)) { + package = alpm_list_getdata(i); + pmgrp_t *grp = alpm_db_readgrp(db_local, package); + if(grp) { + alpm_list_t *p, *pkgnames = alpm_grp_get_pkgs(grp); + for(p = pkgnames; p; p = alpm_list_next(p)) { + printf("%s %s\n", package, (char *)alpm_list_getdata(p)); + } } else { - printf("\n "); + fprintf(stderr, _("error: group \"%s\" was not found\n"), package); + ret++; } + } + } + return ret; +} - indentprint(alpm_pkg_get_desc(pkg), 4); - printf("\n"); +static int query_isfile(alpm_list_t *targets) +{ + int ret = 0; + char *package = NULL; + alpm_list_t *i; + pmpkg_t *info = NULL; + if(targets == NULL) { + fprintf(stderr, _("error: no package file was specified for --file\n")); + return(1); + } else { + for(i = targets; i; i = alpm_list_next(i)) { + package = alpm_list_getdata(i); + if(alpm_pkg_load(package, &info) == -1) { + fprintf(stderr, _("error: failed to load package '%s' (%s)\n"), + package, alpm_strerror(pm_errno)); + ret++; + continue; + } + if(config->op_q_info) { + dump_pkg_full(info, config->op_q_info); + } + if(config->op_q_list) { + dump_pkg_files(info); + } + if(!config->op_q_info && !config->op_q_list) { + printf("%s %s\n", alpm_pkg_get_name(info), + alpm_pkg_get_version(info)); + } + alpm_pkg_free(info); + info = NULL; } - alpm_list_free(searchlist); - return(0); + } + return(ret); +} + +int pacman_query(alpm_list_t *targets) +{ + alpm_list_t *sync_dbs = NULL, *i, *j, *k; + pmpkg_t *info = NULL; + char *package = NULL; + int ret = 0; + + if(config->op_q_search) { + ret = query_search(targets); + return(ret); } if(config->op_q_foreign) { @@ -170,125 +271,80 @@ int pacman_query(alpm_list_t *targets) alpm_list_t *syncpkgs; if((syncpkgs = alpm_get_upgrades()) != NULL) { - display_targets(syncpkgs); - return(0); + display_targets(syncpkgs); + return(0); } else { printf(_("no upgrades found")); return(1); } } - for(i = targets; i; i = alpm_list_next(i)) { - package = alpm_list_getdata(i); + /* looking for groups */ + if(config->group) { + ret = query_group(targets); + return(ret); + } - /* looking for groups */ - if(config->group) { - if(targets == NULL) { - for(j = alpm_db_getgrpcache(db_local); j; j = alpm_list_next(j)) { - pmgrp_t *grp = alpm_list_getdata(j); - alpm_list_t *p, *pkgnames; - const char *grpname; + /* output info for a .tar.gz package */ + if(config->op_q_isfile) { + ret = query_isfile(targets); + return(ret); + } - grpname = alpm_grp_get_name(grp); - pkgnames = alpm_grp_get_pkgs(grp); + /* determine the owner of a file */ + if(config->op_q_owns) { + ret = query_fileowner(targets); + return(ret); + } - for(p = pkgnames; p; p = alpm_list_next(p)) { - printf("%s %s\n", grpname, (char *)alpm_list_getdata(p)); - } - } - } else { - pmgrp_t *grp = alpm_db_readgrp(db_local, package); - if(grp) { - alpm_list_t *p, *pkgnames = alpm_grp_get_pkgs(grp); - for(p = pkgnames; p; p = alpm_list_next(p)) { - printf("%s %s\n", package, (char *)alpm_list_getdata(p)); - } - } else { - fprintf(stderr, _("error: group \"%s\" was not found\n"), package); + /* find packages in the db */ + if(targets == NULL) { + /* no target */ + for(i = alpm_db_getpkgcache(db_local); i; i = alpm_list_next(i)) { + pmpkg_t *tmpp = alpm_list_getdata(i); + const char *pkgname, *pkgver; + + pkgname = alpm_pkg_get_name(tmpp); + pkgver = alpm_pkg_get_version(tmpp); + + if(config->op_q_list || config->op_q_orphans || config->op_q_foreign) { + info = alpm_db_get_pkg(db_local, (char *)pkgname); + if(info == NULL) { + /* something weird happened */ + fprintf(stderr, _("error: package \"%s\" not found\n"), pkgname); ret++; + continue; } } - continue; - } - - /* output info for a .tar.gz package */ - if(config->op_q_isfile) { - if(package == NULL) { - fprintf(stderr, _("error: no package file was specified for --file\n")); - return(1); - } - if(alpm_pkg_load(package, &info) == -1) { - fprintf(stderr, _("error: failed to load package '%s' (%s)\n"), - package, alpm_strerror(pm_errno)); - return(1); - } - if(config->op_q_info) { - dump_pkg_full(info, config->op_q_info); - } - if(config->op_q_list) { - dump_pkg_files(info); - } - if(!config->op_q_info && !config->op_q_list) { - printf("%s %s\n", alpm_pkg_get_name(info), - alpm_pkg_get_version(info)); - } - alpm_pkg_free(info); - info = NULL; - continue; - } - - /* determine the owner of a file */ - if(config->op_q_owns) { - query_fileowner(db_local, package); - continue; - } - - /* find packages in the db */ - if(package == NULL) { - /* no target */ - for(i = alpm_db_getpkgcache(db_local); i; i = alpm_list_next(i)) { - pmpkg_t *tmpp = alpm_list_getdata(i); - const char *pkgname, *pkgver; - - pkgname = alpm_pkg_get_name(tmpp); - pkgver = alpm_pkg_get_version(tmpp); - - if(config->op_q_list || config->op_q_orphans || config->op_q_foreign) { - info = alpm_db_get_pkg(db_local, (char *)pkgname); - if(info == NULL) { - /* something weird happened */ - fprintf(stderr, _("error: package \"%s\" not found\n"), pkgname); - ret++; - continue; - } - } - if(config->op_q_foreign) { - int match = 0; - for(j = sync_dbs; j; j = alpm_list_next(j)) { - pmdb_t *db = (pmdb_t *)alpm_list_getdata(j); - for(k = alpm_db_getpkgcache(db); k; k = alpm_list_next(k)) { - pmpkg_t *pkg = alpm_list_getdata(k); - if(strcmp(alpm_pkg_get_name(pkg), alpm_pkg_get_name(info)) == 0) { - match = 1; - } + if(config->op_q_foreign) { + int match = 0; + for(j = sync_dbs; j; j = alpm_list_next(j)) { + pmdb_t *db = (pmdb_t *)alpm_list_getdata(j); + for(k = alpm_db_getpkgcache(db); k; k = alpm_list_next(k)) { + pmpkg_t *pkg = alpm_list_getdata(k); + if(strcmp(alpm_pkg_get_name(pkg), alpm_pkg_get_name(info)) == 0) { + match = 1; } } - if(match==0) { - printf("%s %s\n", pkgname, pkgver); - } - } else if(config->op_q_list) { - dump_pkg_files(info); - } else if(config->op_q_orphans) { - if(alpm_pkg_get_requiredby(info) == NULL - && ((long)alpm_pkg_get_reason(info) == PM_PKG_REASON_DEPEND - || config->op_q_orphans > 1)) { - printf("%s %s\n", pkgname, pkgver); - } - } else { + } + if(match==0) { + printf("%s %s\n", pkgname, pkgver); + } + } else if(config->op_q_list) { + dump_pkg_files(info); + } else if(config->op_q_orphans) { + if(alpm_pkg_get_requiredby(info) == NULL + && ((long)alpm_pkg_get_reason(info) == PM_PKG_REASON_DEPEND + || config->op_q_orphans > 1)) { printf("%s %s\n", pkgname, pkgver); } + } else { + printf("%s %s\n", pkgname, pkgver); } - } else { + } + } else { + for(i = targets; i; i = alpm_list_next(i)) { + package = alpm_list_getdata(i); info = alpm_db_get_pkg(db_local, package); if(info == NULL) { fprintf(stderr, _("error: package \"%s\" not found\n"), package); @@ -305,16 +361,16 @@ int pacman_query(alpm_list_t *targets) } if(!config->op_q_info && !config->op_q_list) { printf("%s %s\n", alpm_pkg_get_name(info), - alpm_pkg_get_version(info)); + alpm_pkg_get_version(info)); } if(config->op_q_changelog) { char changelog[PATH_MAX]; /* TODO should be done in the backend- no raw DB stuff up front */ snprintf(changelog, PATH_MAX, "%s/%s/%s-%s/changelog", - alpm_option_get_dbpath(), - alpm_db_get_name(db_local), - alpm_pkg_get_name(info), - alpm_pkg_get_version(info)); + alpm_option_get_dbpath(), + alpm_db_get_name(db_local), + alpm_pkg_get_name(info), + alpm_pkg_get_version(info)); dump_pkg_changelog(changelog, alpm_pkg_get_name(info)); } } diff --git a/src/pacman/sync.c b/src/pacman/sync.c index 8626393e..7d7de529 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -1,8 +1,8 @@ /* * sync.c - * - * Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org> - * + * + * Copyright (c) 2002-2007 by Judd Vinet <jvinet@zeroflux.org> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ @@ -221,6 +221,7 @@ static int sync_synctree(int level, alpm_list_t *syncs) return(success > 0); } +/* search the sync dbs for a matching package */ static int sync_search(alpm_list_t *syncs, alpm_list_t *targets) { alpm_list_t *i, *j, *ret; @@ -259,12 +260,10 @@ static int sync_search(alpm_list_t *syncs, alpm_list_t *targets) if((grp = alpm_pkg_get_groups(pkg)) != NULL) { group = alpm_list_getdata(grp); printf(" (%s)\n", (char *)alpm_list_getdata(grp)); - } else { - printf("\n"); } - /* we need an initial indent first */ - printf(" "); + /* we need a newline and initial indent first */ + printf("\n "); indentprint(alpm_pkg_get_desc(pkg), 4); printf("\n"); } @@ -340,12 +339,12 @@ static int sync_info(alpm_list_t *syncs, alpm_list_t *targets) } db = NULL; } - + if(!db) { fprintf(stderr, _("error: repository '%s' does not exist\n"), repo); return(1); } - + for(k = alpm_db_getpkgcache(db); k; k = alpm_list_next(k)) { pmpkg_t *pkg = alpm_list_getdata(k); @@ -356,14 +355,14 @@ static int sync_info(alpm_list_t *syncs, alpm_list_t *targets) break; } } - + if(!foundpkg) { fprintf(stderr, _("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)) { pmdb_t *db = alpm_list_getdata(j); @@ -387,7 +386,7 @@ static int sync_info(alpm_list_t *syncs, alpm_list_t *targets) } else { for(i = syncs; i; i = alpm_list_next(i)) { pmdb_t *db = alpm_list_getdata(i); - + for(j = alpm_db_getpkgcache(db); j; j = alpm_list_next(j)) { dump_pkg_sync(alpm_list_getdata(j), alpm_db_get_name(db)); printf("\n"); @@ -565,7 +564,7 @@ int pacman_sync(alpm_list_t *targets) goto cleanup; } /* target not found: check if it's a group */ - + for(j = alpm_option_get_syncdbs(); j; j = alpm_list_next(j)) { pmdb_t *db = alpm_list_getdata(j); grp = alpm_db_readgrp(db, targ); |