From: Mike Frysinger <vapier@gentoo.org>
To: gentoo-dev@lists.gentoo.org
Subject: [gentoo-dev] evar_push/pop helpers
Date: Sat, 1 Jun 2013 23:03:20 -0400 [thread overview]
Message-ID: <201306012303.21261.vapier@gentoo.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 3013 bytes --]
simple set of helpers to save/restore a variable in a limited section of code
you can see an example of it in action at the end of the file where i need to
tweak epatch (and no, doing `LC_COLLATE=C set -- ....` does not work).
-mike
--- eutils.eclass 22 May 2013 05:10:29 -0000 1.421
+++ eutils.eclass 2 Jun 2013 03:00:46 -0000
@@ -146,6 +146,77 @@ estack_pop() {
eval unset ${__estack_name}\[${__estack_i}\]
}
+# @FUNCTION: evar_push
+# @USAGE: <variable to save> [more vars to save]
+# @DESCRIPTION:
+# This let's you temporarily modify a variable and then restore it (including
+# set vs unset semantics). Arrays are not supported at this time.
+#
+# For example:
+# @CODE
+# evar_push LC_ALL
+# export LC_ALL=C
+# ... do some stuff that needs LC_ALL=C set ...
+# evar_pop
+#
+# # You can also save/restore more than one var at a time
+# evar_push BUTTERFLY IN THE SKY
+# ... do stuff with the vars ...
+# evar_pop # This restores just one var, SKY
+# ... do more stuff ...
+# evar_pop 3 # This pops the remaining 3 vars
+# @CODE
+evar_push() {
+ local var val
+ for var ; do
+ [[ ${!var+set} == "set" ]] \
+ && val=${!var} \
+ || val="${___ECLASS_ONCE_EUTILS}"
+ estack_push evar "${var}" "${val}"
+ done
+}
+
+# @FUNCTION: evar_push_set
+# @USAGE: <variable to save> [new value to store]
+# @DESCRIPTION:
+# This is a handy shortcut to save and temporarily set a variable. If a value
+# is not specified, the var will be unset.
+evar_push_set() {
+ local var=$1
+ evar_push ${var}
+ case $# in
+ 1) unset ${var} ;;
+ 2) eval ${var}=\$2 ;;
+ *) die "${FUNCNAME}: incorrect # of args: $*" ;;
+ esac
+}
+
+# @FUNCTION: evar_pop
+# @USAGE: [number of vars to restore]
+# @DESCRIPTION:
+# Restore the variables to the state saved with the corresponding
+# evar_push call. See that function for more details.
+evar_pop() {
+ local cnt=$1
+ case $# in
+ 0) cnt=1 ;;
+ 1)
+ : ${cnt:=bad}
+ [[ -n ${cnt//[0-9]} ]] && die "${FUNCNAME}: first arg must be a number: $*"
+ ;;
+ *) die "${FUNCNAME}: only accepts one arg: $*" ;;
+ esac
+
+ local var val
+ while (( cnt-- )) ; do
+ estack_pop evar val || die "${FUNCNAME}: unbalanced push"
+ estack_pop evar var || die "${FUNCNAME}: unbalanced push"
+ [[ ${val} == "${___ECLASS_ONCE_EUTILS}" ]] \
+ && unset ${var} \
+ || eval ${var}=\${val}
+ done
+}
+
# @FUNCTION: eshopts_push
# @USAGE: [options to `set` or `shopt`]
# @DESCRIPTION:
@@ -344,8 +415,11 @@ epatch() {
local EPATCH_SUFFIX=$1
elif [[ -d $1 ]] ; then
- # Some people like to make dirs of patches w/out suffixes (vim)
+ # We have to force sorting to C so that the wildcard expansion is consistent #471666.
+ evar_push_set LC_COLLATE C
+ # Some people like to make dirs of patches w/out suffixes (vim).
set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"}
+ evar_pop
elif [[ -f ${EPATCH_SOURCE}/$1 ]] ; then
# Re-use EPATCH_SOURCE as a search dir
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
next reply other threads:[~2013-06-02 3:03 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-02 3:03 Mike Frysinger [this message]
2013-06-02 6:51 ` [gentoo-dev] evar_push/pop helpers Michał Górny
2013-06-02 7:09 ` Mike Frysinger
2013-06-02 7:16 ` Michał Górny
2013-06-02 7:29 ` Mike Frysinger
2013-06-02 7:48 ` Tom Wijsman
2013-06-17 5:45 ` Mike Frysinger
2013-06-02 8:39 ` Michał Górny
2013-06-02 15:40 ` Mike Frysinger
2013-06-02 15:57 ` Andreas K. Huettel
2013-06-02 7:33 ` Tom Wijsman
2013-06-02 17:38 ` [gentoo-dev] " Steven J. Long
2013-06-17 5:42 ` Mike Frysinger
2013-06-17 16:06 ` Mike Frysinger
2013-06-17 5:46 ` [gentoo-dev] " Mike Frysinger
2013-06-17 17:51 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201306012303.21261.vapier@gentoo.org \
--to=vapier@gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox