diff options
Diffstat (limited to 'src/policy.c')
-rw-r--r-- | src/policy.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/policy.c b/src/policy.c new file mode 100644 index 0000000..d3f171b --- /dev/null +++ b/src/policy.c @@ -0,0 +1,77 @@ +/* policy.c - Alpine Package Keeper (APK) + * + * Copyright (C) 2013 Timo Teräs <timo.teras@iki.fi> + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. See http://www.gnu.org/ for details. + */ + +#include <stdio.h> +#include "apk_defines.h" +#include "apk_applet.h" +#include "apk_database.h" +#include "apk_version.h" +#include "apk_print.h" + +extern const char * const apk_installed_file; + +static void print_policy(struct apk_database *db, const char *match, struct apk_name *name, void *ctx) +{ + struct apk_provider *p; + struct apk_repository *repo; + int i, j, num = 0; +/* +zlib1g policy: + 2.0: + @testing http://nl.alpinelinux.org/alpine/edge/testing + 1.7: + @edge http://nl.alpinelinux.org/alpine/edge/main + 1.2.3.5 (upgradeable): + http://nl.alpinelinux.org/alpine/v2.6/main + 1.2.3.4 (installed): + /media/cdrom/... + http://nl.alpinelinux.org/alpine/v2.5/main + 1.1: + http://nl.alpinelinux.org/alpine/v2.4/main +*/ + foreach_array_item(p, name->providers) { + if (p->pkg->name != name) + continue; + if (num++ == 0) + printf("%s policy:\n", name->name); + printf(" " BLOB_FMT ":\n", BLOB_PRINTF(*p->version)); + if (p->pkg->ipkg != NULL) + printf(" %s\n", apk_installed_file); + for (i = 0; i < db->num_repos; i++) { + repo = &db->repos[i]; + if (!(BIT(i) & p->pkg->repos)) + continue; + for (j = 0; j < db->num_repo_tags; j++) { + if (db->repo_tags[j].allowed_repos & p->pkg->repos) + printf(" "BLOB_FMT"%s%s\n", + BLOB_PRINTF(db->repo_tags[j].tag), + j == 0 ? "" : " ", + repo->url); + } + } + } +} + +static int policy_main(void *ctx, struct apk_database *db, struct apk_string_array *args) +{ + apk_name_foreach_matching(db, args, apk_foreach_genid(), print_policy, NULL); + return 0; +} + +static struct apk_applet apk_policy = { + .name = "policy", + .help = "Show repository policy for packages.", + .open_flags = APK_OPENF_READ, + .main = policy_main, +}; + +APK_DEFINE_APPLET(apk_policy); + + |