info: option '-r' to print "required by" info

cute-signatures
Timo Teras 2009-04-14 09:35:02 +03:00
parent c11b70c7f0
commit 024480aca0
1 changed files with 71 additions and 43 deletions

View File

@ -17,10 +17,13 @@
#include "apk_state.h"
struct info_ctx {
int (*action)(struct apk_database *db, int argc, char **argv);
int (*action)(struct info_ctx *ctx, struct apk_database *db,
int argc, char **argv);
void (*subaction)(struct apk_package *pkg);
};
static int info_list(struct apk_database *db, int argc, char **argv)
static int info_list(struct info_ctx *ctx, struct apk_database *db,
int argc, char **argv)
{
struct apk_package *pkg;
@ -35,7 +38,8 @@ static int info_list(struct apk_database *db, int argc, char **argv)
return 0;
}
static int info_exists(struct apk_database *db, int argc, char **argv)
static int info_exists(struct info_ctx *ctx, struct apk_database *db,
int argc, char **argv)
{
struct apk_name *name;
int i, j;
@ -56,7 +60,8 @@ static int info_exists(struct apk_database *db, int argc, char **argv)
return 0;
}
static int info_who_owns(struct apk_database *db, int argc, char **argv)
static int info_who_owns(struct info_ctx *ctx, struct apk_database *db,
int argc, char **argv)
{
struct apk_package *pkg;
struct apk_dependency_array *deps = NULL;
@ -88,6 +93,27 @@ static int info_who_owns(struct apk_database *db, int argc, char **argv)
return 0;
}
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", name);
return 1;
}
for (j = 0; j < name->pkgs->num; j++) {
struct apk_package *pkg = name->pkgs->item[j];
if (apk_pkg_get_state(pkg) == APK_STATE_INSTALL)
ctx->subaction(pkg);
}
}
return 0;
}
static void info_print_contents(struct apk_package *pkg)
{
struct apk_db_dir_instance *diri;
@ -109,26 +135,6 @@ static void info_print_contents(struct apk_package *pkg)
puts("");
}
static int info_contents(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", name);
return 1;
}
for (j = 0; j < name->pkgs->num; j++) {
struct apk_package *pkg = name->pkgs->item[j];
if (apk_pkg_get_state(pkg) == APK_STATE_INSTALL)
info_print_contents(pkg);
}
}
return 0;
}
static void info_print_depends(struct apk_package *pkg)
{
int i;
@ -145,27 +151,42 @@ static void info_print_depends(struct apk_package *pkg)
puts("");
}
static int info_depends(struct apk_database *db, int argc, char **argv)
static void info_print_required_by(struct apk_package *pkg)
{
struct apk_name *name;
int i, j;
int i, j, k;
char *separator = apk_verbosity > 1 ? " " : "\n";
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++) {
struct apk_package *pkg = name->pkgs->item[j];
if (apk_pkg_get_state(pkg) == APK_STATE_INSTALL)
info_print_depends(pkg);
if (apk_verbosity == 1)
printf("%s-%s is required by:\n", pkg->name->name, pkg->version);
if (pkg->name->rdepends == NULL)
return;
if (apk_verbosity > 1)
printf("%s: ", pkg->name->name);
for (i = 0; i < pkg->name->rdepends->num; i++) {
struct apk_name *name0 = pkg->name->rdepends->item[i];
/* Check only the package that is installed, and that
* it actually has this package as dependency. */
if (name0->pkgs == NULL)
continue;
for (j = 0; j < name0->pkgs->num; j++) {
struct apk_package *pkg0 = name0->pkgs->item[j];
if (apk_pkg_get_state(pkg0) != APK_STATE_INSTALL ||
pkg0->depends == NULL)
continue;
for (k = 0; k < pkg0->depends->num; k++) {
if (pkg0->depends->item[k].name != pkg->name)
continue;
printf("%s-%s%s", pkg0->name->name,
pkg0->version, separator);
break;
}
}
return 0;
}
puts("");
}
static int info_parse(void *ctx, int optch, int optindex, const char *optarg)
{
struct info_ctx *ictx = (struct info_ctx *) ctx;
@ -178,10 +199,16 @@ static int info_parse(void *ctx, int optch, int optindex, const char *optarg)
ictx->action = info_who_owns;
break;
case 'L':
ictx->action = info_contents;
ictx->action = info_package;
ictx->subaction = info_print_contents;
break;
case 'R':
ictx->action = info_depends;
ictx->action = info_package;
ictx->subaction = info_print_depends;
break;
case 'r':
ictx->action = info_package;
ictx->subaction = info_print_required_by;
break;
default:
return -1;
@ -199,9 +226,9 @@ static int info_main(void *ctx, int argc, char **argv)
return -1;
if (ictx->action != NULL)
r = ictx->action(&db, argc, argv);
r = ictx->action(ictx, &db, argc, argv);
else
r = info_list(&db, argc, argv);
r = info_list(ictx, &db, argc, argv);
apk_db_close(&db);
return r;
@ -212,6 +239,7 @@ static struct option info_options[] = {
{ "installed", no_argument, NULL, 'e' },
{ "who-owns", no_argument, NULL, 'W' },
{ "depends", no_argument, NULL, 'R' },
{ "rdepends", no_argument, NULL, 'r' },
};
static struct apk_applet apk_info = {