Re: persistence of /usr/doc/$pkg (Was: debhelper: /usr/doc problems again)
Hi,
>>"Brian" == Brian May <bam@snoopy.apana.org.au> writes:
Brian> I am guessing that all of these issues have been fully discussed,
Brian> however, I think that some people might be oversimplifing the issue...
One would appreciate details, then.
Brian> I don't think it is that easy just to remove the old /usr/doc
Brian> directory (for the same reason somebody told me you can't just
Brian> move the files from /usr/doc to /usr/share/doc).
Please elaborate. What are the problems you forsee?
Brian> Suppose that two packages have files under /usr/doc/mypackage,
Brian> package A and package B. (for an example, just look for any symbolic
Brian> links under /usr/doc on a *slink* system).
Yes. If a -doc package is indeed putting files under the
directory for the parent package, then the new parent package may
need to conflict with older -doc packages. I do not think this is the
case, however, for the proceduerw I outlined; since there merely
exists yet another symlink in the chain which is added.
The process I discuss is not meant to be blindly followed, and
hence may not be suitable for helper packages.
Brian> When you delete package A, you also delete files that are owned by
Brian> package B inside /usr/doc/mypackage. While this doesn't sound very good,
Brian> I don't think is a huge problem by itself (please correct me if I am
Brian> wrong). However, it does mean that the users documentation would get
Brian> deleted, and this documentation isn't locally maintained, either.
If you look at what I proposed, no file is actiually
deleted. It is first copied to /usr/share/doc/$pkg (with backups),
and the documentatiopn still exists.
Brian> Now, when the user deletes that 2nd package, will dpkg get confused and
Brian> delete the symlink?
No. It would indeed try and delete the files, which should be
OK.
Brian> However, seems to me that there always be some messy situations. eg,
Brian> install new versions of package A and that uses /usr/share/doc, and then
Brian> install old version of package B that uses /usr/doc. Remove package A.
Brian> Does A remove the symlink under /usr/doc? Assume it does. Now remove
Brian> package B. Oops - dpkg can't find the files for package B, as they were
Brian> installed under /usr/share/doc, but that symlink was deleted.
What does dpkg do in this case? I think it silently ignores
files already removed. We'll have cruft in /usr/share/doc. If that is
a major issue, conflict with older -doc packages.
Don't release new versions of package A while not
releasing new versions of package B
I still think this proposal is better than silently failing to
create a symlink.
Please have a look at the postinst of libcgi-perl that I am
including below.
manoj
--
Early to bed and early to rise and you'll be groggy when everyone
else is wide awake.
Manoj Srivastava <srivasta@debian.org> <http://www.debian.org/%7Esrivasta/>
Key C7261095 fingerprint = CB D9 F4 12 68 07 E4 05 CC 2D 27 12 1D F5 E8 6E
#! /bin/sh
# Abort if any command returns an error value
set -e
# This script is called as the last step of the installation of the
# package. All the package's files are in place, dpkg has already
# done its automatic conffile handling, and all the packages we depend
# of are already fully installed and configured.
# The following idempotent stuff doesn't generally need protecting
# against being run in the abort-* cases.
package_name=libcgi-perl;
# Ensure the menu system is updated
[ ! -x /usr/bin/update-menus ] || /usr/bin/update-menus
case "$1" in
configure)
# Configure this package. If the package must prompt the user for
# information, do it here.
if [ -d /usr/doc ]; then
# Well, we still need to handle this, at least for the time being
if [ -d /usr/share/doc/$package_name ]; then
# So the new doc dir exists, goody
if [ -d /usr/doc/$package_name ]; then
echo "Yikes! The old directory, /usr/doc/$package_name"
echo "has not ben removed! This is an error; attemptig"
echo "repairs"
if [ -f /usr/doc/$package_name/.dhelp ]; then
rm -f /usr/doc/$package_name/.dhelp
rmdir --ignore-fail-on-non-empty /usr/doc/$package_name/
fi
if [ -d /usr/doc/$package_name ]; then
cat <<EOF
Failed repairs. There are old files in /usr/doc/$package_name/ created
by you or another script. I can copy them over to the new location
/usr/share/doc/$package_name, if you wish, preserving your versions of
the files. No files shall be over written, instead, backup versions
shall be created in /usr/share/doc/$package_name as needed.
Shall I copy the files over [Yn]?
EOF
read answer;
case answer in
[Nn]*)
echo "Not copying over, aborting";
exit 1;
;;
*)
cp -ab --version-control=t \
/usr/doc/$package_name \
/usr/share/doc/$package_name/.. ;
rm -rf /usr/doc/$package_name;
esac
fi
fi
if [ -e /usr/doc/$package_name ]; then
echo "/usr/doc/$package_name exists, but is not a directory"
if [ -L /usr/doc/$package_name ]; then
echo "it is a symbolic link, overwriting"
ln -sf ../share/doc/$package_name /usr/doc/$package_name
else
echo "This is an error. Aborting"
exit 1
fi
fi
#File unexists. Free to go ahead and create link
ln -sf ../share/doc/$package_name /usr/doc/$package_name
fi
fi
# There are three sub-cases:
if test "${2+set}" != set; then
# We're being installed by an ancient dpkg which doesn't remember
# which version was most recently configured, or even whether
# there is a most recently configured version.
:
elif test -z "$2" -o "$2" = "<unknown>"; then
# The package has not ever been configured on this system, or was
# purged since it was last configured.
:
else
# Version $2 is the most recently configured version of this
# package.
:
fi ;;
abort-upgrade)
# Back out of an attempt to upgrade this package FROM THIS VERSION
# to version $2. Undo the effects of "prerm upgrade $2".
:
;;
abort-remove)
if test "$2" != in-favour; then
echo "$0: undocumented call to \`postinst $*'" 1>&2
exit 0
fi
# Back out of an attempt to remove this package, which was due to
# a conflict with package $3 (version $4). Undo the effects of
# "prerm remove in-favour $3 $4".
:
;;
abort-deconfigure)
if test "$2" != in-favour -o "$5" != removing; then
echo "$0: undocumented call to \`postinst $*'" 1>&2
exit 0
fi
# Back out of an attempt to deconfigure this package, which was
# due to package $6 (version $7) which we depend on being removed
# to make way for package $3 (version $4). Undo the effects of
# "prerm deconfigure in-favour $3 $4 removing $6 $7".
:
;;
*) echo "$0: didn't understand being called with \`$1'" 1>&2
exit 0;;
esac
if command -v install-docs >/dev/null 2>&1; then
install-docs -i /usr/share/doc-base/libcgi-perl
fi
exit 0
Reply to: