Skip to content

Commit a4108eb

Browse files
committed
bin/xbps-query: add --json flag as alternative to --format
1 parent 6c03876 commit a4108eb

File tree

3 files changed

+38
-19
lines changed

3 files changed

+38
-19
lines changed

bin/xbps-query/defs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ int ownedby(struct xbps_handle *, const char *, bool, bool);
5555
int list_manual_pkgs(struct xbps_handle *, xbps_object_t, const char *, void *, bool *);
5656
int list_orphans(struct xbps_handle *, const char *);
5757
int list_pkgs_pkgdb(struct xbps_handle *);
58-
int list_pkgdb(struct xbps_handle *, int (*filter)(xbps_object_t), const char *format);
58+
int list_pkgdb(struct xbps_handle *, int (*filter)(xbps_object_t), const char *format, int json);
5959

6060
int repo_list(struct xbps_handle *);
6161

bin/xbps-query/list.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
#include "defs.h"
3838
#include "xbps.h"
39+
#include "xbps/json.h"
3940

4041
struct length_max_cb {
4142
const char *key;
@@ -135,6 +136,7 @@ list_pkgs_pkgdb(struct xbps_handle *xhp)
135136

136137
struct list_pkgdb_cb {
137138
struct xbps_fmt *fmt;
139+
struct xbps_json_printer *json;
138140
int (*filter)(xbps_object_t obj);
139141
};
140142

@@ -153,23 +155,33 @@ list_pkgdb_cb(struct xbps_handle *xhp UNUSED, xbps_object_t obj,
153155
return 0;
154156
}
155157

156-
r = xbps_fmt_dictionary(ctx->fmt, obj, stdout);
157-
if (r < 0)
158-
return r;
159-
return 0;
158+
if (ctx->fmt) {
159+
r = xbps_fmt_dictionary(ctx->fmt, obj, stdout);
160+
} else if (ctx->json) {
161+
r = xbps_json_print_xbps_object(ctx->json, obj);
162+
} else {
163+
r = -ENOTSUP;
164+
}
165+
return r;
160166
}
161167

162168
int
163-
list_pkgdb(struct xbps_handle *xhp, int (*filter)(xbps_object_t), const char *format)
169+
list_pkgdb(struct xbps_handle *xhp, int (*filter)(xbps_object_t), const char *format, int json)
164170
{
165171
struct list_pkgdb_cb ctx = {.filter = filter};
172+
struct xbps_json_printer pr = {0};
166173
int r;
167-
168-
ctx.fmt = xbps_fmt_parse(format);
169-
if (!ctx.fmt) {
170-
r = -errno;
171-
xbps_error_printf("failed to parse format: %s\n", strerror(-r));
172-
return r;
174+
if (json > 0) {
175+
pr.indent = (json-1) * 2;
176+
pr.file = stdout;
177+
ctx.json = &pr;
178+
} else if (format) {
179+
ctx.fmt = xbps_fmt_parse(format);
180+
if (!ctx.fmt) {
181+
r = -errno;
182+
xbps_error_printf("failed to parse format: %s\n", strerror(-r));
183+
return r;
184+
}
173185
}
174186
r = xbps_pkgdb_foreach_cb(xhp, list_pkgdb_cb, &ctx);
175187
xbps_fmt_free(ctx.fmt);

bin/xbps-query/main.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
#include <xbps.h>
3434

3535
#include "defs.h"
36+
#include "xbps.h"
37+
#include "xbps/json.h"
3638

3739
static void __attribute__((noreturn))
3840
usage(bool fail)
@@ -100,7 +102,7 @@ filter_repolock(xbps_object_t obj)
100102
int
101103
main(int argc, char **argv)
102104
{
103-
const char *shortopts = "C:c:dF:f:hHiLlMmOo:p:Rr:s:S:VvX:x:";
105+
const char *shortopts = "C:c:dF:f:hHiJLlMmOo:p:Rr:s:S:VvX:x:";
104106
const struct option longopts[] = {
105107
{ "config", required_argument, NULL, 'C' },
106108
{ "cachedir", required_argument, NULL, 'c' },
@@ -137,6 +139,7 @@ main(int argc, char **argv)
137139
bool list_pkgs, list_repos, orphans, own, list_repolock;
138140
bool list_manual, list_hold, show_prop, show_files, show_deps, show_rdeps;
139141
bool show, pkg_search, regex, repo_mode, opmode, fulldeptree;
142+
int json = 0;
140143

141144
rootdir = cachedir = confdir = props = pkg = catfile = format = NULL;
142145
flags = rv = c = 0;
@@ -165,6 +168,9 @@ main(int argc, char **argv)
165168
case 'F':
166169
format = optarg;
167170
break;
171+
case 'J':
172+
json++;
173+
break;
168174
case 'H':
169175
list_hold = opmode = true;
170176
break;
@@ -286,20 +292,21 @@ main(int argc, char **argv)
286292
rv = repo_list(&xh);
287293

288294
} else if (list_hold) {
289-
rv = list_pkgdb(&xh, filter_hold, format ? format : "{pkgver}\n") < 0;
295+
rv = list_pkgdb(&xh, filter_hold, format ? format : "{pkgver}\n", json) < 0;
290296

291297
} else if (list_repolock) {
292-
rv = list_pkgdb(&xh, filter_repolock, format ? format : "{pkgver}\n") < 0;
298+
rv = list_pkgdb(&xh, filter_repolock, format ? format : "{pkgver}\n", json) < 0;
293299

294300
} else if (list_manual) {
295-
rv = list_pkgdb(&xh, filter_manual, format ? format : "{pkgver}\n") < 0;
301+
rv = list_pkgdb(&xh, filter_manual, format ? format : "{pkgver}\n", json) < 0;
296302

297303
} else if (list_pkgs) {
298304
/* list available pkgs */
299-
if (format)
300-
rv = list_pkgdb(&xh, NULL, format);
301-
else
305+
if (format || json > 0) {
306+
rv = list_pkgdb(&xh, NULL, format, json);
307+
} else {
302308
rv = list_pkgs_pkgdb(&xh);
309+
}
303310

304311
} else if (orphans) {
305312
/* list pkg orphans */

0 commit comments

Comments
 (0)