xbps-{bin,repo}: new -o flag for the 'show' target, to print specific objs value.

This commit is contained in:
Juan RP 2011-10-29 08:17:54 +02:00
parent 549b5e2e36
commit 1c4d486396
11 changed files with 145 additions and 57 deletions

13
NEWS
View File

@ -1,4 +1,15 @@
xbps-0.10.2 (???):
xbps-0.11.0 (???):
* xbps-bin(8)/xbps-repo(8): new flag '-o' (option). This can be used
in the 'show' target to print only a set of objects stored in package's
properties dictionary, example:
$ xbps-bin -olicense show xbps
Simplified BSD
$ xbps-bin -oversion,build_date show xbps
0.10.1
Wednesday 26 October, 2011, 14:37:31 UTC
$
* libxbpps: when fetching new pkg-index.plist from a repository,
make sure that it's a plist file and can be internalized; otherwise

View File

@ -66,7 +66,7 @@ int show_pkg_deps(const char *);
int show_pkg_reverse_deps(const char *);
/* from show-info-files.c */
int show_pkg_info_from_metadir(const char *);
int show_pkg_info_from_metadir(const char *, const char *);
int show_pkg_files_from_metadir(const char *);
/* from find-files.c */
@ -84,12 +84,13 @@ void transaction_cb(struct xbps_transaction_cb_data *);
void transaction_err_cb(struct xbps_transaction_cb_data *);
/* From util.c */
int show_pkg_files(prop_dictionary_t);
void show_pkg_info(prop_dictionary_t);
int show_pkg_namedesc(prop_object_t, void *, bool *);
int list_strings_in_array(prop_object_t, void *, bool *);
int list_strings_sep_in_array(prop_object_t, void *, bool *);
size_t find_longest_pkgver(prop_dictionary_t);
void print_package_line(const char *, bool);
int show_pkg_files(prop_dictionary_t);
void show_pkg_info(prop_dictionary_t);
void show_pkg_info_one(prop_dictionary_t, const char *);
int show_pkg_namedesc(prop_object_t, void *, bool *);
int list_strings_in_array(prop_object_t, void *, bool *);
int list_strings_sep_in_array(prop_object_t, void *, bool *);
size_t find_longest_pkgver(prop_dictionary_t);
void print_package_line(const char *, bool);
#endif /* !_XBPS_BIN_DEFS_H_ */

View File

