comparison kdiff3/admin/install-sh @ 66:efe33e938730

0.9.86
author joachim99
date Thu, 16 Sep 2004 02:40:08 +0000
parents 415083d043f3
children 8febbfb1148c
comparison
equal deleted inserted replaced
65:8ea11c8efeb5 66:efe33e938730
54 dst="" 54 dst=""
55 dir_arg="" 55 dir_arg=""
56 56
57 while [ x"$1" != x ]; do 57 while [ x"$1" != x ]; do
58 case $1 in 58 case $1 in
59 -c) instcmd="$cpprog" 59 -c) instcmd=$cpprog
60 shift 60 shift
61 continue;; 61 continue;;
62 62
63 -d) dir_arg=true 63 -d) dir_arg=true
64 shift 64 shift
77 -g) chgrpcmd="$chgrpprog $2" 77 -g) chgrpcmd="$chgrpprog $2"
78 shift 78 shift
79 shift 79 shift
80 continue;; 80 continue;;
81 81
82 -s) stripcmd="$stripprog" 82 -s) stripcmd=$stripprog
83 shift 83 shift
84 continue;; 84 continue;;
85 85
86 -t=*) transformarg=`echo $1 | sed 's/-t=//'` 86 -t=*) transformarg=`echo $1 | sed 's/-t=//'`
87 shift 87 shift
104 esac 104 esac
105 done 105 done
106 106
107 if [ x"$src" = x ] 107 if [ x"$src" = x ]
108 then 108 then
109 echo "install: no input file specified" 109 echo "$0: no input file specified" >&2
110 exit 1 110 exit 1
111 else 111 else
112 : 112 :
113 fi 113 fi
114 114
115 if [ x"$dir_arg" != x ]; then 115 if [ x"$dir_arg" != x ]; then
116 dst=$src 116 dst=$src
117 src="" 117 src=""
118 118
119 if [ -d $dst ]; then 119 if [ -d "$dst" ]; then
120 instcmd=: 120 instcmd=:
121 chmodcmd="" 121 chmodcmd=""
122 else 122 else
123 instcmd=$mkdirprog 123 instcmd=$mkdirprog
124 fi 124 fi
125 else 125 else
126 126
127 # Waiting for this to be detected by the "$instcmd $src $dsttmp" command 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 128 # might cause directories to be created, which would be especially bad
129 # if $src (and thus $dsttmp) contains '*'. 129 # if $src (and thus $dsttmp) contains '*'.
130 130
131 if [ -f "$src" ] || [ -d "$src" ] 131 if [ -f "$src" ] || [ -d "$src" ]
132 then 132 then
133 : 133 :
134 else 134 else
135 echo "install: $src does not exist" 135 echo "$0: $src does not exist" >&2
136 exit 1 136 exit 1
137 fi 137 fi
138 138
139 if [ x"$dst" = x ] 139 if [ x"$dst" = x ]
140 then 140 then
141 echo "install: no destination specified" 141 echo "$0: no destination specified" >&2
142 exit 1 142 exit 1
143 else 143 else
144 : 144 :
145 fi 145 fi
146 146
147 # If destination is a directory, append the input filename; if your system 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 148 # does not like double slashes in filenames, you may need to add some logic
149 149
150 if [ -d $dst ] 150 if [ -d "$dst" ]
151 then 151 then
152 dst="$dst"/`basename $src` 152 dst=$dst/`basename "$src"`
153 else 153 else
154 : 154 :
155 fi 155 fi
156 fi 156 fi
157 157
158 ## this sed command emulates the dirname command 158 ## this sed command emulates the dirname command
159 dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 159 dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
160 160
161 # Make sure that the destination directory exists. 161 # Make sure that the destination directory exists.
162 # this part is taken from Noah Friedman's mkinstalldirs script 162 # this part is taken from Noah Friedman's mkinstalldirs script
163 163
164 # Skip lots of stat calls in the usual case. 164 # Skip lots of stat calls in the usual case.
165 if [ ! -d "$dstdir" ]; then 165 if [ ! -d "$dstdir" ]; then
166 defaultIFS=' 166 defaultIFS='
167 ' 167 '
168 IFS="${IFS-${defaultIFS}}" 168 IFS="${IFS-$defaultIFS}"
169 169
170 oIFS="${IFS}" 170 oIFS=$IFS
171 # Some sh's can't handle IFS=/ for some reason. 171 # Some sh's can't handle IFS=/ for some reason.
172 IFS='%' 172 IFS='%'
173 set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 173 set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
174 IFS="${oIFS}" 174 IFS=$oIFS
175 175
176 pathcomp='' 176 pathcomp=''
177 177
178 while [ $# -ne 0 ] ; do 178 while [ $# -ne 0 ] ; do
179 pathcomp="${pathcomp}${1}" 179 pathcomp=$pathcomp$1
180 shift 180 shift
181 181
182 if [ ! -d "${pathcomp}" ] ; 182 if [ ! -d "$pathcomp" ] ;
183 then 183 then
184 $mkdirprog "${pathcomp}" 184 $mkdirprog "$pathcomp"
185 else 185 else
186 : 186 :
187 fi 187 fi
188 188
189 pathcomp="${pathcomp}/" 189 pathcomp=$pathcomp/
190 done 190 done
191 fi 191 fi
192 192
193 if [ x"$dir_arg" != x ] 193 if [ x"$dir_arg" != x ]
194 then 194 then
195 $doit $instcmd $dst && 195 $doit $instcmd "$dst" &&
196 196
197 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && 197 if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
198 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && 198 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
199 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && 199 if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
200 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi 200 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
201 else 201 else
202 202
203 # If we're going to rename the final executable, determine the name now. 203 # If we're going to rename the final executable, determine the name now.
204 204
205 if [ x"$transformarg" = x ] 205 if [ x"$transformarg" = x ]
206 then 206 then
207 dstfile=`basename $dst` 207 dstfile=`basename "$dst"`
208 else 208 else
209 dstfile=`basename $dst $transformbasename | 209 dstfile=`basename "$dst" $transformbasename |
210 sed $transformarg`$transformbasename 210 sed $transformarg`$transformbasename
211 fi 211 fi
212 212
213 # don't allow the sed command to completely eliminate the filename 213 # don't allow the sed command to completely eliminate the filename
214 214
215 if [ x"$dstfile" = x ] 215 if [ x"$dstfile" = x ]
216 then 216 then
217 dstfile=`basename $dst` 217 dstfile=`basename "$dst"`
218 else 218 else
219 : 219 :
220 fi 220 fi
221 221
222 # Make a temp file name in the proper directory. 222 # Make a couple of temp file names in the proper directory.
223 223
224 dsttmp=$dstdir/#inst.$$# 224 dsttmp=$dstdir/#inst.$$#
225 rmtmp=$dstdir/#rm.$$#
226
227 # Trap to clean up temp files at exit.
228
229 trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
230 trap '(exit $?); exit' 1 2 13 15
225 231
226 # Move or copy the file name to the temp name 232 # Move or copy the file name to the temp name
227 233
228 $doit $instcmd $src $dsttmp && 234 $doit $instcmd "$src" "$dsttmp" &&
229
230 trap "rm -f ${dsttmp}" 0 &&
231 235
232 # and set any options; do chmod last to preserve setuid bits 236 # and set any options; do chmod last to preserve setuid bits
233 237
234 # If any of these fail, we abort the whole thing. If we want to 238 # 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 239 # ignore errors from any of these, just make sure not to ignore
236 # errors from the above "$doit $instcmd $src $dsttmp" command. 240 # errors from the above "$doit $instcmd $src $dsttmp" command.
237 241
238 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && 242 if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
239 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && 243 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
240 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && 244 if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
241 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && 245 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
246
247 # Now remove or move aside any old file at destination location. We try this
248 # two ways since rm can't unlink itself on some systems and the destination
249 # file might be busy for other reasons. In this case, the final cleanup
250 # might fail but the new file should still install successfully.
251
252 {
253 if [ -f "$dstdir/$dstfile" ]
254 then
255 $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
256 $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
257 {
258 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
259 (exit 1); exit
260 }
261 else
262 :
263 fi
264 } &&
242 265
243 # Now rename the file to the real destination. 266 # Now rename the file to the real destination.
244 267
245 $doit $rmcmd -f $dstdir/$dstfile && 268 $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
246 $doit $mvcmd $dsttmp $dstdir/$dstfile
247 269
248 fi && 270 fi &&
249 271
250 272 # The final little trick to "correctly" pass the exit status to the exit trap.
251 exit 0 273
274 {
275 (exit 0); exit
276 }