summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2009-05-12 11:44:33 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2009-05-12 11:44:33 +0000
commit4bc1670ec81d81d4ba01cbfb9b704e3d9cb8db21 (patch)
tree2b4530577db0085583616c81cde2a6458e6f2120
parent0c6c448da58a92f1202f7d4b2789b50b0a2c8201 (diff)
downloadaports-4bc1670ec81d81d4ba01cbfb9b704e3d9cb8db21.tar.bz2
aports-4bc1670ec81d81d4ba01cbfb9b704e3d9cb8db21.tar.xz
core/apk-tools: backported misc patches
delay-state-init: fixes apk add /path/to/file bug index-delete: backport of apk index -d /path/to/APK_INDEX.gz
-rw-r--r--core/apk-tools/APKBUILD8
-rw-r--r--core/apk-tools/delay-state-init.patch63
-rw-r--r--core/apk-tools/index-delete.patch132
3 files changed, 202 insertions, 1 deletions
diff --git a/core/apk-tools/APKBUILD b/core/apk-tools/APKBUILD
index 917aae54..7361850a 100644
--- a/core/apk-tools/APKBUILD
+++ b/core/apk-tools/APKBUILD
@@ -1,11 +1,13 @@
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname=apk-tools
pkgver=2.0_pre11
-pkgrel=1
+pkgrel=2
pkgdesc="Alpine Package Keeper - package manager for alpine"
depends="uclibc"
makedepends="zlib-dev"
source="http://git.alpinelinux.org/cgit/$pkgname/snapshot/$pkgname-$pkgver.tar.bz2
+ delay-state-init.patch
+ index-delete.patch
version.patch"
url="http://git.alpinelinux.org/cgit/apk-tools/"
license=GPL-2
@@ -14,6 +16,8 @@ build() {
cd "$srcdir/$pkgname-$pkgver"
sed -i -e 's:-Werror::' Make.rules
patch -p1 < ../version.patch || return 1
+ patch -p1 < ../delay-state-init.patch || return 1
+ patch -p1 < ../index-delete.patch || return 1
make
make DESTDIR="$pkgdir" install
cd "$pkgdir/sbin"
@@ -26,4 +30,6 @@ build() {
}
md5sums="1befa14958bebfe141bbb027937e3043 apk-tools-2.0_pre11.tar.bz2
+e6e851ce179963aef74d32b2db74215c delay-state-init.patch
+3e115bf5f11729a955b15b59d3091935 index-delete.patch
cfe30ff3ceea0bc908dffd01a730c1dd version.patch"
diff --git a/core/apk-tools/delay-state-init.patch b/core/apk-tools/delay-state-init.patch
new file mode 100644
index 00000000..397d2d4c
--- /dev/null
+++ b/core/apk-tools/delay-state-init.patch
@@ -0,0 +1,63 @@
+commit 110611c53c8e1b09c27c8c516c7f7c0baf47f68b
+Author: Natanael Copa <ncopa@alpinelinux.org>
+Date: Mon May 11 12:02:00 2009 +0000
+
+ add: delay state initialization til we have all pkgs in db
+
+ The state size is taken from name_id and cannot be extended. So we
+ must wait with initializing the state til we have all packages added
+ to the db.
+
+ We must also always allocate the package name, incase its not in the
+ repository. This is done with apk_db_get_name().
+
+diff --git a/src/add.c b/src/add.c
+index 77abc3b..9efab15 100644
+--- a/src/add.c
++++ b/src/add.c
+@@ -41,13 +41,13 @@ static int add_main(void *ctx, int argc, char **argv)
+ struct add_ctx *actx = (struct add_ctx *) ctx;
+ struct apk_database db;
+ struct apk_state *state;
++ struct apk_dependency_array *pkgs; /* list of pkgs to install */
+ int i, r;
+
+ r = apk_db_open(&db, apk_root, actx->open_flags | APK_OPENF_WRITE);
+ if (r != 0)
+ return r;
+
+- state = apk_state_new(&db);
+ for (i = 0; i < argc; i++) {
+ struct apk_dependency dep;
+
+@@ -61,7 +61,7 @@ static int add_main(void *ctx, int argc, char **argv)
+ }
+
+ dep = (struct apk_dependency) {
+- .name = pkg->name,
++ .name = apk_db_get_name(&db, APK_BLOB_STR(pkg->name->name)),
+ .version = pkg->version,
+ .result_mask = APK_VERSION_EQUAL,
+ };
+@@ -71,14 +71,18 @@ static int add_main(void *ctx, int argc, char **argv)
+ .result_mask = APK_DEPMASK_REQUIRE,
+ };
+ }
+- apk_deps_add(&db.world, &dep);
+ dep.name->flags |= APK_NAME_TOPLEVEL;
++ apk_deps_add(&pkgs, &dep);
++ }
+
+- r = apk_state_lock_dependency(state, &dep);
++ state = apk_state_new(&db);
++ for (i = 0; i < pkgs->num; i++) {
++ r = apk_state_lock_dependency(state, &pkgs->item[i]);
+ if (r != 0) {
+- apk_error("Unable to install '%s'", dep.name->name);
++ apk_error("Unable to install '%s'", pkgs->item[i].name->name);
+ goto err;
+ }
++ apk_deps_add(&db.world, &pkgs->item[i]);
+ }
+ r = apk_state_commit(state, &db);
+ err:
diff --git a/core/apk-tools/index-delete.patch b/core/apk-tools/index-delete.patch
new file mode 100644
index 00000000..4985e357
--- /dev/null
+++ b/core/apk-tools/index-delete.patch
@@ -0,0 +1,132 @@
+commit 2b6e5d6e40a0b8a7ef650ef66996148cfdca1f2c
+Author: Natanael Copa <ncopa@alpinelinux.org>
+Date: Tue May 12 06:27:25 2009 +0000
+
+ index: support for -d to delete packages from given index
+
+ The syntax is: apk index -d /path/to/APK_INDEX.gz pkg...
+
+ It does not seem like its possible to remove packages in the db so we
+ trick apk_db_index_write() by setting the repo to on-zero.
+
+ It's still not perfect since it does not recalculate the dependencies.
+
+diff --git a/src/apk_database.h b/src/apk_database.h
+index e7bfac9..0a0e52d 100644
+--- a/src/apk_database.h
++++ b/src/apk_database.h
+@@ -123,6 +123,7 @@ struct apk_package *apk_db_pkg_add_file(struct apk_database *db, const char *fil
+ struct apk_package *apk_db_get_pkg(struct apk_database *db, csum_t sum);
+ struct apk_package *apk_db_get_file_owner(struct apk_database *db, apk_blob_t filename);
+
++int apk_db_index_read(struct apk_database *db, struct apk_istream *is, int repo);
+ int apk_db_index_write(struct apk_database *db, struct apk_ostream *os);
+
+ int apk_db_add_repository(apk_database_t db, apk_blob_t repository);
+diff --git a/src/database.c b/src/database.c
+index 4da547d..e91c64a 100644
+--- a/src/database.c
++++ b/src/database.c
+@@ -370,7 +370,7 @@ static struct apk_package *apk_db_pkg_add(struct apk_database *db, struct apk_pa
+ return idb;
+ }
+
+-static int apk_db_index_read(struct apk_database *db, struct apk_istream *is, int repo)
++int apk_db_index_read(struct apk_database *db, struct apk_istream *is, int repo)
+ {
+ struct apk_package *pkg = NULL;
+ struct apk_db_dir_instance *diri = NULL;
+diff --git a/src/index.c b/src/index.c
+index 08fc342..e906ab4 100644
+--- a/src/index.c
++++ b/src/index.c
+@@ -19,6 +19,40 @@ struct counts {
+ int unsatisfied;
+ };
+
++struct index_ctx {
++ const char *index_file;
++ int delete;
++};
++
++static int index_parse(void *ctx, int optch, int optindex, const char *optarg)
++{
++ struct index_ctx *ictx = (struct index_ctx *) ctx;
++
++ switch (optch) {
++ case 'd':
++ ictx->index_file = optarg;
++ ictx->delete = 1;
++ break;
++ default:
++ return -1;
++ }
++ return 0;
++}
++
++static int index_read_file(struct apk_database *db, struct index_ctx *ictx)
++{
++ struct apk_istream *is;
++ int r;
++ if (ictx->index_file == NULL)
++ return 0;
++ is = apk_bstream_gunzip(apk_bstream_from_url(ictx->index_file), 1);
++ if (is == NULL)
++ return -1;
++ r = apk_db_index_read(db, is, -1);
++ is->close(is);
++ return r;
++}
++
+ static int warn_if_no_providers(apk_hash_item item, void *ctx)
+ {
+ struct counts *counts = (struct counts *) ctx;
+@@ -42,11 +76,26 @@ static int index_main(void *ctx, int argc, char **argv)
+ struct apk_database db;
+ struct counts counts = {0};
+ struct apk_ostream *os;
+- int total, i;
++ int total, i, j;
++ struct index_ctx *ictx = (struct index_ctx *) ctx;
+
+ apk_db_open(&db, NULL, APK_OPENF_READ);
+- for (i = 0; i < argc; i++)
+- apk_db_pkg_add_file(&db, argv[i]);
++ index_read_file(&db, ictx);
++
++ for (i = 0; i < argc; i++) {
++ if (ictx->delete) {
++ struct apk_name *name;
++ name = apk_db_query_name(&db, APK_BLOB_STR(argv[i]));
++ if (name == NULL)
++ continue;
++ /* apk_db_index_write() will only print the pkgs
++ where repos == 0. We prevent to write the given
++ packages by setting repos to non-zero */
++ for (j = 0; j < name->pkgs->num; j++)
++ name->pkgs->item[j]->repos = -1;
++ } else
++ apk_db_pkg_add_file(&db, argv[i]);
++ }
+
+ os = apk_ostream_to_fd(STDOUT_FILENO);
+ total = apk_db_index_write(&db, os);
+@@ -64,9 +113,17 @@ static int index_main(void *ctx, int argc, char **argv)
+ return 0;
+ }
+
++static struct option index_options[] = {
++ { "delete", required_argument, NULL, 'd' },
++};
++
+ static struct apk_applet apk_index = {
+ .name = "index",
+- .usage = "apkname...",
++ .usage = "[-d indexfile] apkname...",
++ .context_size = sizeof(struct index_ctx),
++ .num_options = ARRAY_SIZE(index_options),
++ .options = index_options,
++ .parse = index_parse,
+ .main = index_main,
+ };
+