summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2011-01-01 16:58:58 +0200
committerTimo Teräs <timo.teras@iki.fi>2011-01-01 16:58:58 +0200
commit1c7e8d2617d93daac1fe0c38c0279435331bb152 (patch)
treecb801169ccccebad45293071694f877c73447823 /src
parent65826761508d1b9effd62e7665d6db23b6fabe2f (diff)
downloadapk-tools-1c7e8d2617d93daac1fe0c38c0279435331bb152.tar.gz
apk-tools-1c7e8d2617d93daac1fe0c38c0279435331bb152.tar.bz2
apk-tools-1c7e8d2617d93daac1fe0c38c0279435331bb152.tar.xz
apk-tools-1c7e8d2617d93daac1fe0c38c0279435331bb152.zip
pkg: dependencies to specific package checksum
When package is installed from commandline, we should always install that specific instance of package (never favor repository version if it has difference identity). Otherwise we might not always end-up installing the .apk given on command line. The dependency is now against specific checksum identity (marked with >< dependency comparison). Fixes #492.
Diffstat (limited to 'src')
-rw-r--r--src/apk_package.h5
-rw-r--r--src/apk_version.h5
-rw-r--r--src/info.c3
-rw-r--r--src/package.c36
-rw-r--r--src/search.c3
-rw-r--r--src/state.c23
-rw-r--r--src/version.c2
7 files changed, 48 insertions, 29 deletions
diff --git a/src/apk_package.h b/src/apk_package.h
index 65d20ad..3e50979 100644
--- a/src/apk_package.h
+++ b/src/apk_package.h
@@ -56,10 +56,6 @@ struct apk_sign_ctx {
} signature;
};
-#define APK_DEPMASK_REQUIRE (APK_VERSION_EQUAL|APK_VERSION_LESS|\
- APK_VERSION_GREATER)
-#define APK_DEPMASK_CONFLICT (0)
-
struct apk_dependency {
struct apk_name *name;
apk_blob_t *version;
@@ -114,6 +110,7 @@ int apk_dep_from_blob(struct apk_dependency *dep, struct apk_database *db,
apk_blob_t blob);
void apk_dep_from_pkg(struct apk_dependency *dep, struct apk_database *db,
struct apk_package *pkg);
+int apk_dep_is_satisfied(struct apk_dependency *dep, struct apk_package *pkg);
void apk_blob_push_dep(apk_blob_t *to, struct apk_dependency *dep);
int apk_deps_add(struct apk_dependency_array **depends,
diff --git a/src/apk_version.h b/src/apk_version.h
index ea3f444..42df3b9 100644
--- a/src/apk_version.h
+++ b/src/apk_version.h
@@ -18,6 +18,11 @@
#define APK_VERSION_LESS 2
#define APK_VERSION_GREATER 4
+#define APK_DEPMASK_REQUIRE (APK_VERSION_EQUAL|APK_VERSION_LESS|\
+ APK_VERSION_GREATER)
+#define APK_DEPMASK_CHECKSUM (APK_VERSION_LESS|APK_VERSION_GREATER)
+#define APK_DEPMASK_CONFLICT (0)
+
const char *apk_version_op_string(int result_mask);
int apk_version_result_mask(const char *str);
int apk_version_validate(apk_blob_t ver);
diff --git a/src/info.c b/src/info.c
index 1b936f0..c9dc39c 100644
--- a/src/info.c
+++ b/src/info.c
@@ -84,8 +84,7 @@ static int info_exists(struct info_ctx *ctx, struct apk_database *db,
if (j >= name->pkgs->num)
continue;
- if (!(apk_version_compare_blob(*pkg->version, *dep.version)
- & dep.result_mask))
+ if (!apk_dep_is_satisfied(&dep, pkg))
continue;
verbose_print_pkg(pkg, 0);
diff --git a/src/package.c b/src/package.c
index dfd9cc9..37e4357 100644
--- a/src/package.c
+++ b/src/package.c
@@ -222,11 +222,8 @@ int apk_dep_from_blob(struct apk_dependency *dep, struct apk_database *db,
break;
}
}
- if ((mask & (APK_VERSION_LESS|APK_VERSION_GREATER))
- == (APK_VERSION_LESS|APK_VERSION_GREATER))
- return -EINVAL;
-
- if (!apk_version_validate(bver))
+ if ((mask & APK_DEPMASK_CHECKSUM) != APK_DEPMASK_CHECKSUM &&
+ !apk_version_validate(bver))
return -EINVAL;
blob = bname;
@@ -247,10 +244,16 @@ int apk_dep_from_blob(struct apk_dependency *dep, struct apk_database *db,
void apk_dep_from_pkg(struct apk_dependency *dep, struct apk_database *db,
struct apk_package *pkg)
{
+ char buf[64];
+ apk_blob_t b = APK_BLOB_BUF(buf);
+
+ apk_blob_push_csum(&b, &pkg->csum);
+ b = apk_blob_pushed(APK_BLOB_BUF(buf), b);
+
*dep = (struct apk_dependency) {
.name = pkg->name,
- .version = pkg->version,
- .result_mask = APK_VERSION_EQUAL,
+ .version = apk_blob_atomize_dup(b),
+ .result_mask = APK_DEPMASK_CHECKSUM,
};
}
@@ -273,6 +276,25 @@ static int parse_depend(void *ctx, apk_blob_t blob)
return 0;
}
+int apk_dep_is_satisfied(struct apk_dependency *dep, struct apk_package *pkg)
+{
+ if (dep->name != pkg->name)
+ return 0;
+ if (dep->result_mask == APK_DEPMASK_CHECKSUM) {
+ struct apk_checksum csum;
+ apk_blob_t b = *dep->version;
+
+ apk_blob_pull_csum(&b, &csum);
+ if (apk_checksum_compare(&csum, &pkg->csum) == 0)
+ return 1;
+ } else {
+ if (apk_version_compare_blob(*pkg->version, *dep->version)
+ & dep->result_mask)
+ return 1;
+ }
+ return 0;
+}
+
void apk_deps_parse(struct apk_database *db,
struct apk_dependency_array **depends,
apk_blob_t blob)
diff --git a/src/search.c b/src/search.c
index cb8c44d..3973552 100644
--- a/src/search.c
+++ b/src/search.c
@@ -53,8 +53,7 @@ static int print_rdepends(struct apk_package *pkg)
for (k = 0; k < pkg0->depends->num; k++) {
dep = &pkg0->depends->item[k];
if (name == dep->name &&
- (apk_version_compare_blob(*pkg->version, *dep->version)
- & dep->result_mask)) {
+ apk_dep_is_satisfied(dep, pkg)) {
printf(" " PKG_VER_FMT,
PKG_VER_PRINTF(pkg0));
}
diff --git a/src/state.c b/src/state.c
index ddfca57..408df72 100644
--- a/src/state.c
+++ b/src/state.c
@@ -130,8 +130,7 @@ static struct apk_name_choices *name_choices_new(struct apk_database *db,
continue;
for (j = 0; j < nc->num; ) {
- if (apk_version_compare_blob(*nc->pkgs[j]->version, *dep->version)
- & dep->result_mask) {
+ if (apk_dep_is_satisfied(dep, nc->pkgs[j])) {
j++;
} else {
nc->pkgs[j] = nc->pkgs[nc->num - 1];
@@ -286,8 +285,7 @@ int apk_state_prune_dependency(struct apk_state *state,
return -1;
}
} else {
- if (!(apk_version_compare_blob(*pkg->version, *dep->version)
- & dep->result_mask))
+ if (!apk_dep_is_satisfied(dep, pkg))
return -1;
}
@@ -301,9 +299,8 @@ int apk_state_prune_dependency(struct apk_state *state,
c = ns_to_choices(state->name[name->id]);
i = 0;
while (i < c->num) {
- if (apk_version_compare_blob(*c->pkgs[i]->version, *dep->version)
- & dep->result_mask) {
- i++;
+ if (apk_dep_is_satisfied(dep, c->pkgs[i])) {
+ i++;
continue;
}
@@ -444,8 +441,7 @@ static int call_if_dependency_broke(struct apk_state *state,
dep->result_mask == APK_DEPMASK_CONFLICT)
continue;
if (dep_pkg != NULL &&
- (apk_version_compare_blob(*dep_pkg->version, *dep->version)
- & dep->result_mask))
+ apk_dep_is_satisfied(dep, dep_pkg))
continue;
return cb(state, pkg, dep, ctx);
}
@@ -619,12 +615,11 @@ static void apk_print_change(struct apk_database *db,
msg = "Downgrading";
break;
case APK_VERSION_EQUAL:
- if (newpkg == oldpkg) {
+ if (newpkg == oldpkg)
msg = "Re-installing";
- break;
- }
- /* fallthrough - equal version, but different
- * package is counted as upgrade */
+ else
+ msg = "Replacing";
+ break;
case APK_VERSION_GREATER:
msg = "Upgrading";
break;
diff --git a/src/version.c b/src/version.c
index 34c5f1a..2de886a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -151,6 +151,8 @@ const char *apk_version_op_string(int mask)
return ">=";
case APK_VERSION_GREATER:
return ">";
+ case APK_DEPMASK_CHECKSUM:
+ return "><";
default:
return "?";
}