summaryrefslogtreecommitdiff
path: root/src/info.c
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2011-10-18 18:11:26 -0400
committerTimo Teräs <timo.teras@iki.fi>2011-10-18 18:11:26 -0400
commita787038dbe643a7169a4b3610e104ac94b175ed0 (patch)
tree93e0e6629d805cdef6fa5833100ed0366225b019 /src/info.c
parentafd854a3e2cf20b3f35c5503c9df9589f482dc74 (diff)
downloadapk-tools-a787038dbe643a7169a4b3610e104ac94b175ed0.tar.gz
apk-tools-a787038dbe643a7169a4b3610e104ac94b175ed0.tar.bz2
apk-tools-a787038dbe643a7169a4b3610e104ac94b175ed0.tar.xz
apk-tools-a787038dbe643a7169a4b3610e104ac94b175ed0.zip
pkg, info: remember installed packages "replaces"
"replaces" is now turned to a full dependency type list, so you can make package overwrite files only certain versions of the package (though, we should probably take this into account already at solution calculation phase). Also make 'info --replaces' print the "replaces" of the package. This is in preparation for the policy package support, which still requires "replacement priority" field to decide which packages' files get the preference.
Diffstat (limited to 'src/info.c')
-rw-r--r--src/info.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/src/info.c b/src/info.c
index 2cbadf0..b45eba5 100644
--- a/src/info.c
+++ b/src/info.c
@@ -34,6 +34,7 @@ struct info_ctx {
#define APK_INFO_TRIGGERS 0x40
#define APK_INFO_INSTALL_IF 0x80
#define APK_INFO_RINSTALL_IF 0x100
+#define APK_INFO_REPLACES 0x200
static void verbose_print_pkg(struct apk_package *pkg, int minimal_verbosity)
{
@@ -69,14 +70,15 @@ static int info_exists(struct info_ctx *ctx, struct apk_database *db,
struct apk_name *name;
struct apk_package *pkg = NULL;
struct apk_dependency dep;
- int r, i, j, ok = 0;
+ int i, j, ok = 0;
for (i = 0; i < argc; i++) {
- r = apk_dep_from_blob(&dep, db, APK_BLOB_STR(argv[i]));
- if (r != 0)
+ apk_blob_t b = APK_BLOB_STR(argv[i]);
+ apk_blob_pull_dep(&b, db, &dep);
+ name = dep.name;
+ if (name == NULL)
continue;
- name = dep.name;
for (j = 0; j < name->pkgs->num; j++) {
pkg = name->pkgs->item[j];
if (pkg->ipkg != NULL)
@@ -309,6 +311,26 @@ static void info_print_triggers(struct apk_package *pkg)
}
}
+static void info_print_replaces(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, &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);
+ }
+}
+
static void info_subaction(struct info_ctx *ctx, struct apk_package *pkg)
{
typedef void (*subaction_t)(struct apk_package *);
@@ -322,10 +344,11 @@ static void info_subaction(struct info_ctx *ctx, struct apk_package *pkg)
info_print_triggers,
info_print_install_if,
info_print_rinstall_if,
+ info_print_replaces,
};
const int requireipkg =
APK_INFO_CONTENTS | APK_INFO_TRIGGERS | APK_INFO_RDEPENDS |
- APK_INFO_RINSTALL_IF;
+ APK_INFO_RINSTALL_IF | APK_INFO_REPLACES;
int i;
for (i = 0; i < ARRAY_SIZE(subactions); i++) {
@@ -398,6 +421,9 @@ static int info_parse(void *ctx, struct apk_db_options *dbopts,
case 't':
ictx->subaction_mask |= APK_INFO_TRIGGERS;
break;
+ case 0x10000:
+ ictx->subaction_mask |= APK_INFO_REPLACES;
+ break;
case 'a':
ictx->subaction_mask = 0xffffffff;
break;
@@ -423,6 +449,7 @@ static struct apk_option info_options[] = {
{ 'W', "who-owns", "Print the package owning the specified file" },
{ 'R', "depends", "List packages that the PACKAGE depends on" },
{ 'r', "rdepends", "List all packages depending on PACKAGE" },
+ { 0x10000, "replaces", "List packages whom files PACKAGE might replace" },
{ 'i', "install-if", "List the PACKAGE's install-if rule" },
{ 'I', "rinstall-if", "List all packages having install-if referencing PACKAGE" },
{ 'w', "webpage", "Show URL for more information about PACKAGE" },