Skip to content

Commit 17182be

Browse files
committed
bin/xbps-query: add pkgname,version and revision format variables
1 parent dcc60f4 commit 17182be

File tree

2 files changed

+60
-8
lines changed

2 files changed

+60
-8
lines changed

bin/xbps-query/list.c

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,31 +137,73 @@ list_pkgs_pkgdb(struct xbps_handle *xhp)
137137
return xbps_pkgdb_foreach_cb(xhp, list_pkgs_pkgdb_cb, &lpc);
138138
}
139139

140-
struct list_pkgdb_cb {
140+
struct list_pkgdb_ctx {
141141
struct xbps_fmt *fmt;
142142
struct xbps_json_printer *json;
143143
int (*filter)(xbps_object_t obj);
144144
};
145145

146+
static int
147+
fmt_pkg_cb(FILE *fp, const struct xbps_fmt_var *var, void *data)
148+
{
149+
const char *pkgver = NULL;
150+
xbps_dictionary_t pkgd = data;
151+
xbps_object_t obj;
152+
153+
obj = xbps_dictionary_get(pkgd, var->name);
154+
if (obj)
155+
return xbps_fmt_print_object(var, obj, fp);
156+
157+
if (!xbps_dictionary_get_cstring_nocopy(pkgd, "pkgver", &pkgver)) {
158+
xbps_error_printf("invalid package: missing `pkgver`\n");
159+
return -EINVAL;
160+
}
161+
162+
if (strcmp(var->name, "pkgname") == 0) {
163+
char pkgname[XBPS_NAME_SIZE];
164+
if (xbps_pkg_name(pkgname, sizeof(pkgname), pkgver)) {
165+
xbps_error_printf("invalid `pkgver`: %s\n", pkgver);
166+
return -EINVAL;
167+
}
168+
return xbps_fmt_print_string(var, pkgname, 0, fp);
169+
} else if (strcmp(var->name, "version") == 0) {
170+
const char *version = xbps_pkg_version(pkgver);
171+
if (!version) {
172+
xbps_error_printf("invalid `pkgver`: %s\n", pkgver);
173+
return -EINVAL;
174+
}
175+
return xbps_fmt_print_string(var, version, 0, fp);
176+
} else if (strcmp(var->name, "revision") == 0) {
177+
const char *revision = xbps_pkg_revision(pkgver);
178+
if (!revision) {
179+
xbps_error_printf("invalid `pkgver`: %s\n", pkgver);
180+
return -EINVAL;
181+
}
182+
return xbps_fmt_print_string(var, revision, 0, fp);
183+
}
184+
185+
return 0;
186+
}
187+
146188
static int
147189
list_pkgdb_cb(struct xbps_handle *xhp UNUSED, xbps_object_t obj,
148190
const char *key UNUSED, void *arg, bool *loop_done UNUSED)
149191
{
150-
struct list_pkgdb_cb *ctx = arg;
192+
struct list_pkgdb_ctx *ctx = arg;
151193
int r;
152194

153195
if (ctx->filter) {
154196
r = ctx->filter(obj);
155-
if (r < 0)
197+
if (r <= 0)
156198
return r;
157-
if (r == 0)
158-
return 0;
159199
}
160200

161201
if (ctx->fmt) {
162-
r = xbps_fmt_dictionary(ctx->fmt, obj, stdout);
202+
r = xbps_fmt(ctx->fmt, &fmt_pkg_cb, obj, stdout);
163203
} else if (ctx->json) {
164204
r = xbps_json_print_xbps_object(ctx->json, obj);
205+
if (r < 0)
206+
return r;
165207
fprintf(ctx->json->file, "\n");
166208
} else {
167209
r = -ENOTSUP;
@@ -172,7 +214,7 @@ list_pkgdb_cb(struct xbps_handle *xhp UNUSED, xbps_object_t obj,
172214
int
173215
list_pkgdb(struct xbps_handle *xhp, int (*filter)(xbps_object_t), const char *format, int json)
174216
{
175-
struct list_pkgdb_cb ctx = {.filter = filter};
217+
struct list_pkgdb_ctx ctx = {.filter = filter};
176218
struct xbps_json_printer pr = {0};
177219
int r;
178220
if (json > 0) {
@@ -237,7 +279,7 @@ list_orphans(struct xbps_handle *xhp, const char *format)
237279
xbps_object_t obj = xbps_array_get(orphans, i);
238280
if (!obj)
239281
return -errno;
240-
r = xbps_fmt_dictionary(fmt, obj, stdout);
282+
r = xbps_fmt(fmt, &fmt_pkg_cb, obj, stdout);
241283
if (r < 0)
242284
goto err;
243285
}

bin/xbps-query/xbps-query.1

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,16 @@ installation state of the package.
460460
.It Ic tags
461461
list of categories the package is associated with.
462462
.El
463+
.Pp
464+
Additional dynamic properties are available for
465+
.Sx FORMAT STRINGS .
466+
.Pp
467+
.Bl -tag -compact -width 17m
468+
.It Ic version
469+
version of the package.
470+
.It Ic revision
471+
revision of the package.
472+
.El
463473
.Sh ENVIRONMENT
464474
.Bl -tag -width XBPS_TARGET_ARCH
465475
.It Sy XBPS_ARCH

0 commit comments

Comments
 (0)