diff --git a/NEWS b/NEWS index 26dc15fc..961a7594 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,8 @@ xbps-0.38 (???): + * xbps-query(8): added -s/--search local mode, the previous repository mode must + be specified with -R/--repository mode explicitly. + * pkgdb-0.38 format: the pkgdb plist file now contains all pkg metadata objects plus the pkgdb specific ones (automatic-install, install-date, metafile-sha256) with the pkg files list being the exception. The pkgdb code will automatically diff --git a/bin/xbps-query/defs.h b/bin/xbps-query/defs.h index 44a60acf..f16b51ff 100644 --- a/bin/xbps-query/defs.h +++ b/bin/xbps-query/defs.h @@ -65,6 +65,7 @@ int list_pkgs_pkgdb(struct xbps_handle *); int repo_list(struct xbps_handle *); /* from search.c */ -int repo_search(struct xbps_handle *, const char *, const char *, bool); +int search(struct xbps_handle *, bool, const char *, const char *, bool); + #endif /* !_XBPS_QUERY_DEFS_H_ */ diff --git a/bin/xbps-query/main.c b/bin/xbps-query/main.c index 1d3bb28b..897534dc 100644 --- a/bin/xbps-query/main.c +++ b/bin/xbps-query/main.c @@ -103,11 +103,11 @@ main(int argc, char **argv) int c, flags, rv; bool list_pkgs, list_repos, orphans, own; bool list_manual, list_hold, show_prop, show_files, show_deps, show_rdeps; - bool show, search, regex, repo_mode, opmode, fulldeptree; + bool show, pkg_search, regex, repo_mode, opmode, fulldeptree; rootdir = cachedir = conffile = props = pkg = NULL; flags = rv = c = 0; - list_pkgs = list_repos = list_hold = orphans = search = own = false; + list_pkgs = list_repos = list_hold = orphans = pkg_search = own = false; list_manual = show_prop = show_files = false; regex = show = show_deps = show_rdeps = fulldeptree = false; repo_mode = opmode = false; @@ -173,7 +173,7 @@ main(int argc, char **argv) break; case 's': pkg = optarg; - search = opmode = true; + pkg_search = opmode = true; break; case 'v': flags |= XBPS_FLAG_VERBOSE; @@ -252,9 +252,9 @@ main(int argc, char **argv) /* ownedby mode */ rv = ownedby(&xh, pkg, repo_mode, regex); - } else if (search) { + } else if (pkg_search) { /* search mode */ - rv = repo_search(&xh, pkg, props, regex); + rv = search(&xh, repo_mode, pkg, props, regex); } else if (show || show_prop) { /* show mode */ diff --git a/bin/xbps-query/search.c b/bin/xbps-query/search.c index 13002737..c6c2ea6c 100644 --- a/bin/xbps-query/search.c +++ b/bin/xbps-query/search.c @@ -44,7 +44,7 @@ #include "defs.h" struct search_data { - bool regex; + bool regex, repo_mode; int maxcols; const char *pat, *prop, *repourl; xbps_array_t results; @@ -112,7 +112,7 @@ search_array_cb(struct xbps_handle *xhp _unused, xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver); xbps_dictionary_get_cstring_nocopy(obj, "short_desc", &desc); - if (xbps_match_virtual_pkg_in_dict(obj, sd->pat)) + if (sd->repo_mode && xbps_match_virtual_pkg_in_dict(obj, sd->pat)) vpkgfound = true; if (sd->regex) { @@ -151,14 +151,20 @@ search_array_cb(struct xbps_handle *xhp _unused, return errno; if (regexec(®ex, str, 0, 0, 0) == 0) { xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver); - printf("%s: %s (%s)\n", pkgver, str, sd->repourl); + if (sd->repo_mode) + printf("%s: %s (%s)\n", pkgver, str, sd->repourl); + else + printf("%s: %s\n", pkgver, str); } regfree(®ex); } else { if ((strcasestr(str, sd->pat)) || (fnmatch(sd->pat, str, FNM_PERIOD)) == 0) { xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver); - printf("%s: %s (%s)\n", pkgver, str, sd->repourl); + if (sd->repo_mode) + printf("%s: %s (%s)\n", pkgver, str, sd->repourl); + else + printf("%s: %s\n", pkgver, str); } } } @@ -174,18 +180,28 @@ search_array_cb(struct xbps_handle *xhp _unused, if (regcomp(®ex, sd->pat, REG_EXTENDED|REG_NOSUB) != 0) return errno; if (regexec(®ex, size, 0, 0, 0) == 0) { - printf("%s: %s (%s)\n", pkgver, size, sd->repourl); + if (sd->repo_mode) + printf("%s: %s (%s)\n", pkgver, size, sd->repourl); + else + printf("%s: %s\n", pkgver, size); } regfree(®ex); } else { if (strcasestr(size, sd->pat)) { - printf("%s: %s (%s)\n", pkgver, size, sd->repourl); + if (sd->repo_mode) + printf("%s: %s (%s)\n", pkgver, size, sd->repourl); + else + printf("%s: %s\n", pkgver, size); } } } else if (xbps_object_type(obj2) == XBPS_TYPE_BOOL) { /* property is a bool */ xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver); - printf("%s: true (%s)\n", pkgver, sd->repourl); + if (sd->repo_mode) + printf("%s: true (%s)\n", pkgver, sd->repourl); + else + printf("%s: true\n", pkgver); + } else if (xbps_object_type(obj2) == XBPS_TYPE_STRING) { /* property is a string */ str = xbps_string_cstring_nocopy(obj2); @@ -194,13 +210,19 @@ search_array_cb(struct xbps_handle *xhp _unused, return errno; if (regexec(®ex, str, 0, 0, 0) == 0) { xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver); - printf("%s: %s (%s)\n", pkgver, str, sd->repourl); + if (sd->repo_mode) + printf("%s: %s (%s)\n", pkgver, str, sd->repourl); + else + printf("%s: %s\n", pkgver, str); } regfree(®ex); } else { if (strcasestr(str, sd->pat)) { xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver); - printf("%s: %s (%s)\n", pkgver, str, sd->repourl); + if (sd->repo_mode) + printf("%s: %s (%s)\n", pkgver, str, sd->repourl); + else + printf("%s: %s\n", pkgver, str); } } } @@ -208,7 +230,7 @@ search_array_cb(struct xbps_handle *xhp _unused, } static int -search_pkgs_cb(struct xbps_repo *repo, void *arg, bool *done _unused) +search_repo_cb(struct xbps_repo *repo, void *arg, bool *done _unused) { xbps_array_t allkeys; struct search_data *sd = arg; @@ -222,22 +244,33 @@ search_pkgs_cb(struct xbps_repo *repo, void *arg, bool *done _unused) } int -repo_search(struct xbps_handle *xhp, const char *pat, const char *prop, bool regex) +search(struct xbps_handle *xhp, bool repo_mode, const char *pat, const char *prop, bool regex) { struct search_data sd; int rv; sd.regex = regex; + sd.repo_mode = repo_mode; sd.pat = pat; sd.prop = prop; sd.maxcols = get_maxcols(); sd.results = xbps_array_create(); - rv = xbps_rpool_foreach(xhp, search_pkgs_cb, &sd); - if (rv != 0 && rv != ENOTSUP) - fprintf(stderr, "Failed to initialize rpool: %s\n", - strerror(rv)); - + if (repo_mode) { + rv = xbps_rpool_foreach(xhp, search_repo_cb, &sd); + if (rv != 0 && rv != ENOTSUP) { + fprintf(stderr, "Failed to initialize rpool: %s\n", + strerror(rv)); + return rv; + } + } else { + rv = xbps_pkgdb_foreach_cb(xhp, search_array_cb, &sd); + if (rv != 0) { + fprintf(stderr, "Failed to initialize pkgdb: %s\n", + strerror(rv)); + return rv; + } + } if (!prop && xbps_array_count(sd.results)) { print_results(xhp, &sd); xbps_object_release(sd.results);