Blame install-sh

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