aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/opkg/opkg/0001-pkg_get_provider_replacees-do-not-add-installed-pkg-.patch
blob: 29a9f5901d3aa3c571af3efc6872fe45a680ae2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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