diff options
Diffstat (limited to 'main/apk-tools')
-rw-r--r-- | main/apk-tools/0001-solver-fix-potential-install_if-processing-failure-f.patch | 184 | ||||
-rw-r--r-- | main/apk-tools/APKBUILD | 6 |
2 files changed, 188 insertions, 2 deletions
diff --git a/main/apk-tools/0001-solver-fix-potential-install_if-processing-failure-f.patch b/main/apk-tools/0001-solver-fix-potential-install_if-processing-failure-f.patch new file mode 100644 index 0000000000..01df7fbc78 --- /dev/null +++ b/main/apk-tools/0001-solver-fix-potential-install_if-processing-failure-f.patch @@ -0,0 +1,184 @@ +From 8e7fd3e06f300bd76b659db1164da1ee12f16870 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi> +Date: Tue, 12 Dec 2017 15:14:25 +0200 +Subject: [PATCH] solver: fix potential install_if processing failure, fixes + #8237 + +In discovery phase, there was logic to not process packages +multiple times. However, that logic failed to account the package's +depth and install_if state for the name being processed. This +caused install_if processing failure in certain topologies of the +dependency graph. Adds also a test case that should catch this +issue reliably. +--- + src/solver.c | 95 +++++++++++++++++++++++++++------------------------- + test/installif1.repo | 20 +++++++++++ + test/installif5.test | 8 +++++ + 3 files changed, 77 insertions(+), 46 deletions(-) + create mode 100644 test/installif5.test + +diff --git a/src/solver.c b/src/solver.c +index 5698215..851e77e 100644 +--- a/src/solver.c ++++ b/src/solver.c +@@ -184,55 +184,57 @@ static void discover_name(struct apk_solver_state *ss, struct apk_name *name) + name->ss.no_iif = 1; + foreach_array_item(p, name->providers) { + struct apk_package *pkg = p->pkg; +- if (pkg->ss.seen) +- continue; ++ if (!pkg->ss.seen) { ++ pkg->ss.seen = 1; ++ pkg->ss.pinning_allowed = APK_DEFAULT_PINNING_MASK; ++ pkg->ss.pinning_preferred = APK_DEFAULT_PINNING_MASK; ++ pkg->ss.pkg_available = ++ (pkg->filename != NULL) || ++ (pkg->repos & db->available_repos & ~BIT(APK_REPOSITORY_CACHED)); ++ /* Package is in 'cached' repository if filename is provided, ++ * or it's a 'virtual' package with install_size zero */ ++ pkg->ss.pkg_selectable = ++ (pkg->repos & db->available_repos) || ++ pkg->cached_non_repository || ++ pkg->ipkg; ++ ++ /* Prune install_if packages that are no longer available, ++ * currently works only if SOLVERF_AVAILABLE is set in the ++ * global solver flags. */ ++ pkg->ss.iif_failed = ++ (pkg->install_if->num == 0) || ++ ((ss->solver_flags_inherit & APK_SOLVERF_AVAILABLE) && ++ !pkg->ss.pkg_available); ++ ++ repos = get_pkg_repos(db, pkg); ++ pkg->ss.tag_preferred = ++ (pkg->filename != NULL) || ++ (pkg->installed_size == 0) || ++ (repos & ss->default_repos); ++ pkg->ss.tag_ok = ++ pkg->ss.tag_preferred || ++ pkg->cached_non_repository || ++ pkg->ipkg; + +- pkg->ss.seen = 1; +- +- pkg->ss.pinning_allowed = APK_DEFAULT_PINNING_MASK; +- pkg->ss.pinning_preferred = APK_DEFAULT_PINNING_MASK; +- pkg->ss.pkg_available = +- (pkg->filename != NULL) || +- (pkg->repos & db->available_repos & ~BIT(APK_REPOSITORY_CACHED)); +- /* Package is in 'cached' repository if filename is provided, +- * or it's a 'virtual' package with install_size zero */ +- pkg->ss.pkg_selectable = +- (pkg->repos & db->available_repos) || +- pkg->cached_non_repository || +- pkg->ipkg; +- +- /* Prune install_if packages that are no longer available, +- * currently works only if SOLVERF_AVAILABLE is set in the +- * global solver flags. */ +- pkg->ss.iif_failed = +- (pkg->install_if->num == 0) || +- ((ss->solver_flags_inherit & APK_SOLVERF_AVAILABLE) && +- !pkg->ss.pkg_available); +- name->ss.no_iif &= pkg->ss.iif_failed; ++ foreach_array_item(dep, pkg->depends) { ++ discover_name(ss, dep->name); ++ pkg->ss.max_dep_chain = max(pkg->ss.max_dep_chain, ++ dep->name->ss.max_dep_chain+1); ++ } + +- repos = get_pkg_repos(db, pkg); +- pkg->ss.tag_preferred = +- (pkg->filename != NULL) || +- (pkg->installed_size == 0) || +- (repos & ss->default_repos); +- pkg->ss.tag_ok = +- pkg->ss.tag_preferred || +- pkg->cached_non_repository || +- pkg->ipkg; +- +- foreach_array_item(dep, pkg->depends) { +- discover_name(ss, dep->name); +- pkg->ss.max_dep_chain = max(pkg->ss.max_dep_chain, +- dep->name->ss.max_dep_chain+1); ++ dbg_printf("discover " PKG_VER_FMT ": tag_ok=%d, tag_pref=%d max_dep_chain=%d selectable=%d\n", ++ PKG_VER_PRINTF(pkg), ++ pkg->ss.tag_ok, ++ pkg->ss.tag_preferred, ++ pkg->ss.max_dep_chain, ++ pkg->ss.pkg_selectable); + } ++ ++ name->ss.no_iif &= pkg->ss.iif_failed; + name->ss.max_dep_chain = max(name->ss.max_dep_chain, pkg->ss.max_dep_chain); + +- dbg_printf("discover " PKG_VER_FMT ": tag_ok=%d, tag_pref=%d max_dep_chain=%d selectable=%d\n", +- PKG_VER_PRINTF(pkg), +- pkg->ss.tag_ok, +- pkg->ss.tag_preferred, +- pkg->ss.max_dep_chain, +- pkg->ss.pkg_selectable); ++ dbg_printf("discover %s: max_dep_chain=%d no_iif=%d\n", ++ name->name, name->ss.max_dep_chain, name->ss.no_iif); + } + foreach_array_item(pname0, name->rinstall_if) + discover_name(ss, *pname0); +@@ -398,10 +400,11 @@ static void reconsider_name(struct apk_solver_state *ss, struct apk_name *name) + foreach_array_item(dep, pkg->install_if) + inherit_pinning_and_flags(ss, pkg, dep->name->ss.chosen.pkg); + } +- dbg_printf(" "PKG_VER_FMT": iif_triggered=%d iif_failed=%d\n", +- PKG_VER_PRINTF(pkg), pkg->ss.iif_triggered, pkg->ss.iif_failed); + has_iif |= pkg->ss.iif_triggered; + no_iif &= pkg->ss.iif_failed; ++ dbg_printf(" "PKG_VER_FMT": iif_triggered=%d iif_failed=%d, no_iif=%d\n", ++ PKG_VER_PRINTF(pkg), pkg->ss.iif_triggered, pkg->ss.iif_failed, ++ no_iif); + + if (name->ss.requirers == 0) + continue; +diff --git a/test/installif1.repo b/test/installif1.repo +index 09b6760..3990209 100644 +--- a/test/installif1.repo ++++ b/test/installif1.repo +@@ -46,3 +46,23 @@ I:1 + D:app + i:app bar + ++C:Q1/hQ3fH2AzuTwJVGOz+keypXhXKY= ++P:dam ++V:1 ++S:1 ++I:1 ++ ++C:Q1/hQ3fH2AzuTwJVGfz+keypXhXKY= ++P:dam-babel ++V:1 ++S:1 ++I:1 ++p:cmd:babel ++ ++C:Q1/hQ3fH2AguTwJVGOz+keypXhXKY= ++P:dam1-babel ++V:1 ++S:1 ++I:1 ++i:dam dam-babel ++p:cmd:babel +diff --git a/test/installif5.test b/test/installif5.test +new file mode 100644 +index 0000000..a0c707b +--- /dev/null ++++ b/test/installif5.test +@@ -0,0 +1,8 @@ ++@ARGS ++--test-repo installif1.repo ++add dam dam-babel cmd:babel ++@EXPECT ++(1/3) Installing dam-babel (1) ++(2/3) Installing dam (1) ++(3/3) Installing dam1-babel (1) ++OK: 0 MiB in 0 packages +-- +2.14.3 + diff --git a/main/apk-tools/APKBUILD b/main/apk-tools/APKBUILD index 0614a317cf..77b45acb71 100644 --- a/main/apk-tools/APKBUILD +++ b/main/apk-tools/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: Natanael Copa <ncopa@alpinelinux.org> pkgname=apk-tools pkgver=2.8.1 -pkgrel=1 +pkgrel=2 pkgdesc="Alpine Package Keeper - package manager for alpine" subpackages="$pkgname-static" depends= @@ -13,6 +13,7 @@ if [ "$CBUILD" = "$CHOST" ]; then makedepends="$makedepends lua5.2-dev" fi source="http://dev.alpinelinux.org/archive/$pkgname/$pkgname-$pkgver.tar.xz + 0001-solver-fix-potential-install_if-processing-failure-f.patch " url="https://git.alpinelinux.org/cgit/apk-tools/" @@ -82,4 +83,5 @@ luaapk() { mv "$pkgdir"/usr/lib "$subpkgdir"/usr/lib/ } -sha512sums="be36afe5af7beca5f5895c835690ffe7683b70cce6bfef9bc880103f5872a157e7192c172eb23dcd64905ee4e029ee75ee19310d24b267aa94656696b1944466 apk-tools-2.8.1.tar.xz" +sha512sums="be36afe5af7beca5f5895c835690ffe7683b70cce6bfef9bc880103f5872a157e7192c172eb23dcd64905ee4e029ee75ee19310d24b267aa94656696b1944466 apk-tools-2.8.1.tar.xz +ae558e2ffb0008def9de46996c5b5853cbd5432de21755a24b55271250f0e987974314859c51ec533cd4f2f4ee0c178f4902a2f74c8f3361a3b7870a33300f8e 0001-solver-fix-potential-install_if-processing-failure-f.patch" |