Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Dynamically list all options (TODO get the same from plugins)
Baptiste Daroussin committed 13 years ago
commit b356d45503265eda86c483230694c99cdfa36da3
parent 11bbc51
5 files changed +116 -86
modified libpkg/pkg.h
@@ -63,6 +63,7 @@ struct pkg_jobs;
struct pkg_repos;
struct pkg_repos_entry;

+
struct pkg_config;
struct pkg_config_kv;
struct pkg_config_value;

@@ -286,6 +287,14 @@ typedef enum _pkg_stats_t {
	PKG_STATS_REMOTE_REPOS,
} pkg_stats_t;

+
typedef enum {
+
	PKG_CONFIG_STRING=0,
+
	PKG_CONFIG_BOOL,
+
	PKG_CONFIG_KVLIST,
+
	PKG_CONFIG_INTEGER,
+
	PKG_CONFIG_LIST
+
} pkg_config_t;
+

/**
 * Keys for accessing pkg plugin data
 */
@@ -956,6 +965,10 @@ int pkg_config_list(pkg_config_key key, struct pkg_config_value **v);
const char *pkg_config_kv_get(struct pkg_config_kv *kv, pkg_config_kv_t type);
const char *pkg_config_value(struct pkg_config_value *v);
int pkg_config_int64(pkg_config_key key, int64_t *value);
+
int pkg_configs(struct pkg_config **c);
+
int pkg_config_id(struct pkg_config *c);
+
int pkg_config_type(struct pkg_config *c);
+
const char *pkg_config_name(struct pkg_config *c);

/**
 * @todo Document
modified libpkg/pkg_config.c
@@ -55,117 +55,117 @@ static struct pkg_config *config_by_key = NULL;

static struct config_entry c[] = {
	[PKG_CONFIG_REPO] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PACKAGESITE",
		NULL,
	},
	[PKG_CONFIG_DBDIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PKG_DBDIR",
		"/var/db/pkg",
	},
	[PKG_CONFIG_CACHEDIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PKG_CACHEDIR",
		"/var/cache/pkg",
	},
	[PKG_CONFIG_PORTSDIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PORTSDIR",
		"/usr/ports",
	},
	[PKG_CONFIG_REPOKEY] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PUBKEY",
		NULL,
	},
	[PKG_CONFIG_MULTIREPOS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"PKG_MULTIREPOS",
		NULL,
	},
	[PKG_CONFIG_HANDLE_RC_SCRIPTS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"HANDLE_RC_SCRIPTS",
		NULL,
	},
	[PKG_CONFIG_ASSUME_ALWAYS_YES] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"ASSUME_ALWAYS_YES",
		NULL,
	},
	[PKG_CONFIG_REPOS] = {
-
		CONF_KVLIST,
+
		PKG_CONFIG_KVLIST,
		"REPOS",
		"NULL",
	},
	[PKG_CONFIG_PLIST_KEYWORDS_DIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PLIST_KEYWORDS_DIR",
		NULL,
	},
	[PKG_CONFIG_SYSLOG] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"SYSLOG",
		"YES",
	},
	[PKG_CONFIG_SHLIBS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"SHLIBS",
		"NO",
	},
	[PKG_CONFIG_AUTODEPS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"AUTODEPS",
		"NO",
	},
	[PKG_CONFIG_ABI] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"ABI",
		myabi,
	},
	[PKG_CONFIG_DEVELOPER_MODE] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"DEVELOPER_MODE",
		"NO",
	},
	[PKG_CONFIG_PORTAUDIT_SITE] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PORTAUDIT_SITE",
		"http://portaudit.FreeBSD.org/auditfile.tbz",
	},
	[PKG_CONFIG_SRV_MIRROR] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"SRV_MIRRORS",
		"YES",
	},
	[PKG_CONFIG_FETCH_RETRY] = {
-
		CONF_INTEGER,
+
		PKG_CONFIG_INTEGER,
		"FETCH_RETRY",
		"3",
	},
	[PKG_CONFIG_PLUGINS_DIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PKG_PLUGINS_DIR",
		PREFIX"/lib/pkg/",
	},
	[PKG_CONFIG_ENABLE_PLUGINS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"PKG_ENABLE_PLUGINS",
		"YES",
	},
	[PKG_CONFIG_PLUGINS] = {
-
		CONF_LIST,
+
		PKG_CONFIG_LIST,
		"PLUGINS",
		"NULL",
	},
	[PKG_CONFIG_DEBUG_SCRIPTS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"DEBUG_SCRIPTS",
		"NO",
	},
	[PKG_CONFIG_PLUGINS_CONF_DIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PLUGINS_CONF_DIR",
		PREFIX"/etc/pkg/",
	},
@@ -257,7 +257,7 @@ pkg_config_parse(yaml_document_t *doc, yaml_node_t *node, struct pkg_config *con
		HASH_FIND(hhkey, conf_by_key, sbuf_data(b), sbuf_len(b), conf);
		if (conf != NULL) {
			switch (conf->type) {
-
			case CONF_STRING:
+
			case PKG_CONFIG_STRING:
				if (val->type != YAML_SCALAR_NODE) {
					pkg_emit_error("Expecting a string for key %s,"
					    " ignoring...", key->data.scalar.value);
@@ -268,7 +268,7 @@ pkg_config_parse(yaml_document_t *doc, yaml_node_t *node, struct pkg_config *con
					conf->string = strdup(val->data.scalar.value);
				}
				break;
-
			case CONF_INTEGER:
+
			case PKG_CONFIG_INTEGER:
				if (val->type != YAML_SCALAR_NODE) {
					pkg_emit_error("Expecting an integer for key %s,"
					    " ignoring...", key->data.scalar.value);
@@ -283,7 +283,7 @@ pkg_config_parse(yaml_document_t *doc, yaml_node_t *node, struct pkg_config *con
					conf->integer = newint;
				}
				break;
-
			case CONF_BOOL:
+
			case PKG_CONFIG_BOOL:
				if (val->type != YAML_SCALAR_NODE) {
					pkg_emit_error("Expecting an integer for key %s,"
					    " ignoring...", key->data.scalar.value);
@@ -301,14 +301,14 @@ pkg_config_parse(yaml_document_t *doc, yaml_node_t *node, struct pkg_config *con
					}
				}
				break;
-
			case CONF_KVLIST:
+
			case PKG_CONFIG_KVLIST:
				if (val->type != YAML_MAPPING_NODE) {
					pkg_emit_error("Expecting a key/value list for key %s,"
					    " ignoring...", key->data.scalar.value);
				}
				parse_config_mapping(doc, val, conf);
				break;
-
			case CONF_LIST:
+
			case PKG_CONFIG_LIST:
				if (val->type != YAML_SEQUENCE_NODE) {
					pkg_emit_error("Expecting a string list for key %s,"
					    " ignoring...", key->data.scalar.value);
@@ -434,7 +434,7 @@ pkg_config_kvlist(pkg_config_key key, struct pkg_config_kv **kv)
	if (conf == NULL)
		return (EPKG_FATAL);

-
	if (conf->type != CONF_KVLIST) {
+
	if (conf->type != PKG_CONFIG_KVLIST) {
		pkg_emit_error("this config entry is not a \"key: value\" list");
		return (EPKG_FATAL);
	}
@@ -464,7 +464,7 @@ pkg_config_list(pkg_config_key key, struct pkg_config_value **v)
	if (conf == NULL)
		return (EPKG_FATAL);

-
	if (conf->type != CONF_LIST) {
+
	if (conf->type != PKG_CONFIG_LIST) {
		pkg_emit_error("this config entry is not a list");
		return (EPKG_FATAL);
	}
@@ -553,7 +553,7 @@ pkg_init(const char *path)
		val = getenv(c[i].key);

		switch (c[i].type) {
-
		case CONF_STRING:
+
		case PKG_CONFIG_STRING:
			if (val != NULL) {
				conf->string = strdup(val);
				conf->fromenv = true;
@@ -563,7 +563,7 @@ pkg_init(const char *path)
			else
				conf->string = NULL;
			break;
-
		case CONF_INTEGER:
+
		case PKG_CONFIG_INTEGER:
			if (val == NULL)
				val = c[i].def;
			else
@@ -575,7 +575,7 @@ pkg_init(const char *path)
				return (EPKG_FATAL);
			}
			break;
-
		case CONF_BOOL:
+
		case PKG_CONFIG_BOOL:
			if (val == NULL)
				val = c[i].def;
			else
@@ -590,10 +590,10 @@ pkg_init(const char *path)
				conf->boolean = false;
			}
			break;
-
		case CONF_KVLIST:
+
		case PKG_CONFIG_KVLIST:
			STAILQ_INIT(&conf->kvlist);
			break;
-
		case CONF_LIST:
+
		case PKG_CONFIG_LIST:
			STAILQ_INIT(&conf->list);
			break;
		}
@@ -649,9 +649,9 @@ pkg_config_free(struct pkg_config *conf)
	if (conf == NULL)
		return;

-
	if (conf->type == CONF_STRING)
+
	if (conf->type == PKG_CONFIG_STRING)
		free(conf->string);
-
	else if (conf->type == CONF_KVLIST) {
+
	else if (conf->type == PKG_CONFIG_KVLIST) {
		while (!STAILQ_EMPTY(&conf->kvlist)) {
			k = STAILQ_FIRST(&conf->kvlist);
			free(k->key);
@@ -659,7 +659,7 @@ pkg_config_free(struct pkg_config *conf)
			STAILQ_REMOVE_HEAD(&conf->kvlist, next);
			free(k);
		}
-
	} else if (conf->type == CONF_LIST) {
+
	} else if (conf->type == PKG_CONFIG_LIST) {
		while (!STAILQ_EMPTY(&conf->kvlist)) {
			v = STAILQ_FIRST(&conf->list);
			free(v->value);
@@ -672,6 +672,30 @@ pkg_config_free(struct pkg_config *conf)
}

int
+
pkg_config_id(struct pkg_config *conf)
+
{
+
	return (conf->id);
+
}
+

+
int
+
pkg_config_type(struct pkg_config *conf)
+
{
+
	return (conf->type);
+
}
+

+
const char *
+
pkg_config_name(struct pkg_config *conf)
+
{
+
	return (conf->key);
+
}
+

+
int
+
pkg_configs(struct pkg_config **conf)
+
{
+
	HASH_NEXT(config, (*conf));
+
}
+

+
int
pkg_shutdown(void)
{
	if (parsed == true) {
modified libpkg/plugins.c
@@ -191,7 +191,7 @@ pkg_plugin_conf_add_string(struct pkg_plugin *p, int id, const char *key, const
	conf = malloc(sizeof(struct pkg_config));
	conf->id = id;
	conf->key = key;
-
	conf->type = CONF_STRING;
+
	conf->type = PKG_CONFIG_STRING;
	conf->fromenv = false;
	val = getenv(key);
	if (val != NULL) {
@@ -231,7 +231,7 @@ pkg_plugin_conf_add_bool(struct pkg_plugin *p, int id, const char *key, bool boo
	conf = malloc(sizeof(struct pkg_config));
	conf->id = id;
	conf->key = key;
-
	conf->type = CONF_STRING;
+
	conf->type = PKG_CONFIG_STRING;
	conf->fromenv = false;
	val = getenv(key);
	if (val != NULL) {
@@ -278,7 +278,7 @@ pkg_plugin_conf_add_integer(struct pkg_plugin *p, int id, const char *key, int64
	conf = malloc(sizeof(struct pkg_config));
	conf->id = id;
	conf->key = key;
-
	conf->type = CONF_STRING;
+
	conf->type = PKG_CONFIG_STRING;
	conf->fromenv = false;
	val = getenv(key);
	if (val != NULL) {
@@ -320,7 +320,7 @@ pkg_plugin_conf_add_kvlist(struct pkg_plugin *p, int id, const char *key)
	conf = malloc(sizeof(struct pkg_config));
	conf->id = id;
	conf->key = key;
-
	conf->type = CONF_KVLIST;
+
	conf->type = PKG_CONFIG_KVLIST;
	STAILQ_INIT(&conf->kvlist);

	HASH_ADD_INT(p->conf, id, conf);
@@ -350,7 +350,7 @@ pkg_plugin_conf_add_list(struct pkg_plugin *p, int id, const char *key)
	conf = malloc(sizeof(struct pkg_config));
	conf->id = id;
	conf->key = key;
-
	conf->type = CONF_LIST;
+
	conf->type = PKG_CONFIG_LIST;
	STAILQ_INIT(&conf->list);

	HASH_ADD_INT(p->conf, id, conf);
@@ -495,7 +495,7 @@ pkg_plugin_conf_kvlist(struct pkg_plugin *p, int key, struct pkg_config_kv **kv)
	if (conf == NULL)
		return (EPKG_FATAL);

-
	if (conf->type != CONF_KVLIST) {
+
	if (conf->type != PKG_CONFIG_KVLIST) {
		pkg_emit_error("this config entry is not a \"key: value\" list");
		return (EPKG_FATAL);
	}
@@ -525,7 +525,7 @@ pkg_plugin_conf_list(struct pkg_plugin *p, int key, struct pkg_config_value **v)
	if (conf == NULL)
		return (EPKG_FATAL);

-
	if (conf->type != CONF_LIST) {
+
	if (conf->type != PKG_CONFIG_LIST) {
		pkg_emit_error("this config entry is not a list");
		return (EPKG_FATAL);
	}
modified libpkg/private/pkg.h
@@ -162,14 +162,6 @@ typedef enum _pkg_job_flags {
	PKG_JOB_FLAGS_DRY_RUN =	(1 << 1),
} pkg_job_flags;

-
enum {
-
	CONF_STRING=0,
-
	CONF_BOOL,
-
	CONF_KVLIST,
-
	CONF_INTEGER,
-
	CONF_LIST
-
};
-

struct pkg_jobs_node {
	struct pkg	*pkg;
	size_t		 nrefs;
modified pkg/main.c
@@ -34,6 +34,7 @@

#include <assert.h>
#include <err.h>
+
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -205,8 +206,12 @@ main(int argc, char **argv)
	const char *buf = NULL;
	bool b, plugins_enabled = false;
	struct pkg_config_kv *kv = NULL;
+
	struct pkg_config_value *list = NULL;
	struct plugcmd *c;
	struct pkg_plugin *p = NULL;
+
	struct pkg_config *conf = NULL;
+
	const char *configname = NULL;
+
	int64_t integer = 0;

	/* Set stdout unbuffered */
        setvbuf(stdout, NULL, _IONBF, 0);
