aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Eggert2011-01-07 12:42:11 -0800
committerPaul Eggert2011-01-07 12:42:11 -0800
commit2b3f5bc80a2b8a7496a5d87cc98ffcce44e7b32e (patch)
tree0f8e136e47266b4bc4fa38ce543686edf4440f8e
parentf56e0e7a85978026b611bc8f28bdb91d7f8130d4 (diff)
downloademacs-2b3f5bc80a2b8a7496a5d87cc98ffcce44e7b32e.tar.gz
emacs-2b3f5bc80a2b8a7496a5d87cc98ffcce44e7b32e.zip
* install-sh, mkinstalldirs, move-if-change: Update from master
-rw-r--r--ChangeLog3
-rw-r--r--admin/ChangeLog8
-rw-r--r--admin/notes/copyright4
-rwxr-xr-xinstall-sh676
-rwxr-xr-xmkinstalldirs12
-rwxr-xr-xmove-if-change86
6 files changed, 572 insertions, 217 deletions
diff --git a/ChangeLog b/ChangeLog
index b6c2e499982..fdf037c24c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
12011-01-07 Paul Eggert <eggert@cs.ucla.edu> 12011-01-07 Paul Eggert <eggert@cs.ucla.edu>
2 2
3 * install-sh, mkinstalldirs, move-if-change: Update from master
4 source in gnulib.
5
3 * config.guess, config.sub: Updated from master source. 6 * config.guess, config.sub: Updated from master source.
4 7
52011-01-05 Andreas Schwab <schwab@linux-m68k.org> 82011-01-05 Andreas Schwab <schwab@linux-m68k.org>
diff --git a/admin/ChangeLog b/admin/ChangeLog
index d008c14e5f4..07ed0179db0 100644
--- a/admin/ChangeLog
+++ b/admin/ChangeLog
@@ -1,4 +1,10 @@
12011-01-02 Paul Eggert <eggert@cs.ucla.edu> 12011-01-07 Paul Eggert <eggert@cs.ucla.edu>
2
3 * notes/copyright: There's only one install-sh, not two, so fix a
4 typo claiming that there's two. Add move-if-change to the list of
5 GPL files imported from gnulib.
6
72011-01-07 Paul Eggert <eggert@cs.ucla.edu>
2 8
3 * notes/copyright: Report status more accurately for non-GPL files. 9 * notes/copyright: Report status more accurately for non-GPL files.
4 Report copyright status more accurately for mkinstalldirs, 10 Report copyright status more accurately for mkinstalldirs,
diff --git a/admin/notes/copyright b/admin/notes/copyright
index 02aa3ba79c6..174d124f39d 100644
--- a/admin/notes/copyright
+++ b/admin/notes/copyright
@@ -138,8 +138,7 @@ configure
138m4/getopt.m4 138m4/getopt.m4
139 - copyright FSF, with MIT-like license 139 - copyright FSF, with MIT-like license
140 140
141<top-level>/install-sh 141install-sh
142lispintro/install-sh
143 - this file is copyright MIT, which is OK. Leave the copyright alone. 142 - this file is copyright MIT, which is OK. Leave the copyright alone.
144 143
145mkinstalldirs 144mkinstalldirs
@@ -621,6 +620,7 @@ of writing) GPL >= 2. rms says may as well leave the licenses of these
621alone (may import them from Gnulib again). These are: 620alone (may import them from Gnulib again). These are:
622 621
623 Gnulib: 622 Gnulib:
623 move-if-change
624 src/getloadavg.c 624 src/getloadavg.c
625 src/gmalloc.c 625 src/gmalloc.c
626 src/md5.c 626 src/md5.c
diff --git a/install-sh b/install-sh
index 058b26c82d2..3f83ce9b555 100755
--- a/install-sh
+++ b/install-sh
@@ -1,250 +1,524 @@
1#! /bin/sh 1#!/bin/sh
2#
3# install - install a program, script, or datafile 2# install - install a program, script, or datafile
4# This comes from X11R5 (mit/util/scripts/install.sh). 3
4scriptversion=2010-02-06.18; # 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.
5# 28#
6# Copyright 1991 by the Massachusetts Institute of Technology 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.
7# 33#
8# Permission to use, copy, modify, distribute, and sell this software and its 34#
9# documentation for any purpose is hereby granted without fee, provided that 35# FSF changes to this file are in the public domain.
10# the above copyright notice appear in all copies and that both that
11# copyright notice and this permission notice appear in supporting
12# documentation, and that the name of M.I.T. not be used in advertising or
13# publicity pertaining to distribution of the software without specific,
14# written prior permission. M.I.T. makes no representations about the
15# suitability of this software for any purpose. It is provided "as is"
16# without express or implied warranty.
17# 36#
18# Calling this script install-sh is preferred over install.sh, to prevent 37# Calling this script install-sh is preferred over install.sh, to prevent
19# `make' implicit rules from creating a file called install from it 38# `make' implicit rules from creating a file called install from it
20# when there is no Makefile. 39# when there is no Makefile.
21# 40#
22# This script is compatible with the BSD install script, but was written 41# This script is compatible with the BSD install script, but was written
23# from scratch. It can only install one file at a time, a restriction 42# from scratch.
24# shared with many OS's install programs.
25 43
44nl='
45'
46IFS=" "" $nl"
26 47
27# set DOITPROG to echo to test this script 48# set DOITPROG to echo to test this script
28 49
29# Don't use :- since 4.3BSD and earlier shells don't like it. 50# Don't use :- since 4.3BSD and earlier shells don't like it.
30doit="${DOITPROG-}" 51doit=${DOITPROG-}
31 52if test -z "$doit"; then
32 53 doit_exec=exec
33# put in absolute paths if you don't have them in your path; or use env. vars.
34
35mvprog="${MVPROG-mv}"
36cpprog="${CPPROG-cp}"
37chmodprog="${CHMODPROG-chmod}"
38chownprog="${CHOWNPROG-chown}"
39chgrpprog="${CHGRPPROG-chgrp}"
40stripprog="${STRIPPROG-strip}"
41rmprog="${RMPROG-rm}"
42mkdirprog="${MKDIRPROG-mkdir}"
43
44transformbasename=""
45transform_arg=""
46instcmd="$mvprog"
47chmodcmd="$chmodprog 0755"
48chowncmd=""
49chgrpcmd=""
50stripcmd=""
51rmcmd="$rmprog -f"
52mvcmd="$mvprog"
53src=""
54dst=""
55dir_arg=""
56
57while [ x"$1" != x ]; do
58 case $1 in
59 -c) instcmd="$cpprog"
60 shift
61 continue;;
62
63 -d) dir_arg=true
64 shift
65 continue;;
66
67 -m) chmodcmd="$chmodprog $2"
68 shift
69 shift
70 continue;;
71
72 -o) chowncmd="$chownprog $2"
73 shift
74 shift
75 continue;;
76
77 -g) chgrpcmd="$chgrpprog $2"
78 shift
79 shift
80 continue;;
81
82 -s) stripcmd="$stripprog"
83 shift
84 continue;;
85
86 -t=*) transformarg=`echo $1 | sed 's/-t=//'`
87 shift
88 continue;;
89
90 -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
91 shift
92 continue;;
93
94 *) if [ x"$src" = x ]
95 then
96 src=$1
97 else
98 # this colon is to work around a 386BSD /bin/sh bug
99 :
100 dst=$1
101 fi
102 shift
103 continue;;
104 esac
105done
106
107if [ x"$src" = x ]
108then
109 echo "install: no input file specified"
110 exit 1
111else 54else
112 true 55 doit_exec=$doit
113fi 56fi
114 57
115if [ x"$dir_arg" != x ]; then 58# Put in absolute file names if you don't have them in your path;
116 dst=$src 59# or use environment vars.
117 src="" 60
61chgrpprog=${CHGRPPROG-chgrp}
62chmodprog=${CHMODPROG-chmod}
63chownprog=${CHOWNPROG-chown}
64cmpprog=${CMPPROG-cmp}
65cpprog=${CPPROG-cp}
66mkdirprog=${MKDIRPROG-mkdir}
67mvprog=${MVPROG-mv}
68rmprog=${RMPROG-rm}
69stripprog=${STRIPPROG-strip}
70
71posix_glob='?'
72initialize_posix_glob='
73 test "$posix_glob" != "?" || {
74 if (set -f) 2>/dev/null; then
75 posix_glob=
76 else
77 posix_glob=:
78 fi
79 }
80'
118 81
119 if [ -d $dst ]; then 82posix_mkdir=
120 instcmd=:
121 else
122 instcmd=mkdir
123 fi
124else
125 83
126# Waiting for this to be detected by the "$instcmd $src $dsttmp" command 84# Desired mode of installed file.
127# might cause directories to be created, which would be especially bad 85mode=0755
128# if $src (and thus $dsttmp) contains '*'.
129 86
130 if [ -f $src -o -d $src ] 87chgrpcmd=
131 then 88chmodcmd=$chmodprog
132 true 89chowncmd=
133 else 90mvcmd=$mvprog
134 echo "install: $src does not exist" 91rmcmd="$rmprog -f"
135 exit 1 92stripcmd=
136 fi
137 93
138 if [ x"$dst" = x ] 94src=
139 then 95dst=
140 echo "install: no destination specified" 96dir_arg=
141 exit 1 97dst_arg=
142 else
143 true
144 fi
145 98
146# If destination is a directory, append the input filename; if your system 99copy_on_change=false
147# does not like double slashes in filenames, you may need to add some logic 100no_target_directory=
148 101
149 if [ -d $dst ] 102usage="\
150 then 103Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
151 dst="$dst"/`basename $src` 104 or: $0 [OPTION]... SRCFILES... DIRECTORY
152 else 105 or: $0 [OPTION]... -t DIRECTORY SRCFILES...
153 true 106 or: $0 [OPTION]... -d DIRECTORIES...
154 fi
155fi
156 107
157## this sed command emulates the dirname command 108In the 1st form, copy SRCFILE to DSTFILE.
158dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 109In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
110In the 4th, create DIRECTORIES.
159 111
160# Make sure that the destination directory exists. 112Options:
161# this part is taken from Noah Friedman's mkinstalldirs script 113 --help display this help and exit.
114 --version display version info and exit.
162 115
163# Skip lots of stat calls in the usual case. 116 -c (ignored)
164if [ ! -d "$dstdir" ]; then 117 -C install only if different (preserve the last data modification time)
165defaultIFS=' 118 -d create directories instead of installing files.
166' 119 -g GROUP $chgrpprog installed files to GROUP.
167IFS="${IFS-${defaultIFS}}" 120 -m MODE $chmodprog installed files to MODE.
121 -o USER $chownprog installed files to USER.
122 -s $stripprog installed files.
123 -t DIRECTORY install into DIRECTORY.
124 -T report an error if DSTFILE is a directory.
168 125
169oIFS="${IFS}" 126Environment variables override the default commands:
170# Some sh's can't handle IFS=/ for some reason. 127 CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
171IFS='%' 128 RMPROG STRIPPROG
172set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 129"
173IFS="${oIFS}"
174 130
175pathcomp='' 131while test $# -ne 0; do
132 case $1 in
133 -c) ;;
176 134
177while [ $# -ne 0 ] ; do 135 -C) copy_on_change=true;;
178 pathcomp="${pathcomp}${1}"
179 shift
180 136
181 if [ ! -d "${pathcomp}" ] ; 137 -d) dir_arg=true;;
182 then
183 $mkdirprog "${pathcomp}"
184 else
185 true
186 fi
187
188 pathcomp="${pathcomp}/"
189done
190fi
191 138
192if [ x"$dir_arg" != x ] 139 -g) chgrpcmd="$chgrpprog $2"
193then 140 shift;;
194 $doit $instcmd $dst &&
195 141
196 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && 142 --help) echo "$usage"; exit $?;;
197 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
198 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
199 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
200else
201 143
202# If we're going to rename the final executable, determine the name now. 144 -m) mode=$2
145 case $mode in
146 *' '* | *' '* | *'
147'* | *'*'* | *'?'* | *'['*)
148 echo "$0: invalid mode: $mode" >&2
149 exit 1;;
150 esac
151 shift;;
203 152
204 if [ x"$transformarg" = x ] 153 -o) chowncmd="$chownprog $2"
205 then 154 shift;;
206 dstfile=`basename $dst`
207 else
208 dstfile=`basename $dst $transformbasename |
209 sed $transformarg`$transformbasename
210 fi
211 155
212# don't allow the sed command to completely eliminate the filename 156 -s) stripcmd=$stripprog;;
213 157
214 if [ x"$dstfile" = x ] 158 -t) dst_arg=$2
215 then 159 shift;;
216 dstfile=`basename $dst`
217 else
218 true
219 fi
220 160
221# Make a temp file name in the proper directory. 161 -T) no_target_directory=true;;
222 162
223 dsttmp=$dstdir/#inst.$$# 163 --version) echo "$0 $scriptversion"; exit $?;;
224 164
225# Move or copy the file name to the temp name 165 --) shift
166 break;;
226 167
227 $doit $instcmd $src $dsttmp && 168 -*) echo "$0: invalid option: $1" >&2
169 exit 1;;
228 170
229 trap "rm -f ${dsttmp}" 0 && 171 *) break;;
172 esac
173 shift
174done
230 175
231# and set any options; do chmod last to preserve setuid bits 176if 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 done
190fi
232 191
233# If any of these fail, we abort the whole thing. If we want to 192if test $# -eq 0; then
234# ignore errors from any of these, just make sure not to ignore 193 if test -z "$dir_arg"; then
235# errors from the above "$doit $instcmd $src $dsttmp" command. 194 echo "$0: no input file specified." >&2
195 exit 1
196 fi
197 # It's OK to call `install-sh -d' without argument.
198 # This can happen when creating conditional directories.
199 exit 0
200fi
236 201
237 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && 202if test -z "$dir_arg"; then
238 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && 203 do_exit='(exit $ret); exit $ret'
239 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && 204 trap "ret=129; $do_exit" 1
240 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && 205 trap "ret=130; $do_exit" 2
206 trap "ret=141; $do_exit" 13
207 trap "ret=143; $do_exit" 15
208
209 # Set umask so as not to create temps with too-generous modes.
210 # However, 'strip' requires both read and write access to temps.
211 case $mode in
212 # Optimize common cases.
213 *644) cp_umask=133;;
214 *755) cp_umask=22;;
215
216 *[0-7])
217 if test -z "$stripcmd"; then
218 u_plus_rw=
219 else
220 u_plus_rw='% 200'
221 fi
222 cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
223 *)
224 if test -z "$stripcmd"; then
225 u_plus_rw=
226 else
227 u_plus_rw=,u+rw
228 fi
229 cp_umask=$mode$u_plus_rw;;
230 esac
231fi
241 232
242# Now rename the file to the real destination. 233for src
234do
235 # Protect names starting with `-'.
236 case $src in
237 -*) src=./$src;;
238 esac
239
240 if test -n "$dir_arg"; then
241 dst=$src
242 dstdir=$dst
243 test -d "$dstdir"
244 dstdir_status=$?
245 else
246
247 # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
248 # might cause directories to be created, which would be especially bad
249 # if $src (and thus $dsttmp) contains '*'.
250 if test ! -f "$src" && test ! -d "$src"; then
251 echo "$0: $src does not exist." >&2
252 exit 1
253 fi
254
255 if test -z "$dst_arg"; then
256 echo "$0: no destination specified." >&2
257 exit 1
258 fi
259
260 dst=$dst_arg
261 # Protect names starting with `-'.
262 case $dst in
263 -*) dst=./$dst;;
264 esac
243 265
244 $doit $rmcmd -f $dstdir/$dstfile && 266 # If destination is a directory, append the input filename; won't work
245 $doit $mvcmd $dsttmp $dstdir/$dstfile 267 # if double slashes aren't ignored.
268 if test -d "$dst"; then
269 if test -n "$no_target_directory"; then
270 echo "$0: $dst_arg: Is a directory" >&2
271 exit 1
272 fi
273 dstdir=$dst
274 dst=$dstdir/`basename "$src"`
275 dstdir_status=0
276 else
277 # Prefer dirname, but fall back on a substitute if dirname fails.
278 dstdir=`
279 (dirname "$dst") 2>/dev/null ||
280 expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
281 X"$dst" : 'X\(//\)[^/]' \| \
282 X"$dst" : 'X\(//\)$' \| \
283 X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
284 echo X"$dst" |
285 sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
286 s//\1/
287 q
288 }
289 /^X\(\/\/\)[^/].*/{
290 s//\1/
291 q
292 }
293 /^X\(\/\/\)$/{
294 s//\1/
295 q
296 }
297 /^X\(\/\).*/{
298 s//\1/
299 q
300 }
301 s/.*/./; q'
302 `
303
304 test -d "$dstdir"
305 dstdir_status=$?
306 fi
307 fi
308
309 obsolete_mkdir_used=false
310
311 if test $dstdir_status != 0; then
312 case $posix_mkdir in
313 '')
314 # Create intermediate dirs using mode 755 as modified by the umask.
315 # This is like FreeBSD 'install' as of 1997-10-28.
316 umask=`umask`
317 case $stripcmd.$umask in
318 # Optimize common cases.
319 *[2367][2367]) mkdir_umask=$umask;;
320 .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
321
322 *[0-7])
323 mkdir_umask=`expr $umask + 22 \
324 - $umask % 100 % 40 + $umask % 20 \
325 - $umask % 10 % 4 + $umask % 2
326 `;;
327 *) mkdir_umask=$umask,go-w;;
328 esac
329
330 # With -d, create the new directory with the user-specified mode.
331 # Otherwise, rely on $mkdir_umask.
332 if test -n "$dir_arg"; then
333 mkdir_mode=-m$mode
334 else
335 mkdir_mode=
336 fi
246 337
247fi && 338 posix_mkdir=false
339 case $umask in
340 *[123567][0-7][0-7])
341 # POSIX mkdir -p sets u+wx bits regardless of umask, which
342 # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
343 ;;
344 *)
345 tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
346 trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
347
348 if (umask $mkdir_umask &&
349 exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
350 then
351 if test -z "$dir_arg" || {
352 # Check for POSIX incompatibilities with -m.
353 # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
354 # other-writeable bit of parent directory when it shouldn't.
355 # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
356 ls_ld_tmpdir=`ls -ld "$tmpdir"`
357 case $ls_ld_tmpdir in
358 d????-?r-*) different_mode=700;;
359 d????-?--*) different_mode=755;;
360 *) false;;
361 esac &&
362 $mkdirprog -m$different_mode -p -- "$tmpdir" && {
363 ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
364 test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
365 }
366 }
367 then posix_mkdir=:
368 fi
369 rmdir "$tmpdir/d" "$tmpdir"
370 else
371 # Remove any dirs left behind by ancient mkdir implementations.
372 rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
373 fi
374 trap '' 0;;
375 esac;;
376 esac
248 377
378 if
379 $posix_mkdir && (
380 umask $mkdir_umask &&
381 $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
382 )
383 then :
384 else
385
386 # The umask is ridiculous, or mkdir does not conform to POSIX,
387 # or it failed possibly due to a race condition. Create the
388 # directory the slow way, step by step, checking for races as we go.
389
390 case $dstdir in
391 /*) prefix='/';;
392 -*) prefix='./';;
393 *) prefix='';;
394 esac
395
396 eval "$initialize_posix_glob"
397
398 oIFS=$IFS
399 IFS=/
400 $posix_glob set -f
401 set fnord $dstdir
402 shift
403 $posix_glob set +f
404 IFS=$oIFS
405
406 prefixes=
407
408 for d
409 do
410 test -z "$d" && continue
411
412 prefix=$prefix$d
413 if test -d "$prefix"; then
414 prefixes=
415 else
416 if $posix_mkdir; then
417 (umask=$mkdir_umask &&
418 $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
419 # Don't fail if two instances are running concurrently.
420 test -d "$prefix" || exit 1
421 else
422 case $prefix in
423 *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
424 *) qprefix=$prefix;;
425 esac
426 prefixes="$prefixes '$qprefix'"
427 fi
428 fi
429 prefix=$prefix/
430 done
431
432 if test -n "$prefixes"; then
433 # Don't fail if two instances are running concurrently.
434 (umask $mkdir_umask &&
435 eval "\$doit_exec \$mkdirprog $prefixes") ||
436 test -d "$dstdir" || exit 1
437 obsolete_mkdir_used=true
438 fi
439 fi
440 fi
441
442 if test -n "$dir_arg"; then
443 { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
444 { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
445 { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
446 test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
447 else
448
449 # Make a couple of temp file names in the proper directory.
450 dsttmp=$dstdir/_inst.$$_
451 rmtmp=$dstdir/_rm.$$_
452
453 # Trap to clean up those temp files at exit.
454 trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
455
456 # Copy the file name to the temp name.
457 (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
458
459 # and set any options; do chmod last to preserve setuid bits.
460 #
461 # If any of these fail, we abort the whole thing. If we want to
462 # ignore errors from any of these, just make sure not to ignore
463 # errors from the above "$doit $cpprog $src $dsttmp" command.
464 #
465 { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
466 { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
467 { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
468 { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
469
470 # If -C, don't bother to copy if it wouldn't change the file.
471 if $copy_on_change &&
472 old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
473 new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
474
475 eval "$initialize_posix_glob" &&
476 $posix_glob set -f &&
477 set X $old && old=:$2:$4:$5:$6 &&
478 set X $new && new=:$2:$4:$5:$6 &&
479 $posix_glob set +f &&
480
481 test "$old" = "$new" &&
482 $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
483 then
484 rm -f "$dsttmp"
485 else
486 # Rename the file to the real destination.
487 $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
488
489 # The rename failed, perhaps because mv can't rename something else
490 # to itself, or perhaps because mv is so ancient that it does not
491 # support -f.
492 {
493 # Now remove or move aside any old file at destination location.
494 # We try this two ways since rm can't unlink itself on some
495 # systems and the destination file might be busy for other
496 # reasons. In this case, the final cleanup might fail but the new
497 # file should still install successfully.
498 {
499 test ! -f "$dst" ||
500 $doit $rmcmd -f "$dst" 2>/dev/null ||
501 { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
502 { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
503 } ||
504 { echo "$0: cannot unlink or rename $dst" >&2
505 (exit 1); exit 1
506 }
507 } &&
508
509 # Now rename the file to the real destination.
510 $doit $mvcmd "$dsttmp" "$dst"
511 }
512 fi || exit 1
513
514 trap '' 0
515 fi
516done
249 517
250exit 0 518# Local variables:
519# eval: (add-hook 'write-file-hooks 'time-stamp)
520# time-stamp-start: "scriptversion="
521# time-stamp-format: "%:y-%02m-%02d.%02H"
522# time-stamp-time-zone: "UTC"
523# time-stamp-end: "; # UTC"
524# End:
diff --git a/mkinstalldirs b/mkinstalldirs
index be98de6be01..4191a45dbd7 100755
--- a/mkinstalldirs
+++ b/mkinstalldirs
@@ -1,7 +1,7 @@
1#! /bin/sh 1#! /bin/sh
2# mkinstalldirs --- make directory hierarchy 2# mkinstalldirs --- make directory hierarchy
3 3
4scriptversion=2006-05-11.19 4scriptversion=2009-04-28.21; # UTC
5 5
6# Original author: Noah Friedman <friedman@prep.ai.mit.edu> 6# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
7# Created: 1993-05-16 7# Created: 1993-05-16
@@ -150,3 +150,13 @@ do
150done 150done
151 151
152exit $errstatus 152exit $errstatus
153
154# Local Variables:
155# mode: shell-script
156# sh-indentation: 2
157# eval: (add-hook 'write-file-hooks 'time-stamp)
158# time-stamp-start: "scriptversion="
159# time-stamp-format: "%:y-%02m-%02d.%02H"
160# time-stamp-time-zone: "UTC"
161# time-stamp-end: "; # UTC"
162# End:
diff --git a/move-if-change b/move-if-change
index ee9e355e3e6..a891ca51f0c 100755
--- a/move-if-change
+++ b/move-if-change
@@ -1,15 +1,77 @@
1#!/bin/sh 1#!/bin/sh
2if 2# Like mv $1 $2, but if the files are the same, just delete $1.
3test -r $2 3# Status is zero if successful, nonzero otherwise.
4then 4
5if 5VERSION='2007-09-28 23:10'; # UTC
6cmp $1 $2 > /dev/null 6# The definition above must lie within the first 8 lines in order
7then 7# for the Emacs time-stamp write hook (at end) to update it.
8echo $2 is unchanged 8# If you change this file with Emacs, please let the write hook
9rm -f $1 9# do its job. Otherwise, update this string manually.
10
11# Copyright (C) 2002-2007, 2009-2011 Free Software Foundation, Inc.
12
13# This program is free software: you can redistribute it and/or modify
14# it under the terms of the GNU General Public License as published by
15# the Free Software Foundation, either version 3 of the License, or
16# (at your option) any later version.
17
18# This program is distributed in the hope that it will be useful,
19# but WITHOUT ANY WARRANTY; without even the implied warranty of
20# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21# GNU General Public License for more details.
22
23# You should have received a copy of the GNU General Public License
24# along with this program. If not, see <http://www.gnu.org/licenses/>.
25
26usage="usage: $0 SOURCE DEST"
27
28help="$usage
29 or: $0 OPTION
30If SOURCE is different than DEST, then move it to DEST; else remove SOURCE.
31
32 --help display this help and exit
33 --version output version information and exit
34
35Report bugs to <bug-gnulib@gnu.org>."
36
37version=`expr "$VERSION" : '\([^ ]*\)'`
38version="move-if-change (gnulib) $version
39Copyright (C) 2007 Free Software Foundation, Inc.
40License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
41This is free software: you are free to change and redistribute it.
42There is NO WARRANTY, to the extent permitted by law."
43
44
45for arg
46do
47 case $arg in
48 --help | --hel | --he | --h)
49 exec echo "$help" ;;
50 --version | --versio | --versi | --vers | --ver | --ve | --v)
51 exec echo "$version" ;;
52 --)
53 shift
54 break ;;
55 -*)
56 echo "$0: invalid option: $arg" >&2
57 exit 1 ;;
58 *)
59 break ;;
60 esac
61done
62
63test $# = 2 || { echo "$0: $usage" >&2; exit 1; }
64
65if test -r "$2" && cmp -s -- "$1" "$2"; then
66 rm -f -- "$1"
10else 67else
11mv -f $1 $2 68 mv -f -- "$1" "$2"
12fi
13else
14mv -f $1 $2
15fi 69fi
70
71## Local Variables:
72## eval: (add-hook 'write-file-hooks 'time-stamp)
73## time-stamp-start: "VERSION='"
74## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
75## time-stamp-time-zone: "UTC"
76## time-stamp-end: "'; # UTC"
77## End: