[pacman-dev] [PATCH] Add conflict for replacing empty directory owned

Allan McRae allan at archlinux.org
Tue Jul 10 22:22:33 EDT 2012


On 10/07/12 23:28, Dan McGee wrote:
> On Sun, Jul 8, 2012 at 7:13 AM, Allan McRae <allan at archlinux.org> wrote:
>> When two packages own an empty directory, pacman finds no conflict when
>> one of those packages wants to replace the directory with a file or a
>> symlink.  When it comes to actually extracting the new file/symlink,
>> pacman sees the directory is still there (we do not remove empty
>> directories if they are owned by a package) and refuses to extract.
>>
>> Detect this potential conflict early and bail. Note that it is a
>> _potential_ conflict and not a guaranteed one as the other package owning
>> the directory could be updated or removed first which would remove
>> the conflict.  However, pacman currently can not sort package installation
>> order to ensure this, so this conflict requires manual upgrade ordering.
>>
>> Signed-off-by: Allan McRae <allan at archlinux.org>
>> ---
> 

<snip>

>>
>> +       /* TODO: this is an overly strict check but currently pacman will not
>> +        * overwrite a directory with a file (case 10/11 in add.c). Adjusting that
>> +        * is not simple as even if the directory is being unowned by a conflicting
>> +        * package, pacman does not sort this to ensure all required directory
>> +        * "removals" happen before installation of file/symlink */
>> +
>> +       /* check no other _installed_ package owns the directory */
>> +       local_pkgs = _alpm_db_get_pkgcache(handle->db_local);
>> +       for(local = local_pkgs; local; local = local->next) {
>> +               alpm_pkg_t *local_pkg = local->data;
>> +               alpm_filelist_t *filelist;
>> +
>> +               if(pkg == local_pkg) {
>> +                       continue;
>> +               }
>> +
>> +               filelist = alpm_pkg_get_files(local_pkg);
>> +               if(_alpm_filelist_contains(filelist, dirpath)) {
>> +                       return 0;
>> +               }
>> +       }
> 
> Also a TODO- this can seemingly get rather expensive, as we are adding
> another iteration of the local database and all the filelists inside a
> loop where we are iterating every file of every to-be-installed
> package. So we're at like O(n^123) here. (OK, not that bad, but
> something to keep awareness of.)

Note that this loop is only called in the very rare case when a
directory is in conflict with a file/symlink in a package.  And if the
conflict is resolved, the time spent loading the filelists for local
package is saved during the removal of the empty directory (where we do
a very similar loop...).

Allan


More information about the pacman-dev mailing list