Blame build-aux/install-sh

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