@@ -293,40 +298,36 @@ main(int argc, char **argv)

	if (version > 1) {
		printf("version: "PKGVERSION""GITHASH"\n");
-
		pkg_config_string(PKG_CONFIG_ABI, &buf);
-
		printf("abi: %s\n", buf);
-
		pkg_config_string(PKG_CONFIG_DBDIR, &buf);
-
		printf("db dir: %s\n", buf);
-
		pkg_config_string(PKG_CONFIG_CACHEDIR, &buf);
-
		printf("cache dir: %s\n", buf);
-
		pkg_config_string(PKG_CONFIG_PORTSDIR, &buf);
-
		printf("ports dir: %s\n", buf);
-
		pkg_config_bool(PKG_CONFIG_SYSLOG, &b);
-
		printf("Log into syslog: %s\n", b ? "yes": "no");
-
		pkg_config_bool(PKG_CONFIG_ASSUME_ALWAYS_YES, &b);
-
		printf("Assume always yes: %s\n", b ? "yes" : "no");
-
		if (version > 2) {
-
			pkg_config_bool(PKG_CONFIG_HANDLE_RC_SCRIPTS, &b);
-
			printf("Handle rc scripts: %s\n", b ? "yes" : "no");
-
			pkg_config_bool(PKG_CONFIG_SHLIBS, &b);
-
			printf("Track shlibs: %s\n", b ? "yes" : "no");
-
			pkg_config_bool(PKG_CONFIG_AUTODEPS, &b);
-
			printf("Automatic dependency tracking: %s\n", b ? "yes": "no");
-
			pkg_config_string(PKG_CONFIG_PLIST_KEYWORDS_DIR, &buf);
-
			printf("Custom keywords directory: %s\n", buf ? buf : "none");
-
			pkg_config_bool(PKG_CONFIG_DEVELOPER_MODE, &b);
-
			printf("Developer mode: %s\n", b ? "yes" : "no");
-
		}
-
		pkg_config_bool(PKG_CONFIG_MULTIREPOS, &b);
-
		if (b) {
-
			printf("Repositories:\n");
-
			while (pkg_config_kvlist(PKG_CONFIG_REPOS, &kv) == EPKG_OK) {
-
				printf("             - %s: %s\n", pkg_config_kv_get(kv, PKG_CONFIG_KV_KEY),
-
				    pkg_config_kv_get(kv, PKG_CONFIG_KV_VALUE));
+
		while (pkg_configs(&conf) == EPKG_OK) {
+
			configname = pkg_config_name(conf);
+
			switch (pkg_config_type(conf)) {
+
			case PKG_CONFIG_STRING:
+
				pkg_config_string(pkg_config_id(conf), &buf);
+
				if (buf == NULL)
+
					buf = "";
+
				printf("%s: %s\n", configname, buf);
+
				break;
+
			case PKG_CONFIG_BOOL:
+
				pkg_config_bool(pkg_config_id(conf), &b);
+
				printf("%s: %s\n", configname, b ? "yes": "no");
+
				break;
+
			case PKG_CONFIG_INTEGER:
+
				pkg_config_int64(pkg_config_id(conf), &integer);
+
				printf("%s: %"PRId64"\n", configname, integer);
+
				break;
+
			case PKG_CONFIG_KVLIST:
+
				printf("%s:\n", configname);
+
				while (pkg_config_kvlist(pkg_config_id(conf), &kv) == EPKG_OK) {
+
					printf("\t- %s: %s\n", pkg_config_kv_get(kv, PKG_CONFIG_KV_KEY),
+
					    pkg_config_kv_get(kv, PKG_CONFIG_KV_VALUE));
+
				}
+
				break;
+
			case PKG_CONFIG_LIST:
+
				printf("%s:\n", configname);
+
				while (pkg_config_list(pkg_config_id(conf), &list) == EPKG_OK) {
+
					printf("\t- %s\n", pkg_config_value(list));
+
				}
			}
-
		} else {
-
			pkg_config_string(PKG_CONFIG_REPO, &buf);
-
			printf("Repository: %s\n", buf ? buf : "none");
		}
		pkg_shutdown();
		pkg_plugins_shutdown();