Blame install-sh

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