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

Comparing:
hopm/trunk/install-sh (file contents), Revision 5052 by michael, Mon Dec 22 11:56:03 2014 UTC vs.
hopm/branches/1.1.x/install-sh (file contents), Revision 8552 by michael, Sat Sep 22 20:56:36 2018 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=2016-01-11.22; # 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; won't work
275 >    # if double slashes aren't ignored.
276 >    if test -d "$dst"; then
277 >      if test "$is_target_a_directory" = never; then
278 >        echo "$0: $dst_arg: Is a directory" >&2
279 >        exit 1
280 >      fi
281 >      dstdir=$dst
282 >      dst=$dstdir/`basename "$src"`
283 >      dstdir_status=0
284 >    else
285 >      dstdir=`dirname "$dst"`
286 >      test -d "$dstdir"
287 >      dstdir_status=$?
288 >    fi
289 >  fi
290 >
291 >  obsolete_mkdir_used=false
292 >
293 >  if test $dstdir_status != 0; then
294 >    case $posix_mkdir in
295 >      '')
296 >        # Create intermediate dirs using mode 755 as modified by the umask.
297 >        # This is like FreeBSD 'install' as of 1997-10-28.
298 >        umask=`umask`
299 >        case $stripcmd.$umask in
300 >          # Optimize common cases.
301 >          *[2367][2367]) mkdir_umask=$umask;;
302 >          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
303 >
304 >          *[0-7])
305 >            mkdir_umask=`expr $umask + 22 \
306 >              - $umask % 100 % 40 + $umask % 20 \
307 >              - $umask % 10 % 4 + $umask % 2
308 >            `;;
309 >          *) mkdir_umask=$umask,go-w;;
310 >        esac
311 >
312 >        # With -d, create the new directory with the user-specified mode.
313 >        # Otherwise, rely on $mkdir_umask.
314 >        if test -n "$dir_arg"; then
315 >          mkdir_mode=-m$mode
316 >        else
317 >          mkdir_mode=
318 >        fi
319 >
320 >        posix_mkdir=false
321 >        case $umask in
322 >          *[123567][0-7][0-7])
323 >            # POSIX mkdir -p sets u+wx bits regardless of umask, which
324 >            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
325 >            ;;
326 >          *)
327 >            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
328 >            trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
329 >
330 >            if (umask $mkdir_umask &&
331 >                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
332 >            then
333 >              if test -z "$dir_arg" || {
334 >                   # Check for POSIX incompatibilities with -m.
335 >                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
336 >                   # other-writable bit of parent directory when it shouldn't.
337 >                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
338 >                   ls_ld_tmpdir=`ls -ld "$tmpdir"`
339 >                   case $ls_ld_tmpdir in
340 >                     d????-?r-*) different_mode=700;;
341 >                     d????-?--*) different_mode=755;;
342 >                     *) false;;
343 >                   esac &&
344 >                   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
345 >                     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
346 >                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
347 >                   }
348 >                 }
349 >              then posix_mkdir=:
350 >              fi
351 >              rmdir "$tmpdir/d" "$tmpdir"
352 >            else
353 >              # Remove any dirs left behind by ancient mkdir implementations.
354 >              rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
355 >            fi
356 >            trap '' 0;;
357 >        esac;;
358 >    esac
359  
360 < fi &&
360 >    if
361 >      $posix_mkdir && (
362 >        umask $mkdir_umask &&
363 >        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
364 >      )
365 >    then :
366 >    else
367 >
368 >      # The umask is ridiculous, or mkdir does not conform to POSIX,
369 >      # or it failed possibly due to a race condition.  Create the
370 >      # directory the slow way, step by step, checking for races as we go.
371 >
372 >      case $dstdir in
373 >        /*) prefix='/';;
374 >        [-=\(\)!]*) prefix='./';;
375 >        *)  prefix='';;
376 >      esac
377 >
378 >      oIFS=$IFS
379 >      IFS=/
380 >      set -f
381 >      set fnord $dstdir
382 >      shift
383 >      set +f
384 >      IFS=$oIFS
385 >
386 >      prefixes=
387 >
388 >      for d
389 >      do
390 >        test X"$d" = X && continue
391 >
392 >        prefix=$prefix$d
393 >        if test -d "$prefix"; then
394 >          prefixes=
395 >        else
396 >          if $posix_mkdir; then
397 >            (umask=$mkdir_umask &&
398 >             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
399 >            # Don't fail if two instances are running concurrently.
400 >            test -d "$prefix" || exit 1
401 >          else
402 >            case $prefix in
403 >              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
404 >              *) qprefix=$prefix;;
405 >            esac
406 >            prefixes="$prefixes '$qprefix'"
407 >          fi
408 >        fi
409 >        prefix=$prefix/
410 >      done
411 >
412 >      if test -n "$prefixes"; then
413 >        # Don't fail if two instances are running concurrently.
414 >        (umask $mkdir_umask &&
415 >         eval "\$doit_exec \$mkdirprog $prefixes") ||
416 >          test -d "$dstdir" || exit 1
417 >        obsolete_mkdir_used=true
418 >      fi
419 >    fi
420 >  fi
421 >
422 >  if test -n "$dir_arg"; then
423 >    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
424 >    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
425 >    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
426 >      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
427 >  else
428 >
429 >    # Make a couple of temp file names in the proper directory.
430 >    dsttmp=$dstdir/_inst.$$_
431 >    rmtmp=$dstdir/_rm.$$_
432 >
433 >    # Trap to clean up those temp files at exit.
434 >    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
435 >
436 >    # Copy the file name to the temp name.
437 >    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
438 >
439 >    # and set any options; do chmod last to preserve setuid bits.
440 >    #
441 >    # If any of these fail, we abort the whole thing.  If we want to
442 >    # ignore errors from any of these, just make sure not to ignore
443 >    # errors from the above "$doit $cpprog $src $dsttmp" command.
444 >    #
445 >    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
446 >    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
447 >    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
448 >    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
449 >
450 >    # If -C, don't bother to copy if it wouldn't change the file.
451 >    if $copy_on_change &&
452 >       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
453 >       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
454 >       set -f &&
455 >       set X $old && old=:$2:$4:$5:$6 &&
456 >       set X $new && new=:$2:$4:$5:$6 &&
457 >       set +f &&
458 >       test "$old" = "$new" &&
459 >       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
460 >    then
461 >      rm -f "$dsttmp"
462 >    else
463 >      # Rename the file to the real destination.
464 >      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
465 >
466 >      # The rename failed, perhaps because mv can't rename something else
467 >      # to itself, or perhaps because mv is so ancient that it does not
468 >      # support -f.
469 >      {
470 >        # Now remove or move aside any old file at destination location.
471 >        # We try this two ways since rm can't unlink itself on some
472 >        # systems and the destination file might be busy for other
473 >        # reasons.  In this case, the final cleanup might fail but the new
474 >        # file should still install successfully.
475 >        {
476 >          test ! -f "$dst" ||
477 >          $doit $rmcmd -f "$dst" 2>/dev/null ||
478 >          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
479 >            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
480 >          } ||
481 >          { echo "$0: cannot unlink or rename $dst" >&2
482 >            (exit 1); exit 1
483 >          }
484 >        } &&
485 >
486 >        # Now rename the file to the real destination.
487 >        $doit $mvcmd "$dsttmp" "$dst"
488 >      }
489 >    fi || exit 1
490  
491 +    trap '' 0
492 +  fi
493 + done
494  
495 < exit 0
495 > # Local variables:
496 > # eval: (add-hook 'write-file-hooks 'time-stamp)
497 > # time-stamp-start: "scriptversion="
498 > # time-stamp-format: "%:y-%02m-%02d.%02H"
499 > # time-stamp-time-zone: "UTC0"
500 > # time-stamp-end: "; # UTC"
501 > # End:

Comparing:
hopm/trunk/install-sh (property svn:eol-style), Revision 5052 by michael, Mon Dec 22 11:56:03 2014 UTC vs.
hopm/branches/1.1.x/install-sh (property svn:eol-style), Revision 8552 by michael, Sat Sep 22 20:56:36 2018 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.
hopm/branches/1.1.x/install-sh (property svn:keywords), Revision 8552 by michael, Sat Sep 22 20:56:36 2018 UTC

# Line 0 | Line 1
1 + Id

Diff Legend

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