diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2009-05-12 11:44:33 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2009-05-12 11:44:33 +0000 |
commit | 4bc1670ec81d81d4ba01cbfb9b704e3d9cb8db21 (patch) | |
tree | 2b4530577db0085583616c81cde2a6458e6f2120 | |
parent | 0c6c448da58a92f1202f7d4b2789b50b0a2c8201 (diff) | |
download | aports-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/APKBUILD | 8 | ||||
-rw-r--r-- | core/apk-tools/delay-state-init.patch | 63 | ||||
-rw-r--r-- | core/apk-tools/index-delete.patch | 132 |
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, + }; + |