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 - * + * + * Copyright (c) 2002-2007 by Judd Vinet + * * 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,60 +59,190 @@ 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(!(rpath = resolve_path(filename))) { - fprintf(stderr, _("error: cannot determine real path for '%s': %s\n"), - filename, strerror(errno)); - return; - } + if(stat(filename, &buf) == -1) { + fprintf(stderr, _("error: failed to read file '%s': %s\n"), + filename, strerror(errno)); + ret++; + continue; + } - for(i = alpm_db_getpkgcache(db); i && !found; i = alpm_list_next(i)) { - pmpkg_t *info = alpm_list_getdata(i); + if(S_ISDIR(buf.st_mode)) { + fprintf(stderr, _("error: cannot determine ownership of a directory\n")); + 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)); + if(!(rpath = resolve_path(filename))) { + fprintf(stderr, _("error: cannot determine real path for '%s': %s\n"), + filename, strerror(errno)); + ret++; + continue; + } - ppath = resolve_path(path); + for(i = alpm_db_getpkgcache(db_local); i && !found; i = alpm_list_next(i)) { + pmpkg_t *info = alpm_list_getdata(i); - 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; + 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)); + + ppath = resolve_path(path); + + 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); + ret++; + } + free(rpath); + } - free(ppath); + return ret; +} + +/* search the local database for a matching package */ +static int query_search(alpm_list_t *targets) +{ + 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); + } + + 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); + } + + if((grp = alpm_pkg_get_groups(pkg)) != NULL) { + group = alpm_list_getdata(grp); + printf(" (%s)", (char *)alpm_list_getdata(grp)); + } + + /* 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); +} + +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); + + 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 { + fprintf(stderr, _("error: group \"%s\" was not found\n"), package); + ret++; + } } } - if(!found) { - fprintf(stderr, _("error: No package owns %s\n"), filename); - } + return ret; +} - free(rpath); +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; + } + } + return(ret); } int pacman_query(alpm_list_t *targets) @@ -123,37 +253,8 @@ int pacman_query(alpm_list_t *targets) int ret = 0; 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); - } - - if((grp = alpm_pkg_get_groups(pkg)) != NULL) { - group = alpm_list_getdata(grp); - printf(" (%s)\n ", (char *)alpm_list_getdata(grp)); - } else { - printf("\n "); - } - - indentprint(alpm_pkg_get_desc(pkg), 4); - printf("\n"); - } - alpm_list_free(searchlist); - return(0); + 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 - * + * + * Copyright (c) 2002-2007 by Judd Vinet + * * 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);