Gentoo Logo
Gentoo Spaceship




Note: Due to technical difficulties, the Archives are currently not up to date. GMANE provides an alternative service for most mailing lists.
c.f. bug 424647
List Archive: gentoo-dev
Navigation:
Lists: gentoo-dev: < Prev By Thread Next > < Prev By Date Next >
Headers:
To: gentoo-dev@g.o
From: Mike Frysinger <vapier@g.o>
Subject: Re: estack_{push,pop}: cool new helpers or over engineering?
Date: Wed, 14 Dec 2011 18:49:49 -0500
some people pointed out typos/bugs, so here's v2
-mike

--- eutils.eclass	14 Dec 2011 17:36:18 -0000	1.372
+++ eutils.eclass	14 Dec 2011 23:46:37 -0000
@@ -100,6 +100,54 @@ esvn_clean() {
 	find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
 }
 
+# @FUNCTION: estack_push
+# @USAGE: <stack> [items to push]
+# @DESCRIPTION:
+# Push any number of items onto the specified stack.  Pick a name that
+# is a valid variable (i.e. stick to alphanumerics), and push as many
+# items as you like onto the stack at once.
+#
+# The following code snippet will echo 5, then 4, then 3, then ...
+# @CODE
+#		estack_push mystack 1 2 3 4 5
+#		while estack_pop mystack i ; do
+#			echo ${i}
+#		done
+# @CODE
+estack_push() {
+	[[ $# -eq 0 ]] && die "estack_push: incorrect # of arguments"
+	local stack_name="__ESTACK_$1__" ; shift
+	eval ${stack_name}+=\( \"\$@\" \)
+}
+
+# @FUNCTION: estack_pop
+# @USAGE: <stack> [variable]
+# @DESCRIPTION:
+# Pop a single item off the specified stack.  If a variable is specified,
+# the popped item is stored there.  If no more items are available, return
+# 1, else return 0.  See estack_push for more info.
+estack_pop() {
+	( [[ $# -eq 0 ]] || [[ $# -gt 2 ]] ) && die "estack_pop: incorrect # of arguments"
+
+	# We use the fugly __estack_xxx var names to avoid collision with
+	# passing back the return value.  If we used "local i" and the
+	# caller ran `estack_pop ... i`, we'd end up setting the local
+	# copy of "i" rather than the caller's copy.  The __estack_xxx
+	# garbage is preferable to using $1/$2 everywhere as that is a
+	# bit harder to read.
+	local __estack_name="__ESTACK_$1__" ; shift
+	local __estack_retvar=$1 ; shift
+	eval local __estack_i=\${#${__estack_name}[@]}
+	# Don't warn -- let the caller interpret this as a failure
+	# or as normal behavior (akin to `shift`)
+	[[ $(( --__estack_i )) -eq -1 ]] && return 1
+
+	if [[ -n ${__estack_retvar} ]] ; then
+		eval ${__estack_retvar}=\"\${${__estack_name}[${__estack_i}]}\"
+	fi
+	eval unset ${__estack_name}[${__estack_i}]
+}
+
 # @FUNCTION: eshopts_push
 # @USAGE: [options to `set` or `shopt`]
 # @DESCRIPTION:
@@ -126,15 +174,14 @@ esvn_clean() {
 eshopts_push() {
 	# have to assume __ESHOPTS_SAVE__ isn't screwed with
 	# as a `declare -a` here will reset its value
-	local i=${#__ESHOPTS_SAVE__[@]}
 	if [[ $1 == -[su] ]] ; then
-		__ESHOPTS_SAVE__[$i]=$(shopt -p)
+		estack_push eshopts "$(shopt -p)"
 		[[ $# -eq 0 ]] && return 0
 		shopt "$@" || die "eshopts_push: bad options to shopt: $*"
 	else
-		__ESHOPTS_SAVE__[$i]=$-
+		estack_push eshopts $-
 		[[ $# -eq 0 ]] && return 0
 		set "$@" || die "eshopts_push: bad options to set: $*"
 	fi
 }
 
@@ -144,19 +191,36 @@ eshopts_push() {
 # Restore the shell options to the state saved with the corresponding
 # eshopts_push call.  See that function for more details.
 eshopts_pop() {
-	[[ $# -ne 0 ]] && die "eshopts_pop takes no arguments"
-	local i=$(( ${#__ESHOPTS_SAVE__[@]} - 1 ))
-	[[ ${i} -eq -1 ]] && die "eshopts_{push,pop}: unbalanced pair"
-	local s=${__ESHOPTS_SAVE__[$i]}
-	unset __ESHOPTS_SAVE__[$i]
+	local s
+	estack_pop eshopts s || die "${FUNCNAME}: unbalanced push"
 	if [[ ${s} == "shopt -"* ]] ; then
 		eval "${s}" || die "eshopts_pop: sanity: invalid shopt options: ${s}"
 	else
 		set +$-     || die "eshopts_pop: sanity: invalid shell settings: $-"
 		set -${s}   || die "eshopts_pop: sanity: unable to restore saved shell settings: ${s}"
 	fi
 }
 
+# @FUNCTION: eumask_push
+# @USAGE: <new umask>
+# @DESCRIPTION:
+# Set the umask to the new value specified while saving the previous
+# value onto a stack.  Useful for temporarily changing the umask.
+eumask_push() {
+	estack_push eumask "$(umask)"
+	umask "$@" || die "${FUNCNAME}: bad options to umask: $*"
+}
+
+# @FUNCTION: eumask_pop
+# @USAGE:
+# @DESCRIPTION:
+# Restore the previous umask state.
+eumask_pop() {
+	local s
+	estack_pop eumask s || die "${FUNCNAME}: unbalanced push"
+	umask ${s} || die "${FUNCNAME}: sanity: could not restore umask: ${s}"
+}
+
 # @VARIABLE: EPATCH_SOURCE
 # @DESCRIPTION:
 # Default directory to search for patches.
Attachment:
signature.asc (This is a digitally signed message part.)
Replies:
Re: estack_{push,pop}: cool new helpers or over engineering?
-- Steven J Long
References:
estack_{push,pop}: cool new helpers or over engineering?
-- Mike Frysinger
Navigation:
Lists: gentoo-dev: < Prev By Thread Next > < Prev By Date Next >
Previous by thread:
estack_{push,pop}: cool new helpers or over engineering?
Next by thread:
Re: estack_{push,pop}: cool new helpers or over engineering?
Previous by date:
Re: Six month major project on Gentoo
Next by date:
Re: Six month major project on Gentoo


Updated Jun 29, 2012

Summary: Archive of the gentoo-dev mailing list.

Donate to support our development efforts.

Copyright 2001-2013 Gentoo Foundation, Inc. Questions, Comments? Contact us.