ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/hopm/trunk/install-sh
(Generate patch)

Comparing hopm/trunk/install-sh (file contents):
Revision 5052 by michael, Mon Dec 22 11:56:03 2014 UTC vs.
Revision 8850 by michael, Sat Feb 9 18:34:12 2019 UTC

# Line 1 | Line 1
1   #!/bin/sh
2 #
2   # install - install a program, script, or datafile
3 < # This comes from X11R5 (mit/util/scripts/install.sh).
3 >
4 > scriptversion=2018-03-11.20; # 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 < # Copyright 1991 by the Massachusetts Institute of Technology
19 > # The above copyright notice and this permission notice shall be included in
20 > # all copies or substantial portions of the Software.
21   #
22 < # Permission to use, copy, modify, distribute, and sell this software and its
23 < # documentation for any purpose is hereby granted without fee, provided that
24 < # the above copyright notice appear in all copies and that both that
25 < # copyright notice and this permission notice appear in supporting
26 < # documentation, and that the name of M.I.T. not be used in advertising or
27 < # publicity pertaining to distribution of the software without specific,
28 < # written prior permission.  M.I.T. makes no representations about the
29 < # suitability of this software for any purpose.  It is provided "as is"
30 < # without express or implied warranty.
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
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.  It can only install one file at a time, a restriction
24 < # shared with many OS's install programs.
42 > # from scratch.
43  
44 + tab='   '
45 + nl='
46 + '
47 + IFS=" $tab$nl"
48  
49 < # set DOITPROG to echo to test this script
28 <
29 < # Don't use :- since 4.3BSD and earlier shells don't like it.
30 < doit="${DOITPROG-}"
49 > # Set DOITPROG to "echo" to test this script.
50  
51 + doit=${DOITPROG-}
52 + doit_exec=${doit:-exec}
53  
54 < # put in absolute paths if you don't have them in your path; or use env. vars.
55 <
56 < mvprog="${MVPROG-mv}"
57 < cpprog="${CPPROG-cp}"
58 < chmodprog="${CHMODPROG-chmod}"
59 < chownprog="${CHOWNPROG-chown}"
60 < chgrpprog="${CHGRPPROG-chgrp}"
61 < stripprog="${STRIPPROG-strip}"
62 < rmprog="${RMPROG-rm}"
63 < mkdirprog="${MKDIRPROG-mkdir}"
64 <
65 < transformbasename=""
66 < transform_arg=""
67 < instcmd="$mvprog"
68 < chmodcmd="$chmodprog 0755"
69 < chowncmd=""
70 < chgrpcmd=""
71 < stripcmd=""
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 > chgrpcmd=
73 > chmodcmd=$chmodprog
74 > chowncmd=
75 > mvcmd=$mvprog
76   rmcmd="$rmprog -f"
77 < mvcmd="$mvprog"
78 < src=""
79 < dst=""
80 < dir_arg=""
81 <
82 < while [ x"$1" != x ]; do
83 <    case $1 in
84 <        -c) instcmd="$cpprog"
85 <            shift
86 <            continue;;
87 <
88 <        -d) dir_arg=true
89 <            shift
90 <            continue;;
91 <
92 <        -m) chmodcmd="$chmodprog $2"
93 <            shift
94 <            shift
95 <            continue;;
96 <
97 <        -o) chowncmd="$chownprog $2"
98 <            shift
99 <            shift
100 <            continue;;
101 <
102 <        -g) chgrpcmd="$chgrpprog $2"
103 <            shift
104 <            shift
105 <            continue;;
106 <
107 <        -s) stripcmd="$stripprog"
108 <            shift
109 <            continue;;
110 <
111 <        -t=*) transformarg=`echo $1 | sed 's/-t=//'`
112 <            shift
113 <            continue;;
114 <
115 <        -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
116 <            shift
117 <            continue;;
118 <
119 <        *)  if [ x"$src" = x ]
120 <            then
121 <                src=$1
122 <            else
123 <                # this colon is to work around a 386BSD /bin/sh bug
124 <                :
125 <                dst=$1
126 <            fi
127 <            shift
128 <            continue;;
129 <    esac
77 > stripcmd=
78 >
79 > src=
80 > dst=
81 > dir_arg=
82 > dst_arg=
83 >
84 > copy_on_change=false
85 > is_target_a_directory=possibly
86 >
87 > usage="\
88 > Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
89 >   or: $0 [OPTION]... SRCFILES... DIRECTORY
90 >   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
91 >   or: $0 [OPTION]... -d DIRECTORIES...
92 >
93 > In the 1st form, copy SRCFILE to DSTFILE.
94 > In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
95 > In the 4th, create DIRECTORIES.
96 >
97 > Options:
98 >     --help     display this help and exit.
99 >     --version  display version info and exit.
100 >
101 >  -c            (ignored)
102 >  -C            install only if different (preserve the last data modification time)
103 >  -d            create directories instead of installing files.
104 >  -g GROUP      $chgrpprog installed files to GROUP.
105 >  -m MODE       $chmodprog installed files to MODE.
106 >  -o USER       $chownprog installed files to USER.
107 >  -s            $stripprog installed files.
108 >  -t DIRECTORY  install into DIRECTORY.
109 >  -T            report an error if DSTFILE is a directory.
110 >
111 > Environment variables override the default commands:
112 >  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
113 >  RMPROG STRIPPROG
114 > "
115 >
116 > while test $# -ne 0; do
117 >  case $1 in
118 >    -c) ;;
119 >
120 >    -C) copy_on_change=true;;
121 >
122 >    -d) dir_arg=true;;
123 >
124 >    -g) chgrpcmd="$chgrpprog $2"
125 >        shift;;
126 >
127 >    --help) echo "$usage"; exit $?;;
128 >
129 >    -m) mode=$2
130 >        case $mode in
131 >          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
132 >            echo "$0: invalid mode: $mode" >&2
133 >            exit 1;;
134 >        esac
135 >        shift;;
136 >
137 >    -o) chowncmd="$chownprog $2"
138 >        shift;;
139 >
140 >    -s) stripcmd=$stripprog;;
141 >
142 >    -t)
143 >        is_target_a_directory=always
144 >        dst_arg=$2
145 >        # Protect names problematic for 'test' and other utilities.
146 >        case $dst_arg in
147 >          -* | [=\(\)!]) dst_arg=./$dst_arg;;
148 >        esac
149 >        shift;;
150 >
151 >    -T) is_target_a_directory=never;;
152 >
153 >    --version) echo "$0 $scriptversion"; exit $?;;
154 >
155 >    --) shift
156 >        break;;
157 >
158 >    -*) echo "$0: invalid option: $1" >&2
159 >        exit 1;;
160 >
161 >    *)  break;;
162 >  esac
163 >  shift
164   done
165  
166 < if [ x"$src" = x ]
167 < then
109 <        echo "install:  no input file specified"
110 <        exit 1
111 < else
112 <        true
113 < fi
166 > # We allow the use of options -d and -T together, by making -d
167 > # take the precedence; this is for compatibility with GNU install.
168  
169 < if [ x"$dir_arg" != x ]; then
170 <        dst=$src
171 <        src=""
172 <        
173 <        if [ -d $dst ]; then
120 <                instcmd=:
121 <                chmodcmd=""
122 <        else
123 <                instcmd=mkdir
124 <        fi
125 < else
126 <
127 < # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
128 < # might cause directories to be created, which would be especially bad
129 < # if $src (and thus $dsttmp) contains '*'.
130 <
131 <        if [ -f $src -o -d $src ]
132 <        then
133 <                true
134 <        else
135 <                echo "install:  $src does not exist"
136 <                exit 1
137 <        fi
138 <        
139 <        if [ x"$dst" = x ]
140 <        then
141 <                echo "install:  no destination specified"
142 <                exit 1
143 <        else
144 <                true
145 <        fi
146 <
147 < # If destination is a directory, append the input filename; if your system
148 < # does not like double slashes in filenames, you may need to add some logic
149 <
150 <        if [ -d $dst ]
151 <        then
152 <                dst="$dst"/`basename $src`
153 <        else
154 <                true
155 <        fi
169 > if test -n "$dir_arg"; then
170 >  if test -n "$dst_arg"; then
171 >    echo "$0: target directory not allowed when installing a directory." >&2
172 >    exit 1
173 >  fi
174   fi
175  
176 < ## this sed command emulates the dirname command
177 < dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
178 <
179 < # Make sure that the destination directory exists.
180 < #  this part is taken from Noah Friedman's mkinstalldirs script
181 <
182 < # Skip lots of stat calls in the usual case.
183 < if [ ! -d "$dstdir" ]; then
184 < defaultIFS='    
185 < '
186 < IFS="${IFS-${defaultIFS}}"
187 <
188 < oIFS="${IFS}"
189 < # Some sh's can't handle IFS=/ for some reason.
190 < IFS='%'
191 < set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
192 < IFS="${oIFS}"
193 <
176 < pathcomp=''
177 <
178 < while [ $# -ne 0 ] ; do
179 <        pathcomp="${pathcomp}${1}"
180 <        shift
181 <
182 <        if [ ! -d "${pathcomp}" ] ;
183 <        then
184 <                $mkdirprog "${pathcomp}"
185 <        else
186 <                true
187 <        fi
188 <
189 <        pathcomp="${pathcomp}/"
190 < done
176 > if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
177 >  # When -d is used, all remaining arguments are directories to create.
178 >  # When -t is used, the destination is already specified.
179 >  # Otherwise, the last argument is the destination.  Remove it from $@.
180 >  for arg
181 >  do
182 >    if test -n "$dst_arg"; then
183 >      # $@ is not empty: it contains at least $arg.
184 >      set fnord "$@" "$dst_arg"
185 >      shift # fnord
186 >    fi
187 >    shift # arg
188 >    dst_arg=$arg
189 >    # Protect names problematic for 'test' and other utilities.
190 >    case $dst_arg in
191 >      -* | [=\(\)!]) dst_arg=./$dst_arg;;
192 >    esac
193 >  done
194   fi
195  
196 < if [ x"$dir_arg" != x ]
197 < then
198 <        $doit $instcmd $dst &&
199 <
200 <        if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
201 <        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
202 <        if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
203 <        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
204 < else
202 <
203 < # If we're going to rename the final executable, determine the name now.
204 <
205 <        if [ x"$transformarg" = x ]
206 <        then
207 <                dstfile=`basename $dst`
208 <        else
209 <                dstfile=`basename $dst $transformbasename |
210 <                        sed $transformarg`$transformbasename
211 <        fi
212 <
213 < # don't allow the sed command to completely eliminate the filename
214 <
215 <        if [ x"$dstfile" = x ]
216 <        then
217 <                dstfile=`basename $dst`
218 <        else
219 <                true
220 <        fi
221 <
222 < # Make a temp file name in the proper directory.
223 <
224 <        dsttmp=$dstdir/#inst.$$#
225 <
226 < # Move or copy the file name to the temp name
227 <
228 <        $doit $instcmd $src $dsttmp &&
229 <
230 <        trap "rm -f ${dsttmp}" 0 &&
231 <
232 < # and set any options; do chmod last to preserve setuid bits
233 <
234 < # If any of these fail, we abort the whole thing.  If we want to
235 < # ignore errors from any of these, just make sure not to ignore
236 < # errors from the above "$doit $instcmd $src $dsttmp" command.
196 > if test $# -eq 0; then
197 >  if test -z "$dir_arg"; then
198 >    echo "$0: no input file specified." >&2
199 >    exit 1
200 >  fi
201 >  # It's OK to call 'install-sh -d' without argument.
202 >  # This can happen when creating conditional directories.
203 >  exit 0
204 > fi
205  
206 <        if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
207 <        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
208 <        if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
209 <        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
206 > if test -z "$dir_arg"; then
207 >  if test $# -gt 1 || test "$is_target_a_directory" = always; then
208 >    if test ! -d "$dst_arg"; then
209 >      echo "$0: $dst_arg: Is not a directory." >&2
210 >      exit 1
211 >    fi
212 >  fi
213 > fi
214  
215 < # Now rename the file to the real destination.
215 > if test -z "$dir_arg"; then
216 >  do_exit='(exit $ret); exit $ret'
217 >  trap "ret=129; $do_exit" 1
218 >  trap "ret=130; $do_exit" 2
219 >  trap "ret=141; $do_exit" 13
220 >  trap "ret=143; $do_exit" 15
221 >
222 >  # Set umask so as not to create temps with too-generous modes.
223 >  # However, 'strip' requires both read and write access to temps.
224 >  case $mode in
225 >    # Optimize common cases.
226 >    *644) cp_umask=133;;
227 >    *755) cp_umask=22;;
228 >
229 >    *[0-7])
230 >      if test -z "$stripcmd"; then
231 >        u_plus_rw=
232 >      else
233 >        u_plus_rw='% 200'
234 >      fi
235 >      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
236 >    *)
237 >      if test -z "$stripcmd"; then
238 >        u_plus_rw=
239 >      else
240 >        u_plus_rw=,u+rw
241 >      fi
242 >      cp_umask=$mode$u_plus_rw;;
243 >  esac
244 > fi
245  
246 <        $doit $rmcmd -f $dstdir/$dstfile &&
247 <        $doit $mvcmd $dsttmp $dstdir/$dstfile
246 > for src
247 > do
248 >  # Protect names problematic for 'test' and other utilities.
249 >  case $src in
250 >    -* | [=\(\)!]) src=./$src;;
251 >  esac
252 >
253 >  if test -n "$dir_arg"; then
254 >    dst=$src
255 >    dstdir=$dst
256 >    test -d "$dstdir"
257 >    dstdir_status=$?
258 >  else
259 >
260 >    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
261 >    # might cause directories to be created, which would be especially bad
262 >    # if $src (and thus $dsttmp) contains '*'.
263 >    if test ! -f "$src" && test ! -d "$src"; then
264 >      echo "$0: $src does not exist." >&2
265 >      exit 1
266 >    fi
267 >
268 >    if test -z "$dst_arg"; then
269 >      echo "$0: no destination specified." >&2
270 >      exit 1
271 >    fi
272 >    dst=$dst_arg
273 >
274 >    # If destination is a directory, append the input filename.
275 >    if test -d "$dst"; then
276 >      if test "$is_target_a_directory" = never; then
277 >        echo "$0: $dst_arg: Is a directory" >&2
278 >        exit 1
279 >      fi
280 >      dstdir=$dst
281 >      dstbase=`basename "$src"`
282 >      case $dst in
283 >        */) dst=$dst$dstbase;;
284 >        *)  dst=$dst/$dstbase;;
285 >      esac
286 >      dstdir_status=0
287 >    else
288 >      dstdir=`dirname "$dst"`
289 >      test -d "$dstdir"
290 >      dstdir_status=$?
291 >    fi
292 >  fi
293 >
294 >  case $dstdir in
295 >    */) dstdirslash=$dstdir;;
296 >    *)  dstdirslash=$dstdir/;;
297 >  esac
298 >
299 >  obsolete_mkdir_used=false
300 >
301 >  if test $dstdir_status != 0; then
302 >    case $posix_mkdir in
303 >      '')
304 >        # Create intermediate dirs using mode 755 as modified by the umask.
305 >        # This is like FreeBSD 'install' as of 1997-10-28.
306 >        umask=`umask`
307 >        case $stripcmd.$umask in
308 >          # Optimize common cases.
309 >          *[2367][2367]) mkdir_umask=$umask;;
310 >          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
311 >
312 >          *[0-7])
313 >            mkdir_umask=`expr $umask + 22 \
314 >              - $umask % 100 % 40 + $umask % 20 \
315 >              - $umask % 10 % 4 + $umask % 2
316 >            `;;
317 >          *) mkdir_umask=$umask,go-w;;
318 >        esac
319 >
320 >        # With -d, create the new directory with the user-specified mode.
321 >        # Otherwise, rely on $mkdir_umask.
322 >        if test -n "$dir_arg"; then
323 >          mkdir_mode=-m$mode
324 >        else
325 >          mkdir_mode=
326 >        fi
327 >
328 >        posix_mkdir=false
329 >        case $umask in
330 >          *[123567][0-7][0-7])
331 >            # POSIX mkdir -p sets u+wx bits regardless of umask, which
332 >            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
333 >            ;;
334 >          *)
335 >            # Note that $RANDOM variable is not portable (e.g. dash);  Use it
336 >            # here however when possible just to lower collision chance.
337 >            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
338 >
339 >            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
340 >
341 >            # Because "mkdir -p" follows existing symlinks and we likely work
342 >            # directly in world-writeable /tmp, make sure that the '$tmpdir'
343 >            # directory is successfully created first before we actually test
344 >            # 'mkdir -p' feature.
345 >            if (umask $mkdir_umask &&
346 >                $mkdirprog $mkdir_mode "$tmpdir" &&
347 >                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
348 >            then
349 >              if test -z "$dir_arg" || {
350 >                   # Check for POSIX incompatibilities with -m.
351 >                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
352 >                   # other-writable bit of parent directory when it shouldn't.
353 >                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
354 >                   test_tmpdir="$tmpdir/a"
355 >                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
356 >                   case $ls_ld_tmpdir in
357 >                     d????-?r-*) different_mode=700;;
358 >                     d????-?--*) different_mode=755;;
359 >                     *) false;;
360 >                   esac &&
361 >                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
362 >                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
363 >                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
364 >                   }
365 >                 }
366 >              then posix_mkdir=:
367 >              fi
368 >              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
369 >            else
370 >              # Remove any dirs left behind by ancient mkdir implementations.
371 >              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
372 >            fi
373 >            trap '' 0;;
374 >        esac;;
375 >    esac
376  
377 < fi &&
377 >    if
378 >      $posix_mkdir && (
379 >        umask $mkdir_umask &&
380 >        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
381 >      )
382 >    then :
383 >    else
384 >
385 >      # The umask is ridiculous, or mkdir does not conform to POSIX,
386 >      # or it failed possibly due to a race condition.  Create the
387 >      # directory the slow way, step by step, checking for races as we go.
388 >
389 >      case $dstdir in
390 >        /*) prefix='/';;
391 >        [-=\(\)!]*) prefix='./';;
392 >        *)  prefix='';;
393 >      esac
394 >
395 >      oIFS=$IFS
396 >      IFS=/
397 >      set -f
398 >      set fnord $dstdir
399 >      shift
400 >      set +f
401 >      IFS=$oIFS
402 >
403 >      prefixes=
404 >
405 >      for d
406 >      do
407 >        test X"$d" = X && continue
408 >
409 >        prefix=$prefix$d
410 >        if test -d "$prefix"; then
411 >          prefixes=
412 >        else
413 >          if $posix_mkdir; then
414 >            (umask=$mkdir_umask &&
415 >             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
416 >            # Don't fail if two instances are running concurrently.
417 >            test -d "$prefix" || exit 1
418 >          else
419 >            case $prefix in
420 >              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
421 >              *) qprefix=$prefix;;
422 >            esac
423 >            prefixes="$prefixes '$qprefix'"
424 >          fi
425 >        fi
426 >        prefix=$prefix/
427 >      done
428 >
429 >      if test -n "$prefixes"; then
430 >        # Don't fail if two instances are running concurrently.
431 >        (umask $mkdir_umask &&
432 >         eval "\$doit_exec \$mkdirprog $prefixes") ||
433 >          test -d "$dstdir" || exit 1
434 >        obsolete_mkdir_used=true
435 >      fi
436 >    fi
437 >  fi
438 >
439 >  if test -n "$dir_arg"; then
440 >    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
441 >    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
442 >    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
443 >      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
444 >  else
445 >
446 >    # Make a couple of temp file names in the proper directory.
447 >    dsttmp=${dstdirslash}_inst.$$_
448 >    rmtmp=${dstdirslash}_rm.$$_
449 >
450 >    # Trap to clean up those temp files at exit.
451 >    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
452 >
453 >    # Copy the file name to the temp name.
454 >    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
455 >
456 >    # and set any options; do chmod last to preserve setuid bits.
457 >    #
458 >    # If any of these fail, we abort the whole thing.  If we want to
459 >    # ignore errors from any of these, just make sure not to ignore
460 >    # errors from the above "$doit $cpprog $src $dsttmp" command.
461 >    #
462 >    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
463 >    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
464 >    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
465 >    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
466 >
467 >    # If -C, don't bother to copy if it wouldn't change the file.
468 >    if $copy_on_change &&
469 >       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
470 >       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
471 >       set -f &&
472 >       set X $old && old=:$2:$4:$5:$6 &&
473 >       set X $new && new=:$2:$4:$5:$6 &&
474 >       set +f &&
475 >       test "$old" = "$new" &&
476 >       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
477 >    then
478 >      rm -f "$dsttmp"
479 >    else
480 >      # Rename the file to the real destination.
481 >      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
482 >
483 >      # The rename failed, perhaps because mv can't rename something else
484 >      # to itself, or perhaps because mv is so ancient that it does not
485 >      # support -f.
486 >      {
487 >        # Now remove or move aside any old file at destination location.
488 >        # We try this two ways since rm can't unlink itself on some
489 >        # systems and the destination file might be busy for other
490 >        # reasons.  In this case, the final cleanup might fail but the new
491 >        # file should still install successfully.
492 >        {
493 >          test ! -f "$dst" ||
494 >          $doit $rmcmd -f "$dst" 2>/dev/null ||
495 >          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
496 >            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
497 >          } ||
498 >          { echo "$0: cannot unlink or rename $dst" >&2
499 >            (exit 1); exit 1
500 >          }
501 >        } &&
502 >
503 >        # Now rename the file to the real destination.
504 >        $doit $mvcmd "$dsttmp" "$dst"
505 >      }
506 >    fi || exit 1
507  
508 +    trap '' 0
509 +  fi
510 + done
511  
512 < exit 0
512 > # Local variables:
513 > # eval: (add-hook 'before-save-hook 'time-stamp)
514 > # time-stamp-start: "scriptversion="
515 > # time-stamp-format: "%:y-%02m-%02d.%02H"
516 > # time-stamp-time-zone: "UTC0"
517 > # time-stamp-end: "; # UTC"
518 > # End:

Comparing hopm/trunk/install-sh (property svn:eol-style):
Revision 5052 by michael, Mon Dec 22 11:56:03 2014 UTC vs.
Revision 8850 by michael, Sat Feb 9 18:34:12 2019 UTC

# Line 0 | Line 1
1 + native

Comparing hopm/trunk/install-sh (property svn:keywords):
Revision 5052 by michael, Mon Dec 22 11:56:03 2014 UTC vs.
Revision 8850 by michael, Sat Feb 9 18:34:12 2019 UTC

# Line 0 | Line 1
1 + Id

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)