@ -185,17 +185,17 @@ main(int argc, char **argv)
struct xferstat xfer;
struct list_pkgver_cb lpc;
struct sigaction sa;
const char *rootdir, *cachedir, *confdir;
const char *rootdir, *cachedir, *confdir, *option;
int i , c, flags, rv;
bool yes, purge, debug, force_rm_with_deps, recursive_rm;
bool install_auto, install_manual, show_download_pkglist_url;
rootdir = cachedir = confdir = NULL;
rootdir = cachedir = confdir = option = NULL;
flags = rv = 0;
yes = purge = force_rm_with_deps = recursive_rm = debug = false;
install_auto = install_manual = show_download_pkglist_url = false;
while ((c = getopt(argc, argv, "AC:c:dDFfMpRr:Vvy")) != -1) {
while ((c = getopt(argc, argv, "AC:c:dDFfMo:pRr:Vvy")) != -1) {
switch (c) {
case 'A':
install_auto = true;
@ -221,6 +221,9 @@ main(int argc, char **argv)
case 'M':
install_manual = true;
break;
case 'o':
option = optarg;
break;
case 'p':
purge = true;
break;
@ -375,7 +378,7 @@ main(int argc, char **argv)
if (argc != 2)
usage(xhp);
rv = show_pkg_info_from_metadir(argv[1]);
rv = show_pkg_info_from_metadir(argv[1], option);
if (rv != 0) {
printf("Package %s not installed.\n", argv[1]);
goto out;

View File

@ -35,7 +35,7 @@
#include "defs.h"
int
show_pkg_info_from_metadir(const char *pkgname)
show_pkg_info_from_metadir(const char *pkgname, const char *option)
{
prop_dictionary_t d;
@ -43,7 +43,11 @@ show_pkg_info_from_metadir(const char *pkgname)
if (d == NULL)
return EINVAL;
show_pkg_info(d);
if (option == NULL)
show_pkg_info(d);
else
show_pkg_info_one(d, option);
prop_object_release(d);
return 0;
}

View File

@ -40,13 +40,86 @@
#include "defs.h"
#include "../xbps-repo/defs.h"
static void
print_value_obj(const char *keyname, prop_object_t obj, bool raw)
{
const char *value;
size_t i;
char size[8];
switch (prop_object_type(obj)) {
case PROP_TYPE_STRING:
if (!raw)
printf("%s: ", keyname);
printf("%s\n", prop_string_cstring_nocopy(obj));
break;
case PROP_TYPE_NUMBER:
if (!raw)
printf("%s: ", keyname);
if (xbps_humanize_number(size,
(int64_t)prop_number_unsigned_integer_value(obj)) == -1)
printf("%ju\n",
prop_number_unsigned_integer_value(obj));
else
printf("%s\n", size);
break;
case PROP_TYPE_BOOL:
if (!raw)
printf("%s: ", keyname);
printf("%s\n", prop_bool_true(obj) ? "yes" : "no");
break;
case PROP_TYPE_ARRAY:
if (!raw)
printf("%s:\n", keyname);
for (i = 0; i < prop_array_count(obj); i++) {
prop_array_get_cstring_nocopy(obj, i, &value);
printf("%s%s%s", !raw ? "\t" : "", value,
!raw ? "\n" : " ");
}
if (raw)
printf("\n");
break;
default:
xbps_warn_printf("unknown obj type (key %s)\n",
keyname);
break;
}
}
void
show_pkg_info_one(prop_dictionary_t d, const char *keys)
{
prop_object_t obj;
char *key, *p, *saveptr;
assert(prop_object_type(d) == PROP_TYPE_DICTIONARY);
assert(keys != NULL);
if (strchr(keys, ',') == NULL) {
obj = prop_dictionary_get(d, keys);
if (obj == NULL)
return;
print_value_obj(keys, obj, true);
return;
}
key = strdup(keys);
assert(key != NULL);
for ((p = strtok_r(key, ",", &saveptr)); p;
(p = strtok_r(NULL, ",", &saveptr))) {
obj = prop_dictionary_get(d, p);
if (obj == NULL)
continue;
print_value_obj(p, obj, true);
}
free(key);
}
void
show_pkg_info(prop_dictionary_t dict)
{
prop_array_t all_keys;
prop_object_t obj, keysym;
const char *keyname;
char size[8];
size_t i;
assert(prop_object_type(dict) == PROP_TYPE_DICTIONARY);
@ -57,38 +130,11 @@ show_pkg_info(prop_dictionary_t dict)
keysym = prop_array_get(all_keys, i);
keyname = prop_dictionary_keysym_cstring_nocopy(keysym);
obj = prop_dictionary_get_keysym(dict, keysym);
/* ignore run_depends, it's shown via 'show-deps' */
if (strcmp(keyname, "run_depends") == 0)
break;
switch (prop_object_type(obj)) {
case PROP_TYPE_STRING:
printf("%s: %s\n", keyname,
prop_string_cstring_nocopy(obj));
break;
case PROP_TYPE_NUMBER:
printf("%s: ", keyname);
if (xbps_humanize_number(size,
(int64_t)prop_number_unsigned_integer_value(obj)) == -1)
printf("%ju\n",
prop_number_unsigned_integer_value(obj));
else
printf("%s\n", size);
break;
case PROP_TYPE_BOOL:
printf("%s: %s\n", keyname,
prop_bool_true(obj) ? "yes" : "no");
break;
case PROP_TYPE_ARRAY:
/* ignore run_depends, it's shown via 'show-deps' */
if (strcmp(keyname, "run_depends") == 0)
break;
printf("%s:\n", keyname);
(void)xbps_callback_array_iter_in_dict(dict, keyname,
list_strings_sep_in_array, __UNCONST("\t"));
break;
default:
xbps_warn_printf("unknown obj type (key %s)\n",
keyname);
break;
}
print_value_obj(keyname, obj, false);
}
}

View File

@ -1,4 +1,4 @@
.TH "XBPS\-BIN" "8" "17/10/2011" "\ \&" "\ \&"
.TH "XBPS\-BIN" "8" "29/10/2011" "\ \&" "\ \&"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
@ -88,6 +88,14 @@ option takes effect in the \fIautoupdate\fR, \fIinstall\fR and \fIupdate\fR targ
and target packages and its required dependencies will be matched.
.RE
.PP
\fB-o\fR \fIkey[,key2...]\fR
.RS 4
Used currently in the
\fIshow\fR
target\&. Prints the value of specified key(s) from package's properties dictionary.
Multiple keys can be specified delimited by the comma character.
.RE
.PP
\fB\-p\fR
.RS 4
Used currently in the

View File

@ -36,7 +36,7 @@
int repo_genindex(const char *);
/* From repository.c */
int show_pkg_info_from_repolist(const char *);
int show_pkg_info_from_repolist(const char *, const char *);
int show_pkg_deps_from_repolist(const char *);
int repository_sync(void);

View File

@ -90,13 +90,13 @@ main(int argc, char **argv)
struct xbps_handle *xhp;
struct xferstat xfer;
prop_dictionary_t pkgd;
const char *rootdir, *cachedir, *confdir;
const char *rootdir, *cachedir, *confdir, *option;
int c, rv = 0;
bool debug = false;
rootdir = cachedir = confdir = NULL;
rootdir = cachedir = confdir = option = NULL;
while ((c = getopt(argc, argv, "C:c:dr:V")) != -1) {
while ((c = getopt(argc, argv, "C:c:do:r:V")) != -1) {
switch (c) {
case 'C':
confdir = optarg;
@ -107,6 +107,9 @@ main(int argc, char **argv)
case 'd':
debug = true;
break;
case 'o':
option = optarg;
break;
case 'r':
/* To specify the root directory */
rootdir = optarg;
@ -186,7 +189,7 @@ main(int argc, char **argv)
if (argc != 2)
usage(xhp);
rv = show_pkg_info_from_repolist(argv[1]);
rv = show_pkg_info_from_repolist(argv[1], option);
if (rv == ENOENT) {
xbps_printf("Unable to locate package "
"`%s' in repository pool.\n", argv[1]);

View File

@ -100,7 +100,7 @@ out:
}
int
show_pkg_info_from_repolist(const char *pkgname)
show_pkg_info_from_repolist(const char *pkgname, const char *option)
{
prop_dictionary_t pkgd;
@ -111,7 +111,11 @@ show_pkg_info_from_repolist(const char *pkgname)
return errno;
}
show_pkg_info(pkgd);
if (option)
show_pkg_info_one(pkgd, option);
else
show_pkg_info(pkgd);
prop_object_release(pkgd);
return 0;

View File

@ -1,4 +1,4 @@
.TH "XBPS\-REPO" "8" "17/10/2011" "\ \&" "\ \&"
.TH "XBPS\-REPO" "8" "28/10/2011" "\ \&" "\ \&"
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
@ -38,6 +38,14 @@ directory to store downloaded binary packages from remote repositories\&. By def
Enables extra debugging output to be shown to stderr.
.RE
.PP
\fB-o\fR \fIkey[,key2...]\fR
.RS 4
Used currently in the
\fIshow\fR
target\&. Prints the value of specified key(s) from package's properties dictionary.
Multiple keys can be specified delimited by the comma character.
.RE
.PP
\fB\-r\fR \fIrootdir\fR
.RS 4
Sets the

View File

@ -56,7 +56,7 @@
#define XBPS_PKGINDEX_VERSION "1.2"
#define XBPS_API_VERSION "20111027-1"
#define XBPS_VERSION "0.10.2"
#define XBPS_VERSION "0.11.0"
/**
* @def XBPS_RELVER