forked from gambit/gambit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mkidirs
executable file
·183 lines (163 loc) · 4.35 KB
/
mkidirs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
scriptversion=2005-11-03.10
# Original author: Noah Friedman <[email protected]>
# Created: 1993-05-16
# Public domain.
#
# This file is maintained in Automake, please report
# bugs to <[email protected]> or send patches to
# <[email protected]>.
errstatus=0
dirmode=""
usage="\
Usage:
mkinstalldirs [-h] [--help] [--version]
mkinstalldirs [--require REQDIR] [-m MODE] DIR ...
Create each directory DIR (with mode MODE, if specified), including all
leading file name components. If REQDIR is specified, then DIR arguments
will not be processed, unless REQDIR already exists.
Report bugs to <[email protected]>."
# process command line arguments
arglist="void" optarg=""
for argval
do
newarg=""
if test "x$optarg" = xdisabled
then
test -d "$argval" || arglist="$arglist \"$argval\""
elif test -n "$optarg"
then
newarg="$optarg"
eval $optarg=\"$argval\"
optarg=""
else
case $argval in
-h | --help | --h*) # -h for help
echo "$usage"
exit $?
;;
-m) # -m PERM arg
optarg=dirmode
;;
--version)
echo "$0 $scriptversion"
exit $?
;;
--require=*) # --require=REQDIR arg
reqdir=`echo $argval | sed -n s'/[^=]*=//'p`
newarg=reqdir
;;
--require) # --require REQDIR arg
optarg=reqdir
;;
--) # stop option processing
optarg=disabled
;;
-*) # unknown option
echo >&2 "$0: illegal option -- $argval"
echo >&2 "$usage"
exit 1
;;
*) # non-option arg
test -d "$argval" || arglist="$arglist \"$argval\""
;;
esac
fi
case $newarg in
reqdir)
test -d "${reqdir}" ||
{
echo >&2 "$0: $reqdir: directory must exist"
exit 1
} ;;
esac
done
if test -n "$optarg" && test "x$optarg" != xdisabled
then
test x$optarg = xdirmode && optarg="-m"
echo >&2 "$0: $optarg: argument expected"
exit 1
fi
eval set $arglist; shift
test $# -gt 0 || exit 0
# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
# mkdir -p a/c at the same time, both will detect that a is missing,
# one will create a, then the other will try to create a and die with
# a "File exists" error. This is a problem when calling mkinstalldirs
# from a parallel make. We use --version in the probe to restrict
# ourselves to GNU mkdir, which is thread-safe.
case $dirmode in
'')
if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
echo "mkdir -p -- $*"
exec mkdir -p -- "$@"
else
# On NextStep and OpenStep, the `mkdir' command does not
# recognize any option. It will interpret all options as
# directories to create, and then abort because `.' already
# exists.
test -d ./-p && rmdir ./-p
test -d ./--version && rmdir ./--version
fi
;;
*)
if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
test ! -d ./--version; then
echo "mkdir -m $dirmode -p -- $*"
exec mkdir -m "$dirmode" -p -- "$@"
else
# Clean up after NextStep and OpenStep mkdir.
for d in ./-m ./-p ./--version "./$dirmode";
do
test -d "$d" && rmdir "$d"
done
fi
;;
esac
for file
do
case $file in
/*) pathcomp=/ ;;
*) pathcomp= ;;
esac
oIFS=$IFS
IFS=/
set fnord $file
shift
IFS=$oIFS
for d
do
test "x$d" = x && continue
pathcomp=$pathcomp$d
case $pathcomp in
-*) pathcomp=./$pathcomp ;;
esac
if test ! -d "$pathcomp"; then
echo "mkdir $pathcomp"
mkdir "$pathcomp" || lasterr=$?
if test ! -d "$pathcomp"; then
errstatus=$lasterr
else
if test ! -z "$dirmode"; then
echo "chmod $dirmode $pathcomp"
lasterr=
chmod "$dirmode" "$pathcomp" || lasterr=$?
if test ! -z "$lasterr"; then
errstatus=$lasterr
fi
fi
fi
fi
pathcomp=$pathcomp/
done
done
exit $errstatus
# Local Variables:
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End: