summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2009-06-16 09:59:21 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2009-06-16 09:59:21 +0000
commit20a1217e866f9fe15c4de3ed28144084509e4ffa (patch)
tree2bc0c87439ef575dfd565fc081a51d501f4737ce /src
parentd8b1b851c713937bdb1a756f9419e3f97516d479 (diff)
downloadapk-tools-20a1217e866f9fe15c4de3ed28144084509e4ffa.tar.bz2
apk-tools-20a1217e866f9fe15c4de3ed28144084509e4ffa.tar.xz
add: support for forced versions
Support version numbers specified with packages. For example: apk add 'busybox<1.14' apk add 'squid=>3.0'
Diffstat (limited to 'src')
-rw-r--r--src/add.c21
-rw-r--r--src/apk_package.h4
-rw-r--r--src/apk_version.h1
-rw-r--r--src/package.c33
-rw-r--r--src/version.c18
5 files changed, 61 insertions, 16 deletions
diff --git a/src/add.c b/src/add.c
index d5dfb23..43e6340 100644
--- a/src/add.c
+++ b/src/add.c
@@ -122,11 +122,7 @@ static int add_main(void *ctx, int argc, char **argv)
md5_str(virtpkg->name->name, virtpkg->csum);
virtpkg->version = strdup("0");
virtpkg->description = strdup("virtual meta package");
- virtdep = (struct apk_dependency) {
- .name = virtpkg->name,
- .version = virtpkg->version,
- .result_mask = APK_VERSION_EQUAL,
- };
+ virtdep = apk_dep_from_pkg(&db, virtpkg);
virtdep.name->flags |= APK_NAME_TOPLEVEL | APK_NAME_VIRTUAL;
virtpkg = apk_db_pkg_add(&db, virtpkg);
}
@@ -143,17 +139,10 @@ static int add_main(void *ctx, int argc, char **argv)
goto err;
}
- dep = (struct apk_dependency) {
- .name = apk_db_get_name(&db, APK_BLOB_STR(pkg->name->name)),
- .version = pkg->version,
- .result_mask = APK_VERSION_EQUAL,
- };
- } else {
- dep = (struct apk_dependency) {
- .name = apk_db_get_name(&db, APK_BLOB_STR(argv[i])),
- .result_mask = APK_DEPMASK_REQUIRE,
- };
- }
+ dep = apk_dep_from_pkg(&db, pkg);
+ } else
+ dep = apk_dep_from_str(&db, argv[i]);
+
if (virtpkg) {
apk_deps_add(&virtpkg->depends, &dep);
} else {
diff --git a/src/apk_package.h b/src/apk_package.h
index 1e815d3..b8206c1 100644
--- a/src/apk_package.h
+++ b/src/apk_package.h
@@ -94,4 +94,8 @@ int apk_pkg_run_script(struct apk_package *pkg, int root_fd,
struct apk_package *apk_pkg_parse_index_entry(struct apk_database *db, apk_blob_t entry);
int apk_pkg_write_index_entry(struct apk_package *pkg, struct apk_ostream *os);
+struct apk_dependency apk_dep_from_str(struct apk_database *db,
+ char *str);
+struct apk_dependency apk_dep_from_pkg(struct apk_database *db,
+ struct apk_package *pkg);
#endif
diff --git a/src/apk_version.h b/src/apk_version.h
index e7036b3..313d24a 100644
--- a/src/apk_version.h
+++ b/src/apk_version.h
@@ -19,6 +19,7 @@
#define APK_VERSION_GREATER 4
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);
int apk_version_compare(apk_blob_t a, apk_blob_t b);
diff --git a/src/package.c b/src/package.c
index 029167d..0cad132 100644
--- a/src/package.c
+++ b/src/package.c
@@ -663,3 +663,36 @@ int apk_pkg_write_index_entry(struct apk_package *info,
return n;
}
+
+struct apk_dependency apk_dep_from_str(struct apk_database *db,
+ char *str)
+{
+ apk_blob_t name = APK_BLOB_STR(str);
+ char *v = str;
+ int mask = APK_DEPMASK_REQUIRE;
+
+ v = strpbrk(str, "<>=");
+ if (v != NULL) {
+ name.len = v - str;
+ mask = apk_version_result_mask(v++);
+ if (*v == '=')
+ v++;
+ }
+ printf("DEBUG: result_mask = %x\n", mask);
+ return (struct apk_dependency) {
+ .name = apk_db_get_name(db, name),
+ .version = v,
+ .result_mask = mask,
+ };
+}
+
+struct apk_dependency apk_dep_from_pkg(struct apk_database *db,
+ struct apk_package *pkg)
+{
+ return (struct apk_dependency) {
+ .name = apk_db_get_name(db, APK_BLOB_STR(pkg->name->name)),
+ .version = pkg->version,
+ .result_mask = APK_VERSION_EQUAL,
+ };
+}
+
diff --git a/src/version.c b/src/version.c
index 57437aa..c270f68 100644
--- a/src/version.c
+++ b/src/version.c
@@ -146,6 +146,24 @@ const char *apk_version_op_string(int mask)
}
}
+int apk_version_result_mask(const char *str)
+{
+ int r = 0;
+ switch (*str) {
+ case '<':
+ r = APK_VERSION_LESS;
+ str++;
+ break;
+ case '>':
+ r = APK_VERSION_GREATER;
+ str++;
+ break;
+ }
+ if (*str == '=')
+ r |= APK_VERSION_EQUAL;
+ return r;
+}
+
int apk_version_validate(apk_blob_t ver)
{
int t = TOKEN_DIGIT;