quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

install-sh (15442B)


      1 #!/bin/sh
      2 # install - install a program, script, or datafile
      3 
      4 scriptversion=2025-06-18.21; # UTC
      5 
      6 # This originates from X11R5 (mit/util/scripts/install.sh), which was
      7 # later released in X11R6 (xc/config/util/install.sh) with the
      8 # following copyright and license.
      9 #
     10 # Copyright (C) 1994 X Consortium
     11 #
     12 # Permission is hereby granted, free of charge, to any person obtaining a copy
     13 # of this software and associated documentation files (the "Software"), to
     14 # deal in the Software without restriction, including without limitation the
     15 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
     16 # sell copies of the Software, and to permit persons to whom the Software is
     17 # furnished to do so, subject to the following conditions:
     18 #
     19 # The above copyright notice and this permission notice shall be included in
     20 # all copies or substantial portions of the Software.
     21 #
     22 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     23 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     24 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
     25 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     26 # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
     27 # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     28 #
     29 # Except as contained in this notice, the name of the X Consortium shall not
     30 # be used in advertising or otherwise to promote the sale, use or other deal-
     31 # ings in this Software without prior written authorization from the X Consor-
     32 # tium.
     33 #
     34 #
     35 # FSF changes to this file are in the public domain.
     36 #
     37 # Calling this script install-sh is preferred over install.sh, to prevent
     38 # 'make' implicit rules from creating a file called install from it
     39 # when there is no Makefile.
     40 #
     41 # This script is compatible with the BSD install script, but was written
     42 # from scratch.
     43 
     44 tab='	'
     45 nl='
     46 '
     47 IFS=" $tab$nl"
     48 
     49 # Set DOITPROG to "echo" to test this script.
     50 
     51 doit=${DOITPROG-}
     52 doit_exec=${doit:-exec}
     53 
     54 # Put in absolute file names if you don't have them in your path;
     55 # or use environment vars.
     56 
     57 chgrpprog=${CHGRPPROG-chgrp}
     58 chmodprog=${CHMODPROG-chmod}
     59 chownprog=${CHOWNPROG-chown}
     60 cmpprog=${CMPPROG-cmp}
     61 cpprog=${CPPROG-cp}
     62 mkdirprog=${MKDIRPROG-mkdir}
     63 mvprog=${MVPROG-mv}
     64 rmprog=${RMPROG-rm}
     65 stripprog=${STRIPPROG-strip}
     66 
     67 posix_mkdir=
     68 
     69 # Desired mode of installed file.
     70 mode=0755
     71 
     72 # Create dirs (including intermediate dirs) using mode 755.
     73 # This is like GNU 'install' as of coreutils 8.32 (2020).
     74 mkdir_umask=22
     75 
     76 backupsuffix=
     77 chgrpcmd=
     78 chmodcmd=$chmodprog
     79 chowncmd=
     80 mvcmd=$mvprog
     81 rmcmd="$rmprog -f"
     82 stripcmd=
     83 
     84 src=
     85 dst=
     86 dir_arg=
     87 dst_arg=
     88 
     89 copy_on_change=false
     90 is_target_a_directory=possibly
     91 
     92 usage="\
     93 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
     94    or: $0 [OPTION]... SRCFILES... DIRECTORY
     95    or: $0 [OPTION]... -t DIRECTORY SRCFILES...
     96    or: $0 [OPTION]... -d DIRECTORIES...
     97 
     98 In the 1st form, copy SRCFILE to DSTFILE.
     99 In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
    100 In the 4th, create DIRECTORIES.
    101 
    102 Options:
    103      --help     display this help and exit.
    104      --version  display version info and exit.
    105 
    106   -c            (ignored)
    107   -C            install only if different (preserve data modification time)
    108   -d            create directories instead of installing files.
    109   -g GROUP      $chgrpprog installed files to GROUP.
    110   -m MODE       $chmodprog installed files to MODE.
    111   -o USER       $chownprog installed files to USER.
    112   -p            pass -p to $cpprog.
    113   -s            $stripprog installed files.
    114   -S SUFFIX     attempt to back up existing files, with suffix SUFFIX.
    115   -t DIRECTORY  install into DIRECTORY.
    116   -T            report an error if DSTFILE is a directory.
    117 
    118 Environment variables override the default commands:
    119   CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
    120   RMPROG STRIPPROG
    121 
    122 By default, rm is invoked with -f; when overridden with RMPROG,
    123 it's up to you to specify -f if you want it.
    124 
    125 If -S is not specified, no backups are attempted.
    126 
    127 Report bugs to <bug-automake@gnu.org>.
    128 GNU Automake home page: <https://www.gnu.org/software/automake/>.
    129 General help using GNU software: <https://www.gnu.org/gethelp/>."
    130 
    131 while test $# -ne 0; do
    132   case $1 in
    133     -c) ;;
    134 
    135     -C) copy_on_change=true;;
    136 
    137     -d) dir_arg=true;;
    138 
    139     -g) chgrpcmd="$chgrpprog $2"
    140         shift;;
    141 
    142     --help) echo "$usage"; exit $?;;
    143 
    144     -m) mode=$2
    145         case $mode in
    146           *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
    147             echo "$0: invalid mode: $mode" >&2
    148             exit 1;;
    149         esac
    150         shift;;
    151 
    152     -o) chowncmd="$chownprog $2"
    153         shift;;
    154 
    155     -p) cpprog="$cpprog -p";;
    156 
    157     -s) stripcmd=$stripprog;;
    158 
    159     -S) backupsuffix="$2"
    160         shift;;
    161 
    162     -t)
    163         is_target_a_directory=always
    164         dst_arg=$2
    165         # Protect names problematic for 'test' and other utilities.
    166         case $dst_arg in
    167           -* | [=\(\)!]) dst_arg=./$dst_arg;;
    168         esac
    169         shift;;
    170 
    171     -T) is_target_a_directory=never;;
    172 
    173     --version) echo "$0 (GNU Automake) $scriptversion"; exit $?;;
    174 
    175     --) shift
    176         break;;
    177 
    178     -*) echo "$0: invalid option: $1" >&2
    179         exit 1;;
    180 
    181     *)  break;;
    182   esac
    183   shift
    184 done
    185 
    186 # We allow the use of options -d and -T together, by making -d
    187 # take the precedence; this is for compatibility with GNU install.
    188 
    189 if test -n "$dir_arg"; then
    190   if test -n "$dst_arg"; then
    191     echo "$0: target directory not allowed when installing a directory." >&2
    192     exit 1
    193   fi
    194 fi
    195 
    196 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
    197   # When -d is used, all remaining arguments are directories to create.
    198   # When -t is used, the destination is already specified.
    199   # Otherwise, the last argument is the destination.  Remove it from $@.
    200   for arg
    201   do
    202     if test -n "$dst_arg"; then
    203       # $@ is not empty: it contains at least $arg.
    204       set fnord "$@" "$dst_arg"
    205       shift # fnord
    206     fi
    207     shift # arg
    208     dst_arg=$arg
    209     # Protect names problematic for 'test' and other utilities.
    210     case $dst_arg in
    211       -* | [=\(\)!]) dst_arg=./$dst_arg;;
    212     esac
    213   done
    214 fi
    215 
    216 if test $# -eq 0; then
    217   if test -z "$dir_arg"; then
    218     echo "$0: no input file specified." >&2
    219     exit 1
    220   fi
    221   # It's OK to call 'install-sh -d' without argument.
    222   # This can happen when creating conditional directories.
    223   exit 0
    224 fi
    225 
    226 if test -z "$dir_arg"; then
    227   if test $# -gt 1 || test "$is_target_a_directory" = always; then
    228     if test ! -d "$dst_arg"; then
    229       echo "$0: $dst_arg: Is not a directory." >&2
    230       exit 1
    231     fi
    232   fi
    233 fi
    234 
    235 if test -z "$dir_arg"; then
    236   do_exit='(exit $ret); exit $ret'
    237   trap "ret=129; $do_exit" 1
    238   trap "ret=130; $do_exit" 2
    239   trap "ret=141; $do_exit" 13
    240   trap "ret=143; $do_exit" 15
    241 
    242   # Set umask so as not to create temps with too-generous modes.
    243   # However, 'strip' requires both read and write access to temps.
    244   case $mode in
    245     # Optimize common cases.
    246     *644) cp_umask=133;;
    247     *755) cp_umask=22;;
    248 
    249     *[0-7])
    250       if test -z "$stripcmd"; then
    251         u_plus_rw=
    252       else
    253         u_plus_rw='% 200'
    254       fi
    255       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
    256     *)
    257       if test -z "$stripcmd"; then
    258         u_plus_rw=
    259       else
    260         u_plus_rw=,u+rw
    261       fi
    262       cp_umask=$mode$u_plus_rw;;
    263   esac
    264 fi
    265 
    266 for src
    267 do
    268   # Protect names problematic for 'test' and other utilities.
    269   case $src in
    270     -* | [=\(\)!]) src=./$src;;
    271   esac
    272 
    273   if test -n "$dir_arg"; then
    274     dst=$src
    275     dstdir=$dst
    276     test -d "$dstdir"
    277     dstdir_status=$?
    278     # Don't chown directories that already exist.
    279     if test $dstdir_status = 0; then
    280       chowncmd=""
    281     fi
    282   else
    283 
    284     # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
    285     # might cause directories to be created, which would be especially bad
    286     # if $src (and thus $dsttmp) contains '*'.
    287     if test ! -f "$src" && test ! -d "$src"; then
    288       echo "$0: $src does not exist." >&2
    289       exit 1
    290     fi
    291 
    292     if test -z "$dst_arg"; then
    293       echo "$0: no destination specified." >&2
    294       exit 1
    295     fi
    296     dst=$dst_arg
    297 
    298     # If destination is a directory, append the input filename.
    299     if test -d "$dst"; then
    300       if test "$is_target_a_directory" = never; then
    301         echo "$0: $dst_arg: Is a directory" >&2
    302         exit 1
    303       fi
    304       dstdir=$dst
    305       dstbase=`basename "$src"`
    306       case $dst in
    307 	*/) dst=$dst$dstbase;;
    308 	*)  dst=$dst/$dstbase;;
    309       esac
    310       dstdir_status=0
    311     else
    312       dstdir=`dirname "$dst"`
    313       test -d "$dstdir"
    314       dstdir_status=$?
    315     fi
    316   fi
    317 
    318   case $dstdir in
    319     */) dstdirslash=$dstdir;;
    320     *)  dstdirslash=$dstdir/;;
    321   esac
    322 
    323   obsolete_mkdir_used=false
    324 
    325   if test $dstdir_status != 0; then
    326     case $posix_mkdir in
    327       '')
    328         # With -d, create the new directory with the user-specified mode.
    329         # Otherwise, rely on $mkdir_umask.
    330         if test -n "$dir_arg"; then
    331           mkdir_mode=-m$mode
    332         else
    333           mkdir_mode=
    334         fi
    335 
    336         posix_mkdir=false
    337 	# The $RANDOM variable is not portable (e.g., dash).  Use it
    338 	# here however when possible just to lower collision chance.
    339 	tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
    340 
    341 	trap '
    342 	  ret=$?
    343 	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
    344 	  exit $ret
    345 	' 0
    346 
    347 	# Because "mkdir -p" follows existing symlinks and we likely work
    348 	# directly in world-writable /tmp, make sure that the '$tmpdir'
    349 	# directory is successfully created first before we actually test
    350 	# 'mkdir -p'.
    351 	if (umask $mkdir_umask &&
    352 	    $mkdirprog $mkdir_mode "$tmpdir" &&
    353 	    exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
    354 	then
    355 	  if test -z "$dir_arg" || {
    356 	       # Check for POSIX incompatibility with -m.
    357 	       # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
    358 	       # other-writable bit of parent directory when it shouldn't.
    359 	       # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
    360 	       test_tmpdir="$tmpdir/a"
    361 	       ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
    362 	       case $ls_ld_tmpdir in
    363 		 d????-?r-*) different_mode=700;;
    364 		 d????-?--*) different_mode=755;;
    365 		 *) false;;
    366 	       esac &&
    367 	       $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
    368 		 ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
    369 		 test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
    370 	       }
    371 	     }
    372 	  then posix_mkdir=:
    373 	  fi
    374 	  rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
    375 	else
    376 	  # Remove any dirs left behind by ancient mkdir implementations.
    377 	  rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
    378 	fi
    379 	trap '' 0;;
    380     esac
    381 
    382     if
    383       $posix_mkdir && (
    384         umask $mkdir_umask &&
    385         $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
    386       )
    387     then :
    388     else
    389 
    390       # mkdir does not conform to POSIX,
    391       # or it failed possibly due to a race condition.  Create the
    392       # directory the slow way, step by step, checking for races as we go.
    393 
    394       case $dstdir in
    395         /*) prefix='/';;
    396         [-=\(\)!]*) prefix='./';;
    397         *)  prefix='';;
    398       esac
    399 
    400       oIFS=$IFS
    401       IFS=/
    402       set -f
    403       set fnord $dstdir
    404       shift
    405       set +f
    406       IFS=$oIFS
    407 
    408       prefixes=
    409 
    410       for d
    411       do
    412         test X"$d" = X && continue
    413 
    414         prefix=$prefix$d
    415         if test -d "$prefix"; then
    416           prefixes=
    417         else
    418           if $posix_mkdir; then
    419             (umask $mkdir_umask &&
    420              $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
    421             # Don't fail if two instances are running concurrently.
    422             test -d "$prefix" || exit 1
    423           else
    424             case $prefix in
    425               *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
    426               *) qprefix=$prefix;;
    427             esac
    428             prefixes="$prefixes '$qprefix'"
    429           fi
    430         fi
    431         prefix=$prefix/
    432       done
    433 
    434       if test -n "$prefixes"; then
    435         # Don't fail if two instances are running concurrently.
    436         (umask $mkdir_umask &&
    437          eval "\$doit_exec \$mkdirprog $prefixes") ||
    438           test -d "$dstdir" || exit 1
    439         obsolete_mkdir_used=true
    440       fi
    441     fi
    442   fi
    443 
    444   if test -n "$dir_arg"; then
    445     { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
    446     { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
    447     { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
    448       test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
    449   else
    450 
    451     # Make a couple of temp file names in the proper directory.
    452     dsttmp=${dstdirslash}_inst.$$_
    453     rmtmp=${dstdirslash}_rm.$$_
    454 
    455     # Trap to clean up those temp files at exit.
    456     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
    457 
    458     # Copy the file name to the temp name.
    459     (umask $cp_umask &&
    460      { test -z "$stripcmd" || {
    461 	 # Create $dsttmp read-write so that cp doesn't create it read-only,
    462 	 # which would cause strip to fail.
    463 	 if test -z "$doit"; then
    464 	   : >"$dsttmp" # No need to fork-exec 'touch'.
    465 	 else
    466 	   $doit touch "$dsttmp"
    467 	 fi
    468        }
    469      } &&
    470      $doit_exec $cpprog "$src" "$dsttmp") &&
    471 
    472     # and set any options; do chmod last to preserve setuid bits.
    473     #
    474     # If any of these fail, we abort the whole thing.  If we want to
    475     # ignore errors from any of these, just make sure not to ignore
    476     # errors from the above "$doit $cpprog $src $dsttmp" command.
    477     #
    478     { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
    479     { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
    480     { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
    481     { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
    482 
    483     # If -C, don't bother to copy if it wouldn't change the file.
    484     if $copy_on_change &&
    485        old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
    486        new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
    487        set -f &&
    488        set X $old && old=:$2:$4:$5:$6 &&
    489        set X $new && new=:$2:$4:$5:$6 &&
    490        set +f &&
    491        test "$old" = "$new" &&
    492        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
    493     then
    494       rm -f "$dsttmp"
    495     else
    496       # If $backupsuffix is set, and the file being installed
    497       # already exists, attempt a backup.  Don't worry if it fails,
    498       # e.g., if mv doesn't support -f.
    499       if test -n "$backupsuffix" && test -f "$dst"; then
    500         $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
    501       fi
    502 
    503       # Rename the file to the real destination.
    504       $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
    505 
    506       # The rename failed, perhaps because mv can't rename something else
    507       # to itself, or perhaps because mv is so ancient that it does not
    508       # support -f.
    509       {
    510         # Now remove or move aside any old file at destination location.
    511         # We try this two ways since rm can't unlink itself on some
    512         # systems and the destination file might be busy for other
    513         # reasons.  In this case, the final cleanup might fail but the new
    514         # file should still install successfully.
    515         {
    516           test ! -f "$dst" ||
    517           $doit $rmcmd "$dst" 2>/dev/null ||
    518           { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
    519             { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
    520           } ||
    521           { echo "$0: cannot unlink or rename $dst" >&2
    522             (exit 1); exit 1
    523           }
    524         } &&
    525 
    526         # Now rename the file to the real destination.
    527         $doit $mvcmd "$dsttmp" "$dst"
    528       }
    529     fi || exit 1
    530 
    531     trap '' 0
    532   fi
    533 done
    534 
    535 # Local variables:
    536 # eval: (add-hook 'before-save-hook 'time-stamp nil t)
    537 # time-stamp-start: "scriptversion="
    538 # time-stamp-format: "%Y-%02m-%02d.%02H"
    539 # time-stamp-time-zone: "UTC0"
    540 # time-stamp-end: "; # UTC"
    541 # End: