[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