Blame install-sh

Packit a8f112
#!/bin/sh
Packit a8f112
# install - install a program, script, or datafile
Packit a8f112
Packit a8f112
scriptversion=2014-09-12.12; # UTC
Packit a8f112
Packit a8f112
# This originates from X11R5 (mit/util/scripts/install.sh), which was
Packit a8f112
# later released in X11R6 (xc/config/util/install.sh) with the
Packit a8f112
# following copyright and license.
Packit a8f112
#
Packit a8f112
# Copyright (C) 1994 X Consortium
Packit a8f112
#
Packit a8f112
# Permission is hereby granted, free of charge, to any person obtaining a copy
Packit a8f112
# of this software and associated documentation files (the "Software"), to
Packit a8f112
# deal in the Software without restriction, including without limitation the
Packit a8f112
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
Packit a8f112
# sell copies of the Software, and to permit persons to whom the Software is
Packit a8f112
# furnished to do so, subject to the following conditions:
Packit a8f112
#
Packit a8f112
# The above copyright notice and this permission notice shall be included in
Packit a8f112
# all copies or substantial portions of the Software.
Packit a8f112
#
Packit a8f112
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit a8f112
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit a8f112
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit a8f112
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit a8f112
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
Packit a8f112
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit a8f112
#
Packit a8f112
# Except as contained in this notice, the name of the X Consortium shall not
Packit a8f112
# be used in advertising or otherwise to promote the sale, use or other deal-
Packit a8f112
# ings in this Software without prior written authorization from the X Consor-
Packit a8f112
# tium.
Packit a8f112
#
Packit a8f112
#
Packit a8f112
# FSF changes to this file are in the public domain.
Packit a8f112
#
Packit a8f112
# Calling this script install-sh is preferred over install.sh, to prevent
Packit a8f112
# 'make' implicit rules from creating a file called install from it
Packit a8f112
# when there is no Makefile.
Packit a8f112
#
Packit a8f112
# This script is compatible with the BSD install script, but was written
Packit a8f112
# from scratch.
Packit a8f112
Packit a8f112
tab='	'
Packit a8f112
nl='
Packit a8f112
'
Packit a8f112
IFS=" $tab$nl"
Packit a8f112
Packit a8f112
# Set DOITPROG to "echo" to test this script.
Packit a8f112
Packit a8f112
doit=${DOITPROG-}
Packit a8f112
doit_exec=${doit:-exec}
Packit a8f112
Packit a8f112
# Put in absolute file names if you don't have them in your path;
Packit a8f112
# or use environment vars.
Packit a8f112
Packit a8f112
chgrpprog=${CHGRPPROG-chgrp}
Packit a8f112
chmodprog=${CHMODPROG-chmod}
Packit a8f112
chownprog=${CHOWNPROG-chown}
Packit a8f112
cmpprog=${CMPPROG-cmp}
Packit a8f112
cpprog=${CPPROG-cp}
Packit a8f112
mkdirprog=${MKDIRPROG-mkdir}
Packit a8f112
mvprog=${MVPROG-mv}
Packit a8f112
rmprog=${RMPROG-rm}
Packit a8f112
stripprog=${STRIPPROG-strip}
Packit a8f112
Packit a8f112
posix_mkdir=
Packit a8f112
Packit a8f112
# Desired mode of installed file.
Packit a8f112
mode=0755
Packit a8f112
Packit a8f112
chgrpcmd=
Packit a8f112
chmodcmd=$chmodprog
Packit a8f112
chowncmd=
Packit a8f112
mvcmd=$mvprog
Packit a8f112
rmcmd="$rmprog -f"
Packit a8f112
stripcmd=
Packit a8f112
Packit a8f112
src=
Packit a8f112
dst=
Packit a8f112
dir_arg=
Packit a8f112
dst_arg=
Packit a8f112
Packit a8f112
copy_on_change=false
Packit a8f112
is_target_a_directory=possibly
Packit a8f112
Packit a8f112
usage="\
Packit a8f112
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
Packit a8f112
   or: $0 [OPTION]... SRCFILES... DIRECTORY
Packit a8f112
   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
Packit a8f112
   or: $0 [OPTION]... -d DIRECTORIES...
Packit a8f112
Packit a8f112
In the 1st form, copy SRCFILE to DSTFILE.
Packit a8f112
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
Packit a8f112
In the 4th, create DIRECTORIES.
Packit a8f112
Packit a8f112
Options:
Packit a8f112
     --help     display this help and exit.
Packit a8f112
     --version  display version info and exit.
Packit a8f112
Packit a8f112
  -c            (ignored)
Packit a8f112
  -C            install only if different (preserve the last data modification time)
