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

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: