/[gentoo-x86]/eclass/eutils.eclass
Gentoo

Diff of /eclass/eutils.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.315 Revision 1.329
1# Copyright 1999-2007 Gentoo Foundation 1# Copyright 1999-2009 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.315 2009/02/21 23:28:21 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.329 2010/01/28 22:00:12 betelgeuse Exp $
4 4
5# @ECLASS: eutils.eclass 5# @ECLASS: eutils.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# base-system@gentoo.org 7# base-system@gentoo.org
8# @BLURB: many extra (but common) functions that are used in ebuilds 8# @BLURB: many extra (but common) functions that are used in ebuilds
17 17
18inherit multilib portability 18inherit multilib portability
19 19
20DESCRIPTION="Based on the ${ECLASS} eclass" 20DESCRIPTION="Based on the ${ECLASS} eclass"
21 21
22if has "${EAPI:-0}" 0 1 2; then
23
22# @FUNCTION: epause 24# @FUNCTION: epause
23# @USAGE: [seconds] 25# @USAGE: [seconds]
24# @DESCRIPTION: 26# @DESCRIPTION:
25# Sleep for the specified number of seconds (default of 5 seconds). Useful when 27# Sleep for the specified number of seconds (default of 5 seconds). Useful when
26# printing a message the user should probably be reading and often used in 28# printing a message the user should probably be reading and often used in
27# conjunction with the ebeep function. If the EPAUSE_IGNORE env var is set, 29# conjunction with the ebeep function. If the EPAUSE_IGNORE env var is set,
28# don't wait at all. 30# don't wait at all. Defined in EAPIs 0 1 and 2.
29epause() { 31epause() {
30 [[ -z ${EPAUSE_IGNORE} ]] && sleep ${1:-5} 32 [[ -z ${EPAUSE_IGNORE} ]] && sleep ${1:-5}
31} 33}
32 34
33# @FUNCTION: ebeep 35# @FUNCTION: ebeep
34# @USAGE: [number of beeps] 36# @USAGE: [number of beeps]
35# @DESCRIPTION: 37# @DESCRIPTION:
36# Issue the specified number of beeps (default of 5 beeps). Useful when 38# Issue the specified number of beeps (default of 5 beeps). Useful when
37# printing a message the user should probably be reading and often used in 39# printing a message the user should probably be reading and often used in
38# conjunction with the epause function. If the EBEEP_IGNORE env var is set, 40# conjunction with the epause function. If the EBEEP_IGNORE env var is set,
39# don't beep at all. 41# don't beep at all. Defined in EAPIs 0 1 and 2.
40ebeep() { 42ebeep() {
41 local n 43 local n
42 if [[ -z ${EBEEP_IGNORE} ]] ; then 44 if [[ -z ${EBEEP_IGNORE} ]] ; then
43 for ((n=1 ; n <= ${1:-5} ; n++)) ; do 45 for ((n=1 ; n <= ${1:-5} ; n++)) ; do
44 echo -ne "\a" 46 echo -ne "\a"
47 sleep 1 49 sleep 1
48 done 50 done
49 fi 51 fi
50} 52}
51 53
54fi
55
52# @FUNCTION: ecvs_clean 56# @FUNCTION: ecvs_clean
53# @USAGE: [list of dirs] 57# @USAGE: [list of dirs]
54# @DESCRIPTION: 58# @DESCRIPTION:
55# Remove CVS directories recursiveley. Useful when a source tarball contains 59# Remove CVS directories recursiveley. Useful when a source tarball contains
56# internal CVS directories. Defaults to $PWD. 60# internal CVS directories. Defaults to $PWD.
68esvn_clean() { 72esvn_clean() {
69 [[ -z $* ]] && set -- . 73 [[ -z $* ]] && set -- .
70 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf 74 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
71} 75}
72 76
73# Default directory where patches are located 77# @FUNCTION: eshopts_push
78# @USAGE: [options to `set`]
79# @DESCRIPTION:
80# Often times code will want to enable a shell option to change code behavior.
81# Since changing shell options can easily break other pieces of code (which
82# assume the default state), eshopts_push is used to (1) push the current shell
83# options onto a stack and (2) pass the specified arguments to set.
84#
85# A common example is to disable shell globbing so that special meaning/care
86# may be used with variables/arguments to custom functions. That would be:
87# @CODE
88# eshopts_push -o noglob
89# for x in ${foo} ; do
90# if ...some check... ; then
91# eshopts_pop
92# return 0
93# fi
94# done
95# eshopts_pop
96# @CODE
97eshopts_push() {
98 # have to assume __ESHOPTS_SAVE__ isn't screwed with
99 # as a `declare -a` here will reset its value
100 local i=${#__ESHOPTS_SAVE__[@]}
101 __ESHOPTS_SAVE__[$i]=$-
102 [[ $# -eq 0 ]] && return 0
103 set "$@" || die "eshopts_push: bad options to set: $*"
104}
105
106# @FUNCTION: eshopts_pop
107# @USAGE:
108# @DESCRIPTION:
109# Restore the shell options to the state saved with the corresponding
110# eshopts_push call. See that function for more details.
111eshopts_pop() {
112 [[ $# -ne 0 ]] && die "eshopts_pop takes no arguments"
113 local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 ))
114 [[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair"
115 local s=${__ESHOPTS_SAVE__[$i]}
116 unset __ESHOPTS_SAVE__[$i]
117 set +$- || die "eshopts_pop: sanity: invalid shell settings: $-"
118 set -${s} || die "eshopts_pop: sanity: unable to restore saved shell settings: ${s}"
119}
120
121# @VARIABLE: EPATCH_SOURCE
122# @DESCRIPTION:
123# Default directory to search for patches.
74EPATCH_SOURCE="${WORKDIR}/patch" 124EPATCH_SOURCE="${WORKDIR}/patch"
75# Default extension for patches 125# @VARIABLE: EPATCH_SUFFIX
126# @DESCRIPTION:
127# Default extension for patches (do not prefix the period yourself).
76EPATCH_SUFFIX="patch.bz2" 128EPATCH_SUFFIX="patch.bz2"
129# @VARIABLE: EPATCH_OPTS
130# @DESCRIPTION:
77# Default options for patch 131# Default options for patch:
132# @CODE
78# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571 133# -g0 - keep RCS, ClearCase, Perforce and SCCS happy #24571
79# Set --no-backup-if-mismatch so we don't leave '.orig' files behind. 134# --no-backup-if-mismatch - do not leave .orig files behind
80# Set -E to automatically remove empty files. 135# -E - automatically remove empty files
136# @CODE
81EPATCH_OPTS="-g0 -E --no-backup-if-mismatch" 137EPATCH_OPTS="-g0 -E --no-backup-if-mismatch"
138# @VARIABLE: EPATCH_EXCLUDE
139# @DESCRIPTION:
82# List of patches not to apply. Note this is only file names, 140# List of patches not to apply. Note this is only file names,
83# and not the full path .. 141# and not the full path. Globs accepted.
84EPATCH_EXCLUDE="" 142EPATCH_EXCLUDE=""
143# @VARIABLE: EPATCH_SINGLE_MSG
144# @DESCRIPTION:
85# Change the printed message for a single patch. 145# Change the printed message for a single patch.
86EPATCH_SINGLE_MSG="" 146EPATCH_SINGLE_MSG=""
147# @VARIABLE: EPATCH_MULTI_MSG
148# @DESCRIPTION:
87# Change the printed message for multiple patches. 149# Change the printed message for multiple patches.
88EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..." 150EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
89# Force applying bulk patches even if not following the style: 151# @VARIABLE: EPATCH_FORCE
90# 152# @DESCRIPTION:
91# ??_${ARCH}_foo.${EPATCH_SUFFIX} 153# Only require patches to match EPATCH_SUFFIX rather than the extended
92# 154# arch naming style.
93EPATCH_FORCE="no" 155EPATCH_FORCE="no"
94 156
95# This function is for bulk patching, or in theory for just one 157# @FUNCTION: epatch
96# or two patches. 158# @USAGE: [patches] [dirs of patches]
159# @DESCRIPTION:
160# epatch is designed to greatly simplify the application of patches. It can
161# process patch files directly, or directories of patches. The patches may be
162# compressed (bzip/gzip/etc...) or plain text. You generally need not specify
163# the -p option as epatch will automatically attempt -p0 to -p5 until things
164# apply successfully.
97# 165#
98# It should work with .bz2, .gz, .zip and plain text patches. 166# If you do not specify any options, then epatch will default to the directory
99# Currently all patches should be the same format. 167# specified by EPATCH_SOURCE.
100# 168#
101# You do not have to specify '-p' option to patch, as it will 169# When processing directories, epatch will apply all patches that match:
102# try with -p0 to -p5 until it succeed, or fail at -p5. 170# @CODE
103# 171# ${EPATCH_FORCE} == "yes"
104# Above EPATCH_* variables can be used to control various defaults,
105# bug they should be left as is to ensure an ebuild can rely on
106# them for.
107#
108# Patches are applied in current directory.
109#
110# Bulk Patches should preferably have the form of:
111#
112# ??_${ARCH}_foo.${EPATCH_SUFFIX} 172# ??_${ARCH}_foo.${EPATCH_SUFFIX}
173# else
174# *.${EPATCH_SUFFIX}
175# @CODE
176# The leading ?? are typically numbers used to force consistent patch ordering.
177# The arch field is used to apply patches only for the host architecture with
178# the special value of "all" means apply for everyone. Note that using values
179# other than "all" is highly discouraged -- you should apply patches all the
180# time and let architecture details be detected at configure/compile time.
113# 181#
114# For example: 182# If EPATCH_SUFFIX is empty, then no period before it is implied when searching
183# for patches to apply.
115# 184#
116# 01_all_misc-fix.patch.bz2 185# Refer to the other EPATCH_xxx variables for more customization of behavior.
117# 02_sparc_another-fix.patch.bz2
118#
119# This ensures that there are a set order, and you can have ARCH
120# specific patches.
121#
122# If you however give an argument to epatch(), it will treat it as a
123# single patch that need to be applied if its a file. If on the other
124# hand its a directory, it will set EPATCH_SOURCE to this.
125#
126# <azarah@gentoo.org> (10 Nov 2002)
127#
128epatch() { 186epatch() {
129 _epatch_draw_line() { 187 _epatch_draw_line() {
188 # create a line of same length as input string
130 [[ -z $1 ]] && set "$(printf "%65s" '')" 189 [[ -z $1 ]] && set "$(printf "%65s" '')"
131 echo "${1//?/=}" 190 echo "${1//?/=}"
132 } 191 }
133 _epatch_assert() { local _pipestatus=${PIPESTATUS[*]}; [[ ${_pipestatus// /} -eq 0 ]] ; }
134 local PIPE_CMD=""
135 local STDERR_TARGET="${T}/$$.out"
136 local PATCH_TARGET="${T}/$$.patch"
137 local PATCH_SUFFIX=""
138 local SINGLE_PATCH="no"
139 local x=""
140 192
141 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402 193 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
142 194
143 if [ "$#" -gt 1 ] 195 # Let the rest of the code process one user arg at a time --
144 then 196 # each arg may expand into multiple patches, and each arg may
197 # need to start off with the default global EPATCH_xxx values
198 if [[ $# -gt 1 ]] ; then
145 local m="" 199 local m
146 for m in "$@" ; do 200 for m in "$@" ; do
147 epatch "${m}" 201 epatch "${m}"
148 done 202 done
149 return 0 203 return 0
150 fi 204 fi
151 205
152 if [ -n "$1" -a -f "$1" ] 206 local SINGLE_PATCH="no"
153 then 207 # no args means process ${EPATCH_SOURCE}
208 [[ $# -eq 0 ]] && set -- "${EPATCH_SOURCE}"
209
210 if [[ -f $1 ]] ; then
154 SINGLE_PATCH="yes" 211 SINGLE_PATCH="yes"
155 212 set -- "$1"
156 local EPATCH_SOURCE="$1" 213 # Use the suffix from the single patch (localize it); the code
214 # below will find the suffix for us
157 local EPATCH_SUFFIX="${1##*\.}" 215 local EPATCH_SUFFIX=$1
158 216
159 elif [ -n "$1" -a -d "$1" ] 217 elif [[ -d $1 ]] ; then
160 then 218 # Some people like to make dirs of patches w/out suffixes (vim)
161 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ... 219 set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"}
162 if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ] 220
221 else
222 # sanity check ... if it isn't a dir or file, wtf man ?
223 [[ $# -ne 0 ]] && EPATCH_SOURCE=$1
224 echo
225 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
226 eerror
227 eerror " ${EPATCH_SOURCE}"
228 eerror " ( ${EPATCH_SOURCE##*/} )"
229 echo
230 die "Cannot find \$EPATCH_SOURCE!"
231 fi
232
233 local PIPE_CMD
234 case ${EPATCH_SUFFIX##*\.} in
235 xz) PIPE_CMD="xz -dc" ;;
236 lzma) PIPE_CMD="lzma -dc" ;;
237 bz2) PIPE_CMD="bzip2 -dc" ;;
238 gz|Z|z) PIPE_CMD="gzip -dc" ;;
239 ZIP|zip) PIPE_CMD="unzip -p" ;;
240 *) ;;
241 esac
242
243 [[ ${SINGLE_PATCH} == "no" ]] && einfo "${EPATCH_MULTI_MSG}"
244
245 local x
246 for x in "$@" ; do
247 # If the patch dir given contains subdirs, or our EPATCH_SUFFIX
248 # didn't match anything, ignore continue on
249 [[ ! -f ${x} ]] && continue
250
251 local patchname=${x##*/}
252
253 # Apply single patches, or forced sets of patches, or
254 # patches with ARCH dependant names.
255 # ???_arch_foo.patch
256 # Else, skip this input altogether
257 local a=${patchname#*_} # strip the ???_
258 a=${a%%_*} # strip the _foo.patch
259 if ! [[ ${SINGLE_PATCH} == "yes" || \
260 ${EPATCH_FORCE} == "yes" || \
261 ${a} == all || \
262 ${a} == ${ARCH} ]]
163 then 263 then
164 local EPATCH_SOURCE="$1/*" 264 continue
265 fi
266
267 # Let people filter things dynamically
268 if [[ -n ${EPATCH_EXCLUDE} ]] ; then
269 # let people use globs in the exclude
270 eshopts_push -o noglob
271
272 local ex
273 for ex in ${EPATCH_EXCLUDE} ; do
274 if [[ ${patchname} == ${ex} ]] ; then
275 eshopts_pop
276 continue 2
277 fi
278 done
279
280 eshopts_pop
281 fi
282
283 if [[ ${SINGLE_PATCH} == "yes" ]] ; then
284 if [[ -n ${EPATCH_SINGLE_MSG} ]] ; then
285 einfo "${EPATCH_SINGLE_MSG}"
286 else
287 einfo "Applying ${patchname} ..."
288 fi
165 else 289 else
166 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 290 einfo " ${patchname} ..."
167 fi 291 fi
168 else 292
169 if [[ ! -d ${EPATCH_SOURCE} ]] || [[ -n $1 ]] ; then 293 # most of the time, there will only be one run per unique name,
170 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ] 294 # but if there are more, make sure we get unique log filenames
171 then 295 local STDERR_TARGET="${T}/${patchname}.out"
172 EPATCH_SOURCE="$1" 296 if [[ -e ${STDERR_TARGET} ]] ; then
297 STDERR_TARGET="${T}/${patchname}-$$.out"
298 fi
299
300 printf "***** %s *****\n\n" "${patchname}" > "${STDERR_TARGET}"
301
302 # Decompress the patch if need be
303 local count=0
304 local PATCH_TARGET
305 if [[ -n ${PIPE_CMD} ]] ; then
306 PATCH_TARGET="${T}/$$.patch"
307 echo "PIPE_COMMAND: ${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> "${STDERR_TARGET}"
308
309 if ! (${PIPE_CMD} "${x}" > "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then
310 echo
311 eerror "Could not extract patch!"
312 #die "Could not extract patch!"
313 count=5
314 break
173 fi 315 fi
316 else
317 PATCH_TARGET=${x}
318 fi
174 319
320 # Check for absolute paths in patches. If sandbox is disabled,
321 # people could (accidently) patch files in the root filesystem.
322 # Or trigger other unpleasantries #237667. So disallow -p0 on
323 # such patches.
324 local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
325 if [[ -n ${abs_paths} ]] ; then
326 count=1
327 printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}"
328 fi
329
330 # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/
331 while [[ ${count} -lt 5 ]] ; do
332 # Generate some useful debug info ...
333 (
334 _epatch_draw_line "***** ${patchname} *****"
175 echo 335 echo
176 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:" 336 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'"
337 echo
338 _epatch_draw_line "***** ${patchname} *****"
339 ) >> "${STDERR_TARGET}"
340
341 if (patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then
342 (
343 _epatch_draw_line "***** ${patchname} *****"
344 echo
345 echo "ACTUALLY APPLYING ${patchname} ..."
346 echo
347 _epatch_draw_line "***** ${patchname} *****"
348 patch -p${count} ${EPATCH_OPTS} < "${PATCH_TARGET}" 2>&1
349 ) >> "${STDERR_TARGET}"
350
351 if [ $? -ne 0 ] ; then
352 echo
353 eerror "A dry-run of patch command succeeded, but actually"
354 eerror "applying the patch failed!"
355 #die "Real world sux compared to the dreamworld!"
356 count=5
357 fi
358 break
359 fi
360
361 : $(( count++ ))
362 done
363
364 # if we had to decompress the patch, delete the temp one
365 if [[ -n ${PIPE_CMD} ]] ; then
366 rm -f "${PATCH_TARGET}"
367 fi
368
369 if [[ ${count} -ge 5 ]] ; then
370 echo
371 eerror "Failed Patch: ${patchname} !"
372 eerror " ( ${PATCH_TARGET} )"
177 eerror 373 eerror
178 eerror " ${EPATCH_SOURCE}" 374 eerror "Include in your bugreport the contents of:"
179 eerror " ( ${EPATCH_SOURCE##*/} )" 375 eerror
376 eerror " ${STDERR_TARGET}"
180 echo 377 echo
181 die "Cannot find \$EPATCH_SOURCE!"
182 fi
183
184 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
185 fi
186
187 case ${EPATCH_SUFFIX##*\.} in
188 lzma)
189 PIPE_CMD="lzma -dc"
190 PATCH_SUFFIX="lzma"
191 ;;
192 bz2)
193 PIPE_CMD="bzip2 -dc"
194 PATCH_SUFFIX="bz2"
195 ;;
196 gz|Z|z)
197 PIPE_CMD="gzip -dc"
198 PATCH_SUFFIX="gz"
199 ;;
200 ZIP|zip)
201 PIPE_CMD="unzip -p"
202 PATCH_SUFFIX="zip"
203 ;;
204 *)
205 PIPE_CMD="cat"
206 PATCH_SUFFIX="patch"
207 ;;
208 esac
209
210 if [ "${SINGLE_PATCH}" = "no" ]
211 then
212 einfo "${EPATCH_MULTI_MSG}"
213 fi
214 for x in ${EPATCH_SOURCE}
215 do
216 # New ARCH dependant patch naming scheme ...
217 #
218 # ???_arch_foo.patch
219 #
220 if [ -f ${x} ] && \
221 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "${x/_${ARCH}_}" != "${x}" ] || \
222 [ "${EPATCH_FORCE}" = "yes" ])
223 then
224 local count=0
225 local popts="${EPATCH_OPTS}"
226 local patchname=${x##*/}
227
228 if [ -n "${EPATCH_EXCLUDE}" ]
229 then
230 if [ "${EPATCH_EXCLUDE/${patchname}}" != "${EPATCH_EXCLUDE}" ]
231 then
232 continue
233 fi
234 fi
235
236 if [ "${SINGLE_PATCH}" = "yes" ]
237 then
238 if [ -n "${EPATCH_SINGLE_MSG}" ]
239 then
240 einfo "${EPATCH_SINGLE_MSG}"
241 else
242 einfo "Applying ${patchname} ..."
243 fi
244 else
245 einfo " ${patchname} ..."
246 fi
247
248 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
249 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
250
251 # Decompress the patch if need be
252 if [[ ${PATCH_SUFFIX} != "patch" ]] ; then
253 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
254 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
255
256 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1 ; then
257 echo
258 eerror "Could not extract patch!"
259 #die "Could not extract patch!"
260 count=5
261 break
262 fi
263 else
264 PATCH_TARGET="${x}"
265 fi
266
267 # Check for absolute paths in patches. If sandbox is disabled,
268 # people could (accidently) patch files in the root filesystem.
269 # Or trigger other unpleasantries #237667. So disallow -p0 on
270 # such patches.
271 local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
272 if [[ -n ${abs_paths} ]] ; then
273 count=1
274 echo "NOTE: skipping -p0 due to absolute paths in patch:" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
275 echo "${abs_paths}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
276 fi
277
278 # Allow for prefix to differ ... im lazy, so shoot me :/
279 while [ "${count}" -lt 5 ]
280 do
281 # Generate some useful debug info ...
282 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
283 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
284
285 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
286 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
287
288 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
289 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
290
291 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
292 then
293 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
294 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
295 echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
296 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
297 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
298
299 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1
300 _epatch_assert
301
302 if [ "$?" -ne 0 ]
303 then
304 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
305 echo
306 eerror "A dry-run of patch command succeeded, but actually"
307 eerror "applying the patch failed!"
308 #die "Real world sux compared to the dreamworld!"
309 count=5
310 fi
311
312 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
313
314 break
315 fi
316
317 count=$((count + 1))
318 done
319
320 if [ "${PATCH_SUFFIX}" != "patch" ]
321 then
322 rm -f ${PATCH_TARGET}
323 fi
324
325 if [ "${count}" -eq 5 ]
326 then
327 echo
328 eerror "Failed Patch: ${patchname} !"
329 eerror " ( ${PATCH_TARGET} )"
330 eerror
331 eerror "Include in your bugreport the contents of:"
332 eerror
333 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}"
334 echo
335 die "Failed Patch: ${patchname}!" 378 die "Failed Patch: ${patchname}!"
336 fi 379 fi
337 380
338 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 381 # if everything worked, delete the patch log
339 382 rm -f "${STDERR_TARGET}"
340 eend 0 383 eend 0
341 fi
342 done 384 done
343 if [ "${SINGLE_PATCH}" = "no" ] 385
344 then 386 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
345 einfo "Done with patching" 387 : # everything worked
388}
389epatch_user() {
390 [[ $# -ne 0 ]] && die "epatch_user takes no options"
391
392 # don't clobber any EPATCH vars that the parent might want
393 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
394 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do
395 EPATCH_SOURCE=${base}/${CTARGET}/${check}
396 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check}
397 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check}
398 if [[ -d ${EPATCH_SOURCE} ]] ; then
399 EPATCH_SOURCE=${EPATCH_SOURCE} \
400 EPATCH_SUFFIX="patch" \
401 EPATCH_FORCE="yes" \
402 EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \
403 epatch
404 break
346 fi 405 fi
406 done
347} 407}
348 408
349# @FUNCTION: emktemp 409# @FUNCTION: emktemp
350# @USAGE: [temp dir] 410# @USAGE: [temp dir]
351# @DESCRIPTION: 411# @DESCRIPTION:
392# Small wrapper for getent (Linux), 452# Small wrapper for getent (Linux),
393# nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5), 453# nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5),
394# and pw (FreeBSD) used in enewuser()/enewgroup() 454# and pw (FreeBSD) used in enewuser()/enewgroup()
395egetent() { 455egetent() {
396 case ${CHOST} in 456 case ${CHOST} in
457 *-darwin[678])
458 case "$2" in
459 *[!0-9]*) # Non numeric
460 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
461 ;;
462 *) # Numeric
463 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
464 ;;
465 esac
466 ;;
397 *-darwin9) 467 *-darwin*)
398 local mytype=$1 468 local mytype=$1
399 [[ "passwd" == $mytype ]] && mytype="Users" 469 [[ "passwd" == $mytype ]] && mytype="Users"
400 [[ "group" == $mytype ]] && mytype="Groups" 470 [[ "group" == $mytype ]] && mytype="Groups"
401 case "$2" in 471 case "$2" in
402 *[!0-9]*) # Non numeric 472 *[!0-9]*) # Non numeric
404 ;; 474 ;;
405 *) # Numeric 475 *) # Numeric
406 local mykey="UniqueID" 476 local mykey="UniqueID"
407 [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID" 477 [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID"
408 dscl . -search /$mytype $mykey $2 2>/dev/null 478 dscl . -search /$mytype $mykey $2 2>/dev/null
409 ;;
410 esac
411 ;;
412 *-darwin*)
413 case "$2" in
414 *[!0-9]*) # Non numeric
415 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
416 ;;
417 *) # Numeric
418 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
419 ;; 479 ;;
420 esac 480 esac
421 ;; 481 ;;
422 *-freebsd*|*-dragonfly*) 482 *-freebsd*|*-dragonfly*)
423 local opts action="user" 483 local opts action="user"
623 fi 683 fi
624 ;; 684 ;;
625 685
626 *) 686 *)
627 if [[ -z $@ ]] ; then 687 if [[ -z $@ ]] ; then
628 useradd ${opts} ${euser} \ 688 useradd ${opts} \
629 -c "added by portage for ${PN}" \ 689 -c "added by portage for ${PN}" \
690 ${euser} \
630 || die "enewuser failed" 691 || die "enewuser failed"
631 else 692 else
632 einfo " - Extra: $@" 693 einfo " - Extra: $@"
633 useradd ${opts} ${euser} "$@" \ 694 useradd ${opts} "$@" \
695 ${euser} \
634 || die "enewuser failed" 696 || die "enewuser failed"
635 fi 697 fi
636 ;; 698 ;;
637 esac 699 esac
638 700
920 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop" 982 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop"
921 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop 983 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
922 984
923 cat <<-EOF > "${desktop}" 985 cat <<-EOF > "${desktop}"
924 [Desktop Entry] 986 [Desktop Entry]
925 Version=1.0
926 Name=${name} 987 Name=${name}
927 Type=Application 988 Type=Application
928 Comment=${DESCRIPTION} 989 Comment=${DESCRIPTION}
929 Exec=${exec} 990 Exec=${exec}
930 TryExec=${exec%% *} 991 TryExec=${exec%% *}
1312 lic="${PWD}/${lic}" 1373 lic="${PWD}/${lic}"
1313 elif [ -e "${lic}" ] ; then 1374 elif [ -e "${lic}" ] ; then
1314 lic="${lic}" 1375 lic="${lic}"
1315 fi 1376 fi
1316 fi 1377 fi
1317 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1318 local l="`basename ${lic}`" 1378 local l="`basename ${lic}`"
1319 1379
1320 # here is where we check for the licenses the user already 1380 # here is where we check for the licenses the user already
1321 # accepted ... if we don't find a match, we make the user accept 1381 # accepted ... if we don't find a match, we make the user accept
1322 local shopts=$-
1323 local alic 1382 local alic
1324 set -o noglob #so that bash doesn't expand "*" 1383 eshopts_push -o noglob # so that bash doesn't expand "*"
1325 for alic in ${ACCEPT_LICENSE} ; do 1384 for alic in ${ACCEPT_LICENSE} ; do
1326 if [[ ${alic} == ${l} ]]; then 1385 if [[ ${alic} == ${l} ]]; then
1327 set +o noglob; set -${shopts} #reset old shell opts 1386 eshopts_pop
1328 return 0 1387 return 0
1329 fi 1388 fi
1330 done 1389 done
1331 set +o noglob; set -$shopts #reset old shell opts 1390 eshopts_pop
1391 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1332 1392
1333 local licmsg=$(emktemp) 1393 local licmsg=$(emktemp)
1334 cat <<-EOF > ${licmsg} 1394 cat <<-EOF > ${licmsg}
1335 ********************************************************** 1395 **********************************************************
1336 The following license outlines the terms of use of this 1396 The following license outlines the terms of use of this
1614 else 1674 else
1615 nols="${nols} ${f}" 1675 nols="${nols} ${f}"
1616 fi 1676 fi
1617 done 1677 done
1618 [[ -n ${nols} ]] \ 1678 [[ -n ${nols} ]] \
1619 && ewarn "Sorry, but ${PN} does not support the LINGUAs:" ${nols} 1679 && ewarn "Sorry, but ${PN} does not support the LINGUAS:" ${nols}
1620 export LINGUAS=${newls:1} 1680 export LINGUAS=${newls:1}
1621} 1681}
1622 1682
1623# @FUNCTION: preserve_old_lib 1683# @FUNCTION: preserve_old_lib
1624# @USAGE: <libs to preserve> [more libs] 1684# @USAGE: <libs to preserve> [more libs]
1687} 1747}
1688 1748
1689# @FUNCTION: built_with_use 1749# @FUNCTION: built_with_use
1690# @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags> 1750# @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1691# @DESCRIPTION: 1751# @DESCRIPTION:
1752#
1753# Deprecated: Use EAPI 2 use deps in DEPEND|RDEPEND and with has_version calls.
1754#
1692# A temporary hack until portage properly supports DEPENDing on USE 1755# A temporary hack until portage properly supports DEPENDing on USE
1693# flags being enabled in packages. This will check to see if the specified 1756# flags being enabled in packages. This will check to see if the specified
1694# DEPEND atom was built with the specified list of USE flags. The 1757# DEPEND atom was built with the specified list of USE flags. The
1695# --missing option controls the behavior if called on a package that does 1758# --missing option controls the behavior if called on a package that does
1696# not actually support the defined USE flags (aka listed in IUSE). 1759# not actually support the defined USE flags (aka listed in IUSE).

Legend:
Removed from v.1.315  
changed lines
  Added in v.1.329

  ViewVC Help
Powered by ViewVC 1.1.20