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

Diff of /eclass/eutils.eclass

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

Revision 1.304 Revision 1.325
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.304 2008/09/20 18:45:26 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.325 2010/01/09 20:06:24 vapier 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
68esvn_clean() { 68esvn_clean() {
69 [[ -z $* ]] && set -- . 69 [[ -z $* ]] && set -- .
70 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf 70 find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
71} 71}
72 72
73# Default directory where patches are located 73# @FUNCTION: eshopts_push
74# @USAGE: [options to `set`]
75# @DESCRIPTION:
76# 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
78# 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.
80#
81# 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:
83# @CODE
84# eshopts_push -o noglob
85# for x in ${foo} ; do
86# if ...some check... ; then
87# eshopts_pop
88# return 0
89# fi
90# done
91# eshopts_pop
92# @CODE
93eshopts_push() {
94 # have to assume __ESHOPTS_SAVE__ isn't screwed with
95 # as a `declare -a` here will reset its value
96 local i=${#__ESHOPTS_SAVE__[@]}
97 __ESHOPTS_SAVE__[$i]=$-
98 [[ $# -eq 0 ]] && return 0
99 set "$@" || die "eshopts_push: bad options to set: $*"
100}
101
102# @FUNCTION: eshopts_pop
103# @USAGE:
104# @DESCRIPTION:
105# Restore the shell options to the state saved with the corresponding
106# eshopts_push call. See that function for more details.
107eshopts_pop() {
108 [[ $# -ne 0 ]] && die "eshopts_pop takes no arguments"
109 local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 ))
110 [[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair"
111 local s=${__ESHOPTS_SAVE__[$i]}
112 unset __ESHOPTS_SAVE__[$i]
113 set +$- || die "eshopts_pop: sanity: invalid shell settings: $-"
114 set -${s} || die "eshopts_pop: sanity: unable to restore saved shell settings: ${s}"
115}
116
117# @VARIABLE: EPATCH_SOURCE
118# @DESCRIPTION:
119# Default directory to search for patches.
74EPATCH_SOURCE="${WORKDIR}/patch" 120EPATCH_SOURCE="${WORKDIR}/patch"
75# Default extension for patches 121# @VARIABLE: EPATCH_SUFFIX
122# @DESCRIPTION:
123# Default extension for patches (do not prefix the period yourself).
76EPATCH_SUFFIX="patch.bz2" 124EPATCH_SUFFIX="patch.bz2"
125# @VARIABLE: EPATCH_OPTS
126# @DESCRIPTION:
77# Default options for patch 127# Default options for patch:
128# @CODE
78# Set -g0 to keep RCS, ClearCase, Perforce and SCCS happy. Bug #24571 129# -g0 - keep RCS, ClearCase, Perforce and SCCS happy #24571
79# Set --no-backup-if-mismatch so we don't leave '.orig' files behind. 130# --no-backup-if-mismatch - do not leave .orig files behind
80# Set -E to automatically remove empty files. 131# -E - automatically remove empty files
132# @CODE
81EPATCH_OPTS="-g0 -E --no-backup-if-mismatch" 133EPATCH_OPTS="-g0 -E --no-backup-if-mismatch"
134# @VARIABLE: EPATCH_EXCLUDE
135# @DESCRIPTION:
82# List of patches not to apply. Not this is only file names, 136# List of patches not to apply. Note this is only file names,
83# and not the full path .. 137# and not the full path. Globs accepted.
84EPATCH_EXCLUDE="" 138EPATCH_EXCLUDE=""
139# @VARIABLE: EPATCH_SINGLE_MSG
140# @DESCRIPTION:
85# Change the printed message for a single patch. 141# Change the printed message for a single patch.
86EPATCH_SINGLE_MSG="" 142EPATCH_SINGLE_MSG=""
143# @VARIABLE: EPATCH_MULTI_MSG
144# @DESCRIPTION:
87# Change the printed message for multiple patches. 145# Change the printed message for multiple patches.
88EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..." 146EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
89# Force applying bulk patches even if not following the style: 147# @VARIABLE: EPATCH_FORCE
90# 148# @DESCRIPTION:
91# ??_${ARCH}_foo.${EPATCH_SUFFIX} 149# Only require patches to match EPATCH_SUFFIX rather than the extended
92# 150# arch naming style.
93EPATCH_FORCE="no" 151EPATCH_FORCE="no"
94 152
95# This function is for bulk patching, or in theory for just one 153# @FUNCTION: epatch
96# or two patches. 154# @USAGE: [patches] [dirs of patches]
155# @DESCRIPTION:
156# epatch is designed to greatly simplify the application of patches. It can
157# process patch files directly, or directories of patches. The patches may be
158# compressed (bzip/gzip/etc...) or plain text. You generally need not specify
159# the -p option as epatch will automatically attempt -p0 to -p5 until things
160# apply successfully.
97# 161#
98# It should work with .bz2, .gz, .zip and plain text patches. 162# If you do not specify any options, then epatch will default to the directory
99# Currently all patches should be the same format. 163# specified by EPATCH_SOURCE.
100# 164#
101# You do not have to specify '-p' option to patch, as it will 165# When processing directories, epatch will apply all patches that match:
102# try with -p0 to -p5 until it succeed, or fail at -p5. 166# @CODE
103# 167# ${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 preferibly have the form of:
111#
112# ??_${ARCH}_foo.${EPATCH_SUFFIX} 168# ??_${ARCH}_foo.${EPATCH_SUFFIX}
169# else
170# *.${EPATCH_SUFFIX}
171# @CODE
172# The leading ?? are typically numbers used to force consistent patch ordering.
173# The arch field is used to apply patches only for the host architecture with
174# the special value of "all" means apply for everyone. Note that using values
175# other than "all" is highly discouraged -- you should apply patches all the
176# time and let architecture details be detected at configure/compile time.
113# 177#
114# For example: 178# If EPATCH_SUFFIX is empty, then no period before it is implied when searching
179# for patches to apply.
115# 180#
116# 01_all_misc-fix.patch.bz2 181# 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() { 182epatch() {
129 _epatch_draw_line() { 183 _epatch_draw_line() {
184 # create a line of same length as input string
130 [[ -z $1 ]] && set "$(printf "%65s" '')" 185 [[ -z $1 ]] && set "$(printf "%65s" '')"
131 echo "${1//?/=}" 186 echo "${1//?/=}"
132 } 187 }
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 188
141 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402 189 unset P4CONFIG P4PORT P4USER # keep perforce at bay #56402
142 190
143 if [ "$#" -gt 1 ] 191 # Let the rest of the code process one user arg at a time --
144 then 192 # each arg may expand into multiple patches, and each arg may
193 # need to start off with the default global EPATCH_xxx values
194 if [[ $# -gt 1 ]] ; then
145 local m="" 195 local m
146 for m in "$@" ; do 196 for m in "$@" ; do
147 epatch "${m}" 197 epatch "${m}"
148 done 198 done
149 return 0 199 return 0
150 fi 200 fi
151 201
152 if [ -n "$1" -a -f "$1" ] 202 local SINGLE_PATCH="no"
153 then 203 # no args means process ${EPATCH_SOURCE}
204 [[ $# -eq 0 ]] && set -- "${EPATCH_SOURCE}"
205
206 if [[ -f $1 ]] ; then
154 SINGLE_PATCH="yes" 207 SINGLE_PATCH="yes"
155 208 set -- "$1"
156 local EPATCH_SOURCE="$1" 209 # Use the suffix from the single patch (localize it); the code
210 # below will find the suffix for us
157 local EPATCH_SUFFIX="${1##*\.}" 211 local EPATCH_SUFFIX=$1
158 212
159 elif [ -n "$1" -a -d "$1" ] 213 elif [[ -d $1 ]] ; then
160 then 214 # 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 ... 215 set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"}
162 if [ "${EPATCH_FORCE}" = "yes" ] && [ -z "${EPATCH_SUFFIX}" ] 216
217 else
218 # sanity check ... if it isn't a dir or file, wtf man ?
219 [[ $# -ne 0 ]] && EPATCH_SOURCE=$1
220 echo
221 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
222 eerror
223 eerror " ${EPATCH_SOURCE}"
224 eerror " ( ${EPATCH_SOURCE##*/} )"
225 echo
226 die "Cannot find \$EPATCH_SOURCE!"
227 fi
228
229 local PIPE_CMD
230 case ${EPATCH_SUFFIX##*\.} in
231 xz) PIPE_CMD="xz -dc" ;;
232 lzma) PIPE_CMD="lzma -dc" ;;
233 bz2) PIPE_CMD="bzip2 -dc" ;;
234 gz|Z|z) PIPE_CMD="gzip -dc" ;;
235 ZIP|zip) PIPE_CMD="unzip -p" ;;
236 *) ;;
237 esac
238
239 [[ ${SINGLE_PATCH} == "no" ]] && einfo "${EPATCH_MULTI_MSG}"
240
241 local x
242 for x in "$@" ; do
243 # If the patch dir given contains subdirs, or our EPATCH_SUFFIX
244 # didn't match anything, ignore continue on
245 [[ ! -f ${x} ]] && continue
246
247 local patchname=${x##*/}
248
249 # Apply single patches, or forced sets of patches, or
250 # patches with ARCH dependant names.
251 # ???_arch_foo.patch
252 # Else, skip this input altogether
253 local a=${patchname#*_} # strip the ???_
254 a=${a%%_*} # strip the _foo.patch
255 if ! [[ ${SINGLE_PATCH} == "yes" || \
256 ${EPATCH_FORCE} == "yes" || \
257 ${a} == all || \
258 ${a} == ${ARCH} ]]
163 then 259 then
164 local EPATCH_SOURCE="$1/*" 260 continue
165 else
166 local EPATCH_SOURCE="$1/*.${EPATCH_SUFFIX}"
167 fi
168 else
169 if [[ ! -d ${EPATCH_SOURCE} ]] || [[ -n $1 ]] ; then
170 if [ -n "$1" -a "${EPATCH_SOURCE}" = "${WORKDIR}/patch" ]
171 then
172 EPATCH_SOURCE="$1"
173 fi 261 fi
174 262
175 echo 263 # Let people filter things dynamically
176 eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:"
177 eerror
178 eerror " ${EPATCH_SOURCE}"
179 eerror " ( ${EPATCH_SOURCE##*/} )"
180 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}" ] 264 if [[ -n ${EPATCH_EXCLUDE} ]] ; then
229 then 265 # let people use globs in the exclude
230 if [ "${EPATCH_EXCLUDE/${patchname}}" != "${EPATCH_EXCLUDE}" ] 266 eshopts_push -o noglob
231 then 267
268 local ex
269 for ex in ${EPATCH_EXCLUDE} ; do
270 if [[ ${patchname} == ${ex} ]] ; then
271 eshopts_pop
232 continue 272 continue
233 fi 273 fi
274 done
275 eshopts_pop
276 fi
277
278 if [[ ${SINGLE_PATCH} == "yes" ]] ; then
279 if [[ -n ${EPATCH_SINGLE_MSG} ]] ; then
280 einfo "${EPATCH_SINGLE_MSG}"
281 else
282 einfo "Applying ${patchname} ..."
234 fi 283 fi
235
236 if [ "${SINGLE_PATCH}" = "yes" ]
237 then
238 if [ -n "${EPATCH_SINGLE_MSG}" ]
239 then
240 einfo "${EPATCH_SINGLE_MSG}"
241 else 284 else
242 einfo "Applying ${patchname} ..." 285 einfo " ${patchname} ..."
286 fi
287
288 # most of the time, there will only be one run per unique name,
289 # but if there are more, make sure we get unique log filenames
290 local STDERR_TARGET="${T}/${patchname}.out"
291 if [[ -e ${STDERR_TARGET} ]] ; then
292 STDERR_TARGET="${T}/${patchname}-$$.out"
293 fi
294
295 printf "***** %s *****\n\n" "${patchname}" > "${STDERR_TARGET}"
296
297 # Decompress the patch if need be
298 local count=0
299 local PATCH_TARGET
300 if [[ -n ${PIPE_CMD} ]] ; then
301 PATCH_TARGET="${T}/$$.patch"
302 echo "PIPE_COMMAND: ${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> "${STDERR_TARGET}"
303
304 if ! (${PIPE_CMD} "${x}" > "${PATCH_TARGET}") >> "${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 printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}"
323 fi
324
325 # Dynamically detect the correct -p# ... i'm lazy, so shoot me :/
326 while [[ ${count} -lt 5 ]] ; do
327 # Generate some useful debug info ...
328 (
329 _epatch_draw_line "***** ${patchname} *****"
330 echo
331 echo "PATCH COMMAND: patch -p${count} ${EPATCH_OPTS} < '${PATCH_TARGET}'"
332 echo
333 _epatch_draw_line "***** ${patchname} *****"
334 ) >> "${STDERR_TARGET}"
335
336 if (patch -p${count} ${EPATCH_OPTS} --dry-run -f < "${PATCH_TARGET}") >> "${STDERR_TARGET}" 2>&1 ; then
337 (
338 _epatch_draw_line "***** ${patchname} *****"
339 echo
340 echo "ACTUALLY APPLYING ${patchname} ..."
341 echo
342 _epatch_draw_line "***** ${patchname} *****"
343 patch -p${count} ${EPATCH_OPTS} < "${PATCH_TARGET}" 2>&1
344 ) >> "${STDERR_TARGET}"
345
346 if [ $? -ne 0 ] ; then
347 echo
348 eerror "A dry-run of patch command succeeded, but actually"
349 eerror "applying the patch failed!"
350 #die "Real world sux compared to the dreamworld!"
351 count=5
243 fi 352 fi
244 else 353 break
245 einfo " ${patchname} ..."
246 fi 354 fi
247 355
248 echo "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 356 : $(( count++ ))
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 # Allow for prefix to differ ... im lazy, so shoot me :/
268 while [ "${count}" -lt 5 ]
269 do
270 # Generate some useful debug info ...
271 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
272 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
273
274 echo -n "PATCH COMMAND: " >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
275 echo "patch -p${count} ${popts} < ${PATCH_TARGET}" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
276
277 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
278 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
279
280 if (cat ${PATCH_TARGET} | patch -p${count} ${popts} --dry-run -f ; _epatch_assert) >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 2>&1
281 then
282 _epatch_draw_line "***** ${patchname} *****" > ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
283 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
284 echo "ACTUALLY APPLYING ${patchname} ..." >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
285 echo >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
286 _epatch_draw_line "***** ${patchname} *****" >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
287
288 cat ${PATCH_TARGET} | patch -p${count} ${popts} >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real 2>&1
289 _epatch_assert
290
291 if [ "$?" -ne 0 ]
292 then
293 cat ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real >> ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}
294 echo
295 eerror "A dry-run of patch command succeeded, but actually"
296 eerror "applying the patch failed!"
297 #die "Real world sux compared to the dreamworld!"
298 count=5
299 fi
300
301 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}.real
302
303 break
304 fi
305
306 count=$((count + 1))
307 done 357 done
308 358
309 if [ "${PATCH_SUFFIX}" != "patch" ] 359 # if we had to decompress the patch, delete the temp one
310 then 360 if [[ -n ${PIPE_CMD} ]] ; then
311 rm -f ${PATCH_TARGET} 361 rm -f "${PATCH_TARGET}"
312 fi 362 fi
313 363
314 if [ "${count}" -eq 5 ] 364 if [[ ${count} -ge 5 ]] ; then
315 then
316 echo 365 echo
317 eerror "Failed Patch: ${patchname} !" 366 eerror "Failed Patch: ${patchname} !"
318 eerror " ( ${PATCH_TARGET} )" 367 eerror " ( ${PATCH_TARGET} )"
319 eerror 368 eerror
320 eerror "Include in your bugreport the contents of:" 369 eerror "Include in your bugreport the contents of:"
321 eerror 370 eerror
322 eerror " ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/}" 371 eerror " ${STDERR_TARGET}"
323 echo 372 echo
324 die "Failed Patch: ${patchname}!" 373 die "Failed Patch: ${patchname}!"
325 fi 374 fi
326 375
327 rm -f ${STDERR_TARGET%/*}/${patchname}-${STDERR_TARGET##*/} 376 # if everything worked, delete the patch log
328 377 rm -f "${STDERR_TARGET}"
329 eend 0 378 eend 0
330 fi
331 done 379 done
332 if [ "${SINGLE_PATCH}" = "no" ] 380
333 then 381 [[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"
334 einfo "Done with patching" 382 : # everything worked
383}
384epatch_user() {
385 [[ $# -ne 0 ]] && die "epatch_user takes no options"
386
387 # don't clobber any EPATCH vars that the parent might want
388 local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches
389 for check in {${CATEGORY}/${PF},${CATEGORY}/${P},${CATEGORY}/${PN}}; do
390 EPATCH_SOURCE=${base}/${CTARGET}/${check}
391 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check}
392 [[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check}
393 if [[ -d ${EPATCH_SOURCE} ]] ; then
394 EPATCH_SOURCE=${EPATCH_SOURCE} \
395 EPATCH_SUFFIX="patch" \
396 EPATCH_FORCE="yes" \
397 EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." \
398 epatch
399 break
335 fi 400 fi
401 done
336} 402}
337 403
338# @FUNCTION: emktemp 404# @FUNCTION: emktemp
339# @USAGE: [temp dir] 405# @USAGE: [temp dir]
340# @DESCRIPTION: 406# @DESCRIPTION:
376# base-system@gentoo.org (Linux) 442# base-system@gentoo.org (Linux)
377# Joe Jezak <josejx@gmail.com> (OS X) 443# Joe Jezak <josejx@gmail.com> (OS X)
378# usata@gentoo.org (OS X) 444# usata@gentoo.org (OS X)
379# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD) 445# Aaron Walker <ka0ttic@gentoo.org> (FreeBSD)
380# @DESCRIPTION: 446# @DESCRIPTION:
381# Small wrapper for getent (Linux), nidump (Mac OS X), 447# Small wrapper for getent (Linux),
448# nidump (< Mac OS X 10.5), dscl (Mac OS X 10.5),
382# and pw (FreeBSD) used in enewuser()/enewgroup() 449# and pw (FreeBSD) used in enewuser()/enewgroup()
383egetent() { 450egetent() {
384 case ${CHOST} in 451 case ${CHOST} in
385 *-darwin*) 452 *-darwin[678])
386 case "$2" in 453 case "$2" in
387 *[!0-9]*) # Non numeric 454 *[!0-9]*) # Non numeric
388 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }" 455 nidump $1 . | awk -F":" "{ if (\$1 ~ /^$2$/) {print \$0;exit;} }"
389 ;; 456 ;;
390 *) # Numeric 457 *) # Numeric
391 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }" 458 nidump $1 . | awk -F":" "{ if (\$3 == $2) {print \$0;exit;} }"
459 ;;
460 esac
461 ;;
462 *-darwin*)
463 local mytype=$1
464 [[ "passwd" == $mytype ]] && mytype="Users"
465 [[ "group" == $mytype ]] && mytype="Groups"
466 case "$2" in
467 *[!0-9]*) # Non numeric
468 dscl . -read /$mytype/$2 2>/dev/null |grep RecordName
469 ;;
470 *) # Numeric
471 local mykey="UniqueID"
472 [[ $mytype == "Groups" ]] && mykey="PrimaryGroupID"
473 dscl . -search /$mytype $mykey $2 2>/dev/null
392 ;; 474 ;;
393 esac 475 esac
394 ;; 476 ;;
395 *-freebsd*|*-dragonfly*) 477 *-freebsd*|*-dragonfly*)
396 local opts action="user" 478 local opts action="user"
596 fi 678 fi
597 ;; 679 ;;
598 680
599 *) 681 *)
600 if [[ -z $@ ]] ; then 682 if [[ -z $@ ]] ; then
601 useradd ${opts} ${euser} \ 683 useradd ${opts} \
602 -c "added by portage for ${PN}" \ 684 -c "added by portage for ${PN}" \
685 ${euser} \
603 || die "enewuser failed" 686 || die "enewuser failed"
604 else 687 else
605 einfo " - Extra: $@" 688 einfo " - Extra: $@"
606 useradd ${opts} ${euser} "$@" \ 689 useradd ${opts} "$@" \
690 ${euser} \
607 || die "enewuser failed" 691 || die "enewuser failed"
608 fi 692 fi
609 ;; 693 ;;
610 esac 694 esac
611 695
893 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop" 977 local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop"
894 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop 978 #local desktop=${T}/${exec%% *:-${desktop_name}}.desktop
895 979
896 cat <<-EOF > "${desktop}" 980 cat <<-EOF > "${desktop}"
897 [Desktop Entry] 981 [Desktop Entry]
898 Version=1.0
899 Name=${name} 982 Name=${name}
900 Type=Application 983 Type=Application
901 Comment=${DESCRIPTION} 984 Comment=${DESCRIPTION}
902 Exec=${exec} 985 Exec=${exec}
903 TryExec=${exec%% *} 986 TryExec=${exec%% *}
942 einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo." 1025 einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo."
943 fi 1026 fi
944} 1027}
945 1028
946# @FUNCTION: make_session_desktop 1029# @FUNCTION: make_session_desktop
947# @USAGE: <title> <command> 1030# @USAGE: <title> <command> [command args...]
948# @DESCRIPTION: 1031# @DESCRIPTION:
949# Make a GDM/KDM Session file. The title is the file to execute to start the 1032# Make a GDM/KDM Session file. The title is the file to execute to start the
950# Window Manager. The command is the name of the Window Manager. 1033# Window Manager. The command is the name of the Window Manager.
1034#
1035# You can set the name of the file via the ${wm} variable.
951make_session_desktop() { 1036make_session_desktop() {
952 [[ -z $1 ]] && eerror "make_session_desktop: You must specify the title" && return 1 1037 [[ -z $1 ]] && eerror "$0: You must specify the title" && return 1
953 [[ -z $2 ]] && eerror "make_session_desktop: You must specify the command" && return 1 1038 [[ -z $2 ]] && eerror "$0: You must specify the command" && return 1
954 1039
955 local title=$1 1040 local title=$1
956 local command=$2 1041 local command=$2
957 local desktop=${T}/${wm}.desktop 1042 local desktop=${T}/${wm:-${PN}}.desktop
1043 shift 2
958 1044
959 cat <<-EOF > "${desktop}" 1045 cat <<-EOF > "${desktop}"
960 [Desktop Entry] 1046 [Desktop Entry]
961 Name=${title} 1047 Name=${title}
962 Comment=This session logs you into ${title} 1048 Comment=This session logs you into ${title}
963 Exec=${command} 1049 Exec=${command} $*
964 TryExec=${command} 1050 TryExec=${command}
965 Type=Application 1051 Type=XSession
966 EOF 1052 EOF
967 1053
968 ( 1054 (
969 # wrap the env here so that the 'insinto' call 1055 # wrap the env here so that the 'insinto' call
970 # doesn't corrupt the env of the caller 1056 # doesn't corrupt the env of the caller
1282 lic="${PWD}/${lic}" 1368 lic="${PWD}/${lic}"
1283 elif [ -e "${lic}" ] ; then 1369 elif [ -e "${lic}" ] ; then
1284 lic="${lic}" 1370 lic="${lic}"
1285 fi 1371 fi
1286 fi 1372 fi
1287 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1288 local l="`basename ${lic}`" 1373 local l="`basename ${lic}`"
1289 1374
1290 # here is where we check for the licenses the user already 1375 # here is where we check for the licenses the user already
1291 # accepted ... if we don't find a match, we make the user accept 1376 # accepted ... if we don't find a match, we make the user accept
1292 local shopts=$-
1293 local alic 1377 local alic
1294 set -o noglob #so that bash doesn't expand "*" 1378 eshopts_push -o noglob # so that bash doesn't expand "*"
1295 for alic in ${ACCEPT_LICENSE} ; do 1379 for alic in ${ACCEPT_LICENSE} ; do
1296 if [[ ${alic} == ${l} ]]; then 1380 if [[ ${alic} == ${l} ]]; then
1297 set +o noglob; set -${shopts} #reset old shell opts 1381 eshopts_pop
1298 return 0 1382 return 0
1299 fi 1383 fi
1300 done 1384 done
1301 set +o noglob; set -$shopts #reset old shell opts 1385 eshopts_pop
1386 [ ! -f "${lic}" ] && die "Could not find requested license ${lic}"
1302 1387
1303 local licmsg=$(emktemp) 1388 local licmsg=$(emktemp)
1304 cat <<-EOF > ${licmsg} 1389 cat <<-EOF > ${licmsg}
1305 ********************************************************** 1390 **********************************************************
1306 The following license outlines the terms of use of this 1391 The following license outlines the terms of use of this
1553# of the lists. 1638# of the lists.
1554strip-linguas() { 1639strip-linguas() {
1555 local ls newls nols 1640 local ls newls nols
1556 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then 1641 if [[ $1 == "-i" ]] || [[ $1 == "-u" ]] ; then
1557 local op=$1; shift 1642 local op=$1; shift
1558 ls=$(find "$1" -name '*.po' -exec basename {} .po \;); shift 1643 ls=$(find "$1" -name '*.po' -exec basename {} .po ';'); shift
1559 local d f 1644 local d f
1560 for d in "$@" ; do 1645 for d in "$@" ; do
1561 if [[ ${op} == "-u" ]] ; then 1646 if [[ ${op} == "-u" ]] ; then
1562 newls=${ls} 1647 newls=${ls}
1563 else 1648 else
1564 newls="" 1649 newls=""
1565 fi 1650 fi
1566 for f in $(find "$d" -name '*.po' -exec basename {} .po \;) ; do 1651 for f in $(find "$d" -name '*.po' -exec basename {} .po ';') ; do
1567 if [[ ${op} == "-i" ]] ; then 1652 if [[ ${op} == "-i" ]] ; then
1568 hasq ${f} ${ls} && newls="${newls} ${f}" 1653 hasq ${f} ${ls} && newls="${newls} ${f}"
1569 else 1654 else
1570 hasq ${f} ${ls} || newls="${newls} ${f}" 1655 hasq ${f} ${ls} || newls="${newls} ${f}"
1571 fi 1656 fi
1584 else 1669 else
1585 nols="${nols} ${f}" 1670 nols="${nols} ${f}"
1586 fi 1671 fi
1587 done 1672 done
1588 [[ -n ${nols} ]] \ 1673 [[ -n ${nols} ]] \
1589 && ewarn "Sorry, but ${PN} does not support the LINGUAs:" ${nols} 1674 && ewarn "Sorry, but ${PN} does not support the LINGUAS:" ${nols}
1590 export LINGUAS=${newls:1} 1675 export LINGUAS=${newls:1}
1591} 1676}
1592 1677
1593# @FUNCTION: preserve_old_lib 1678# @FUNCTION: preserve_old_lib
1594# @USAGE: <libs to preserve> [more libs] 1679# @USAGE: <libs to preserve> [more libs]
1794 ) || die 1879 ) || die
1795 else 1880 else
1796 newbin "${tmpwrapper}" "${wrapper}" || die 1881 newbin "${tmpwrapper}" "${wrapper}" || die
1797 fi 1882 fi
1798} 1883}
1884
1885# @FUNCTION: prepalldocs
1886# @USAGE:
1887# @DESCRIPTION:
1888# Compress files in /usr/share/doc which are not already
1889# compressed, excluding /usr/share/doc/${PF}/html.
1890# Uses the ecompressdir to do the compression.
1891# 2009-02-18 by betelgeuse:
1892# Commented because ecompressdir is even more internal to
1893# Portage than prepalldocs (it's not even mentioned in man 5
1894# ebuild). Please submit a better version for review to gentoo-dev
1895# if you want prepalldocs here.
1896#prepalldocs() {
1897# if [[ -n $1 ]] ; then
1898# ewarn "prepalldocs: invalid usage; takes no arguments"
1899# fi
1900
1901# cd "${D}"
1902# [[ -d usr/share/doc ]] || return 0
1903
1904# find usr/share/doc -exec gzip {} +
1905# ecompressdir --ignore /usr/share/doc/${PF}/html
1906# ecompressdir --queue /usr/share/doc
1907#}

Legend:
Removed from v.1.304  
changed lines
  Added in v.1.325

  ViewVC Help
Powered by ViewVC 1.1.20