Blame install-sh

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