Created search applet
parent
e93cb1ffe5
commit
57391d1e4c
|
@ -26,6 +26,7 @@ apk_OBJS = \
|
||||||
ver.o \
|
ver.o \
|
||||||
index.o \
|
index.o \
|
||||||
info.o \
|
info.o \
|
||||||
|
search.o \
|
||||||
audit.o \
|
audit.o \
|
||||||
apk.o
|
apk.o
|
||||||
|
|
||||||
|
|
30
src/info.c
30
src/info.c
|
@ -35,30 +35,6 @@ static int info_list(struct apk_database *db, int argc, char **argv)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int info_repo_pkgs_print(apk_hash_item item, void *ctx)
|
|
||||||
{
|
|
||||||
struct apk_database *db = (struct apk_database *) ctx;
|
|
||||||
struct apk_package *pkg = (struct apk_package *) item;
|
|
||||||
|
|
||||||
printf("%s", pkg->name->name);
|
|
||||||
if (apk_verbosity > 0)
|
|
||||||
printf("-%s", pkg->version);
|
|
||||||
if (apk_verbosity > 1) {
|
|
||||||
printf("\n\t%s", db->repos[pkg->repos].url);
|
|
||||||
printf("\n\t%s", pkg->description);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int info_repo_pkgs(struct apk_database *db, int argc, char **argv)
|
|
||||||
{
|
|
||||||
apk_hash_foreach(&db->available.packages, info_repo_pkgs_print, db);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int info_exists(struct apk_database *db, int argc, char **argv)
|
static int info_exists(struct apk_database *db, int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct apk_name *name;
|
struct apk_name *name;
|
||||||
|
@ -207,9 +183,6 @@ static int info_parse(void *ctx, int optch, int optindex, const char *optarg)
|
||||||
case 'R':
|
case 'R':
|
||||||
ictx->action = info_depends;
|
ictx->action = info_depends;
|
||||||
break;
|
break;
|
||||||
case 'o':
|
|
||||||
ictx->action = info_repo_pkgs;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -239,12 +212,11 @@ static struct option info_options[] = {
|
||||||
{ "installed", no_argument, NULL, 'e' },
|
{ "installed", no_argument, NULL, 'e' },
|
||||||
{ "who-owns", no_argument, NULL, 'W' },
|
{ "who-owns", no_argument, NULL, 'W' },
|
||||||
{ "depends", no_argument, NULL, 'R' },
|
{ "depends", no_argument, NULL, 'R' },
|
||||||
{ "repo-pkgs", no_argument, NULL, 'o' },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct apk_applet apk_info = {
|
static struct apk_applet apk_info = {
|
||||||
.name = "info",
|
.name = "info",
|
||||||
.usage = "[--repo-pkgs|-o]",
|
.usage = "",
|
||||||
.context_size = sizeof(struct info_ctx),
|
.context_size = sizeof(struct info_ctx),
|
||||||
.num_options = ARRAY_SIZE(info_options),
|
.num_options = ARRAY_SIZE(info_options),
|
||||||
.options = info_options,
|
.options = info_options,
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
/* info.c - Alpine Package Keeper (APK)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005-2009 Natanael Copa <n@tanael.org>
|
||||||
|
* Copyright (C) 2009 Timo Teräs <timo.teras@iki.fi>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 as published
|
||||||
|
* by the Free Software Foundation. See http://www.gnu.org/ for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "apk_defines.h"
|
||||||
|
#include "apk_applet.h"
|
||||||
|
#include "apk_package.h"
|
||||||
|
#include "apk_database.h"
|
||||||
|
#include "apk_state.h"
|
||||||
|
|
||||||
|
struct search_ctx {
|
||||||
|
int (*action)(struct apk_database *db, int argc, char **argv);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct search_query_ctx {
|
||||||
|
struct apk_database *db;
|
||||||
|
const char *query;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int search_list_print(apk_hash_item item, void *ctx)
|
||||||
|
{
|
||||||
|
//struct apk_database *db = (struct apk_database *) ctx;
|
||||||
|
struct apk_package *pkg = (struct apk_package *) item;
|
||||||
|
|
||||||
|
printf("%s", pkg->name->name);
|
||||||
|
if (apk_verbosity > 0)
|
||||||
|
printf("-%s", pkg->version);
|
||||||
|
if (apk_verbosity > 1) {
|
||||||
|
printf(" - %s", pkg->description);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int search_query_print(apk_hash_item item, void *ctx)
|
||||||
|
{
|
||||||
|
struct search_query_ctx *ictx = (struct search_query_ctx *) ctx;
|
||||||
|
struct apk_package *pkg = (struct apk_package *) item;
|
||||||
|
|
||||||
|
if( strstr(pkg->name->name, ictx->query) == NULL )
|
||||||
|
return 0;
|
||||||
|
search_list_print(item, ictx->db);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int search_list(struct apk_database *db, int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct search_query_ctx ctx;
|
||||||
|
|
||||||
|
ctx.db = db;
|
||||||
|
|
||||||
|
if (argc == 0)
|
||||||
|
apk_hash_foreach(&db->available.packages, search_list_print, db);
|
||||||
|
else
|
||||||
|
for (i=0; i<argc; i++) {
|
||||||
|
ctx.query = argv[i];
|
||||||
|
apk_hash_foreach(&db->available.packages, search_query_print, &ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int search_query_desc_print(apk_hash_item item, void *ctx)
|
||||||
|
{
|
||||||
|
struct search_query_ctx *ictx = (struct search_query_ctx *) ctx;
|
||||||
|
struct apk_package *pkg = (struct apk_package *) item;
|
||||||
|
|
||||||
|
if( strstr(pkg->description, ictx->query) == NULL )
|
||||||
|
return 0;
|
||||||
|
search_list_print(item, ictx->db);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int search_desc(struct apk_database *db, int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct search_query_ctx ctx;
|
||||||
|
|
||||||
|
ctx.db = db;
|
||||||
|
|
||||||
|
for (i=0; i<argc; i++) {
|
||||||
|
ctx.query = argv[i];
|
||||||
|
apk_hash_foreach(&db->available.packages, search_query_desc_print, &ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int search_parse(void *ctx, int optch, int optindex, const char *optarg)
|
||||||
|
{
|
||||||
|
struct search_ctx *ictx = (struct search_ctx *) ctx;
|
||||||
|
|
||||||
|
switch (optch) {
|
||||||
|
case 'd':
|
||||||
|
ictx->action = search_desc;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int search_main(void *ctx, int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct search_ctx *ictx = (struct search_ctx *) ctx;
|
||||||
|
struct apk_database db;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (apk_db_open(&db, apk_root, APK_OPENF_READ) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (ictx->action != NULL)
|
||||||
|
r = ictx->action(&db, argc, argv);
|
||||||
|
else
|
||||||
|
r = search_list(&db, argc, argv);
|
||||||
|
|
||||||
|
apk_db_close(&db);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct option search_options[] = {
|
||||||
|
{ "description", no_argument, NULL, 'd' },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct apk_applet apk_search = {
|
||||||
|
.name = "search",
|
||||||
|
.usage = "[--description|-d] [search_pattern]",
|
||||||
|
.context_size = sizeof(struct search_ctx),
|
||||||
|
.num_options = ARRAY_SIZE(search_options),
|
||||||
|
.options = search_options,
|
||||||
|
.parse = search_parse,
|
||||||
|
.main = search_main,
|
||||||
|
};
|
||||||
|
|
||||||
|
APK_DEFINE_APPLET(apk_search);
|
||||||
|
|
Loading…
Reference in New Issue