Packit a8f112
  -d            create directories instead of installing files.
Packit a8f112
  -g GROUP      $chgrpprog installed files to GROUP.
Packit a8f112
  -m MODE       $chmodprog installed files to MODE.
Packit a8f112
  -o USER       $chownprog installed files to USER.
Packit a8f112
  -s            $stripprog installed files.
Packit a8f112
  -t DIRECTORY  install into DIRECTORY.
Packit a8f112
  -T            report an error if DSTFILE is a directory.
Packit a8f112
Packit a8f112
Environment variables override the default commands:
Packit a8f112
  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
Packit a8f112
  RMPROG STRIPPROG
Packit a8f112
"
Packit a8f112
Packit a8f112
while test $# -ne 0; do
Packit a8f112
  case $1 in
Packit a8f112
    -c) ;;
Packit a8f112
Packit a8f112
    -C) copy_on_change=true;;
Packit a8f112
Packit a8f112
    -d) dir_arg=true;;
Packit a8f112
Packit a8f112
    -g) chgrpcmd="$chgrpprog $2"
Packit a8f112
        shift;;
Packit a8f112
Packit a8f112
    --help) echo "$usage"; exit $?;;
Packit a8f112
Packit a8f112
    -m) mode=$2
Packit a8f112
        case $mode in
Packit a8f112
          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
Packit a8f112
            echo "$0: invalid mode: $mode" >&2
Packit a8f112
            exit 1;;
Packit a8f112
        esac
Packit a8f112
        shift;;
Packit a8f112
Packit a8f112
    -o) chowncmd="$chownprog $2"
Packit a8f112
        shift;;
Packit a8f112
Packit a8f112
    -s) stripcmd=$stripprog;;
Packit a8f112
Packit a8f112
    -t)
Packit a8f112
        is_target_a_directory=always
Packit a8f112
        dst_arg=$2
Packit a8f112
        # Protect names problematic for 'test' and other utilities.
Packit a8f112
        case $dst_arg in
Packit a8f112
          -* | [=\(\)!]) dst_arg=./$dst_arg;;
Packit a8f112
        esac
Packit a8f112
        shift;;
Packit a8f112
Packit a8f112
    -T) is_target_a_directory=never;;
Packit a8f112
Packit a8f112
    --version) echo "$0 $scriptversion"; exit $?;;
Packit a8f112
Packit a8f112
    --) shift
Packit a8f112
        break;;
Packit a8f112
Packit a8f112
    -*) echo "$0: invalid option: $1" >&2
Packit a8f112
        exit 1;;
Packit a8f112
Packit a8f112
    *)  break;;
Packit a8f112
  esac
Packit a8f112
  shift
Packit a8f112
done
Packit a8f112
Packit a8f112
# We allow the use of options -d and -T together, by making -d
Packit a8f112
# take the precedence; this is for compatibility with GNU install.
Packit a8f112
Packit a8f112
if test -n "$dir_arg"; then
Packit a8f112
  if test -n "$dst_arg"; then
Packit a8f112
    echo "$0: target directory not allowed when installing a directory." >&2
Packit a8f112
    exit 1
Packit a8f112
  fi
Packit a8f112
fi
Packit a8f112
Packit a8f112
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
Packit a8f112
  # When -d is used, all remaining arguments are directories to create.
Packit a8f112
  # When -t is used, the destination is already specified.
Packit a8f112
  # Otherwise, the last argument is the destination.  Remove it from $@.
Packit a8f112
  for arg
Packit a8f112
  do
Packit a8f112
    if test -n "$dst_arg"; then
Packit a8f112
      # $@ is not empty: it contains at least $arg.
Packit a8f112
      set fnord "$@" "$dst_arg"
Packit a8f112
      shift # fnord
Packit a8f112
    fi
Packit a8f112
    shift # arg
Packit a8f112
    dst_arg=$arg
Packit a8f112
    # Protect names problematic for 'test' and other utilities.
Packit a8f112
    case $dst_arg in
Packit a8f112
      -* | [=\(\)!]) dst_arg=./$dst_arg;;
Packit a8f112
    esac
Packit a8f112
  done
Packit a8f112
fi
Packit a8f112
Packit a8f112
if test $# -eq 0; then
Packit a8f112
  if test -z "$dir_arg"; then
Packit a8f112
    echo "$0: no input file specified." >&2
Packit a8f112
    exit 1
Packit a8f112
  fi
Packit a8f112
  # It's OK to call 'install-sh -d' without argument.
Packit a8f112
  # This can happen when creating conditional directories.
Packit a8f112
  exit 0
