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

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: