Signed-off-by: Andrew Gregory <[email protected]>
---
 lib/libalpm/conflict.c                             | 25 +++++++++++++++++-----
 src/pacman/sync.c                                  |  9 ++++++--
 test/pacman/tests/TESTS                            |  1 +
 .../tests/file-conflict-with-installed-pkg.py      | 17 +++++++++++++++
 4 files changed, 45 insertions(+), 7 deletions(-)
 create mode 100644 test/pacman/tests/file-conflict-with-installed-pkg.py

diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c
index 0e37419f..d52f8942 100644
--- a/lib/libalpm/conflict.c
+++ b/lib/libalpm/conflict.c
@@ -278,12 +278,15 @@ static alpm_list_t *add_fileconflict(alpm_handle_t 
*handle,
 
        STRDUP(conflict->target, pkg1->name, goto error);
        STRDUP(conflict->file, filestr, goto error);
-       if(pkg2) {
-               conflict->type = ALPM_FILECONFLICT_TARGET;
-               STRDUP(conflict->ctarget, pkg2->name, goto error);
-       } else {
+       if(!pkg2) {
                conflict->type = ALPM_FILECONFLICT_FILESYSTEM;
                STRDUP(conflict->ctarget, "", goto error);
+       } else if(pkg2->origin == ALPM_PKG_FROM_LOCALDB) {
+               conflict->type = ALPM_FILECONFLICT_FILESYSTEM;
+               STRDUP(conflict->ctarget, pkg2->name, goto error);
+       } else {
+               conflict->type = ALPM_FILECONFLICT_TARGET;
+               STRDUP(conflict->ctarget, pkg2->name, goto error);
        }
 
        conflicts = alpm_list_add(conflicts, conflict);
@@ -385,6 +388,17 @@ static alpm_list_t *alpm_db_find_file_owners(alpm_db_t* 
db, const char *path)
        return owners;
 }
 
+static alpm_pkg_t *_alpm_find_file_owner(alpm_handle_t *handle, const char 
*path)
+{
+       alpm_list_t *i;
+       for(i = alpm_db_get_pkgcache(handle->db_local); i; i = i->next) {
+               if(alpm_filelist_contains(alpm_pkg_get_files(i->data), path)) {
+                       return i->data;
+               }
+       }
+       return NULL;
+}
+
 static int _alpm_can_overwrite_file(alpm_handle_t *handle, const char *path)
 {
        return handle->trans->flags & ALPM_TRANS_FLAG_FORCE
@@ -668,7 +682,8 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t 
*handle,
                        }
 
                        if(!resolved_conflict) {
-                               conflicts = add_fileconflict(handle, conflicts, 
path, p1, NULL);
+                               conflicts = add_fileconflict(handle, conflicts, 
path, p1,
+                                               _alpm_find_file_owner(handle, 
relative_path));
                                if(handle->pm_errno == ALPM_ERR_MEMORY) {
                                        alpm_list_free_inner(conflicts,
                                                        (alpm_list_fn_free) 
alpm_conflict_free);
diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index e37b91c7..680d7b3e 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -823,8 +823,13 @@ int sync_prepare_execute(void)
                                                                        
conflict->file, conflict->target, conflict->ctarget);
                                                        break;
                                                case 
ALPM_FILECONFLICT_FILESYSTEM:
-                                                       printf(_("%s: %s exists 
in filesystem\n"),
-                                                                       
conflict->target, conflict->file);
+                                                       
if(conflict->ctarget[0]) {
+                                                               printf(_("%s: 
%s exists in filesystem (owned by %s)\n"),
+                                                                               
conflict->target, conflict->file, conflict->ctarget);
+                                                       } else {
+                                                               printf(_("%s: 
%s exists in filesystem\n"),
+                                                                               
conflict->target, conflict->file);
+                                                       }
                                                        break;
                                        }
                                        alpm_fileconflict_free(conflict);
diff --git a/test/pacman/tests/TESTS b/test/pacman/tests/TESTS
index eadb63b4..9dbeb767 100644
--- a/test/pacman/tests/TESTS
+++ b/test/pacman/tests/TESTS
@@ -28,6 +28,7 @@ TESTS += test/pacman/tests/epoch005.py
 TESTS += test/pacman/tests/epoch010.py
 TESTS += test/pacman/tests/epoch011.py
 TESTS += test/pacman/tests/epoch012.py
+TESTS += test/pacman/tests/file-conflict-with-installed-pkg.py
 TESTS += test/pacman/tests/fileconflict001.py
 TESTS += test/pacman/tests/fileconflict002.py
 TESTS += test/pacman/tests/fileconflict003.py
diff --git a/test/pacman/tests/file-conflict-with-installed-pkg.py 
b/test/pacman/tests/file-conflict-with-installed-pkg.py
new file mode 100644
index 00000000..cf88e8a9
--- /dev/null
+++ b/test/pacman/tests/file-conflict-with-installed-pkg.py
@@ -0,0 +1,17 @@
+self.description = "File conflict with an installed package"
+
+lp = pmpkg("foobar")
+lp.files = ["conflicting-file"]
+self.addpkg2db("local", lp)
+
+p1 = pmpkg("pkg1")
+p1.files = ["conflicting-file"]
+self.addpkg(p1)
+
+self.args = "-U %s" % (p1.filename())
+
+self.addrule("!PACMAN_RETCODE=0")
+self.addrule("PKG_EXIST=foobar")
+self.addrule("!PKG_EXIST=pkg1")
+self.addrule("FILE_EXIST=conflicting-file")
+self.addrule("PACMAN_OUTPUT=foobar")
-- 
2.12.2

Reply via email to