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