Re: dpkg, symlinks, directories
On 2012-09-29 12:47, Vincent Bernat wrote:
> ❦ 29 septembre 2012 12:35 CEST, Salvatore Bonaccorso <carnil@debian.org> :
>
>>> In roundcube package, I am turning existing directories to symlinks and
>>> symlinks into directories. It seems that dpkg does not like that:
>>> symlinks are not replaced with the appropriate directories. I didn't
>>> find anything about this in the documentation. How should I handle such
>>> cases?
>>
>> This is indeed intentional, that dpkg never replaces directories with
>> symlinks if directory is present, see [1] and [2] (under 4.).
>>
>> [1]: http://bugs.debian.org/404850
>> [2]: http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-unpackphase
>>
>> Andreas Beckmann recently is filling many of these bugs discovered by
>> piuparts runs (updating Squeeze -> Wheezy). Most common approach there
>> is to do the substitution in postinst, in case the directory is there.
>> See for example [3].
>>
>> [3]: http://bugs.debian.org/687859
>>
>> Does this helps?
>
> Thanks for the pointers! I now understand why this does not
> work. Fixing in postinst is quite difficult since I have swapped
> symlinks and, from the bug reports, successive installs make the
> situation worst (things got installed in the wrong place).
>
> Well, I need to work a bit on this.
I think a working approach is:
* directory to symlink
fix it up in the postinst (at postinst, the directory should have
become "empty"):
if [ -d $X ] && [ ! -L $X ]; then
rmdir $X # bombs if not empty
ln -s $target $X
fi
* symlink to directory
remove symlinks in the preinst to avoid installing stuff at the wrong
place
test ! -L $X || rm $X
The whole process may not work properly on aborted upgrades (or even
downgrades, but these are not really supported anyway).
Andreas
Reply to: