policy: new applet
to show different versions of package and the repositories from which it is available from.cute-signatures
parent
98c6b46de6
commit
5725f656b0
|
@ -21,7 +21,7 @@ endif
|
|||
progs-y += apk
|
||||
apk-objs := apk.o add.o del.o fix.o update.o info.o \
|
||||
search.o upgrade.o cache.o ver.o index.o fetch.o \
|
||||
audit.o verify.o dot.o
|
||||
audit.o verify.o dot.o policy.o
|
||||
|
||||
libapk.so-objs := common.o database.o package.o archive.o \
|
||||
version.o io.o url.o gunzip.o blob.o hash.o print.o \
|
||||
|
|
|
@ -97,7 +97,7 @@ struct apk_name {
|
|||
};
|
||||
|
||||
struct apk_repository {
|
||||
char *url;
|
||||
const char *url;
|
||||
struct apk_checksum csum;
|
||||
apk_blob_t description;
|
||||
};
|
||||
|
|
|
@ -68,7 +68,7 @@ static const char * const apk_triggers_file = "lib/apk/db/triggers";
|
|||
static const char * const apk_triggers_file_tmp = "lib/apk/db/triggers.new";
|
||||
static const char * const apk_triggers_file_old = "var/lib/apk/triggers";
|
||||
|
||||
static const char * const apk_installed_file = "lib/apk/db/installed";
|
||||
const char * const apk_installed_file = "lib/apk/db/installed";
|
||||
static const char * const apk_installed_file_tmp = "lib/apk/db/installed.new";
|
||||
static const char * const apk_installed_file_old = "var/lib/apk/installed";
|
||||
|
||||
|
@ -609,7 +609,7 @@ int apk_repo_format_real_url(struct apk_database *db, struct apk_repository *rep
|
|||
int apk_repo_format_item(struct apk_database *db, struct apk_repository *repo, struct apk_package *pkg,
|
||||
int *fd, char *buf, size_t len)
|
||||
{
|
||||
if (strcmp(repo->url, "cache") == 0) {
|
||||
if (repo->url == apk_linked_cache_dir) {
|
||||
*fd = db->cache_fd;
|
||||
return apk_pkg_format_cache_pkg(APK_BLOB_PTR_LEN(buf, len), pkg);
|
||||
} else {
|
||||
|
@ -1423,7 +1423,7 @@ static int add_repos_from_file(void *ctx, int dirfd, const char *file)
|
|||
static void apk_db_setup_repositories(struct apk_database *db)
|
||||
{
|
||||
db->repos[APK_REPOSITORY_CACHED] = (struct apk_repository) {
|
||||
.url = "cache",
|
||||
.url = apk_linked_cache_dir,
|
||||
.csum.data = {
|
||||
0xb0,0x35,0x92,0x80,0x6e,0xfa,0xbf,0xee,0xb7,0x09,
|
||||
0xf5,0xa7,0x0a,0x7c,0x17,0x26,0x69,0xb0,0x05,0x38 },
|
||||
|
@ -1737,7 +1737,7 @@ void apk_db_close(struct apk_database *db)
|
|||
}
|
||||
|
||||
for (i = APK_REPOSITORY_FIRST_CONFIGURED; i < db->num_repos; i++) {
|
||||
free(db->repos[i].url);
|
||||
free((void*) db->repos[i].url);
|
||||
free(db->repos[i].description.ptr);
|
||||
}
|
||||
foreach_array_item(ppath, db->protected_paths)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue