[pacman-dev] [PATCH] libalpm: Fix installing update of a replaced package

Olivier Brunel i.am.jack.mail at gmail.com
Thu Feb 28 13:06:47 EST 2013


During a sysupgrade, if a package is replaced by another, and an update for the
former package is found (on another repo) the replaced package would be
re-installed.

Signed-off-by: Olivier Brunel <i.am.jack.mail at gmail.com>
---
I'm not really familiar with inner workings of ALPM, so this is probably not the
best way to do this.

 lib/libalpm/sync.c            | 13 ++++++++++++-
 test/pacman/tests/sync1104.py | 18 ++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 test/pacman/tests/sync1104.py

diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index 204456d..31f5870 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -351,6 +351,16 @@ finish:
 	return ret;
 }
 
+static int _cmp_pkg (alpm_pkg_t *pkg1, alpm_pkg_t *pkg2)
+{
+	if (!pkg1)
+		return 1;
+	else if (!pkg2)
+		return -1;
+	else
+		return strcmp (pkg1->name, pkg2->name);
+}
+
 int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
 {
 	alpm_list_t *i, *j;
@@ -408,7 +418,8 @@ int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data)
 		   building up a list of packages which could not be resolved. */
 		for(i = trans->add; i; i = i->next) {
 			alpm_pkg_t *pkg = i->data;
-			if(_alpm_resolvedeps(handle, localpkgs, pkg, trans->add,
+			if(!alpm_list_find(remove, pkg, (alpm_list_fn_cmp) _cmp_pkg)
+					&& _alpm_resolvedeps(handle, localpkgs, pkg, trans->add,
 						&resolved, remove, data) == -1) {
 				unresolvable = alpm_list_add(unresolvable, pkg);
 			}
diff --git a/test/pacman/tests/sync1104.py b/test/pacman/tests/sync1104.py
new file mode 100644
index 0000000..5cec98a
--- /dev/null
+++ b/test/pacman/tests/sync1104.py
@@ -0,0 +1,18 @@
+self.description = "Don't update (reinstall) a replaced package"
+
+lp = pmpkg("old", "1-1")
+self.addpkg2db("local", lp)
+
+p1 = pmpkg("new")
+p1.provides = ["old"]
+p1.replaces = ["old"]
+self.addpkg2db("sync1", p1)
+
+p2 = pmpkg("old", "1-2")
+self.addpkg2db("sync2", p2)
+
+self.args = "-Su"
+
+self.addrule("PACMAN_RETCODE=0")
+self.addrule("!PKG_EXIST=old")
+self.addrule("PKG_EXIST=new")
-- 
1.8.1.4



More information about the pacman-dev mailing list