Blame install-sh

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