diff options
-rw-r--r-- | src/apk_database.h | 1 | ||||
-rw-r--r-- | src/database.c | 2 | ||||
-rw-r--r-- | src/index.c | 65 |
3 files changed, 63 insertions, 5 deletions
diff --git a/src/apk_database.h b/src/apk_database.h index e7bfac9..0a0e52d 100644 --- a/src/apk_database.h +++ b/src/apk_database.h @@ -123,6 +123,7 @@ struct apk_package *apk_db_pkg_add_file(struct apk_database *db, const char *fil struct apk_package *apk_db_get_pkg(struct apk_database *db, csum_t sum); struct apk_package *apk_db_get_file_owner(struct apk_database *db, apk_blob_t filename); +int apk_db_index_read(struct apk_database *db, struct apk_istream *is, int repo); int apk_db_index_write(struct apk_database *db, struct apk_ostream *os); int apk_db_add_repository(apk_database_t db, apk_blob_t repository); diff --git a/src/database.c b/src/database.c index 4da547d..e91c64a 100644 --- a/src/database.c +++ b/src/database.c @@ -370,7 +370,7 @@ static struct apk_package *apk_db_pkg_add(struct apk_database *db, struct apk_pa return idb; } -static int apk_db_index_read(struct apk_database *db, struct apk_istream *is, int repo) +int apk_db_index_read(struct apk_database *db, struct apk_istream *is, int repo) { struct apk_package *pkg = NULL; struct apk_db_dir_instance *diri = NULL; diff --git a/src/index.c b/src/index.c index 08fc342..e906ab4 100644 --- a/src/index.c +++ b/src/index.c @@ -19,6 +19,40 @@ struct counts { int unsatisfied; }; +struct index_ctx { + const char *index_file; + int delete; +}; + +static int index_parse(void *ctx, int optch, int optindex, const char *optarg) +{ + struct index_ctx *ictx = (struct index_ctx *) ctx; + + switch (optch) { + case 'd': + ictx->index_file = optarg; + ictx->delete = 1; + break; + default: + return -1; + } + return 0; +} + +static int index_read_file(struct apk_database *db, struct index_ctx *ictx) +{ + struct apk_istream *is; + int r; + if (ictx->index_file == NULL) + return 0; + is = apk_bstream_gunzip(apk_bstream_from_url(ictx->index_file), 1); + if (is == NULL) + return -1; + r = apk_db_index_read(db, is, -1); + is->close(is); + return r; +} + static int warn_if_no_providers(apk_hash_item item, void *ctx) { struct counts *counts = (struct counts *) ctx; @@ -42,11 +76,26 @@ static int index_main(void *ctx, int argc, char **argv) struct apk_database db; struct counts counts = {0}; struct apk_ostream *os; - int total, i; + int total, i, j; + struct index_ctx *ictx = (struct index_ctx *) ctx; apk_db_open(&db, NULL, APK_OPENF_READ); - for (i = 0; i < argc; i++) - apk_db_pkg_add_file(&db, argv[i]); + index_read_file(&db, ictx); + + for (i = 0; i < argc; i++) { + if (ictx->delete) { + struct apk_name *name; + name = apk_db_query_name(&db, APK_BLOB_STR(argv[i])); + if (name == NULL) + continue; + /* apk_db_index_write() will only print the pkgs + where repos == 0. We prevent to write the given + packages by setting repos to non-zero */ + for (j = 0; j < name->pkgs->num; j++) + name->pkgs->item[j]->repos = -1; + } else + apk_db_pkg_add_file(&db, argv[i]); + } os = apk_ostream_to_fd(STDOUT_FILENO); total = apk_db_index_write(&db, os); @@ -64,9 +113,17 @@ static int index_main(void *ctx, int argc, char **argv) return 0; } +static struct option index_options[] = { + { "delete", required_argument, NULL, 'd' }, +}; + static struct apk_applet apk_index = { .name = "index", - .usage = "apkname...", + .usage = "[-d indexfile] apkname...", + .context_size = sizeof(struct index_ctx), + .num_options = ARRAY_SIZE(index_options), + .options = index_options, + .parse = index_parse, .main = index_main, }; |