[pacman-dev] [PATCH 3/3] [RFC] Avoid upgrade conflict with unchanged effective path
Allan McRae
allan at archlinux.org
Tue Jul 17 10:42:43 EDT 2012
This applies to a case such as when /lib is a symlink to /usr/lib. If a
package is installed which contains /lib/libfoo.so, pacman will complain
if this package is then "fixed" to contain /usr/lib/libfoo.so. Since
these have the same effective path and it exists within the same
package, ignore the conflict.
Fixes FS#30681.
Pactest-by: Dave Reisner <dreisner at archlinux.org>
Signed-off-by: Allan McRae <allan at archlinux.org>
---
lib/libalpm/conflict.c | 23 ++++++++++++++++-------
test/pacman/tests/fileconflict013.py | 20 ++++++++++++++++++++
2 files changed, 36 insertions(+), 7 deletions(-)
create mode 100644 test/pacman/tests/fileconflict013.py
diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c
index faee7bd..7f867b4 100644
--- a/lib/libalpm/conflict.c
+++ b/lib/libalpm/conflict.c
@@ -639,6 +639,7 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle,
alpm_list_t *j;
alpm_filelist_t tmpfiles;
alpm_pkg_t *dbpkg;
+ alpm_filelist_t *dbpkg_filelist;
size_t filenum;
alpm_filelist_t *p1_filelist = resolved_filelist(handle, alpm_pkg_get_files(p1));
@@ -682,10 +683,6 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle,
}
}
- if(p1_filelist != alpm_pkg_get_files(p1)) {
- free_filelist(p1_filelist);
- }
-
/* CHECK 2: check every target against the filesystem */
_alpm_log(handle, ALPM_LOG_DEBUG, "searching for filesystem conflicts: %s\n",
p1->name);
@@ -698,16 +695,16 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle,
* be freed. */
if(dbpkg) {
alpm_list_t *difference;
+ dbpkg_filelist = resolved_filelist(handle, alpm_pkg_get_files(dbpkg));
/* older ver of package currently installed */
- difference = filelist_difference(alpm_pkg_get_files(p1),
- alpm_pkg_get_files(dbpkg));
+ difference = filelist_difference(p1_filelist, dbpkg_filelist);
tmpfiles.count = alpm_list_count(difference);
tmpfiles.files = alpm_list_to_array(difference, tmpfiles.count,
sizeof(alpm_file_t));
alpm_list_free(difference);
} else {
/* no version of package currently installed */
- tmpfiles = *alpm_pkg_get_files(p1);
+ tmpfiles = *p1_filelist;
}
for(filenum = 0; filenum < tmpfiles.count; filenum++) {
@@ -834,6 +831,12 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle,
if(dbpkg) {
/* only freed if it was generated from filelist_difference() */
free(tmpfiles.files);
+ if(dbpkg_filelist != alpm_pkg_get_files(dbpkg)) {
+ free_filelist(dbpkg_filelist);
+ }
+ }
+ if(p1_filelist != alpm_pkg_get_files(p1)) {
+ free_filelist(p1_filelist);
}
return NULL;
}
@@ -842,6 +845,12 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle,
if(dbpkg) {
/* only freed if it was generated from filelist_difference() */
free(tmpfiles.files);
+ if(dbpkg_filelist != alpm_pkg_get_files(dbpkg)) {
+ free_filelist(dbpkg_filelist);
+ }
+ }
+ if(p1_filelist != alpm_pkg_get_files(p1)) {
+ free_filelist(p1_filelist);
}
}
PROGRESS(handle, ALPM_PROGRESS_CONFLICTS_START, "", 100,
diff --git a/test/pacman/tests/fileconflict013.py b/test/pacman/tests/fileconflict013.py
new file mode 100644
index 0000000..a83923c
--- /dev/null
+++ b/test/pacman/tests/fileconflict013.py
@@ -0,0 +1,20 @@
+self.description = "file->file path change with same effective path (/lib as symlink)"
+
+lp1 = pmpkg("filesystem", "1.0-1")
+lp1.files = ["usr/",
+ "usr/lib/",
+ "lib -> usr/lib/"]
+self.addpkg2db("local", lp1)
+
+lp2 = pmpkg("pkg1", "1.0-1")
+lp2.files = ["lib/libfoo.so"]
+self.addpkg2db("local", lp2)
+
+sp1 = pmpkg("pkg1", "1.0-2")
+sp1.files = ["usr/lib/libfoo.so"]
+self.addpkg2db("sync", sp1)
+
+self.args = "-Su"
+
+self.addrule("PACMAN_RETCODE=0")
+self.addrule("PKG_VERSION=pkg1|1.0-2")
--
1.7.11.2
More information about the pacman-dev
mailing list