info: clean ups, print triggers (ref #45)
parent
05f016481a
commit
b71606dbf4
209
src/info.c
209
src/info.c
|
@ -23,34 +23,15 @@ struct info_ctx {
|
|||
int subaction_mask;
|
||||
};
|
||||
|
||||
struct info_subaction {
|
||||
int mask;
|
||||
void (*subaction)(struct apk_package *pkg);
|
||||
};
|
||||
|
||||
static void info_print_depends(struct apk_package *pkg);
|
||||
static void info_print_url(struct apk_package *pkg);
|
||||
static void info_print_required_by(struct apk_package *pkg);
|
||||
static void info_print_size(struct apk_package *pkg);
|
||||
static void info_print_contents(struct apk_package *pkg);
|
||||
static void info_print_description(struct apk_package *pkg);
|
||||
|
||||
#define APK_INFO_URL 0x01
|
||||
#define APK_INFO_DEPENDS 0x02
|
||||
#define APK_INFO_RDEPENDS 0x04
|
||||
#define APK_INFO_SIZE 0x08
|
||||
#define APK_INFO_CONTENTS 0x10
|
||||
#define APK_INFO_DESC 0x20
|
||||
|
||||
#define APK_INFO_NUM_SUBACTIONS 6
|
||||
static struct info_subaction info_package_actions[] = {
|
||||
{ APK_INFO_DESC, info_print_description },
|
||||
{ APK_INFO_URL, info_print_url },
|
||||
{ APK_INFO_SIZE, info_print_size },
|
||||
{ APK_INFO_CONTENTS, info_print_contents },
|
||||
{ APK_INFO_DEPENDS, info_print_depends },
|
||||
{ APK_INFO_RDEPENDS, info_print_required_by },
|
||||
};
|
||||
/* These need to stay in sync with the function pointer array in
|
||||
* info_subaction() */
|
||||
#define APK_INFO_DESC 0x01
|
||||
#define APK_INFO_URL 0x02
|
||||
#define APK_INFO_SIZE 0x04
|
||||
#define APK_INFO_DEPENDS 0x08
|
||||
#define APK_INFO_RDEPENDS 0x10
|
||||
#define APK_INFO_CONTENTS 0x20
|
||||
#define APK_INFO_TRIGGERS 0x40
|
||||
|
||||
static void verbose_print_pkg(struct apk_package *pkg, int minimal_verbosity)
|
||||
{
|
||||
|
@ -154,59 +135,31 @@ static int info_who_owns(struct info_ctx *ctx, struct apk_database *db,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void info_subaction(struct info_ctx *ctx, struct apk_package *pkg)
|
||||
static void info_print_description(struct apk_package *pkg)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < APK_INFO_NUM_SUBACTIONS; i++)
|
||||
if (info_package_actions[i].mask & ctx->subaction_mask) {
|
||||
info_package_actions[i].subaction(pkg);
|
||||
puts("");
|
||||
}
|
||||
if (apk_verbosity > 1)
|
||||
printf("%s: %s", pkg->name->name, pkg->description);
|
||||
else
|
||||
printf("%s-%s description:\n%s\n", pkg->name->name,
|
||||
pkg->version, pkg->description);
|
||||
}
|
||||
|
||||
static int info_package(struct info_ctx *ctx, struct apk_database *db,
|
||||
int argc, char **argv)
|
||||
static void info_print_url(struct apk_package *pkg)
|
||||
{
|
||||
struct apk_name *name;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < argc; i++) {
|
||||
name = apk_db_query_name(db, APK_BLOB_STR(argv[i]));
|
||||
if (name == NULL) {
|
||||
apk_error("Not found: %s", name);
|
||||
return 1;
|
||||
}
|
||||
for (j = 0; j < name->pkgs->num; j++) {
|
||||
struct apk_package *pkg = name->pkgs->item[j];
|
||||
if (pkg->ipkg != NULL)
|
||||
info_subaction(ctx, pkg);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
if (apk_verbosity > 1)
|
||||
printf("%s: %s", pkg->name->name, pkg->url);
|
||||
else
|
||||
printf("%s-%s webpage:\n%s\n", pkg->name->name, pkg->version,
|
||||
pkg->url);
|
||||
}
|
||||
|
||||
static void info_print_contents(struct apk_package *pkg)
|
||||
static void info_print_size(struct apk_package *pkg)
|
||||
{
|
||||
struct apk_installed_package *ipkg = pkg->ipkg;
|
||||
struct apk_db_dir_instance *diri;
|
||||
struct apk_db_file *file;
|
||||
struct hlist_node *dc, *dn, *fc, *fn;
|
||||
|
||||
if (ipkg == NULL)
|
||||
return;
|
||||
|
||||
if (apk_verbosity == 1)
|
||||
printf("%s-%s contains:\n", pkg->name->name, pkg->version);
|
||||
|
||||
hlist_for_each_entry_safe(diri, dc, dn, &ipkg->owned_dirs,
|
||||
pkg_dirs_list) {
|
||||
hlist_for_each_entry_safe(file, fc, fn, &diri->owned_files,
|
||||
diri_files_list) {
|
||||
if (apk_verbosity > 1)
|
||||
printf("%s: ", pkg->name->name);
|
||||
printf("%s/%s\n", diri->dir->name, file->name);
|
||||
}
|
||||
}
|
||||
if (apk_verbosity > 1)
|
||||
printf("%s: %zu", pkg->name->name, pkg->installed_size);
|
||||
else
|
||||
printf("%s-%s installed size:\n%zu\n", pkg->name->name, pkg->version,
|
||||
pkg->installed_size);
|
||||
}
|
||||
|
||||
static void info_print_depends(struct apk_package *pkg)
|
||||
|
@ -258,32 +211,88 @@ static void info_print_required_by(struct apk_package *pkg)
|
|||
}
|
||||
}
|
||||
|
||||
static void info_print_url(struct apk_package *pkg)
|
||||
static void info_print_contents(struct apk_package *pkg)
|
||||
{
|
||||
if (apk_verbosity > 1)
|
||||
printf("%s: %s", pkg->name->name, pkg->url);
|
||||
else
|
||||
printf("%s-%s webpage:\n%s\n", pkg->name->name, pkg->version,
|
||||
pkg->url);
|
||||
struct apk_installed_package *ipkg = pkg->ipkg;
|
||||
struct apk_db_dir_instance *diri;
|
||||
struct apk_db_file *file;
|
||||
struct hlist_node *dc, *dn, *fc, *fn;
|
||||
|
||||
if (apk_verbosity == 1)
|
||||
printf("%s-%s contains:\n", pkg->name->name, pkg->version);
|
||||
|
||||
hlist_for_each_entry_safe(diri, dc, dn, &ipkg->owned_dirs,
|
||||
pkg_dirs_list) {
|
||||
hlist_for_each_entry_safe(file, fc, fn, &diri->owned_files,
|
||||
diri_files_list) {
|
||||
if (apk_verbosity > 1)
|
||||
printf("%s: ", pkg->name->name);
|
||||
printf("%s/%s\n", diri->dir->name, file->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void info_print_size(struct apk_package *pkg)
|
||||
static void info_print_triggers(struct apk_package *pkg)
|
||||
{
|
||||
if (apk_verbosity > 1)
|
||||
printf("%s: %zu", pkg->name->name, pkg->installed_size);
|
||||
else
|
||||
printf("%s-%s installed size:\n%zu\n", pkg->name->name, pkg->version,
|
||||
pkg->installed_size);
|
||||
struct apk_installed_package *ipkg = pkg->ipkg;
|
||||
int i;
|
||||
|
||||
if (apk_verbosity == 1)
|
||||
printf("%s-%s triggers:\n", pkg->name->name, pkg->version);
|
||||
|
||||
for (i = 0; ipkg->triggers && i < ipkg->triggers->num; i++) {
|
||||
if (apk_verbosity > 1)
|
||||
printf("%s: trigger ", pkg->name->name);
|
||||
printf("%s\n", ipkg->triggers->item[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void info_print_description(struct apk_package *pkg)
|
||||
static void info_subaction(struct info_ctx *ctx, struct apk_package *pkg)
|
||||
{
|
||||
if (apk_verbosity > 1)
|
||||
printf("%s: %s", pkg->name->name, pkg->description);
|
||||
else
|
||||
printf("%s-%s description:\n%s\n", pkg->name->name,
|
||||
pkg->version, pkg->description);
|
||||
typedef void (*subaction_t)(struct apk_package *);
|
||||
static subaction_t subactions[] = {
|
||||
info_print_description,
|
||||
info_print_url,
|
||||
info_print_size,
|
||||
info_print_depends,
|
||||
info_print_required_by,
|
||||
info_print_contents,
|
||||
info_print_triggers,
|
||||
};
|
||||
const int requireipkg =
|
||||
APK_INFO_CONTENTS | APK_INFO_TRIGGERS | APK_INFO_RDEPENDS;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(subactions); i++) {
|
||||
if (!(BIT(i) & ctx->subaction_mask))
|
||||
continue;
|
||||
|
||||
if (pkg->ipkg == NULL && (BIT(i) & requireipkg))
|
||||
continue;
|
||||
|
||||
subactions[i](pkg);
|
||||
puts("");
|
||||
}
|
||||
}
|
||||
|
||||
static int info_package(struct info_ctx *ctx, struct apk_database *db,
|
||||
int argc, char **argv)
|
||||
{
|
||||
struct apk_name *name;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < argc; i++) {
|
||||
name = apk_db_query_name(db, APK_BLOB_STR(argv[i]));
|
||||
if (name == NULL) {
|
||||
apk_error("Not found: %s", argv[i]);
|
||||
return 1;
|
||||
}
|
||||
for (j = 0; j < name->pkgs->num; j++)
|
||||
info_subaction(ctx, name->pkgs->item[j]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int info_parse(void *ctx, struct apk_db_options *dbopts,
|
||||
int optch, int optindex, const char *optarg)
|
||||
{
|
||||
|
@ -300,9 +309,6 @@ static int info_parse(void *ctx, struct apk_db_options *dbopts,
|
|||
case 'w':
|
||||
ictx->subaction_mask |= APK_INFO_URL;
|
||||
break;
|
||||
case 'L':
|
||||
ictx->subaction_mask |= APK_INFO_CONTENTS;
|
||||
break;
|
||||
case 'R':
|
||||
ictx->subaction_mask |= APK_INFO_DEPENDS;
|
||||
break;
|
||||
|
@ -315,6 +321,15 @@ static int info_parse(void *ctx, struct apk_db_options *dbopts,
|
|||
case 'd':
|
||||
ictx->subaction_mask |= APK_INFO_DESC;
|
||||
break;
|
||||
case 'L':
|
||||
ictx->subaction_mask |= APK_INFO_CONTENTS;
|
||||
break;
|
||||
case 't':
|
||||
ictx->subaction_mask |= APK_INFO_TRIGGERS;
|
||||
break;
|
||||
case 'a':
|
||||
ictx->subaction_mask = 0xffffffff;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
@ -340,13 +355,15 @@ static struct apk_option info_options[] = {
|
|||
{ 'w', "webpage", "Show URL for more information about PACKAGE" },
|
||||
{ 's', "size", "Show installed size of PACKAGE" },
|
||||
{ 'd', "description", "Print description for PACKAGE" },
|
||||
{ 't', "triggers", "Print active triggers of PACKAGE" },
|
||||
{ 'a', "all", "Print all information about PACKAGE" },
|
||||
};
|
||||
|
||||
static struct apk_applet apk_info = {
|
||||
.name = "info",
|
||||
.help = "Give detailed information about PACKAGEs.",
|
||||
.arguments = "PACKAGE...",
|
||||
.open_flags = APK_OPENF_READ | APK_OPENF_NO_REPOS,
|
||||
.open_flags = APK_OPENF_READ,
|
||||
.context_size = sizeof(struct info_ctx),
|
||||
.num_options = ARRAY_SIZE(info_options),
|
||||
.options = info_options,
|
||||
|
|
Loading…
Reference in New Issue