diff options
author | Stefan Agner <stefan.agner@toradex.com> | 2016-04-24 18:10:37 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-05-09 14:37:19 +0100 |
commit | f26fc34bbe9cf9ae059d4fe646a84501b8924f75 (patch) | |
tree | f3574656753c0abc44a0c7d98b579ac2de721e83 | |
parent | e8bc043f871e507542955ad28de74f67afa9bc36 (diff) | |
download | openembedded-core-f26fc34bbe9cf9ae059d4fe646a84501b8924f75.tar.gz openembedded-core-f26fc34bbe9cf9ae059d4fe646a84501b8924f75.tar.bz2 openembedded-core-f26fc34bbe9cf9ae059d4fe646a84501b8924f75.zip |
opkg: backport fix for double remove of packges
Backport the fix 7885da3974 ("pkg_get_provider_replacees: do not
add installed pkg to replacee list"). This avoids opkg trying to
remove a package twice e.g. when upgrading.
Suggested-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
Signed-off-by: Stefan Agner <stefan.agner@toradex.com>
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/recipes-devtools/opkg/opkg/0001-pkg_get_provider_replacees-do-not-add-installed-pkg-.patch | 112 | ||||
-rw-r--r-- | meta/recipes-devtools/opkg/opkg_0.3.0.bb | 1 |
2 files changed, 113 insertions, 0 deletions
diff --git a/meta/recipes-devtools/opkg/opkg/0001-pkg_get_provider_replacees-do-not-add-installed-pkg-.patch b/meta/recipes-devtools/opkg/opkg/0001-pkg_get_provider_replacees-do-not-add-installed-pkg-.patch new file mode 100644 index 0000000000..29a9f5901d --- /dev/null +++ b/meta/recipes-devtools/opkg/opkg/0001-pkg_get_provider_replacees-do-not-add-installed-pkg-.patch @@ -0,0 +1,112 @@ +From c5acac4ca0633088ea3f2d92dc236a43593e13b7 Mon Sep 17 00:00:00 2001 +From: Alejandro del Castillo <alejandro.delcastillo@ni.com> +Date: Tue, 12 Jan 2016 17:12:18 -0600 +Subject: [PATCH] pkg_get_provider_replacees: do not add installed pkg to + replacee list + +If package A replaces provider B, and B is provided by A, +pkg_get_provider_replacees incorrectly adds A to the list of B replacees +when A is installed. During an upgrade, pacakge A is removed during +pkg_remove_installed_replacees, then once more during the package +upgrade. + +Add check to skip the insertion of package A into the replacees vector +in pkg_get_provider_replacees. + +Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com> +--- + libopkg/opkg_install.c | 13 +++++++++---- + tests/Makefile | 1 + + tests/regress/issue8913.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 54 insertions(+), 4 deletions(-) + create mode 100755 tests/regress/issue8913.py + +diff --git a/libopkg/opkg_install.c b/libopkg/opkg_install.c +index dbfafa5..c2db870 100644 +--- a/libopkg/opkg_install.c ++++ b/libopkg/opkg_install.c +@@ -427,10 +427,15 @@ static void pkg_get_provider_replacees(pkg_t * pkg, + continue; + for (j = 0; j < ap->pkgs->len; j++) { + pkg_t *replacee = ap->pkgs->pkgs[j]; +- int installed = (replacee->state_status == SS_INSTALLED) +- || (replacee->state_status == SS_UNPACKED); +- if (installed) +- pkg_vec_insert(replacees, replacee); ++ pkg_t *old = pkg_hash_fetch_installed_by_name(pkg->name); ++ /* skip pkg if installed: it will be removed during upgrade ++ * issue 8913 */ ++ if (old != replacee) { ++ int installed = (replacee->state_status == SS_INSTALLED) ++ || (replacee->state_status == SS_UNPACKED); ++ if (installed) ++ pkg_vec_insert(replacees, replacee); ++ } + } + } + } +diff --git a/tests/Makefile b/tests/Makefile +index 707434f..d01e97b 100644 +--- a/tests/Makefile ++++ b/tests/Makefile +@@ -39,6 +39,7 @@ REGRESSION_TESTS := core/01_install.py \ + regress/issue127.py \ + regress/issue152.py \ + regress/issue154.py \ ++ regress/issue8913.py \ + misc/filehash.py \ + misc/update_loses_autoinstalled_flag.py + RUN_TESTS := $(REGRESSION_TESTS:%.py=run-%.py) +diff --git a/tests/regress/issue8913.py b/tests/regress/issue8913.py +new file mode 100755 +index 0000000..aaa940f +--- /dev/null ++++ b/tests/regress/issue8913.py +@@ -0,0 +1,44 @@ ++#! /usr/bin/env python3 ++# ++# Reporter: alejandro.delcastillo@ni.com ++# ++# What steps will reproduce the problem? ++# ====================================== ++# ++# 1.- Create package a (v 1.0) that Provides b and c, Replaces b, Conflicts with b. ++# install it ++# 2.- Create package a (v 2.0) that Provides b and c, Replaces b, Conflicts with b. ++# upgrade ++# ++# What is the expected output? What do you see instead? ++# ===================================================== ++# ++# Upgrade fails ++# ++ ++import os ++import opk, cfg, opkgcl ++ ++opk.regress_init() ++ ++o = opk.OpkGroup() ++o.add(Package="a", Version="1.0", Provides="b, c", Replaces="b", Conflicts="b") ++o.write_opk() ++o.write_list() ++ ++opkgcl.update() ++ ++opkgcl.install("a", "--force-postinstall") ++ ++o = opk.OpkGroup() ++o.add(Package="a", Version="2.0", Provides="b, c", Replaces="b", Conflicts="b") ++o.write_opk() ++o.write_list() ++ ++opkgcl.update() ++status = opkgcl.upgrade("--force-postinstall") ++ ++if not opkgcl.is_installed("a", "2.0"): ++ opk.fail("New version of package 'a' available during upgrade but was not installed") ++ ++opkgcl.remove("a") +-- +2.8.0 + diff --git a/meta/recipes-devtools/opkg/opkg_0.3.0.bb b/meta/recipes-devtools/opkg/opkg_0.3.0.bb index 5ad3e92cff..70110d597e 100644 --- a/meta/recipes-devtools/opkg/opkg_0.3.0.bb +++ b/meta/recipes-devtools/opkg/opkg_0.3.0.bb @@ -21,6 +21,7 @@ SRC_URI = "http://downloads.yoctoproject.org/releases/${BPN}/${BPN}-${PV}.tar.gz file://0002-md5-Add-md5_to_string-function.patch \ file://0003-sha256-Add-sha256_to_string-function.patch \ file://0004-opkg_download-Use-short-cache-file-name.patch \ + file://0001-pkg_get_provider_replacees-do-not-add-installed-pkg-.patch \ " SRC_URI[md5sum] = "3412cdc71d78b98facc84b19331ec64e" |