From: Zac Medico Date: Thu, 13 Dec 2007 05:54:49 +0000 (-0000) Subject: * In filter_readonly_variables(), replace 'declare -r ' with 'declare ' X-Git-Tag: v2.1.4~121 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=78fb2c22e9b81dd5cd2e0d35a1d7d8960bc363e7;p=portage.git * In filter_readonly_variables(), replace 'declare -r ' with 'declare ' instead of removing it completely. * Bug #202068 - In order to filter unwanted variable assignments out of the bash environment, use a filter-bash-environment.py script that behaves similar to egrep -v except that it leaves bash here- documents intact. * Use the sed -r option to enable extended regular expressions so that commonly used characters like (, ), and + don't have to be escaped. (trunk r8890:8893) svn path=/main/branches/2.1.2/; revision=8899 --- diff --git a/bin/ebuild.sh b/bin/ebuild.sh index fbccce70c..50222eb6e 100755 --- a/bin/ebuild.sh +++ b/bin/ebuild.sh @@ -1425,9 +1425,9 @@ filter_readonly_variables() { # listed in READONLY_EBUILD_METADATA, since having any readonly attributes # persisting in the saved environment can be inconvenient when it # eventually needs to be reloaded. - egrep -v -e "${var_grep}" | sed \ - -e 's:^declare[[:space:]]\+-r[[:space:]]\+::' \ - -e 's:^declare[[:space:]]\+-\([[:alnum:]]*\)r\([[:alnum:]]*\)[[:space:]]\+:declare -\1\2 :' + "${PORTAGE_BIN_PATH}"/filter-bash-environment.py "${var_grep}" | sed -r \ + -e 's:^declare[[:space:]]+-r[[:space:]]+:declare :' \ + -e 's:^declare[[:space:]]+-([[:alnum:]]*)r([[:alnum:]]*)[[:space:]]+:declare -\1\2 :' } # @FUNCTION: preprocess_ebuild_env diff --git a/bin/filter-bash-environment.py b/bin/filter-bash-environment.py new file mode 100755 index 000000000..83b250b69 --- /dev/null +++ b/bin/filter-bash-environment.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# Copyright 1999-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +import os, re, sys + +egrep_compat_map = { + "[:alnum:]" : r'\w', + "[:space:]" : r'\s', +} + +here_doc_re = re.compile(r'.*\s<<[-]?(\w+)$') + +def compile_egrep_pattern(s): + for k, v in egrep_compat_map.iteritems(): + s = s.replace(k, v) + return re.compile(s) + +def filter_bash_environment(pattern, file_in, file_out): + here_doc_delim = None + for line in file_in: + if here_doc_delim is not None: + if here_doc_delim.match(line): + here_doc_delim = None + file_out.write(line) + continue + here_doc = here_doc_re.match(line) + if here_doc is not None: + here_doc_delim = re.compile("^%s$" % here_doc.group(1)) + file_out.write(line) + continue + if pattern.match(line) is None: + file_out.write(line) + +if __name__ == "__main__": + description = "Filter out any lines that match a given PATTERN " + \ + "while leaving bash here-documents intact. The PATTERN should " + \ + "use python regular expression syntax but [:space:] and " + \ + "[:alnum:] character classes will be automatically translated " + \ + "for compatibility with egrep syntax." + usage = "usage: %s PATTERN" % os.path.basename(sys.argv[0]) + from optparse import OptionParser + parser = OptionParser(description=description, usage=usage) + options, args = parser.parse_args(sys.argv[1:]) + if len(args) != 1: + parser.error("Missing required PATTERN argument.") + file_in = sys.stdin + file_out = sys.stdout + filter_bash_environment( + compile_egrep_pattern(args[0]), file_in, file_out) + file_out.flush()