Packit a8f112
fi
Packit a8f112
Packit a8f112
if test -z "$dir_arg"; then
Packit a8f112
  if test $# -gt 1 || test "$is_target_a_directory" = always; then
Packit a8f112
    if test ! -d "$dst_arg"; then
Packit a8f112
      echo "$0: $dst_arg: Is not a directory." >&2
Packit a8f112
      exit 1
Packit a8f112
    fi
Packit a8f112
  fi
Packit a8f112
fi
Packit a8f112
Packit a8f112
if test -z "$dir_arg"; then
Packit a8f112
  do_exit='(exit $ret); exit $ret'
Packit a8f112
  trap "ret=129; $do_exit" 1
Packit a8f112
  trap "ret=130; $do_exit" 2
Packit a8f112
  trap "ret=141; $do_exit" 13
Packit a8f112
  trap "ret=143; $do_exit" 15
Packit a8f112
Packit a8f112
  # Set umask so as not to create temps with too-generous modes.
Packit a8f112
  # However, 'strip' requires both read and write access to temps.
Packit a8f112
  case $mode in
Packit a8f112
    # Optimize common cases.
Packit a8f112
    *644) cp_umask=133;;
Packit a8f112
    *755) cp_umask=22;;
Packit a8f112
Packit a8f112
    *[0-7])
Packit a8f112
      if test -z "$stripcmd"; then
Packit a8f112
        u_plus_rw=
Packit a8f112
      else
Packit a8f112
        u_plus_rw='% 200'
Packit a8f112
      fi
Packit a8f112
      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
Packit a8f112
    *)
Packit a8f112
      if test -z "$stripcmd"; then
Packit a8f112
        u_plus_rw=
Packit a8f112
      else
Packit a8f112
        u_plus_rw=,u+rw
Packit a8f112
      fi
Packit a8f112
      cp_umask=$mode$u_plus_rw;;
Packit a8f112
  esac
Packit a8f112
fi
Packit a8f112
Packit a8f112
for src
Packit a8f112
do
Packit a8f112
  # Protect names problematic for 'test' and other utilities.
Packit a8f112
  case $src in
Packit a8f112
    -* | [=\(\)!]) src=./$src;;
Packit a8f112
  esac
Packit a8f112
Packit a8f112
  if test -n "$dir_arg"; then
Packit a8f112
    dst=$src
Packit a8f112
    dstdir=$dst
Packit a8f112
    test -d "$dstdir"
Packit a8f112
    dstdir_status=$?
Packit a8f112
  else
Packit a8f112
Packit a8f112
    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
Packit a8f112
    # might cause directories to be created, which would be especially bad
Packit a8f112
    # if $src (and thus $dsttmp) contains '*'.
Packit a8f112
    if test ! -f "$src" && test ! -d "$src"; then
Packit a8f112
      echo "$0: $src does not exist." >&2
Packit a8f112
      exit 1
Packit a8f112
    fi
Packit a8f112
Packit a8f112
    if test -z "$dst_arg"; then
Packit a8f112
      echo "$0: no destination specified." >&2
Packit a8f112
      exit 1
Packit a8f112
    fi
Packit a8f112
    dst=$dst_arg
Packit a8f112
Packit a8f112
    # If destination is a directory, append the input filename; won't work
Packit a8f112
    # if double slashes aren't ignored.
Packit a8f112
    if test -d "$dst"; then
Packit a8f112
      if test "$is_target_a_directory" = never; then
Packit a8f112
        echo "$0: $dst_arg: Is a directory" >&2
Packit a8f112
        exit 1
Packit a8f112
      fi
Packit a8f112
      dstdir=$dst
Packit a8f112
      dst=$dstdir/`basename "$src"`
Packit a8f112
      dstdir_status=0
Packit a8f112
    else
Packit a8f112
      dstdir=`dirname "$dst"`
Packit a8f112
      test -d "$dstdir"
Packit a8f112
      dstdir_status=$?
Packit a8f112
    fi
Packit a8f112
  fi
Packit a8f112
Packit a8f112
  obsolete_mkdir_used=false
Packit a8f112
Packit a8f112
  if test $dstdir_status != 0; then
Packit a8f112
    case $posix_mkdir in
Packit a8f112
      '')
Packit a8f112
        # Create intermediate dirs using mode 755 as modified by the umask.
Packit a8f112
        # This is like FreeBSD 'install' as of 1997-10-28.
Packit a8f112
        umask=`umask`
Packit a8f112
        case $stripcmd.$umask in
Packit a8f112
          # Optimize common cases.
Packit a8f112
          *[2367][2367]) mkdir_umask=$umask;;
Packit a8f112
          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
