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

Diff of /eclass/eutils.eclass

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

Revision 1.322 Revision 1.333
1# Copyright 1999-2009 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.322 2009/12/11 20:31:34 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.333 2010/02/17 17:10:23 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
54else
55
56ebeep() {
57 [[ $(type -t eqawarn) == function ]] && \
58 eqawarn "QA Notice: ebeep is not defined in EAPI=3, please file a bug at http://bugs.gentoo.org"
59}
60
61epause() {
62 [[ $(type -t eqawarn) == function ]] && \
63 eqawarn "QA Notice: epause is not defined in EAPI=3, please file a bug at http://bugs.gentoo.org"
64}
65
66fi
67
52# @FUNCTION: ecvs_clean 68# @FUNCTION: ecvs_clean
53# @USAGE: [list of dirs] 69# @USAGE: [list of dirs]
54# @DESCRIPTION: 70# @DESCRIPTION:
55# Remove CVS directories recursiveley. Useful when a source tarball contains 71# Remove CVS directories recursiveley. Useful when a source tarball contains
56# internal CVS directories. Defaults to $PWD. 72# internal CVS directories. Defaults to $PWD.
69 [[ -z $* ]] && set -- . 85 [[ -z $* ]] && set -- .
70 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf 86 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
71} 87}
72 88
73# @FUNCTION: eshopts_push 89# @FUNCTION: eshopts_push
74# @USAGE: [options to `set`] 90# @USAGE: [options to `set` or `shopt`]
75# @DESCRIPTION: 91# @DESCRIPTION:
76# Often times code will want to enable a shell option to change code behavior. 92# Often times code will want to enable a shell option to change code behavior.
77# Since changing shell options can easily break other pieces of code (which 93# Since changing shell options can easily break other pieces of code (which
78# assume the default state), eshopts_push is used to (1) push the current shell 94# assume the default state), eshopts_push is used to (1) push the current shell
79# options onto a stack and (2) pass the specified arguments to set. 95# options onto a stack and (2) pass the specified arguments to set.
96#
97# If the first argument is '-s' or '-u', we assume you want to call `shopt`
98# rather than `set` as there are some options only available via that.
80# 99#
81# A common example is to disable shell globbing so that special meaning/care 100# A common example is to disable shell globbing so that special meaning/care
82# may be used with variables/arguments to custom functions. That would be: 101# may be used with variables/arguments to custom functions. That would be:
83# @CODE 102# @CODE
84# eshopts_push -o noglob 103# eshopts_push -o noglob
92# @CODE 111# @CODE
93eshopts_push() { 112eshopts_push() {
94 # have to assume __ESHOPTS_SAVE__ isn't screwed with 113 # have to assume __ESHOPTS_SAVE__ isn't screwed with
95 # as a `declare -a` here will reset its value 114 # as a `declare -a` here will reset its value
96 local i=${#__ESHOPTS_SAVE__[@]} 115 local i=${#__ESHOPTS_SAVE__[@]}
116 if [[ $1 == -[su] ]] ; then
97 __ESHOPTS_SAVE__[$i]=$- 117 __ESHOPTS_SAVE__[$i]=$(shopt -p)
98 [[ $# -eq 0 ]] && return 0 118 [[ $# -eq 0 ]] && return 0
119 shopt "$@" || die "eshopts_push: bad options to shopt: $*"
120 else
121 __ESHOPTS_SAVE__[$i]=$-
122 [[ $# -eq 0 ]] && return 0
99 set "$@" || die "eshopts_push: bad options to set: $*" 123 set "$@" || die "eshopts_push: bad options to set: $*"
124 fi
100} 125}
101 126
102# @FUNCTION: eshopts_pop 127# @FUNCTION: eshopts_pop
103# @USAGE: 128# @USAGE:
104# @DESCRIPTION: 129# @DESCRIPTION:
108 [[ $# -ne 0 ]] && die "eshopts_pop takes no arguments" 133 [[ $# -ne 0 ]] && die "eshopts_pop takes no arguments"
109 local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 )) 134 local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 ))
110 [[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair" 135 [[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair"
111 local s=${__ESHOPTS_SAVE__[$i]} 136 local s=${__ESHOPTS_SAVE__[$i]}
112 unset __ESHOPTS_SAVE__[$i] 137 unset __ESHOPTS_SAVE__[$i]
138 if [[ ${s} == "shopt -"* ]] ; then
139 eval "${s}" || die "eshopts_pop: sanity: invalid shopt options: ${s}"
140 else
113 set +$- || die "eshopts_pop: sanity: invalid shell settings: $-" 141 set +$- || die "eshopts_pop: sanity: invalid shell settings: $-"
114 set -${s} || die "eshopts_pop: sanity: unable to restore saved shell settings: ${s}" 142 set -${s} || die "eshopts_pop: sanity: unable to restore saved shell settings: ${s}"
143 fi
115} 144}
116 145
117# Default directory where patches are located 146# @VARIABLE: EPATCH_SOURCE
147# @DESCRIPTION:
148# Default directory to search for patches.
118EPATCH_SOURCE="${WORKDIR}/patch" 149EPATCH_SOURCE="${WORKDIR}/patch"
119# Default extension for patches 150# @VARIABLE: EPATCH_SUFFIX
151# @DESCRIPTION:
152# Default extension for patches (do not prefix the period yourself).
120EPATCH_SUFFIX="patch.bz2" 153EPATCH_SUFFIX="patch.bz2"
154# @VARIABLE: EPATCH_OPTS
155# @DESCRIPTION:
121# Default options for patch 156# Default options for patch:
157# @CODE
122# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571 158# -g0 - keep RCS, ClearCase, Perforce and SCCS happy #24571
123# Set --no-backup-if-mismatch so we don't leave '.orig' files behind. 159# --no-backup-if-mismatch - do not leave .orig files behind
124# Set -E to automatically remove empty files. 160# -E - automatically remove empty files
161# @CODE
125EPATCH_OPTS="-g0 -E --no-backup-if-mismatch" 162EPATCH_OPTS="-g0 -E --no-backup-if-mismatch"
163# @VARIABLE: EPATCH_EXCLUDE
164# @DESCRIPTION:
126# List of patches not to apply. Note this is only file names, 165# List of patches not to apply. Note this is only file names,
127# and not the full path .. 166# and not the full path. Globs accepted.
128EPATCH_EXCLUDE="" 167EPATCH_EXCLUDE=""
168# @VARIABLE: EPATCH_SINGLE_MSG
169# @DESCRIPTION:
129# Change the printed message for a single patch. 170# Change the printed message for a single patch.
130EPATCH_SINGLE_MSG="" 171EPATCH_SINGLE_MSG=""
172# @VARIABLE: EPATCH_MULTI_MSG
173# @DESCRIPTION:
131# Change the printed message for multiple patches. 174# Change the printed message for multiple patches.
132EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..." 175EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
133# Force applying bulk patches even if not following the style: 176# @VARIABLE: EPATCH_FORCE
134# 177# @DESCRIPTION:
135# ??_${ARCH}_foo.${EPATCH_SUFFIX} 178# Only require patches to match EPATCH_SUFFIX rather than the extended
136# 179# arch naming style.
137EPATCH_FORCE="no" 180EPATCH_FORCE="no"
138 181
139# This function is for bulk patching, or in theory for just one 182# @FUNCTION: epatch
140# or two patches. 183# @USAGE: [patches] [dirs of patches]
184# @DESCRIPTION:
185# epatch is designed to greatly simplify the application of patches. It can
186# process patch files directly, or directories of patches. The patches may be
187# compressed (bzip/gzip/etc...) or plain text. You generally need not specify
188# the -p option as epatch will automatically attempt -p0 to -p5 until things
189# apply successfully.
141# 190#
142# It should work with .bz2, .gz, .zip and plain text patches. 191# If you do not specify any options, then epatch will default to the directory
143# Currently all patches should be the same format. 192# specified by EPATCH_SOURCE.
144# 193#
145# You do not have to specify '-p' option to patch, as it will 194# When processing directories, epatch will apply all patches that match:
146# try with -p0 to -p5 until it succeed, or fail at -p5. 195# @CODE
147# 196# ${EPATCH_FORCE} == "yes"
148# Above EPATCH_* variables can be used to control various defaults,
149# bug they should be left as is to ensure an ebuild can rely on
150# them for.
151#
152# Patches are applied in current directory.
153#
154# Bulk Patches should preferably have the form of:
155#
156# ??_${ARCH}_foo.${EPATCH_SUFFIX} 197# ??_${ARCH}_foo.${EPATCH_SUFFIX}
198# else
199# *.${EPATCH_SUFFIX}
200# @CODE
201# The leading ?? are typically numbers used to force consistent patch ordering.
202# The arch field is used to apply patches only for the host architecture with
203# the special value of "all" means apply for everyone. Note that using values
204# other than "all" is highly discouraged -- you should apply patches all the
205# time and let architecture details be detected at configure/compile time.
157# 206#
158# For example: 207# If EPATCH_SUFFIX is empty, then no period before it is implied when searching
208# for patches to apply.
159# 209#
160# 01_all_misc-fix.patch.bz2 210# Refer to the other EPATCH_xxx variables for more customization of behavior.
161# 02_sparc_another-fix.patch.bz2
162#
163# This ensures that there are a set order, and you can have ARCH
164# specific patches.
165#
166# If you however give an argument to epatch(), it will treat it as a
167# single patch that need to be applied if its a file. If on the other
168# hand its a directory, it will set EPATCH_SOURCE to this.
169#
170# <azarah@gentoo.org> (10 Nov 2002)
171#
172epatch() { 211epatch() {
173 _epatch_draw_line() { 212 _epatch_draw_line() {
213 # create a line of same length as input string
174 [[ -z $1 ]] && set "$(printf "%65s" '')" 214 [[ -z $1 ]] && set "$(printf "%65s" '')"
175 echo "${1//?/=}" 215 echo "${1//?/=}"
176 } 216 }
177 _epatch_assert() { local _pipestatus=${PIPESTATUS[*]}; [[ ${_pipestatus// /} -eq 0 ]] ; }
178 local PIPE_CMD=""
179 local STDERR_TARGET="${T}/$$.out"
180 local PATCH_TARGET="${T}/$$.patch"
181 local PATCH_SUFFIX=""
182 local SINGLE_PATCH="no"
183 local x=""
184 217
185 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402 218 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
186 219
187 if [ "$#" -gt 1 ] 220 # Let the rest of the code process one user arg at a time --
188 then 221 # each arg may expand into multiple patches, and each arg may
222 # need to start off with the default global EPATCH_xxx values
223 if [[ $# -gt 1 ]] ; then
189 local m="" 224 local m
190 for m in "$@" ; do 225 for m in "$@" ; do
191 epatch "${m}" 226 epatch "${m}"
192 done 227 done
193 return 0 228 return 0
194 fi 229 fi
195 230
196 if [ -n "$1" -a -f "$1" ] 231 local SINGLE_PATCH="no"
197 then 232 # no args means process ${EPATCH_SOURCE}
233 [[ $# -eq 0 ]] && set -- "${EPATCH_SOURCE}"
234
235 if [[ -f $1 ]] ; then
198 SINGLE_PATCH="yes" 236 SINGLE_PATCH="yes"
199 237 set -- "$1"
200 local EPATCH_SOURCE="$1" 238 # Use the suffix from the single patch (localize it); the code
239 # below will find the suffix for us
201 local EPATCH_SUFFIX="${1##*\.}" 240 local EPATCH_SUFFIX=$1
202 241
203 elif [ -n "$1" -a -d "$1" ] 242 elif [[ -d $1 ]] ; then
204 then 243 # Some people like to make dirs of patches w/out suffixes (vim)
205 # Allow no extension if EPATCH_FORCE=yes ... used by vim for example ... 244 set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"}
206 if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ] 245
246 else
247 # sanity check ... if it isn't a dir or file, wtf man ?
248 [[ $# -ne 0 ]] && EPATCH_SOURCE=$1
249 echo
250 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
251 eerror
252 eerror " ${EPATCH_SOURCE}"
253 eerror " ( ${EPATCH_SOURCE##*/} )"
254 echo
255 die "Cannot find \$EPATCH_SOURCE!"
256 fi
257
258 local PIPE_CMD
259 case ${EPATCH_SUFFIX##*\.} in
260 xz) PIPE_CMD="xz -dc" ;;
261 lzma) PIPE_CMD="lzma -dc" ;;
262 bz2) PIPE_CMD="bzip2 -dc" ;;
263 gz|Z|z) PIPE_CMD="gzip -dc" ;;
264 ZIP|zip) PIPE_CMD="unzip -p" ;;
265 *) ;;
266 esac
267
268 [[ ${SINGLE_PATCH} == "no" ]] && einfo "${EPATCH_MULTI_MSG}"
269
270 local x
271 for x in "$@" ; do
272 # If the patch dir given contains subdirs, or our EPATCH_SUFFIX
273 # didn't match anything, ignore continue on
274 [[ ! -f ${x} ]] && continue
275
276 local patchname=${x##*/}
277
278 # Apply single patches, or forced sets of patches, or
279 # patches with ARCH dependant names.
280 # ???_arch_foo.patch
281 # Else, skip this input altogether
282 local a=${patchname#*_} # strip the ???_
283 a=${a%%_*} # strip the _foo.patch
284 if ! [[ ${SINGLE_PATCH} == "yes" || \
285 ${EPATCH_FORCE} == "yes" || \
286 ${a} == all || \
287 ${a} == ${ARCH} ]]
207 then 288 then
208 local EPATCH_SOURCE="$1/*" 289 continue
290 fi
291
292 # Let people filter things dynamically
293 if [[ -n ${EPATCH_EXCLUDE} ]] ; then
294 # let people use globs in the exclude
295 eshopts_push -o noglob
296
297 local ex
298 for ex in ${EPATCH_EXCLUDE} ; do
299 if [[ ${patchname} == ${ex} ]] ; then
300 eshopts_pop
301 continue 2
302 fi
303 done
304
305 eshopts_pop
306 fi
307
308 if [[ ${SINGLE_PATCH} == "yes" ]] ; then
309 if [[ -n ${EPATCH_SINGLE_MSG} ]] ; then
310 einfo "${EPATCH_SINGLE_MSG}"
311 else
312 einfo "Applying ${patchname} ..."
313 fi
209 else 314 else
210 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}" 315 einfo " ${patchname} ..."
211 fi 316 fi
212 else 317
213 if [[ ! -d ${EPATCH_SOURCE} ]] || [[ -n $1 ]] ; then 318 # most of the time, there will only be one run per unique name,
214 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ] 319 # but if there are more, make sure we get unique log filenames
215 then 320 local STDERR_TARGET="${T}/${patchname}.out"
216 EPATCH_SOURCE="$1" 321 if [[ -e ${STDERR_TARGET} ]] ; then
322 STDERR_TARGET="${T}/${patchname}-$$.out"
323 fi
324
325 printf "***** %s *****\n\n" "${patchname}" > "${STDERR_TARGET}"
326
327 # Decompress the patch if need be
328 local count=0
329 local PATCH_TARGET
330 if [[ -n ${PIPE_CMD} ]] ; then
331 PATCH_TARGET="${T}/$$.patch"
332 echo "PIPE_COMMAND: ${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> "${STDERR_TARGET}"
333
334 if ! (${PIPE_CMD} "${x}" > "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then
335 echo
336 eerror "Could not extract patch!"
337 #die "Could not extract patch!"
338 count=5
339 break
217 fi 340 fi
341 else
342 PATCH_TARGET=${x}
343 fi
218 344
345 # Check for absolute paths in patches. If sandbox is disabled,
346 # people could (accidently) patch files in the root filesystem.
347 # Or trigger other unpleasantries #237667. So disallow -p0 on
348 # such patches.
349 local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
350 if [[ -n ${abs_paths} ]] ; then
351 count=1
352 printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}"
353 fi
354
355 # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/
356 while [[ ${count} -lt 5 ]] ; do
357 # Generate some useful debug info ...
358 (
359 _epatch_draw_line "***** ${patchname} *****"
219 echo 360 echo
220 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:" 361 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'"
362 echo
363 _epatch_draw_line "***** ${patchname} *****"
364 ) >> "${STDERR_TARGET}"
365
366 if (patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then
367 (
368 _epatch_draw_line "***** ${patchname} *****"
369 echo
370 echo "ACTUALLY APPLYING ${patchname} ..."
371 echo
372 _epatch_draw_line "***** ${patchname} *****"
373 patch -p${count} ${EPATCH_OPTS} < "${PATCH_TARGET}" 2>&1
374 ) >> "${STDERR_TARGET}"
375
376 if [ $? -ne 0 ] ; then
377 echo
378 eerror "A dry-run of patch command succeeded, but actually"
379 eerror "applying the patch failed!"
380 #die "Real world sux compared to the dreamworld!"
381 count=5
382 fi
383 break
384 fi
385
386 : $(( count++ ))
387 done
388
389 # if we had to decompress the patch, delete the temp one
390 if [[ -n ${PIPE_CMD} ]] ; then
391 rm -f "${PATCH_TARGET}"
392 fi
393
394 if [[ ${count} -ge 5 ]] ; then
395 echo
396 eerror "Failed Patch: ${patchname} !"
397 eerror " ( ${PATCH_TARGET} )"
221 eerror 398 eerror
222 eerror " ${EPATCH_SOURCE}" 399 eerror "Include in your bugreport the contents of:"
223 eerror " ( ${EPATCH_SOURCE##*/} )" 400 eerror
401 eerror " ${STDERR_TARGET}"
224 echo 402 echo
225 die "Cannot find \$EPATCH_SOURCE!"
226 fi
227
228 local EPATCH_SOURCE="${EPATCH_SOURCE}/*.${EPATCH_SUFFIX}"
229 fi
230
231 case ${EPATCH_SUFFIX##*\.} in
232 xz)
233 PIPE_CMD="xz -dc"
234 PATCH_SUFFIX="xz"
235 ;;
236 lzma)
237 PIPE_CMD="lzma -dc"
238 PATCH_SUFFIX="lzma"
239 ;;
240 bz2)
241 PIPE_CMD="bzip2 -dc"
242 PATCH_SUFFIX="bz2"
243 ;;
244 gz|Z|z)
245 PIPE_CMD="gzip -dc"
246 PATCH_SUFFIX="gz"
247 ;;
248 ZIP|zip)
249 PIPE_CMD="unzip -p"
250 PATCH_SUFFIX="zip"
251 ;;
252 *)
253 PIPE_CMD="cat"
254 PATCH_SUFFIX="patch"
255 ;;
256 esac
257
258 if [ "${SINGLE_PATCH}" = "no" ]
259 then
260 einfo "${EPATCH_MULTI_MSG}"
261 fi
262 for x in ${EPATCH_SOURCE}
263 do
264 # New ARCH dependant patch naming scheme ...
265 #
266 # ???_arch_foo.patch
267 #
268 if [ -f ${x} ] && \
269 ([ "${SINGLE_PATCH}" = "yes" -o "${x/_all_}" != "${x}" -o "${x/_${ARCH}_}" != "${x}" ] || \
270 [ "${EPATCH_FORCE}" = "yes" ])
271 then
272 local count=0
273 local popts="${EPATCH_OPTS}"
274 local patchname=${x##*/}
275
276 if [ -n "${EPATCH_EXCLUDE}" ]
277 then
278 if [ "${EPATCH_EXCLUDE/${patchname}}" != "${EPATCH_EXCLUDE}" ]
279 then
280 continue
281 fi
282 fi
283
284 if [ "${SINGLE_PATCH}" = "yes" ]
285 then
286 if [ -n "${EPATCH_SINGLE_MSG}" ]
287 then
288 einfo "${EPATCH_SINGLE_MSG}"
289 else
290 einfo "Applying ${patchname} ..."
291 fi
292 else
293 einfo " ${patchname} ..."
294 fi
295
296 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
297 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
298
299 # Decompress the patch if need be
300 if [[ ${PATCH_SUFFIX} != "patch" ]] ; then
301 echo -n "PIPE_COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
302 echo "${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
303
304 if ! (${PIPE_CMD} ${x} > ${PATCH_TARGET}) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1 ; then
305 echo
306 eerror "Could not extract patch!"
307 #die "Could not extract patch!"
308 count=5
309 break
310 fi
311 else
312 PATCH_TARGET="${x}"
313 fi
314
315 # Check for absolute paths in patches. If sandbox is disabled,
316 # people could (accidently) patch files in the root filesystem.
317 # Or trigger other unpleasantries #237667. So disallow -p0 on
318 # such patches.
319 local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }')
320 if [[ -n ${abs_paths} ]] ; then
321 count=1
322 echo "NOTE: skipping -p0 due to absolute paths in patch:" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
323 echo "${abs_paths}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
324 fi
325
326 # Allow for prefix to differ ... im lazy, so shoot me :/
327 while [ "${count}" -lt 5 ]
328 do
329 # Generate some useful debug info ...
330 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
331 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
332
333 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
334 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
335
336 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
337 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
338
339 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
340 then
341 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
342 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
343 echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
344 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
345 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
346
347 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1
348 _epatch_assert
349
350 if [ "$?" -ne 0 ]
351 then
352 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
353 echo
354 eerror "A dry-run of patch command succeeded, but actually"
355 eerror "applying the patch failed!"
356 #die "Real world sux compared to the dreamworld!"
357 count=5
358 fi
359
360 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
361
362 break
363 fi
364
365 count=$((count + 1))
366 done
367
368 if [ "${PATCH_SUFFIX}" != "patch" ]
369 then
370 rm -f ${PATCH_TARGET}
371 fi
372
373 if [ "${count}" -eq 5 ]
374 then
375 echo
376 eerror "Failed Patch: ${patchname} !"
377 eerror " ( ${PATCH_TARGET} )"
378 eerror
379 eerror "Include in your bugreport the contents of:"
380 eerror
381 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}"
382 echo
383 die "Failed Patch: ${patchname}!" 403 die "Failed Patch: ${patchname}!"
384 fi 404 fi
385 405
386 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 406 # if everything worked, delete the patch log
387 407 rm -f "${STDERR_TARGET}"
388 eend 0 408 eend 0
389 fi
390 done 409 done
391 if [ "${SINGLE_PATCH}" = "no" ] 410
392 then 411 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
393 einfo "Done with patching" 412 : # everything worked
394 fi
395} 413}
396epatch_user() { 414epatch_user() {
397 [[ $# -ne 0 ]] && die "epatch_user takes no options" 415 [[ $# -ne 0 ]] && die "epatch_user takes no options"
398 416
399 # don't clobber any EPATCH vars that the parent might want 417 # don't clobber any EPATCH vars that the parent might want
400 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT}/etc/portage/patches 418 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
401 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do 419 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do
402 EPATCH_SOURCE=${base}/${CTARGET}/${check} 420 EPATCH_SOURCE=${base}/${CTARGET}/${check}
403 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check} 421 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check}
404 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check} 422 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check}
405 if [[ -d ${EPATCH_SOURCE} ]] ; then 423 if [[ -d ${EPATCH_SOURCE} ]] ; then
1380 lic="${PWD}/${lic}" 1398 lic="${PWD}/${lic}"
1381 elif [ -e "${lic}" ] ; then 1399 elif [ -e "${lic}" ] ; then
1382 lic="${lic}" 1400 lic="${lic}"
1383 fi 1401 fi
1384 fi 1402 fi
1385 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1386 local l="`basename ${lic}`" 1403 local l="`basename ${lic}`"
1387 1404
1388 # here is where we check for the licenses the user already 1405 # here is where we check for the licenses the user already
1389 # accepted ... if we don't find a match, we make the user accept 1406 # accepted ... if we don't find a match, we make the user accept
1390 local alic 1407 local alic
1394 eshopts_pop 1411 eshopts_pop
1395 return 0 1412 return 0
1396 fi 1413 fi
1397 done 1414 done
1398 eshopts_pop 1415 eshopts_pop
1416 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1399 1417
1400 local licmsg=$(emktemp) 1418 local licmsg=$(emktemp)
1401 cat <<-EOF > ${licmsg} 1419 cat <<-EOF > ${licmsg}
1402 ********************************************************** 1420 **********************************************************
1403 The following license outlines the terms of use of this 1421 The following license outlines the terms of use of this
1754} 1772}
1755 1773
1756# @FUNCTION: built_with_use 1774# @FUNCTION: built_with_use
1757# @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags> 1775# @USAGE: [--hidden] [--missing <action>] [-a|-o] <DEPEND ATOM> <List of USE flags>
1758# @DESCRIPTION: 1776# @DESCRIPTION:
1777#
1778# Deprecated: Use EAPI 2 use deps in DEPEND|RDEPEND and with has_version calls.
1779#
1759# A temporary hack until portage properly supports DEPENDing on USE 1780# A temporary hack until portage properly supports DEPENDing on USE
1760# flags being enabled in packages. This will check to see if the specified 1781# flags being enabled in packages. This will check to see if the specified
1761# DEPEND atom was built with the specified list of USE flags. The 1782# DEPEND atom was built with the specified list of USE flags. The
1762# --missing option controls the behavior if called on a package that does 1783# --missing option controls the behavior if called on a package that does
1763# not actually support the defined USE flags (aka listed in IUSE). 1784# not actually support the defined USE flags (aka listed in IUSE).

Legend:
Removed from v.1.322  
changed lines
  Added in v.1.333

  ViewVC Help
Powered by ViewVC 1.1.20