diff options
-rw-r--r-- | doc/apk.8.scd | 13 | ||||
-rw-r--r-- | src/apk.c | 37 | ||||
-rw-r--r-- | src/apk_applet.h | 2 | ||||
-rw-r--r-- | src/apk_database.h | 1 | ||||
-rw-r--r-- | src/app_dot.c | 2 | ||||
-rw-r--r-- | src/app_fetch.c | 2 | ||||
-rw-r--r-- | src/app_info.c | 2 | ||||
-rw-r--r-- | src/app_list.c | 2 | ||||
-rw-r--r-- | src/app_search.c | 2 | ||||
-rw-r--r-- | src/database.c | 4 |
10 files changed, 59 insertions, 8 deletions
diff --git a/doc/apk.8.scd b/doc/apk.8.scd index 23d091c..009f845 100644 --- a/doc/apk.8.scd +++ b/doc/apk.8.scd @@ -55,7 +55,7 @@ Each command is documented in detail on its manual page. |[ *apk-index*(8) :< Create repository index file from packages | *apk-fetch*(8) -: Download packages from global repositories to a local directory +: Download packages from repositories to a local directory | *apk-manifest*(8) : Show checksums of package contents | *apk-verify*(8) @@ -205,6 +205,17 @@ The following options are available for all commands which commit the database. force options to minimize failure, and disables commit hooks, among other features. + +# SOURCE OPTIONS + +The following options are available for all commands which operate on the +package indexes only. + +*--from* _FROMSPEC_ + Search packages from: *system* (all system sources), *repositories* + (exclude installed database), *installed* (exclude normal repositories) + or *none* (commandline repositories only). + # NOTES This apk has coffee making abilities. @@ -284,6 +284,43 @@ const struct apk_option_group optgroup_commit = { .parse = option_parse_commit, }; +#define SOURCE_OPTIONS(OPT) \ + OPT(OPT_SOURCE_from, APK_OPT_ARG "from") + +APK_OPT_GROUP(optiondesc_source, "Source", SOURCE_OPTIONS); + +static int option_parse_source(void *ctx, struct apk_db_options *dbopts, int opt, const char *optarg) +{ + const unsigned long all_flags = APK_OPENF_NO_SYS_REPOS | APK_OPENF_NO_INSTALLED_REPO | APK_OPENF_NO_INSTALLED; + unsigned long flags; + + switch (opt) { + case OPT_SOURCE_from: + if (strcmp(optarg, "none") == 0) { + flags = APK_OPENF_NO_SYS_REPOS | APK_OPENF_NO_INSTALLED_REPO | APK_OPENF_NO_INSTALLED; + } else if (strcmp(optarg, "repositories") == 0) { + flags = APK_OPENF_NO_INSTALLED_REPO | APK_OPENF_NO_INSTALLED; + } else if (strcmp(optarg, "installed") == 0) { + flags = APK_OPENF_NO_SYS_REPOS; + } else if (strcmp(optarg, "system") == 0) { + flags = 0; + } else + return -ENOTSUP; + + dbopts->open_flags &= ~all_flags; + dbopts->open_flags |= flags; + break; + default: + return -ENOTSUP; + } + return 0; +} + +const struct apk_option_group optgroup_source = { + .desc = optiondesc_source, + .parse = option_parse_source, +}; + static int usage(struct apk_applet *applet) { version(); diff --git a/src/apk_applet.h b/src/apk_applet.h index 0ae33b4..1e5b74f 100644 --- a/src/apk_applet.h +++ b/src/apk_applet.h @@ -61,7 +61,7 @@ struct apk_applet { int (*main)(void *ctx, struct apk_database *db, struct apk_string_array *args); }; -extern const struct apk_option_group optgroup_global, optgroup_commit; +extern const struct apk_option_group optgroup_global, optgroup_commit, optgroup_source; void apk_applet_register(struct apk_applet *); struct apk_applet *apk_applet_find(const char *name); diff --git a/src/apk_database.h b/src/apk_database.h index 5818eb4..f70ae1c 100644 --- a/src/apk_database.h +++ b/src/apk_database.h @@ -229,6 +229,7 @@ struct apk_db_file *apk_db_file_query(struct apk_database *db, #define APK_OPENF_NO_INSTALLED_REPO 0x0200 #define APK_OPENF_CACHE_WRITE 0x0400 #define APK_OPENF_NO_AUTOUPDATE 0x0800 +#define APK_OPENF_NO_CMDLINE_REPOS 0x1000 #define APK_OPENF_NO_REPOS (APK_OPENF_NO_SYS_REPOS | \ APK_OPENF_NO_INSTALLED_REPO) diff --git a/src/app_dot.c b/src/app_dot.c index 64c3f87..6f63bd9 100644 --- a/src/app_dot.c +++ b/src/app_dot.c @@ -162,7 +162,7 @@ static struct apk_applet apk_dot = { .name = "dot", .open_flags = APK_OPENF_READ | APK_OPENF_NO_STATE, .context_size = sizeof(struct dot_ctx), - .optgroups = { &optgroup_global, &optgroup_applet }, + .optgroups = { &optgroup_global, &optgroup_source, &optgroup_applet }, .main = dot_main, }; diff --git a/src/app_fetch.c b/src/app_fetch.c index 6b40786..11602c1 100644 --- a/src/app_fetch.c +++ b/src/app_fetch.c @@ -392,7 +392,7 @@ static struct apk_applet apk_fetch = { .name = "fetch", .open_flags = APK_OPENF_READ | APK_OPENF_NO_STATE, .context_size = sizeof(struct fetch_ctx), - .optgroups = { &optgroup_global, &optgroup_applet }, + .optgroups = { &optgroup_global, &optgroup_source, &optgroup_applet }, .main = fetch_main, }; diff --git a/src/app_info.c b/src/app_info.c index cf7f58f..8ba0c10 100644 --- a/src/app_info.c +++ b/src/app_info.c @@ -473,7 +473,7 @@ static struct apk_applet apk_info = { .name = "info", .open_flags = APK_OPENF_READ, .context_size = sizeof(struct info_ctx), - .optgroups = { &optgroup_global, &optgroup_applet }, + .optgroups = { &optgroup_global, &optgroup_source, &optgroup_applet }, .main = info_main, }; diff --git a/src/app_list.c b/src/app_list.c index fed9aa9..d3848ec 100644 --- a/src/app_list.c +++ b/src/app_list.c @@ -248,7 +248,7 @@ static struct apk_applet apk_list = { .name = "list", .open_flags = APK_OPENF_READ, .context_size = sizeof(struct list_ctx), - .optgroups = { &optgroup_global, &optgroup_applet }, + .optgroups = { &optgroup_global, &optgroup_source, &optgroup_applet }, .main = list_main, }; diff --git a/src/app_search.c b/src/app_search.c index db4c398..a3f38e3 100644 --- a/src/app_search.c +++ b/src/app_search.c @@ -195,7 +195,7 @@ static struct apk_applet apk_search = { .name = "search", .open_flags = APK_OPENF_READ | APK_OPENF_NO_STATE, .context_size = sizeof(struct search_ctx), - .optgroups = { &optgroup_global, &optgroup_applet }, + .optgroups = { &optgroup_global, &optgroup_source, &optgroup_applet }, .main = search_main, }; diff --git a/src/database.c b/src/database.c index 58c00d4..3b5bc38 100644 --- a/src/database.c +++ b/src/database.c @@ -1726,10 +1726,12 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts) } } - if (!(dbopts->open_flags & APK_OPENF_NO_SYS_REPOS)) { + if (!(dbopts->open_flags & APK_OPENF_NO_CMDLINE_REPOS)) { list_for_each_entry(repo, &dbopts->repository_list, list) apk_db_add_repository(db, APK_BLOB_STR(repo->url)); + } + if (!(dbopts->open_flags & APK_OPENF_NO_SYS_REPOS)) { if (dbopts->repositories_file == NULL) { add_repos_from_file(db, db->root_fd, "etc/apk/repositories"); apk_dir_foreach_file(openat(db->root_fd, "etc/apk/repositories.d", O_RDONLY | O_CLOEXEC), |