Packit a8f112
Packit a8f112
          *[0-7])
Packit a8f112
            mkdir_umask=`expr $umask + 22 \
Packit a8f112
              - $umask % 100 % 40 + $umask % 20 \
Packit a8f112
              - $umask % 10 % 4 + $umask % 2
Packit a8f112
            `;;
Packit a8f112
          *) mkdir_umask=$umask,go-w;;
Packit a8f112
        esac
Packit a8f112
Packit a8f112
        # With -d, create the new directory with the user-specified mode.
Packit a8f112
        # Otherwise, rely on $mkdir_umask.
Packit a8f112
        if test -n "$dir_arg"; then
Packit a8f112
          mkdir_mode=-m$mode
Packit a8f112
        else
Packit a8f112
          mkdir_mode=
Packit a8f112
        fi
Packit a8f112
Packit a8f112
        posix_mkdir=false
Packit a8f112
        case $umask in
Packit a8f112
          *[123567][0-7][0-7])
Packit a8f112
            # POSIX mkdir -p sets u+wx bits regardless of umask, which
Packit a8f112
            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
Packit a8f112
            ;;
Packit a8f112
          *)
Packit a8f112
            # $RANDOM is not portable (e.g. dash);  use it when possible to
Packit a8f112
            # lower collision chance
Packit a8f112
            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
Packit a8f112
            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
Packit a8f112
Packit a8f112
            # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
Packit a8f112
            # create the $tmpdir first (and fail if unsuccessful) to make sure
Packit a8f112
            # that nobody tries to guess the $tmpdir name.
Packit a8f112
            if (umask $mkdir_umask &&
Packit a8f112
                $mkdirprog $mkdir_mode "$tmpdir" &&
Packit a8f112
                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
Packit a8f112
            then
Packit a8f112
              if test -z "$dir_arg" || {
Packit a8f112
                   # Check for POSIX incompatibilities with -m.
Packit a8f112
                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
Packit a8f112
                   # other-writable bit of parent directory when it shouldn't.
Packit a8f112
                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
Packit a8f112
                   test_tmpdir="$tmpdir/a"
Packit a8f112
                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
Packit a8f112
                   case $ls_ld_tmpdir in
Packit a8f112
                     d????-?r-*) different_mode=700;;
Packit a8f112
                     d????-?--*) different_mode=755;;
Packit a8f112
                     *) false;;
Packit a8f112
                   esac &&
Packit a8f112
                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
Packit a8f112
                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
Packit a8f112
                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
Packit a8f112
                   }
Packit a8f112
                 }
Packit a8f112
              then posix_mkdir=:
Packit a8f112
              fi
Packit a8f112
              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
Packit a8f112
            else
Packit a8f112
              # Remove any dirs left behind by ancient mkdir implementations.
Packit a8f112
              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
Packit a8f112
            fi
Packit a8f112
            trap '' 0;;
Packit a8f112
        esac;;
Packit a8f112
    esac
Packit a8f112
Packit a8f112
    if
Packit a8f112
      $posix_mkdir && (
Packit a8f112
        umask $mkdir_umask &&
Packit a8f112
        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
Packit a8f112
      )
Packit a8f112
    then :
Packit a8f112
    else
Packit a8f112
Packit a8f112
      # The umask is ridiculous, or mkdir does not conform to POSIX,
Packit a8f112
      # or it failed possibly due to a race condition.  Create the
Packit a8f112
      # directory the slow way, step by step, checking for races as we go.
Packit a8f112
Packit a8f112
      case $dstdir in
Packit a8f112
        /*) prefix='/';;
Packit a8f112
        [-=\(\)!]*) prefix='./';;
Packit a8f112
        *)  prefix='';;
Packit a8f112
      esac
Packit a8f112
Packit a8f112
      oIFS=$IFS
Packit a8f112
      IFS=/
Packit a8f112
      set -f
Packit a8f112
      set fnord $dstdir
Packit a8f112
      shift
Packit a8f112
      set +f
Packit a8f112
      IFS=$oIFS
Packit a8f112
Packit a8f112
      prefixes=
Packit a8f112
Packit a8f112
      for d
Packit a8f112
      do
Packit a8f112
        test X"$d" = X && continue
Packit a8f112
Packit a8f112
        prefix=$prefix$d
Packit a8f112
        if test -d "$prefix"; then
Packit a8f112
          prefixes=
Packit a8f112
        else
Packit a8f112
          if $posix_mkdir; then
Packit a8f112
            (umask=$mkdir_umask &&
Packit a8f112
             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
Packit a8f112
            # Don't fail if two instances are running concurrently.
Packit a8f112
            test -d "$prefix" || exit 1
Packit a8f112
          else
Packit a8f112
            case $prefix in
Packit a8f112
              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
Packit a8f112
              *) qprefix=$prefix;;
Packit a8f112
            esac
Packit a8f112
            prefixes="$prefixes '$qprefix'"
Packit a8f112
          fi
Packit a8f112
        fi
Packit a8f112
        prefix=$prefix/
Packit a8f112
      done
Packit a8f112
Packit a8f112
      if test -n "$prefixes"; then
Packit a8f112
        # Don't fail if two instances are running concurrently.
Packit a8f112
        (umask $mkdir_umask &&
Packit a8f112
         eval "\$doit_exec \$mkdirprog $prefixes") ||
Packit a8f112
          test -d "$dstdir" || exit 1
Packit a8f112
        obsolete_mkdir_used=true
Packit a8f112
      fi
Packit a8f112
    fi
Packit a8f112
  fi
Packit a8f112
Packit a8f112
  if test -n "$dir_arg"; then
Packit a8f112
    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
Packit a8f112
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
Packit a8f112
    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
Packit a8f112
      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
Packit a8f112
  else
Packit a8f112
Packit a8f112
    # Make a couple of temp file names in the proper directory.
Packit a8f112
    dsttmp=$dstdir/_inst.$$_
Packit a8f112
    rmtmp=$dstdir/_rm.$$_
Packit a8f112
Packit a8f112
    # Trap to clean up those temp files at exit.
Packit a8f112
    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
Packit a8f112
Packit a8f112
    # Copy the file name to the temp name.
Packit a8f112
    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
Packit a8f112
Packit a8f112
    # and set any options; do chmod last to preserve setuid bits.
Packit a8f112
    #
Packit a8f112
    # If any of these fail, we abort the whole thing.  If we want to
Packit a8f112
    # ignore errors from any of these, just make sure not to ignore
Packit a8f112
    # errors from the above "$doit $cpprog $src $dsttmp" command.
Packit a8f112
    #
Packit a8f112
    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
Packit a8f112
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
Packit a8f112
    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
Packit a8f112
    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
Packit a8f112
Packit a8f112
    # If -C, don't bother to copy if it wouldn't change the file.
Packit a8f112
    if $copy_on_change &&
Packit a8f112
       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
Packit a8f112
       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
Packit a8f112
       set -f &&
Packit a8f112
       set X $old && old=:$2:$4:$5:$6 &&
Packit a8f112
       set X $new && new=:$2:$4:$5:$6 &&
Packit a8f112
       set +f &&
Packit a8f112
       test "$old" = "$new" &&
Packit a8f112
       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
Packit a8f112
    then
Packit a8f112
      rm -f "$dsttmp"
Packit a8f112
    else
Packit a8f112
      # Rename the file to the real destination.
Packit a8f112
      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
Packit a8f112
Packit a8f112
      # The rename failed, perhaps because mv can't rename something else
Packit a8f112
      # to itself, or perhaps because mv is so ancient that it does not
Packit a8f112
      # support -f.
Packit a8f112
      {
Packit a8f112
        # Now remove or move aside any old file at destination location.
Packit a8f112
        # We try this two ways since rm can't unlink itself on some
Packit a8f112
        # systems and the destination file might be busy for other
Packit a8f112
        # reasons.  In this case, the final cleanup might fail but the new
Packit a8f112
        # file should still install successfully.
Packit a8f112
        {
Packit a8f112
          test ! -f "$dst" ||
Packit a8f112
          $doit $rmcmd -f "$dst" 2>/dev/null ||
Packit a8f112
          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
Packit a8f112
            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
Packit a8f112
          } ||
Packit a8f112
          { echo "$0: cannot unlink or rename $dst" >&2
Packit a8f112
            (exit 1); exit 1
Packit a8f112
          }
Packit a8f112
        } &&
Packit a8f112
Packit a8f112
        # Now rename the file to the real destination.
Packit a8f112
        $doit $mvcmd "$dsttmp" "$dst"
Packit a8f112
      }
Packit a8f112
    fi || exit 1
Packit a8f112
Packit a8f112
    trap '' 0
Packit a8f112
  fi
Packit a8f112
done
Packit a8f112
Packit a8f112
# Local variables:
Packit a8f112
# eval: (add-hook 'write-file-hooks 'time-stamp)
Packit a8f112
# time-stamp-start: "scriptversion="
Packit a8f112
# time-stamp-format: "%:y-%02m-%02d.%02H"
Packit a8f112
# time-stamp-time-zone: "UTC"
Packit a8f112
# time-stamp-end: "; # UTC"
Packit a8f112
# End: