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 <[EMAIL PROTECTED]> Mon, 23 Aug 2004 02:02:15 -0500 + -- Branden Robinson <[EMAIL PROTECTED]> 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: