Blame install-sh

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