summaryrefslogtreecommitdiff
path: root/src/policy.c
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2013-06-18 14:53:59 +0300
committerTimo Teräs <timo.teras@iki.fi>2013-06-18 14:54:18 +0300
commit5725f656b01c734580dd9d866a2855a9c333a441 (patch)
tree255253ee880072bf8906499786912d3d45f078fb /src/policy.c
parent98c6b46de6d5074235e80617fd03c9e15cdd16e2 (diff)
downloadapk-tools-5725f656b01c734580dd9d866a2855a9c333a441.tar.gz
apk-tools-5725f656b01c734580dd9d866a2855a9c333a441.tar.bz2
apk-tools-5725f656b01c734580dd9d866a2855a9c333a441.tar.xz
apk-tools-5725f656b01c734580dd9d866a2855a9c333a441.zip
policy: new applet
to show different versions of package and the repositories from which it is available from.
Diffstat (limited to 'src/policy.c')
-rw-r--r--src/policy.c77
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);
+
+