xbps-query(8): added local search mode support (-s [-p]).
This commit is contained in:
parent
01dbb968dd
commit
ed67cad564
3
NEWS
3
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
|
||||
|
@ -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_ */
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
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);
|
||||
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) {
|
||||
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)) {
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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)
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user