From 039ff3bd466819909a5295a43e40947a9e0b6c16 Mon Sep 17 00:00:00 2001 From: Timo Teräs Date: Wed, 3 Jan 2018 15:17:11 +0200 Subject: split --force to several --force-[type] options This unloads --force as several of the things are really not wanted together. E.g. --force-refresh is a lot different from --force-broken-world and doing --force to get the other might introduce unwanted behaviour. --force is still kept for backwards compatibility and it enables most things --force was used for. --- src/add.c | 6 +++--- src/apk.c | 36 ++++++++++++++++++++++++++++++++---- src/apk_defines.h | 10 ++++++++-- src/commit.c | 6 ++++-- src/database.c | 12 ++++++------ src/fetch.c | 3 +-- src/index.c | 6 +++--- src/solver.c | 2 +- src/upgrade.c | 3 ++- 9 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/add.c b/src/add.c index 742df07..dcaa45c 100644 --- a/src/add.c +++ b/src/add.c @@ -60,7 +60,7 @@ static const struct apk_option_group optgroup_applet = { static int non_repository_check(struct apk_database *db) { - if (apk_flags & APK_FORCE) + if (apk_force & APK_FORCE_NON_REPOSITORY) return 0; if (apk_db_cache_active(db)) return 0; @@ -69,8 +69,8 @@ static int non_repository_check(struct apk_database *db) apk_error("You tried to add a non-repository package to system, " "but it would be lost on next reboot. Enable package caching " - "(apk cache --help) or use --force if you know what you are " - "doing."); + "(apk cache --help) or use --force-non-repository " + "if you know what you are doing."); return 1; } diff --git a/src/apk.c b/src/apk.c index 73c9f21..22acf41 100644 --- a/src/apk.c +++ b/src/apk.c @@ -95,7 +95,27 @@ static int option_parse_global(void *ctx, struct apk_db_options *dbopts, int opt version(); return -ESHUTDOWN; case 'f': - apk_flags |= APK_FORCE; + apk_force |= APK_FORCE_OVERWRITE | APK_FORCE_OLD_APK + | APK_FORCE_BROKEN_WORLD | APK_FORCE_NON_REPOSITORY + | APK_FORCE_BINARY_STDOUT; + break; + case 0x120: + apk_force |= APK_FORCE_OVERWRITE; + break; + case 0x121: + apk_force |= APK_FORCE_OLD_APK; + break; + case 0x122: + apk_force |= APK_FORCE_BROKEN_WORLD; + break; + case 0x123: + apk_force |= APK_FORCE_REFRESH; + break; + case 0x124: + apk_force |= APK_FORCE_NON_REPOSITORY; + break; + case 0x125: + apk_force |= APK_FORCE_BINARY_STDOUT; break; case 'i': apk_flags |= APK_INTERACTIVE; @@ -166,7 +186,13 @@ static const struct apk_option options_global[] = { { 'v', "verbose", "Print more information (can be doubled)" }, { 'i', "interactive", "Ask confirmation for certain operations" }, { 'V', "version", "Print program version and exit" }, - { 'f', "force", "Do what was asked even if it looks dangerous" }, + { 'f', "force", "Enable selected --force-* (deprecated)" }, + { 0x125, "force-binary-stdout", "Continue even if binary data is to be output" }, + { 0x122, "force-broken-world", "Continue even if 'world' cannot be satisfied" }, + { 0x124, "force-non-repository", "Continue even if packages may be lost on reboot" }, + { 0x121, "force-old-apk", "Continue even if packages use unsupported features" }, + { 0x120, "force-overwrite", "Overwrite files in other packages" }, + { 0x123, "force-refresh", "Do not use cached files (local or from proxy)" }, { 'U', "update-cache", "Update the repository cache" }, { 0x101, "progress", "Show a progress bar" }, { 0x10f, "progress-fd", "Write progress to fd", required_argument, "FD" }, @@ -182,7 +208,7 @@ static const struct apk_option options_global[] = { { 0x108, "repositories-file", "Override repositories file", required_argument, "REPOFILE" }, { 0x109, "no-network", "Do not use network (cache is still used)" }, - { 0x115, "no-cache", "Read uncached index from network" }, + { 0x115, "no-cache", "Do not use any local cache path" }, { 0x116, "cache-dir", "Override cache directory", required_argument, "CACHEDIR" }, { 0x112, "arch", "Use architecture with --root", @@ -222,7 +248,9 @@ static int option_parse_commit(void *ctx, struct apk_db_options *dbopts, int opt break; case 0x118: dbopts->open_flags |= APK_OPENF_CREATE; - apk_flags |= APK_FORCE | APK_NO_COMMIT_HOOKS; + apk_flags |= APK_NO_COMMIT_HOOKS; + apk_force |= APK_FORCE_OVERWRITE | APK_FORCE_OLD_APK + | APK_FORCE_BROKEN_WORLD | APK_FORCE_NON_REPOSITORY; break; default: return -ENOTSUP; diff --git a/src/apk_defines.h b/src/apk_defines.h index 08a3801..7e79135 100644 --- a/src/apk_defines.h +++ b/src/apk_defines.h @@ -60,11 +60,10 @@ static inline int IS_ERR_OR_NULL(const void *ptr) { return IS_ERR(ptr) || !ptr; #endif extern int apk_verbosity; -extern unsigned int apk_flags; +extern unsigned int apk_flags, apk_force; extern const char *apk_arch; extern char **apk_argv; -#define APK_FORCE 0x0001 #define APK_SIMULATE 0x0002 #define APK_CLEAN_PROTECTED 0x0004 #define APK_PROGRESS 0x0008 @@ -79,6 +78,13 @@ extern char **apk_argv; #define APK_NO_CACHE 0x8000 #define APK_NO_COMMIT_HOOKS 0x00010000 +#define APK_FORCE_OVERWRITE BIT(0) +#define APK_FORCE_OLD_APK BIT(1) +#define APK_FORCE_BROKEN_WORLD BIT(2) +#define APK_FORCE_REFRESH BIT(3) +#define APK_FORCE_NON_REPOSITORY BIT(4) +#define APK_FORCE_BINARY_STDOUT BIT(5) + /* default architecture for APK packages. */ #if defined(__x86_64__) #define APK_DEFAULT_ARCH "x86_64" diff --git a/src/commit.c b/src/commit.c index af49f5c..e82537f 100644 --- a/src/commit.c +++ b/src/commit.c @@ -266,7 +266,8 @@ int apk_solver_commit_changeset(struct apk_database *db, int r, errors = 0; if (apk_db_check_world(db, world) != 0) { - apk_error("Not committing changes due to missing repository tags. Use --force to override."); + apk_error("Not committing changes due to missing repository tags. " + "Use --force-broken-world to override."); return -1; } @@ -675,7 +676,8 @@ int apk_solver_commit(struct apk_database *db, int r; if (apk_db_check_world(db, world) != 0) { - apk_error("Not committing changes due to missing repository tags. Use --force to override."); + apk_error("Not committing changes due to missing repository tags. " + "Use --force-broken-world to override."); return -1; } diff --git a/src/database.c b/src/database.c index 162ce1a..4ea4fb4 100644 --- a/src/database.c +++ b/src/database.c @@ -47,7 +47,7 @@ enum { }; int apk_verbosity = 1; -unsigned int apk_flags = 0; +unsigned int apk_flags = 0, apk_force = 0; static apk_blob_t tmpprefix = { .len=8, .ptr = ".apknew." }; @@ -633,7 +633,7 @@ int apk_cache_download(struct apk_database *db, struct apk_repository *repo, r = apk_repo_format_real_url(db, repo, pkg, url, sizeof(url)); if (r < 0) return r; - if ((apk_flags & APK_FORCE) || + if ((apk_force & APK_FORCE_REFRESH) || fstatat(db->cache_fd, cacheitem, &st, 0) != 0) st.st_mtime = 0; @@ -867,13 +867,13 @@ int apk_db_index_read(struct apk_database *db, struct apk_bstream *bs, int repo) case 's': ipkg->broken_script = 1; break; case 'x': ipkg->broken_xattr = 1; break; default: - if (!(apk_flags & APK_FORCE)) + if (!(apk_force & APK_FORCE_OLD_APK)) goto old_apk_tools; } } break; default: - if (r != 0 && !(apk_flags & APK_FORCE)) + if (r != 0 && !(apk_force & APK_FORCE_OLD_APK)) goto old_apk_tools; /* Installed. So mark the package as installable. */ pkg->filename = NULL; @@ -2033,7 +2033,7 @@ int apk_db_check_world(struct apk_database *db, struct apk_dependency_array *wor struct apk_dependency *dep; int bad = 0, tag; - if (apk_flags & APK_FORCE) + if (apk_force & APK_FORCE_BROKEN_WORLD) return 0; foreach_array_item(dep, world) { @@ -2463,7 +2463,7 @@ static int apk_db_install_archive_entry(void *_ctx, if (pkg_prio >= 0) break; - if (!(apk_flags & APK_FORCE)) { + if (!(apk_force & APK_FORCE_OVERWRITE)) { apk_error(PKG_VER_FMT": trying to overwrite %s owned by "PKG_VER_FMT".", PKG_VER_PRINTF(pkg), ae->name, PKG_VER_PRINTF(opkg)); ipkg->broken_files = 1; diff --git a/src/fetch.c b/src/fetch.c index c6622e5..f9dc9a1 100644 --- a/src/fetch.c +++ b/src/fetch.c @@ -319,8 +319,7 @@ static int fetch_main(void *pctx, struct apk_database *db, struct apk_string_arr ctx->outdir_fd = AT_FDCWD; if ((args->num == 1) && (strcmp(args->item[0], "coffee") == 0)) { - if (apk_flags & APK_FORCE) - return cup(); + if (apk_force) return cup(); apk_message("Go and fetch your own coffee."); return 0; } diff --git a/src/index.c b/src/index.c index 4dd69cb..35bd340 100644 --- a/src/index.c +++ b/src/index.c @@ -118,9 +118,9 @@ static int index_main(void *ctx, struct apk_database *db, struct apk_string_arra char **parg; if (isatty(STDOUT_FILENO) && ictx->output == NULL && - !(apk_flags & APK_FORCE)) { - apk_error("Will not write binary index to console " - "without --force"); + !(apk_force & APK_FORCE_BINARY_STDOUT)) { + apk_error("Will not write binary index to console. " + "Use --force-binary-stdout to override."); return -1; } diff --git a/src/solver.c b/src/solver.c index 851e77e..91e5958 100644 --- a/src/solver.c +++ b/src/solver.c @@ -1022,7 +1022,7 @@ restart: generate_changeset(ss, world); - if (ss->errors && (apk_flags & APK_FORCE)) { + if (ss->errors && (apk_force & APK_FORCE_BROKEN_WORLD)) { foreach_array_item(d, world) { name = d->name; pkg = name->ss.chosen.pkg; diff --git a/src/upgrade.c b/src/upgrade.c index 22839db..f5fcb41 100644 --- a/src/upgrade.c +++ b/src/upgrade.c @@ -144,7 +144,8 @@ static int upgrade_main(void *ctx, struct apk_database *db, struct apk_string_ar int r = 0; if (apk_db_check_world(db, db->world) != 0) { - apk_error("Not continuing with upgrade due to missing repository tags. Use --force to override."); + apk_error("Not continuing with upgrade due to missing repository tags. " + "Use --force-broken-world to override."); return -1; } -- cgit v1.2.3