X Strike Force XFree86 SVN commit: r1753 - trunk/debian
Author: branden
Date: 2004-08-25 11:42:17 -0500 (Wed, 25 Aug 2004)
New Revision: 1753
Added:
trunk/debian/libx11-6.config.in
trunk/debian/libx11-6.templates
trunk/debian/libxt6.config.in
trunk/debian/libxt6.templates
Modified:
trunk/debian/TODO
trunk/debian/changelog
trunk/debian/libx11-6.postinst.in
trunk/debian/libx11-6.postrm.in
trunk/debian/libx11-6.preinst.in
trunk/debian/libxt6.postinst.in
trunk/debian/libxt6.postrm.in
trunk/debian/libxt6.preinst.in
trunk/debian/shell-lib.sh
Log:
Merge revisions 1739 to HEAD from
branches/branches/app-defaults-and-xkb-dir-migration-fix.
Resolve expected conflict in debian/changelog.
Modified: trunk/debian/TODO
===================================================================
--- trunk/debian/TODO 2004-08-25 16:36:38 UTC (rev 1752)
+++ trunk/debian/TODO 2004-08-25 16:42:17 UTC (rev 1753)
@@ -18,21 +18,6 @@
--------------
* Add FAQ entry describing what has become of the XFree86 3.x packages.
-* Re-do migration of /usr/X11R6/lib/X11/{app-defaults,xkb}:
- + stop shipping symlink
- + In {libxt6,xlibs}.preinst:
- - if existing stuff in /usr/X11R6/lib/X11/$DIR:
- + debconf boolean explaining situation and permitting abort
- + if user doesn't abort:
- - mv existing directory contents to /etc/X11/$DIR
- - create /usr/X11R6/lib/X11/$DIR symlink
- - touch $DIR migration file in /var/run
- + In {libxt6,xlibs}.postinst:
- - remove $DIR migration file from /var/run
- + In {libxt6,xlibs}.postrm:
- - If /var/run/$DIR migration file exists:
- + remove /usr/X11R6/lib/X11/$DIR symlink
- + mv /etc/X11/$DIR back to /usr/X11R6/lib/X11/$DIR
* Rewrite xserver-xfree86 debconfage. Joey Hess, Eduard Bloch, and David
Nusinow have provided good input.
+ udev users will have "/dev/input/mousen" -- configure that as only mouse
Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog 2004-08-25 16:36:38 UTC (rev 1752)
+++ trunk/debian/changelog 2004-08-25 16:42:17 UTC (rev 1753)
@@ -342,6 +342,51 @@
person, of *course* dpkg and apt accept 'Conflicts: (4.3.0.dfsg.1-4 <<)
xserver-xfree86 (<< 4.3.0.dfsg.1-7)'!"
+ * Rewrite migration of app-defaults (in libxt6) and xkb (in libx11-6)
+ directories.
+ + Enhance the shell libary with new functions:
+ - Implement check_symlink() and change check_symlinks_and_warn() and
+ check_symlinks_and_bomb() to use it.
+ - Implement make_symlink_sane(). Ensure that the specified symbolic
+ link symlink exists, and points to the specified target. If symlink
+ does not exist, create it and point it at target. If symlink exists
+ but is not a symbolic link, back it up. If symlink exists, is a
+ symbolic link, but points to the wrong location, fix it. If symlink
+ exists, is a symbolic link, and already points to target, do nothing.
+ This function wouldn't be needed if ln had an -I, --idempotent option.
+ - Implement migrate_dir_to_symlink(). Per Debian Policy section 6.5.4,
+ "A directory will never be replaced by a symbolic link to a directory
+ or vice versa; instead, the existing state (symlink or not) will be
+ left alone and dpkg will follow the symlink if there is one." We have
+ to do it ourselves. This function moves the contents of old_location,
+ a directory, into new_location, a directory, then makes old_location a
+ symbolic link to new_location. old_location need not exist, but if it
+ does, it must be a directory (or a symlink to a directory). If it is
+ not, it is backed up. If new_location exists already and is not a
+ directory, it is backed up.
+ + Add config scripts for libx11-6 and libxt6, which detect if
+ /usr/X11R6/lib/X11/{app-defaults,xkb} is a directory but not a symlink,
+ and use debconf to prompt the user (at low priority) whether the
+ directories should be moved. If the user says no, abort the script. If
+ the user says yes (default), start the migration with
+ migrate_dir_to_symlink().
+ + Update preinst scripts to use debconf as the configs script do; this is
+ unusual but necessary because if we're going to do the migration we need
+ to start before any other packages (which may use the old directories)
+ are unpacked.
+ + In the preinst scripts, call check_symlink(), and if that fails, call
+ make_symlink_sane(). Stop calling check_symlinks_and_warn().
+ + Update postinst scripts to indicate that migration is completed.
+ + Update postrm scripts to run migration in reverse if it had been started
+ and the package installation or upgrade is aborted.
+ + We keep shipping /etc/X11/{app-defaults,xkb} symlinks as part of the
+ package payloads, because manipulating them in the preinst isn't enough
+ -- dpkg will remove "disappearing" files from the system *after* the
+ preinst runs but before the postinst does, leaving a window for packages
+ using the legacy paths to unpack to the old location with no symlink to
+ redirect them, which is precisely what we don't want (see section 6.5 of
+ the Debian Policy Manual).
+
Changes by Fabio M. Di Nitto and Branden Robinson:
* Support building only the parts of the source tree needed by
@@ -383,7 +428,7 @@
autodetection would cause the script to think it had detected one X server
or XFree86 video driver instead ($(echo "" | wc -l) is "1", not "0").
- -- Branden Robinson <branden@debian.org> Mon, 23 Aug 2004 02:02:15 -0500
+ -- Branden Robinson <branden@debian.org> Wed, 25 Aug 2004 11:41:15 -0500
xfree86 (4.3.0.dfsg.1-6) unstable; urgency=low
Copied: trunk/debian/libx11-6.config.in (from rev 1752, branches/app-defaults-and-xkb-dir-migration-fix/debian/libx11-6.config.in)
Property changes on: trunk/debian/libx11-6.config.in
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: trunk/debian/libx11-6.postinst.in
===================================================================
--- trunk/debian/libx11-6.postinst.in 2004-08-25 16:36:38 UTC (rev 1752)
+++ trunk/debian/libx11-6.postinst.in 2004-08-25 16:42:17 UTC (rev 1753)
@@ -1,6 +1,6 @@
#!/bin/sh
# Debian libx11-6 package post-installation script
-# Copyright 2003 Branden Robinson.
+# Copyright 2003, 2004 Branden Robinson.
# Licensed under the GNU General Public License, version 2. See the file
# /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
# Acknowlegements to Stephen Early, Mark Eichin, and Manoj Srivastava.
@@ -14,12 +14,14 @@
#INCLUDE_SHELL_LIB#
-# finish migration started in preinst
+# Finish migration started in preinst.
+MIGRATION_FILE=/var/run/libx11-6.xkb.migration
DIR=/usr/X11R6/lib/X11/xkb
-if [ -d "$DIR.dpkg-tmp" -a -L "$DIR" ]; then
- observe "committing removal of obsolete directory $DIR"
- rm -r "$DIR"
+
+if [ -e "$MIGRATION_FILE" ]; then
+ rm "$MIGRATION_FILE"
fi
+
check_symlinks_and_bomb "$DIR"
register_x_lib_dir_with_ld_so
@@ -29,4 +31,4 @@
exit 0
-# vim:set ai et sts=2 sw=2 tw=0:
+# vim:set ai et sts=2 sw=2 tw=80:
Modified: trunk/debian/libx11-6.postrm.in
===================================================================
--- trunk/debian/libx11-6.postrm.in 2004-08-25 16:36:38 UTC (rev 1752)
+++ trunk/debian/libx11-6.postrm.in 2004-08-25 16:42:17 UTC (rev 1753)
@@ -1,6 +1,6 @@
#!/bin/sh
# Debian libx11-6 package post-removal script
-# Copyright 2003 Branden Robinson.
+# Copyright 2003, 2004 Branden Robinson.
# Licensed under the GNU General Public License, version 2. See the file
# /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
# Acknowlegements to Stephen Early, Mark Eichin, and Manoj Srivastava.
@@ -14,12 +14,17 @@
#INCLUDE_SHELL_LIB#
-if [ "$1" = "abort-install" -o "$1" = "abort-upgrade" ]; then
- # roll back migration started in preinst
- DIR=/usr/X11R6/lib/X11/xkb
- if [ -d "$DIR.dpkg-tmp" ]; then
- observe "rolling back removal of obsolete directory $DIR"
- mv "$DIR.dpkg-tmp" "$DIR"
+MIGRATION_FILE=/var/run/libx11-6.xkb.migration
+DIR=/usr/X11R6/lib/X11/xkb
+
+# If we were migrating the xkb directory but have aborted the install or
+# upgrade, we need to undo it.
+if [ "$1" = "abort-install" ] || [ "$1" = "abort-upgrade" ]; then
+ if [ -e "$MIGRATION_FILE" ]; then
+ warn "reverting migration of $DIR to $(maplink "$DIR")"
+ if ! migrate_dir_to_symlink "$(maplink "$DIR")" "$DIR"; then
+ die "failed to migrate $(maplink "$DIR") back to $DIR"
+ fi
fi
fi
@@ -32,4 +37,4 @@
exit 0
-# vim:set ai et sts=2 sw=2 tw=0:
+# vim:set ai et sts=2 sw=2 tw=80:
Modified: trunk/debian/libx11-6.preinst.in
===================================================================
--- trunk/debian/libx11-6.preinst.in 2004-08-25 16:36:38 UTC (rev 1752)
+++ trunk/debian/libx11-6.preinst.in 2004-08-25 16:42:17 UTC (rev 1753)
@@ -1,6 +1,6 @@
#!/bin/sh
# Debian libx11-6 package pre-installation script
-# Copyright 2003 Branden Robinson.
+# Copyright 2003, 2004 Branden Robinson.
# Licensed under the GNU General Public License, version 2. See the file
# /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
# Acknowlegements to Stephen Early, Mark Eichin, and Manoj Srivastava.
@@ -9,23 +9,51 @@
set -e
+# source debconf library
+. /usr/share/debconf/confmodule
+
THIS_PACKAGE=libx11-6
THIS_SCRIPT=preinst
#INCLUDE_SHELL_LIB#
-if [ "$1" = "install" -o "$1" = "upgrade" ]; then
+if [ "$1" = "install" ] || [ "$1" = "upgrade" ]; then
# xkb directory moved in 4.0
+ MIGRATION_FILE=/var/run/libx11-6.xkb.migration
DIR=/usr/X11R6/lib/X11/xkb
- if [ -d "$DIR" -a ! -L "$DIR" ]; then
- observe "preparing obsolete directory $DIR for removal"
- mv "$DIR" "$DIR.dpkg-tmp"
+ if [ -d "$DIR" ] && [ ! -L "$DIR" ]; then
+ # We do this debconf stuff in the preinst, not the postinst, because the
+ # migration needs to happen *before* other packages are unpacked.
+ # The question may not have been seen yet if this package wasn't
+ # pre-configured. If not, we must ask now.
+ run db_metaget libx11-6/migrate_xkb_dir seen
+ if [ "$RET" != "true" ]; then
+ run db_input low libx11-6/migrate_xkb_dir
+ run db_go
+ fi
+ if db_get libx11-6/migrate_xkb_dir; then
+ if [ "$RET" = "true" ]; then
+ if migrate_dir_to_symlink "$DIR" "$(maplink "$DIR")"; then
+ >"$MIGRATION_FILE"
+ else
+ die "failed to migrate $DIR to $(maplink "$DIR")"
+ fi
+ else
+ die "aborting at user request"
+ fi
+ else
+ internal_error "failure using db_get to retrieve" \
+ "libx11-6/migrate_xkb_dir"
+ fi
fi
- check_symlinks_and_warn "$DIR"
+ # Ensure the app-defaults directory is in the correct place.
+ if ! check_symlink "$DIR"; then
+ make_symlink_sane "$DIR" "$(maplink "$DIR")"
+ fi
fi
#DEBHELPER#
exit 0
-# vim:set ai et sts=2 sw=2 tw=0:
+# vim:set ai et sts=2 sw=2 tw=80:
Copied: trunk/debian/libx11-6.templates (from rev 1752, branches/app-defaults-and-xkb-dir-migration-fix/debian/libx11-6.templates)
Copied: trunk/debian/libxt6.config.in (from rev 1752, branches/app-defaults-and-xkb-dir-migration-fix/debian/libxt6.config.in)
Property changes on: trunk/debian/libxt6.config.in
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: trunk/debian/libxt6.postinst.in
===================================================================
--- trunk/debian/libxt6.postinst.in 2004-08-25 16:36:38 UTC (rev 1752)
+++ trunk/debian/libxt6.postinst.in 2004-08-25 16:42:17 UTC (rev 1753)
@@ -1,6 +1,6 @@
#!/bin/sh
# Debian libxt6 package post-installation script
-# Copyright 2003 Branden Robinson.
+# Copyright 2003, 2004 Branden Robinson.
# Licensed under the GNU General Public License, version 2. See the file
# /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
# Acknowlegements to Stephen Early, Mark Eichin, and Manoj Srivastava.
@@ -14,12 +14,14 @@
#INCLUDE_SHELL_LIB#
-# finish migration started in preinst
+# Finish migration started in preinst.
+MIGRATION_FILE=/var/run/libxt6.app-defaults.migration
DIR=/usr/X11R6/lib/X11/app-defaults
-if [ -d "$DIR.dpkg-tmp" -a -L "$DIR" ]; then
- observe "committing removal of obsolete directory $DIR"
- rm -r "$DIR"
+
+if [ -e "$MIGRATION_FILE" ]; then
+ rm "$MIGRATION_FILE"
fi
+
check_symlinks_and_bomb "$DIR"
register_x_lib_dir_with_ld_so
@@ -29,4 +31,4 @@
exit 0
-# vim:set ai et sts=2 sw=2 tw=0:
+# vim:set ai et sts=2 sw=2 tw=80:
Modified: trunk/debian/libxt6.postrm.in
===================================================================
--- trunk/debian/libxt6.postrm.in 2004-08-25 16:36:38 UTC (rev 1752)
+++ trunk/debian/libxt6.postrm.in 2004-08-25 16:42:17 UTC (rev 1753)
@@ -1,6 +1,6 @@
#!/bin/sh
# Debian libxt6 package post-removal script
-# Copyright 2003 Branden Robinson.
+# Copyright 2003, 2004 Branden Robinson.
# Licensed under the GNU General Public License, version 2. See the file
# /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
# Acknowlegements to Stephen Early, Mark Eichin, and Manoj Srivastava.
@@ -14,12 +14,17 @@
#INCLUDE_SHELL_LIB#
-if [ "$1" = "abort-install" -o "$1" = "abort-upgrade" ]; then
- # roll back migration started in preinst
- DIR=/usr/X11R6/lib/X11/app-defaults
- if [ -d "$DIR.dpkg-tmp" ]; then
- observe "rolling back removal of obsolete directory $DIR"
- mv "$DIR.dpkg-tmp" "$DIR"
+MIGRATION_FILE=/var/run/libxt6.app-defaults.migration
+DIR=/usr/X11R6/lib/X11/app-defaults
+
+# If we were migrating the app-defaults directory but have aborted the install
+# or upgrade, we need to undo it.
+if [ "$1" = "abort-install" ] || [ "$1" = "abort-upgrade" ]; then
+ if [ -e "$MIGRATION_FILE" ]; then
+ warn "reverting migration of $DIR to $(maplink "$DIR")"
+ if ! migrate_dir_to_symlink "$(maplink "$DIR")" "$DIR"; then
+ die "failed to migrate $(maplink "$DIR") back to $DIR"
+ fi
fi
fi
@@ -32,4 +37,4 @@
exit 0
-# vim:set ai et sts=2 sw=2 tw=0:
+# vim:set ai et sts=2 sw=2 tw=80:
Modified: trunk/debian/libxt6.preinst.in
===================================================================
--- trunk/debian/libxt6.preinst.in 2004-08-25 16:36:38 UTC (rev 1752)
+++ trunk/debian/libxt6.preinst.in 2004-08-25 16:42:17 UTC (rev 1753)
@@ -1,6 +1,6 @@
#!/bin/sh
# Debian libxt6 package pre-installation script
-# Copyright 2003 Branden Robinson.
+# Copyright 2003, 2004 Branden Robinson.
# Licensed under the GNU General Public License, version 2. See the file
# /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
# Acknowlegements to Stephen Early, Mark Eichin, and Manoj Srivastava.
@@ -9,23 +9,51 @@
set -e
+# source debconf library
+. /usr/share/debconf/confmodule
+
THIS_PACKAGE=libxt6
THIS_SCRIPT=preinst
#INCLUDE_SHELL_LIB#
-if [ "$1" = "install" -o "$1" = "upgrade" ]; then
+if [ "$1" = "install" ] || [ "$1" = "upgrade" ]; then
# app-defaults directory moved in 4.0
+ MIGRATION_FILE=/var/run/libxt6.app-defaults.migration
DIR=/usr/X11R6/lib/X11/app-defaults
- if [ -d "$DIR" -a ! -L "$DIR" ]; then
- observe "preparing obsolete directory $DIR for removal"
- mv "$DIR" "$DIR.dpkg-tmp"
+ if [ -d "$DIR" ] && [ ! -L "$DIR" ]; then
+ # We do this debconf stuff in the preinst, not the postinst, because the
+ # migration needs to happen *before* other packages are unpacked.
+ # The question may not have been seen yet if this package wasn't
+ # pre-configured. If not, we must ask now.
+ run db_metaget libxt6/migrate_app_defaults_dir seen
+ if [ "$RET" != "true" ]; then
+ run db_input low libxt6/migrate_app_defaults_dir
+ run db_go
+ fi
+ if db_get libxt6/migrate_app_defaults_dir; then
+ if [ "$RET" = "true" ]; then
+ if migrate_dir_to_symlink "$DIR" "$(maplink "$DIR")"; then
+ >"$MIGRATION_FILE"
+ else
+ die "failed to migrate $DIR to $(maplink "$DIR")"
+ fi
+ else
+ die "aborting at user request"
+ fi
+ else
+ internal_error "failure using db_get to retrieve" \
+ "libxt6/migrate_app_defaults_dir"
+ fi
fi
- check_symlinks_and_warn "$DIR"
+ # Ensure the app-defaults directory is in the correct place.
+ if ! check_symlink "$DIR"; then
+ make_symlink_sane "$DIR" "$(maplink "$DIR")"
+ fi
fi
#DEBHELPER#
exit 0
-# vim:set ai et sts=2 sw=2 tw=0:
+# vim:set ai et sts=2 sw=2 tw=80:
Copied: trunk/debian/libxt6.templates (from rev 1752, branches/app-defaults-and-xkb-dir-migration-fix/debian/libxt6.templates)
Modified: trunk/debian/shell-lib.sh
===================================================================
--- trunk/debian/shell-lib.sh 2004-08-25 16:36:38 UTC (rev 1752)
+++ trunk/debian/shell-lib.sh 2004-08-25 16:42:17 UTC (rev 1753)
@@ -275,6 +275,32 @@
}
fi
+check_symlink () {
+ # syntax: check_symlink symlink
+ #
+ # See if specified symlink points where it is supposed to. Return 0 if it
+ # does, and 1 if it does not.
+ #
+ # Primarily used by check_symlinks_and_warn() and check_symlinks_and_bomb().
+
+ local symlink
+
+ # validate arguments
+ if [ $# -ne 1 ]; then
+ usage_error "check_symlink() called with wrong number of arguments;" \
+ "expected 1, got $#"
+ exit $SHELL_LIB_USAGE_ERROR
+ fi
+
+ symlink="$1"
+
+ if [ "$(maplink "$symlink")" = "$(readlink "$symlink")" ]; then
+ return 0
+ else
+ return 1
+ fi
+}
+
check_symlinks_and_warn () {
# syntax: check_symlinks_and_warn symlink ...
#
@@ -295,7 +321,7 @@
while [ -n "$1" ]; do
symlink="$1"
if [ -L "$symlink" ]; then
- if [ "$(maplink "$symlink")" != "$(readlink "$symlink")" ]; then
+ if ! check_symlink "$symlink"; then
observe "$symlink symbolic link points to wrong location" \
"$(readlink "$symlink"); removing"
rm "$symlink"
@@ -337,7 +363,7 @@
problem=
symlink="$1"
if [ -L "$symlink" ]; then
- if [ "$(maplink "$symlink")" != "$(readlink "$symlink")" ]; then
+ if ! check_symlink "$symlink"; then
problem=yes
warn "$symlink symbolic link points to wrong location" \
"$(readlink "$symlink")"
@@ -594,4 +620,144 @@
fi
}
-# vim:set ai et sts=2 sw=2 tw=0:
+make_symlink_sane () {
+ # syntax: make_symlink_sane symlink target
+ #
+ # Ensure that the symbolic link symlink exists, and points to target.
+ #
+ # If symlink does not exist, create it and point it at target.
+ #
+ # If symlink exists but is not a symbolic link, back it up.
+ #
+ # If symlink exists, is a symbolic link, but points to the wrong location, fix
+ # it.
+ #
+ # If symlink exists, is a symbolic link, and already points to target, do
+ # nothing.
+ #
+ # This function wouldn't be needed if ln had an -I, --idempotent option.
+
+ # Validate arguments.
+ if [ $# -ne 2 ]; then
+ usage_error "make_symlink_sane() called with wrong number of arguments;" \
+ "expected 2, got $#"
+ exit $SHELL_LIB_USAGE_ERROR
+ fi
+
+ # We could just use the positional parameters as-is, but that makes things
+ # harder to follow.
+ local symlink target
+
+ symlink="$1"
+ target="$2"
+
+ if [ -L "$symlink" ] && [ "$(readlink "$symlink")" = "$target" ]; then
+ observe "link from $symlink to $target already exists"
+ else
+ observe "creating symbolic link from $symlink to $target"
+ ln -s -b -S ".dpkg-old" "$target" "$symlink"
+ fi
+}
+
+migrate_dir_to_symlink () {
+ # syntax: migrate_dir_to_symlink old_location new_location
+ #
+ # Per Debian Policy section 6.5.4, "A directory will never be replaced by a
+ # symbolic link to a directory or vice versa; instead, the existing state
+ # (symlink or not) will be left alone and dpkg will follow the symlink if
+ # there is one."
+ #
+ # We have to do it ourselves.
+ #
+ # This function moves the contents of old_location, a directory, into
+ # new_location, a directory, then makes old_location a symbolic link to
+ # new_location.
+ #
+ # old_location need not exist, but if it does, it must be a directory (or a
+ # symlink to a directory). If it is not, it is backed up. If new_location
+ # exists already and is not a directory, it is backed up.
+ #
+ # This function should be called from a package's preinst so that other
+ # packages unpacked after this one --- but before this package's postinst runs
+ # --- are unpacked into new_location even if their payloads contain
+ # old_location filespecs.
+
+ # Validate arguments.
+ if [ $# -ne 2 ]; then
+ usage_error "migrate_dir_to_symlink() called with wrong number of"
+ "arguments; expected 2, got $#"
+ exit $SHELL_LIB_USAGE_ERROR
+ fi
+
+ # We could just use the positional parameters as-is, but that makes things
+ # harder to follow.
+ local new old
+
+ old="$1"
+ new="$2"
+
+ # Is old location a symlink?
+ if [ -L "$old" ]; then
+ # Does it already point to new location?
+ if [ "$(readlink "$old")" = "$new" ]; then
+ # Nothing to do; migration has already been done.
+ observe "migration of $old to $new already done"
+ return 0
+ else
+ # Back it up.
+ warn "backing up symbolic link $old as $old.dpkg-old"
+ mv -b "$old" "$old.dpkg-old"
+ fi
+ fi
+
+ # Does old location exist, but is not a directory?
+ if [ -e "$old" ] && [ ! -d "$old" ]; then
+ # Back it up.
+ warn "backing up non-directory $old as $old.dpkg-old"
+ mv -b "$old" "$old.dpkg-old"
+ fi
+
+ observe "migrating $old to $new"
+
+ # Is new location a symlink?
+ if [ -L "$new" ]; then
+ # Does it point the wrong way, i.e., back to where we're migrating from?
+ if [ "$(readlink "$new")" = "$old" ]; then
+ # Get rid of it.
+ observe "removing symbolic link $new which points to $old"
+ rm "$new"
+ else
+ # Back it up.
+ warn "backing up symbolic link $new as $new.dpkg-old"
+ mv -b "$new" "$new.dpkg-old"
+ fi
+ fi
+
+ # Does new location exist, but is not a directory?
+ if [ -e "$new" ] && [ ! -d "$new" ]; then
+ warn "backing up non-directory $new as $new.dpkg-old"
+ mv -b "$new" "$new.dpkg-old"
+ fi
+
+ # Create new directory if it does not yet exist.
+ if [ ! -e "$new" ]; then
+ observe "creating $new"
+ mkdir -p "$new"
+ fi
+
+ # Copy files in old location to new location. Back up any filenames that
+ # already exist in the new location with the extension ".dpkg-old".
+ observe "copying files from $old to $new"
+ if ! (cd "$old" && cp -a -b -S ".dpkg-old" . "$new"); then
+ die "error(s) encountered while copying files from $old to $new"
+ fi
+
+ # Remove files at old location.
+ observe "removing $old"
+ rm -r "$old"
+
+ # Create symlink from old location to new location.
+ make_symlink_sane "$old" "$new"
+}
+
+# vim:set ai et sts=2 sw=2 tw=80:
Reply to: