/* -Qi */ static int query_info(alpm_db_t *localdb, alpm_list_t *targets) { int ret, hits, found, pkgcount; alpm_list_t *i, *k, *dbcache; alpm_pkg_t *pkg; ret = pkgcount = hits = found = 0; dbcache = alpm_db_get_pkgcache(localdb); for (i = targets; i; i = i->next, ++pkgcount) { found = 0; for (k = dbcache; k; k = k->next) { pkg = k->data; if (!strcmp(i->data, alpm_pkg_get_name(pkg))) { if (hits++) { printf("\n"); } found = 1; pacman_pkgdump(pkg, PKG_FROM_LOCAL); break; } } if (!found) { if (pkgcount) { printf("\n"); } ret = -1; pw_fprintf(PW_LOG_ERROR, stderr, "package %s not found\n", i->data); } } return ret; }
/* Lists detailed information about targets */ static int sync_info(CURL *curl, alpm_list_t *targets) { int found, ret, pkgcount; alpm_list_t *i, *j, *results; alpm_list_t *free_list = NULL; alpm_list_t *syncdbs = alpm_option_get_syncdbs(config->handle); alpm_pkg_t *spkg; char cwd[PATH_MAX]; char filename[PATH_MAX]; char url[PATH_MAX]; FILE *fp = NULL; int fd; struct aurpkg_t *pkg; if (!getcwd(cwd, PATH_MAX)) { return error(PW_ERR_GETCWD); } if (chdir(powaur_dir)) { return error(PW_ERR_CHDIR, powaur_dir); } found = ret = pkgcount = 0; for (i = targets; i; i = i->next, ++pkgcount) { /* Search sync dbs first */ spkg = search_syncdbs(syncdbs, i->data); if (spkg) { if (found++){ printf("\n"); } pacman_pkgdump(spkg, PKG_FROM_SYNC); spkg = NULL; continue; } results = query_aur(curl, i->data, AUR_QUERY_INFO); if (alpm_list_count(results) != 1) { if (pkgcount > 0) { printf("\n"); } pw_printf(PW_LOG_ERROR, "package %s not found\n", i->data); goto garbage_collect; } snprintf(filename, PATH_MAX, "%s.PKGBUILDXXXXXX", i->data); fd = mkstemp(filename); if (fd < 0) { error(PW_ERR_FOPEN, filename); goto garbage_collect; } fp = fdopen(fd, "w+"); if (!fp) { printf("NO\n"); error(PW_ERR_FOPEN, filename); goto garbage_collect; } snprintf(url, PATH_MAX, AUR_PKGBUILD_URL, i->data); /* Download the PKGBUILD and parse it */ ret = download_single_file(curl, url, fp); if (ret) { goto destroy_remnants; } /* Parse PKGBUILD and get detailed info */ fseek(fp, 0L, SEEK_SET); pkg = results->data; parse_pkgbuild(pkg, fp); if (found++) { printf("\n"); } printf("%s%s %saur%s\n", color.bold, REPO, color.bmag, color.nocolor); printf("%s%s %s%s\n", color.bold, NAME, pkg->name, color.nocolor); printf("%s%s %s%s%s\n", color.bold, VERSION, color.bgreen, pkg->version, color.nocolor); printf("%s%s %s%s%s\n", color.bold, URL, color.bcyan, pkg->url, color.nocolor); printf("%s%s%s ", color.bold, A_URL, color.bcyan); printf(AUR_PKG_URL, pkg->id); printf("%s\n", color.nocolor); printf("%s%s %s%s\n", color.bold, LICENSES, color.nocolor, pkg->license); printf("%s%s %s%d\n", color.bold, A_VOTES, color.nocolor, pkg->votes); printf("%s%s ", color.bold, A_OUTOFDATE); if (pkg->outofdate) { printf("%s%s", color.bred, "Yes"); } else { printf("%s%s", color.nocolor, "No"); } printf("%s\n", color.nocolor); print_list_prefix(pkg->provides, PROVIDES); print_list_prefix(pkg->depends, DEPS); print_list_prefix(pkg->optdepends, OPTDEPS); print_list_prefix(pkg->conflicts, CONFLICTS); print_list_prefix(pkg->replaces, REPLACES); print_list_prefix(pkg->arch, ARCH); printf("%s%s%s %s\n", color.bold, DESC, color.nocolor, pkg->desc); destroy_remnants: fclose(fp); fp = NULL; unlink(filename); garbage_collect: free_list = alpm_list_add(free_list, results); } cleanup: for (i = free_list; i; i = i->next) { alpm_list_free_inner(i->data, (alpm_list_fn_free) aurpkg_free); alpm_list_free(i->data); } alpm_list_free(free_list); if (chdir(cwd)) { return error(PW_ERR_RESTORECWD); } return found ? 0 : -1; }
/* Dumps info from dbs and returns. */ int pacman_db_dump(enum pkgfrom_t from, enum dumplvl_t lvl) { int cnt = 0; alpm_list_t *i, *j, *dbs, *syncdbs; const char *repo; pmdb_t *localdb, *db; pmpkg_t *pkg; pmdepend_t *dep; switch (lvl) { case DUMP_Q: case DUMP_Q_SEARCH: case DUMP_Q_INFO: localdb = alpm_option_get_localdb(); syncdbs = alpm_option_get_syncdbs(); break; case DUMP_S_SEARCH: case DUMP_S_INFO: dbs = alpm_option_get_syncdbs(); break; } if (lvl == DUMP_S_SEARCH || lvl == DUMP_S_INFO) { goto dump_sync; } /* -Qi */ if (lvl == DUMP_Q_INFO) { for (i = alpm_db_get_pkgcache(localdb); i; i = i->next) { pacman_pkgdump(i->data, PKG_FROM_LOCAL); } } else { /* plain -Q and -Qs */ for (j = alpm_db_get_pkgcache(localdb); j; j = j->next) { pkg = j->data; print_pkg_pretty(syncdbs, pkg, lvl); } } goto done; dump_sync: /* -S */ for (i = dbs; i; i = i->next) { db = i->data; for (j = alpm_db_get_pkgcache(db); j; j = j->next) { if (cnt++) { printf("\n"); } pkg = j->data; if (lvl == DUMP_S_INFO) { pacman_pkgdump(pkg, from); } else { /* -Ss */ print_pkg_pretty(dbs, pkg, lvl); } } } done: if (lvl != DUMP_Q && lvl != DUMP_Q_SEARCH) { printf("\n"); } return 0; }