diff options
author | Timo Teräs <timo.teras@iki.fi> | 2014-12-08 08:30:58 +0200 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2014-12-08 08:31:41 +0200 |
commit | 02cd5a9c76cd676545c232bb567d7eb01e5bd6fd (patch) | |
tree | ce05b50bff40784b36c310eee0916be229e640b2 | |
parent | 6697ed5e86e64516ac56894d2f81c575ff72fd4f (diff) | |
download | apk-tools-02cd5a9c76cd676545c232bb567d7eb01e5bd6fd.tar.gz apk-tools-02cd5a9c76cd676545c232bb567d7eb01e5bd6fd.tar.bz2 apk-tools-02cd5a9c76cd676545c232bb567d7eb01e5bd6fd.tar.xz apk-tools-02cd5a9c76cd676545c232bb567d7eb01e5bd6fd.zip |
make del, fetch, fix and info return errors
In case all applet arguments are packages names (that is are not
including wildcards), return error if they do not match to some
package.
-rw-r--r-- | src/database.c | 4 | ||||
-rw-r--r-- | src/del.c | 8 | ||||
-rw-r--r-- | src/fetch.c | 23 | ||||
-rw-r--r-- | src/fix.c | 13 | ||||
-rw-r--r-- | src/info.c | 37 | ||||
-rw-r--r-- | src/policy.c | 3 | ||||
-rw-r--r-- | src/search.c | 2 | ||||
-rw-r--r-- | src/ver.c | 5 |
8 files changed, 63 insertions, 32 deletions
diff --git a/src/database.c b/src/database.c index e35c127..f94826b 100644 --- a/src/database.c +++ b/src/database.c @@ -2774,9 +2774,7 @@ void apk_name_foreach_matching(struct apk_database *db, struct apk_string_array foreach_array_item(pmatch, filter) { name = (struct apk_name *) apk_hash_get(&db->available.names, APK_BLOB_STR(*pmatch)); - if (name == NULL) - continue; - if (genid) { + if (genid && name) { if (name->foreach_genid >= genid) continue; name->foreach_genid = genid; @@ -18,6 +18,7 @@ struct del_ctx { int recursive_delete : 1; struct apk_dependency_array *world; + int errors; }; static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int optch, const char *optarg) @@ -109,6 +110,11 @@ static void delete_name(struct apk_database *db, const char *match, struct del_ctx *ctx = (struct del_ctx *) pctx; struct apk_package *pkg; + if (!name) { + ctx->errors++; + return; + } + pkg = apk_pkg_get_installed(name); if (pkg != NULL) delete_pkg(pkg, NULL, NULL, pctx); @@ -126,6 +132,8 @@ static int del_main(void *pctx, struct apk_database *db, struct apk_string_array apk_dependency_array_copy(&ctx->world, db->world); apk_name_foreach_matching(db, args, apk_foreach_genid(), delete_name, ctx); + if (ctx->errors) return ctx->errors; + r = apk_solver_solve(db, 0, ctx->world, &changeset); if (r == 0) { /* check for non-deleted package names */ diff --git a/src/fetch.c b/src/fetch.c index 3c40963..7caf9d4 100644 --- a/src/fetch.c +++ b/src/fetch.c @@ -207,7 +207,7 @@ static void mark_error(struct fetch_ctx *ctx, const char *match, struct apk_name if (strchr(match, '*') != NULL) return; - apk_message("%s: unable to select package (or it's dependencies)", name->name); + apk_message("%s: unable to select package (or it's dependencies)", name ? name->name : match); ctx->errors++; } @@ -223,6 +223,11 @@ static void mark_name_recursive(struct apk_database *db, const char *match, stru struct apk_change *change; int r; + if (!name) { + mark_error(ctx, match, name); + return; + } + apk_dependency_array_init(&world); *apk_dependency_array_add(&world) = dep; r = apk_solver_solve(db, 0, world, &changeset); @@ -241,14 +246,18 @@ static void mark_name(struct apk_database *db, const char *match, struct apk_nam struct apk_package *pkg = NULL; struct apk_provider *p; + if (!name) goto err; + foreach_array_item(p, name->providers) if (pkg == NULL || apk_pkg_version_compare(p->pkg, pkg) == APK_VERSION_GREATER) pkg = p->pkg; - if (pkg != NULL) - mark_package(ctx, pkg); - else - mark_error(ctx, match, name); + if (!pkg) goto err; + mark_package(ctx, pkg); + return; + +err: + mark_error(ctx, match, name); } static int fetch_main(void *pctx, struct apk_database *db, struct apk_string_array *args) @@ -272,8 +281,10 @@ static int fetch_main(void *pctx, struct apk_database *db, struct apk_string_arr } ctx->db = db; + apk_name_foreach_matching(db, args, apk_foreach_genid(), mark, ctx); - apk_hash_foreach(&db->available.packages, fetch_package, ctx); + if (!ctx->errors) + apk_hash_foreach(&db->available.packages, fetch_package, ctx); return ctx->errors; } @@ -20,6 +20,7 @@ struct fix_ctx { unsigned short solver_flags; int fix_depends : 1; int fix_directory_permissions : 1; + int errors; }; static int option_parse_applet(void *pctx, struct apk_db_options *dbopts, int optch, const char *optarg) @@ -70,9 +71,15 @@ static void mark_fix(struct fix_ctx *ctx, struct apk_name *name) apk_solver_set_name_flags(name, ctx->solver_flags, ctx->fix_depends ? ctx->solver_flags : 0); } -static void set_solver_flags(struct apk_database *db, const char *match, struct apk_name *name, void *ctx) +static void set_solver_flags(struct apk_database *db, const char *match, struct apk_name *name, void *pctx) { - mark_fix(ctx, name); + struct fix_ctx *ctx = pctx; + + if (!name) { + apk_error("Package '%s' not found", match); + ctx->errors++; + } else + mark_fix(ctx, name); } static int fix_main(void *pctx, struct apk_database *db, struct apk_string_array *args) @@ -94,6 +101,8 @@ static int fix_main(void *pctx, struct apk_database *db, struct apk_string_array } else apk_name_foreach_matching(db, args, apk_foreach_genid(), set_solver_flags, ctx); + if (ctx->errors) return ctx->errors; + return apk_solver_commit(db, 0, db->world); } @@ -20,8 +20,9 @@ struct info_ctx { struct apk_database *db; - int (*action)(struct info_ctx *ctx, struct apk_database *db, struct apk_string_array *args); + void (*action)(struct info_ctx *ctx, struct apk_database *db, struct apk_string_array *args); int subaction_mask; + int errors; }; /* These need to stay in sync with the function pointer array in @@ -55,14 +56,14 @@ static void verbose_print_pkg(struct apk_package *pkg, int minimal_verbosity) printf("\n"); } -static int info_exists(struct info_ctx *ctx, struct apk_database *db, - struct apk_string_array *args) +static void info_exists(struct info_ctx *ctx, struct apk_database *db, + struct apk_string_array *args) { struct apk_name *name; struct apk_dependency dep; struct apk_provider *p; char **parg; - int ok, errors = 0; + int ok; foreach_array_item(parg, args) { apk_blob_t b = APK_BLOB_STR(*parg); @@ -82,15 +83,12 @@ static int info_exists(struct info_ctx *ctx, struct apk_database *db, verbose_print_pkg(p->pkg, 0); ok = 1; } - if (!ok) - errors++; + if (!ok) ctx->errors++; } - - return errors; } -static int info_who_owns(struct info_ctx *ctx, struct apk_database *db, - struct apk_string_array *args) +static void info_who_owns(struct info_ctx *ctx, struct apk_database *db, + struct apk_string_array *args) { struct apk_package *pkg; struct apk_dependency_array *deps; @@ -98,7 +96,6 @@ static int info_who_owns(struct info_ctx *ctx, struct apk_database *db, struct apk_ostream *os; const char *via; char **parg, buf[PATH_MAX]; - int errors = 0; ssize_t r; apk_dependency_array_init(&deps); @@ -115,7 +112,7 @@ static int info_who_owns(struct info_ctx *ctx, struct apk_database *db, if (pkg == NULL) { apk_error("%s: Could not find owner package", *parg); - errors++; + ctx->errors++; continue; } @@ -138,8 +135,6 @@ static int info_who_owns(struct info_ctx *ctx, struct apk_database *db, os->close(os); } apk_dependency_array_free(&deps); - - return errors; } static void info_print_description(struct apk_database *db, struct apk_package *pkg) @@ -337,6 +332,11 @@ static void print_name_info(struct apk_database *db, const char *match, struct a struct info_ctx *ctx = (struct info_ctx *) pctx; struct apk_provider *p; + if (name == NULL) { + ctx->errors++; + return; + } + foreach_array_item(p, name->providers) info_subaction(ctx, p->pkg); } @@ -405,10 +405,9 @@ static int info_main(void *ctx, struct apk_database *db, struct apk_string_array ictx->db = db; if (ictx->subaction_mask == 0) ictx->subaction_mask = APK_INFO_DESC | APK_INFO_URL | APK_INFO_SIZE; - if (ictx->action != NULL) - return ictx->action(ictx, db, args); - - if (args->num > 0) { + if (ictx->action != NULL) { + ictx->action(ictx, db, args); + } else if (args->num > 0) { /* Print info on given names */ apk_name_foreach_matching( db, args, APK_FOREACH_NULL_MATCHES_ALL | apk_foreach_genid(), @@ -419,7 +418,7 @@ static int info_main(void *ctx, struct apk_database *db, struct apk_string_array verbose_print_pkg(ipkg->pkg, 1); } - return 0; + return ictx->errors; } static const struct apk_option options_applet[] = { diff --git a/src/policy.c b/src/policy.c index 773cf69..25d39b3 100644 --- a/src/policy.c +++ b/src/policy.c @@ -22,6 +22,9 @@ static void print_policy(struct apk_database *db, const char *match, struct apk_ struct apk_provider *p; struct apk_repository *repo; int i, j, num = 0; + + if (!name) return; + /* zlib1g policy: 2.0: diff --git a/src/search.c b/src/search.c index 4e7c730..47339fd 100644 --- a/src/search.c +++ b/src/search.c @@ -145,6 +145,8 @@ static void print_result(struct apk_database *db, const char *match, struct apk_ struct apk_provider *p; struct apk_package *pkg = NULL; + if (!name) return; + if (ctx->show_all) { foreach_array_item(p, name->providers) print_result_pkg(ctx, p->pkg); @@ -123,9 +123,10 @@ static void ver_print_package_status(struct apk_database *db, const char *match, int i, r = -1; unsigned short tag, allowed_repos; + if (!name) return; + pkg = apk_pkg_get_installed(name); - if (pkg == NULL) - return; + if (!pkg) return; tag = pkg->ipkg->repository_tag; allowed_repos = db->repo_tags[tag].allowed_repos; |