[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Merging three direcories in postinst

Joachim Breitner writes ("Merging three direcories in postinst"):
> But before doing so, I?d like to get comments as to what can go wrong.
> Especially, does dpkg mind if I replace something that dpkg thinks is a
> proper directory by a symbolic link?

Thanks for asking.

No, dpkg will not mind.  It will follow the link.

> Will it still cleanly remove files that were installed by
> libghc-foo-doc into /usr/lib/ghc-7.0.3/haddock/ when libghc-foo-doc
> is removed?

Yes, it will.  It will also (try to) remove the symlink when it thinks
/usr/lib/ghc-7.0.3 becomes empty.

However, dpkg will not know that
  /usr/lib/ghc-7.0.2/haddock/foo.haddock  (in old libghc-foo-doc)
  /usr/lib/haddock/foo.haddock  (in old libghc-foo-doc)
are the same file.  This will not normally be a problem as dpkg will
ihappily "overwrite" the "unexpected" other file, but you should be
aware of it.

> for dir in /usr/lib/ghc-7.0.2/haddock /usr/lib/ghc-7.0.3/haddock
> do
>   if test -d $dir
>   then
>     mv $dir/* /usr/lib/haddock
>     rmdir $dir
>     ln -s ../haddock $dir
>   fi
> done

This code is buggy because it will always trigger since test -d will
be true for a symlink to a directory.

Also you might want to think about what you want to happen if the same
file is found in two or more of

In general I think you have a tenable approach here.  But you should
do thorough testing; particularly, you should do testing with
"dpkg -i" and "dpkg --remove" in arbitrary orders, and you should do
testing of what happens if your fixup script falls over halfway
through (eg, put a sleep in it and ^Z then kill -9 the whole dpkg
process stack).

It is important that the sh code you write is idempotent and the
dependencies are all correct.  I suggest you come back here (or to
debian-dpkg) and ask for another review when you have a more concrete


Reply to: