diff options
-rw-r--r-- | src/apk_package.h | 6 | ||||
-rw-r--r-- | src/commit.c | 24 | ||||
-rw-r--r-- | src/database.c | 58 | ||||
-rw-r--r-- | src/dot.c | 18 | ||||
-rw-r--r-- | src/hash.c | 7 | ||||
-rw-r--r-- | src/info.c | 130 | ||||
-rw-r--r-- | src/package.c | 55 |
7 files changed, 109 insertions, 189 deletions
diff --git a/src/apk_package.h b/src/apk_package.h index e259c19..db3965b 100644 --- a/src/apk_package.h +++ b/src/apk_package.h @@ -154,10 +154,8 @@ void apk_blob_pull_deps(apk_blob_t *from, struct apk_database *, struct apk_depe int apk_deps_write(struct apk_database *db, struct apk_dependency_array *deps, struct apk_ostream *os, apk_blob_t separator); -int apk_deps_add(struct apk_dependency_array **depends, - struct apk_dependency *dep); -void apk_deps_del(struct apk_dependency_array **deps, - struct apk_name *name); +void apk_deps_add(struct apk_dependency_array **depends, struct apk_dependency *dep); +void apk_deps_del(struct apk_dependency_array **deps, struct apk_name *name); int apk_script_type(const char *name); struct apk_package *apk_pkg_get_installed(struct apk_name *name); diff --git a/src/commit.c b/src/commit.c index e55843e..6279e53 100644 --- a/src/commit.c +++ b/src/commit.c @@ -147,10 +147,9 @@ static int dump_packages(struct apk_changeset *changeset, struct apk_change *change; struct apk_name *name; struct apk_indent indent = { .indent = 2 }; - int match = 0, i; + int match = 0; - for (i = 0; i < changeset->changes->num; i++) { - change = &changeset->changes->item[i]; + foreach_array_item(change, changeset->changes) { if (!cmp(change)) continue; if (match == 0) @@ -207,18 +206,16 @@ static int cmp_upgrade(struct apk_change *change) static void run_triggers(struct apk_database *db, struct apk_changeset *changeset) { - int i; + struct apk_change *change; + struct apk_installed_package *ipkg; if (apk_db_fire_triggers(db) == 0) return; - for (i = 0; i < changeset->changes->num; i++) { - struct apk_package *pkg = changeset->changes->item[i].new_pkg; - struct apk_installed_package *ipkg; - + foreach_array_item(change, changeset->changes) { + struct apk_package *pkg = change->new_pkg; if (pkg == NULL) continue; - ipkg = pkg->ipkg; if (ipkg->pending_triggers->num == 0) continue; @@ -236,7 +233,7 @@ int apk_solver_commit_changeset(struct apk_database *db, { struct progress prog; struct apk_change *change; - int i, r = 0, size_diff = 0, size_unit; + int r = 0, size_diff = 0, size_unit; if (apk_db_check_world(db, world) != 0) { apk_error("Not committing changes due to missing repository tags. Use --force to override."); @@ -248,8 +245,7 @@ int apk_solver_commit_changeset(struct apk_database *db, /* Count what needs to be done */ memset(&prog, 0, sizeof(prog)); - for (i = 0; i < changeset->changes->num; i++) { - change = &changeset->changes->item[i]; + foreach_array_item(change, changeset->changes) { count_change(change, &prog.total); if (change->new_pkg) size_diff += change->new_pkg->installed_size; @@ -291,9 +287,7 @@ int apk_solver_commit_changeset(struct apk_database *db, /* Go through changes */ r = 0; - for (i = 0; i < changeset->changes->num; i++) { - change = &changeset->changes->item[i]; - + foreach_array_item(change, changeset->changes) { if (print_change(db, change, prog.done.changes, prog.total.changes)) { prog.pkg = change->new_pkg; prog.flags = APK_PRINT_PROGRESS_FORCE; diff --git a/src/database.c b/src/database.c index cff38c0..964bc22 100644 --- a/src/database.c +++ b/src/database.c @@ -293,10 +293,10 @@ struct apk_db_dir *apk_db_dir_get(struct apk_database *db, apk_blob_t name) { struct apk_db_dir *dir; struct apk_protected_path_array *ppaths; + struct apk_protected_path *ppath; apk_blob_t bparent; unsigned long hash = apk_hash_from_key(&db->installed.dirs, name); char *relative_name; - int i; if (name.len && name.ptr[name.len-1] == '/') name.len--; @@ -338,11 +338,8 @@ struct apk_db_dir *apk_db_dir_get(struct apk_database *db, apk_blob_t name) return dir; relative_name = strrchr(dir->rooted_name, '/') + 1; - for (i = 0; i < ppaths->num; i++) { - struct apk_protected_path *ppath = &ppaths->item[i]; - char *slash; - - slash = strchr(ppath->relative_pattern, '/'); + foreach_array_item(ppath, ppaths) { + char *slash = strchr(ppath->relative_pattern, '/'); if (slash != NULL) { *slash = 0; if (fnmatch(ppath->relative_pattern, relative_name, FNM_PATHNAME) != 0) { @@ -529,7 +526,7 @@ static inline void add_provider(struct apk_name *name, struct apk_provider p) struct apk_package *apk_db_pkg_add(struct apk_database *db, struct apk_package *pkg) { struct apk_package *idb; - int i; + struct apk_dependency *dep; if (pkg->license == NULL) pkg->license = apk_blob_atomize(APK_BLOB_NULL); @@ -544,10 +541,8 @@ struct apk_package *apk_db_pkg_add(struct apk_database *db, struct apk_package * idb = pkg; apk_hash_insert(&db->available.packages, pkg); add_provider(pkg->name, APK_PROVIDER_FROM_PACKAGE(pkg)); - for (i = 0; i < pkg->provides->num; i++) { - struct apk_dependency *dep = &pkg->provides->item[i]; + foreach_array_item(dep, pkg->provides) add_provider(dep->name, APK_PROVIDER_FROM_PROVIDES(pkg, dep)); - } apk_db_pkg_rdepends(db, pkg); } else { idb->repos |= pkg->repos; @@ -1057,7 +1052,7 @@ static void apk_db_triggers_write(struct apk_database *db, struct apk_ostream *o struct apk_installed_package *ipkg; char buf[APK_BLOB_CHECKSUM_BUF]; apk_blob_t bfn; - int i; + char **trigger; list_for_each_entry(ipkg, &db->installed.triggers, trigger_pkgs_list) { bfn = APK_BLOB_BUF(buf); @@ -1065,9 +1060,9 @@ static void apk_db_triggers_write(struct apk_database *db, struct apk_ostream *o bfn = apk_blob_pushed(APK_BLOB_BUF(buf), bfn); os->write(os, bfn.ptr, bfn.len); - for (i = 0; i < ipkg->triggers->num; i++) { + foreach_array_item(trigger, ipkg->triggers) { os->write(os, " ", 1); - apk_ostream_write_string(os, ipkg->triggers->item[i]); + apk_ostream_write_string(os, *trigger); } os->write(os, "\n", 1); } @@ -1728,6 +1723,7 @@ void apk_db_close(struct apk_database *db) { struct apk_installed_package *ipkg; struct apk_db_dir_instance *diri; + struct apk_protected_path *ppath; struct hlist_node *dc, *dn; int i; @@ -1746,8 +1742,8 @@ void apk_db_close(struct apk_database *db) free(db->repos[i].url); free(db->repos[i].description.ptr); } - for (i = 0; i < db->protected_paths->num; i++) - free(db->protected_paths->item[i].relative_pattern); + foreach_array_item(ppath, db->protected_paths) + free(ppath->relative_pattern); apk_protected_path_array_free(&db->protected_paths); apk_dependency_array_free(&db->world); @@ -1849,8 +1845,8 @@ static int foreach_cache_file(void *pctx, int dirfd, const char *name) struct foreach_cache_item_ctx *ctx = (struct foreach_cache_item_ctx *) pctx; struct apk_database *db = ctx->db; struct apk_package *pkg = NULL; + struct apk_provider *p0; apk_blob_t b = APK_BLOB_STR(name), bname, bver; - int i; if (apk_pkg_parse_name(b, &bname, &bver) == 0) { /* Package - search for it */ @@ -1859,15 +1855,13 @@ static int foreach_cache_file(void *pctx, int dirfd, const char *name) if (name == NULL) goto no_pkg; - for (i = 0; i < name->providers->num; i++) { - struct apk_package *pkg0 = name->providers->item[i].pkg; - - if (pkg0->name != name) + foreach_array_item(p0, name->providers) { + if (p0->pkg->name != name) continue; - apk_pkg_format_cache_pkg(APK_BLOB_BUF(tmp), pkg0); + apk_pkg_format_cache_pkg(APK_BLOB_BUF(tmp), p0->pkg); if (apk_blob_compare(b, APK_BLOB_STR(tmp)) == 0) { - pkg = pkg0; + pkg = p0->pkg; break; } } @@ -1892,15 +1886,14 @@ int apk_db_permanent(struct apk_database *db) int apk_db_check_world(struct apk_database *db, struct apk_dependency_array *world) { - int i, bad = 0; + struct apk_dependency *dep; + int bad = 0, tag; if (apk_flags & APK_FORCE) return 0; - for (i = 0; i < world->num; i++) { - struct apk_dependency *dep = &world->item[i]; - int tag = dep->repository_tag; - + foreach_array_item(dep, world) { + tag = dep->repository_tag; if (tag == 0 || db->repo_tags[tag].allowed_repos != 0) continue; @@ -2213,6 +2206,7 @@ static int apk_db_install_archive_entry(void *_ctx, struct install_ctx *ctx = (struct install_ctx *) _ctx; struct apk_database *db = ctx->db; struct apk_package *pkg = ctx->pkg, *opkg; + struct apk_dependency *dep; struct apk_installed_package *ipkg = pkg->ipkg; apk_blob_t name = APK_BLOB_STR(ae->name), bdir, bfile; struct apk_db_dir_instance *diri = ctx->diri; @@ -2274,8 +2268,6 @@ static int apk_db_install_archive_entry(void *_ctx, opkg = NULL; file = apk_db_file_query(db, bdir, bfile); if (file != NULL) { - int i; - opkg = file->diri->pkg; do { int opkg_prio = -1, pkg_prio = -1; @@ -2287,15 +2279,15 @@ static int apk_db_install_archive_entry(void *_ctx, if (opkg->name == pkg->name) break; /* Does the original package replace the new one? */ - for (i = 0; i < opkg->ipkg->replaces->num; i++) { - if (apk_dep_is_materialized(&opkg->ipkg->replaces->item[i], pkg)) { + foreach_array_item(dep, opkg->ipkg->replaces) { + if (apk_dep_is_materialized(dep, pkg)) { opkg_prio = opkg->ipkg->replaces_priority; break; } } /* Does the new package replace the original one? */ - for (i = 0; i < ctx->ipkg->replaces->num; i++) { - if (apk_dep_is_materialized(&ctx->ipkg->replaces->item[i], opkg)) { + foreach_array_item(dep, ctx->ipkg->replaces) { + if (apk_dep_is_materialized(dep, opkg)) { pkg_prio = ctx->ipkg->replaces_priority; break; } @@ -64,7 +64,9 @@ static void dump_name(struct dot_ctx *ctx, struct apk_name *name) static int dump_pkg(struct dot_ctx *ctx, struct apk_package *pkg) { - int i, j, r, ret = 0; + struct apk_dependency *dep; + struct apk_provider *p0; + int r, ret = 0; if (pkg->state_int == S_EVALUATED) return 0; @@ -75,8 +77,7 @@ static int dump_pkg(struct dot_ctx *ctx, struct apk_package *pkg) } pkg->state_int = S_EVALUATING; - for (i = 0; i < pkg->depends->num; i++) { - struct apk_dependency *dep = &pkg->depends->item[i]; + foreach_array_item(dep, pkg->depends) { struct apk_name *name = dep->name; dump_name(ctx, name); @@ -87,9 +88,7 @@ static int dump_pkg(struct dot_ctx *ctx, struct apk_package *pkg) continue; } - for (j = 0; j < name->providers->num; j++) { - struct apk_provider *p0 = &name->providers->item[j]; - + foreach_array_item(p0, name->providers) { if (!apk_dep_is_provided(dep, p0)) continue; @@ -124,15 +123,16 @@ static int foreach_pkg(apk_hash_item item, void *ctx) static int dot_main(void *pctx, struct apk_database *db, int argc, char **argv) { struct dot_ctx *ctx = (struct dot_ctx *) pctx; - int i, j; + struct apk_provider *p; + int i; if (argc) { for (i = 0; i < argc; i++) { struct apk_name *name = apk_db_get_name(db, APK_BLOB_STR(argv[i])); if (!name) continue; - for (j = 0; j < name->providers->num; j++) - dump_pkg(ctx, name->providers->item[j].pkg); + foreach_array_item(p, name->providers) + dump_pkg(ctx, p->pkg); } } else { apk_hash_foreach(&db->available.packages, foreach_pkg, pctx); @@ -29,12 +29,13 @@ void apk_hash_free(struct apk_hash *h) int apk_hash_foreach(struct apk_hash *h, apk_hash_enumerator_f e, void *ctx) { + struct hlist_head *bucket; apk_hash_node *pos, *n; ptrdiff_t offset = h->ops->node_offset; - int i, r; + int r; - for (i = 0; i < h->buckets->num; i++) { - hlist_for_each_safe(pos, n, &h->buckets->item[i]) { + foreach_array_item(bucket, h->buckets) { + hlist_for_each_safe(pos, n, bucket) { r = e(((void *) pos) - offset, ctx); if (r != 0 && ctx != NULL) return r; @@ -71,7 +71,8 @@ static int info_exists(struct info_ctx *ctx, struct apk_database *db, { struct apk_name *name; struct apk_dependency dep; - int i, j, ok, rc = 0; + struct apk_provider *p; + int i, ok, rc = 0; for (i = 0; i < argc; i++) { apk_blob_t b = APK_BLOB_STR(argv[i]); @@ -85,11 +86,8 @@ static int info_exists(struct info_ctx *ctx, struct apk_database *db, continue; ok = 0; - for (j = 0; j < name->providers->num; j++) { - struct apk_provider *p = &name->providers->item[j]; - if (p->pkg->ipkg == NULL) - continue; - if (!apk_dep_is_provided(&dep, p)) + foreach_array_item(p, name->providers) { + if (p->pkg->ipkg == NULL || !apk_dep_is_provided(&dep, p)) continue; verbose_print_pkg(p->pkg, 0); ok = 1; @@ -173,96 +171,56 @@ static void info_print_size(struct apk_database *db, struct apk_package *pkg) pkg->installed_size); } -static void info_print_depends(struct apk_database *db, struct apk_package *pkg) +static void info_print_dep_array(struct apk_database *db, struct apk_package *pkg, + struct apk_dependency_array *deps, const char *dep_text) { + struct apk_dependency *d; apk_blob_t separator = APK_BLOB_STR(apk_verbosity > 1 ? " " : "\n"); - char dep[256]; - int i; + char buf[256]; if (apk_verbosity == 1) - printf(PKG_VER_FMT " depends on:\n", - PKG_VER_PRINTF(pkg)); + printf(PKG_VER_FMT " %s:\n", PKG_VER_PRINTF(pkg), dep_text); if (apk_verbosity > 1) printf("%s: ", pkg->name->name); - for (i = 0; i < pkg->depends->num; i++) { - apk_blob_t b = APK_BLOB_BUF(dep); - apk_blob_push_dep(&b, db, &pkg->depends->item[i]); + foreach_array_item(d, deps) { + apk_blob_t b = APK_BLOB_BUF(buf); + apk_blob_push_dep(&b, db, d); apk_blob_push_blob(&b, separator); - b = apk_blob_pushed(APK_BLOB_BUF(dep), b); + b = apk_blob_pushed(APK_BLOB_BUF(buf), b); fwrite(b.ptr, b.len, 1, stdout); } } +static void info_print_depends(struct apk_database *db, struct apk_package *pkg) +{ + info_print_dep_array(db, pkg, pkg->depends, "depends on"); +} + static void info_print_provides(struct apk_database *db, struct apk_package *pkg) { - apk_blob_t separator = APK_BLOB_STR(apk_verbosity > 1 ? " " : "\n"); - char dep[256]; - int i; + info_print_dep_array(db, pkg, pkg->provides, "provides"); +} - if (apk_verbosity == 1) - printf(PKG_VER_FMT " provides:\n", - PKG_VER_PRINTF(pkg)); - if (apk_verbosity > 1) - printf("%s: ", pkg->name->name); - for (i = 0; i < pkg->provides->num; i++) { - apk_blob_t b = APK_BLOB_BUF(dep); - apk_blob_push_dep(&b, db, &pkg->provides->item[i]); - apk_blob_push_blob(&b, separator); - b = apk_blob_pushed(APK_BLOB_BUF(dep), b); - fwrite(b.ptr, b.len, 1, stdout); - } +static void print_rdep_pkg(struct apk_package *pkg0, struct apk_dependency *dep0, struct apk_package *pkg, void *pctx) +{ + printf(PKG_VER_FMT "%s", PKG_VER_PRINTF(pkg0), apk_verbosity > 1 ? " " : "\n"); } static void info_print_required_by(struct apk_database *db, struct apk_package *pkg) { - int i, j; - char *separator = apk_verbosity > 1 ? " " : "\n"; - if (apk_verbosity == 1) - printf(PKG_VER_FMT " is required by:\n", - PKG_VER_PRINTF(pkg)); + printf(PKG_VER_FMT " is required by:\n", PKG_VER_PRINTF(pkg)); if (apk_verbosity > 1) printf("%s: ", pkg->name->name); - for (i = 0; i < pkg->name->rdepends->num; i++) { - struct apk_name *name0; - struct apk_package *pkg0; - - /* Check only the package that is installed, and that - * it actually has this package as dependency. */ - name0 = pkg->name->rdepends->item[i]; - pkg0 = apk_pkg_get_installed(name0); - if (pkg0 == NULL) - continue; - - for (j = 0; j < pkg0->depends->num; j++) { - if (pkg0->depends->item[j].name != pkg->name) - continue; - printf(PKG_VER_FMT "%s", - PKG_VER_PRINTF(pkg0), - separator); - break; - } - } + apk_pkg_foreach_reverse_dependency( + pkg, + APK_FOREACH_INSTALLED | APK_DEP_SATISFIES | apk_foreach_genid(), + print_rdep_pkg, NULL); } static void info_print_install_if(struct apk_database *db, struct apk_package *pkg) { - apk_blob_t separator = APK_BLOB_STR(apk_verbosity > 1 ? " " : "\n"); - char dep[256]; - int i; - - if (apk_verbosity == 1) - printf(PKG_VER_FMT " has auto-install rule:\n", - PKG_VER_PRINTF(pkg)); - if (apk_verbosity > 1) - printf("%s: ", pkg->name->name); - for (i = 0; i < pkg->install_if->num; i++) { - apk_blob_t b = APK_BLOB_BUF(dep); - apk_blob_push_dep(&b, db, &pkg->install_if->item[i]); - apk_blob_push_blob(&b, separator); - b = apk_blob_pushed(APK_BLOB_BUF(dep), b); - fwrite(b.ptr, b.len, 1, stdout); - } + info_print_dep_array(db, pkg, pkg->install_if, "has auto-install rule"); } static void info_print_rinstall_if(struct apk_database *db, struct apk_package *pkg) @@ -322,37 +280,22 @@ static void info_print_contents(struct apk_database *db, struct apk_package *pkg static void info_print_triggers(struct apk_database *db, struct apk_package *pkg) { struct apk_installed_package *ipkg = pkg->ipkg; - int i; + char **trigger; if (apk_verbosity == 1) printf(PKG_VER_FMT " triggers:\n", PKG_VER_PRINTF(pkg)); - for (i = 0; i < ipkg->triggers->num; i++) { + foreach_array_item(trigger, ipkg->triggers) { if (apk_verbosity > 1) printf("%s: trigger ", pkg->name->name); - printf("%s\n", ipkg->triggers->item[i]); + printf("%s\n", *trigger); } } static void info_print_replaces(struct apk_database *db, struct apk_package *pkg) { - apk_blob_t separator = APK_BLOB_STR(apk_verbosity > 1 ? " " : "\n"); - char dep[256]; - int i; - - if (apk_verbosity == 1) - printf(PKG_VER_FMT " replaces:\n", - PKG_VER_PRINTF(pkg)); - if (apk_verbosity > 1) - printf("%s: ", pkg->name->name); - for (i = 0; i < pkg->ipkg->replaces->num; i++) { - apk_blob_t b = APK_BLOB_BUF(dep); - apk_blob_push_dep(&b, db, &pkg->ipkg->replaces->item[i]); - apk_blob_push_blob(&b, separator); - b = apk_blob_pushed(APK_BLOB_BUF(dep), b); - fwrite(b.ptr, b.len, 1, stdout); - } + info_print_dep_array(db, pkg, pkg->provides, "replaces"); } static void info_subaction(struct info_ctx *ctx, struct apk_package *pkg) @@ -392,7 +335,8 @@ static int info_package(struct info_ctx *ctx, struct apk_database *db, int argc, char **argv) { struct apk_name *name; - int i, j; + struct apk_provider *p; + int i; for (i = 0; i < argc; i++) { name = apk_db_query_name(db, APK_BLOB_STR(argv[i])); @@ -400,8 +344,8 @@ static int info_package(struct info_ctx *ctx, struct apk_database *db, apk_error("Not found: %s", argv[i]); return 1; } - for (j = 0; j < name->providers->num; j++) - info_subaction(ctx, name->providers->item[j].pkg); + foreach_array_item(p, name->providers) + info_subaction(ctx, p->pkg); } return 0; } diff --git a/src/package.c b/src/package.c index 61927e7..702a643 100644 --- a/src/package.c +++ b/src/package.c @@ -40,16 +40,12 @@ static const apk_spn_match_def apk_spn_dependency_separator = { struct apk_package *apk_pkg_get_installed(struct apk_name *name) { - int i; + struct apk_provider *p; + + foreach_array_item(p, name->providers) + if (p->pkg->name == name && p->pkg->ipkg != NULL) + return p->pkg; - for (i = 0; i < name->providers->num; i++) { - struct apk_package *pkg = name->providers->item[i].pkg; - if (pkg->name != name) - continue; - if (pkg->ipkg == NULL) - continue; - return pkg; - } return NULL; } @@ -95,6 +91,7 @@ struct apk_installed_package *apk_pkg_install(struct apk_database *db, void apk_pkg_uninstall(struct apk_database *db, struct apk_package *pkg) { struct apk_installed_package *ipkg = pkg->ipkg; + char **trigger; int i; if (ipkg == NULL) @@ -110,8 +107,8 @@ void apk_pkg_uninstall(struct apk_database *db, struct apk_package *pkg) if (ipkg->triggers->num) { list_del(&ipkg->trigger_pkgs_list); list_init(&ipkg->trigger_pkgs_list); - for (i = 0; i < ipkg->triggers->num; i++) - free(ipkg->triggers->item[i]); + foreach_array_item(trigger, ipkg->triggers) + free(*trigger); } apk_string_array_free(&ipkg->triggers); apk_string_array_free(&ipkg->pending_triggers); @@ -153,41 +150,35 @@ int apk_pkg_parse_name(apk_blob_t apkname, return 0; } -int apk_deps_add(struct apk_dependency_array **depends, - struct apk_dependency *dep) +void apk_deps_add(struct apk_dependency_array **depends, struct apk_dependency *dep) { - struct apk_dependency_array *deps = *depends; - int i; + struct apk_dependency *d0; - if (deps != NULL) { - for (i = 0; i < deps->num; i++) { - if (deps->item[i].name == dep->name) { - deps->item[i] = *dep; - return 0; + if (*depends) { + foreach_array_item(d0, *depends) { + if (d0->name == dep->name) { + *d0 = *dep; + return; } } } - *apk_dependency_array_add(depends) = *dep; - return 0; } -void apk_deps_del(struct apk_dependency_array **pdeps, - struct apk_name *name) +void apk_deps_del(struct apk_dependency_array **pdeps, struct apk_name *name) { struct apk_dependency_array *deps = *pdeps; - int i; + struct apk_dependency *d0; if (deps == NULL) return; - for (i = 0; i < deps->num; i++) { - if (deps->item[i].name != name) - continue; - - deps->item[i] = deps->item[deps->num-1]; - apk_dependency_array_resize(pdeps, deps->num-1); - break; + foreach_array_item(d0, deps) { + if (d0->name == name) { + *d0 = deps->item[deps->num - 1]; + apk_dependency_array_resize(pdeps, deps->num - 1); + break; + } } } |