diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-03-04 07:44:11 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-03-04 07:44:11 +0000 |
commit | 820724b418ac0020394bfbc8f17ac9bcbb4926e5 (patch) | |
tree | bf4c085f2f33cc18e6ee10c5a3e75db219eb56cf | |
parent | 425d03f0ad6327699611fa2360d93231fc78d924 (diff) | |
download | portage-820724b418ac0020394bfbc8f17ac9bcbb4926e5.tar.gz portage-820724b418ac0020394bfbc8f17ac9bcbb4926e5.tar.bz2 portage-820724b418ac0020394bfbc8f17ac9bcbb4926e5.zip |
Add support for idendification of function definitions since it's needed
in some cases in order to prevent some odd function contents from being
mistakenly identified as invalid variable assignments. For example, this
line from _gcc-specs-directive_raw() is commonly found in environment.bz2
files:
$1=="*"directive":" { pspec=spec; spec=""; outside=0; next }
svn path=/main/trunk/; revision=9431
-rwxr-xr-x | bin/filter-bash-environment.py | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/bin/filter-bash-environment.py b/bin/filter-bash-environment.py index 691d406da..0c1e67911 100755 --- a/bin/filter-bash-environment.py +++ b/bin/filter-bash-environment.py @@ -12,6 +12,8 @@ egrep_compat_map = { } here_doc_re = re.compile(r'.*\s<<[-]?(\w+)$') +func_start_re = re.compile(r'^\s*[-\w]*\s*\(\)\s*$') +func_end_re = re.compile(r'^\}$') def compile_egrep_pattern(s): for k, v in egrep_compat_map.iteritems(): @@ -20,6 +22,7 @@ def compile_egrep_pattern(s): def filter_bash_environment(pattern, file_in, file_out): here_doc_delim = None + in_func = None for line in file_in: if here_doc_delim is not None: if here_doc_delim.match(line): @@ -31,13 +34,26 @@ def filter_bash_environment(pattern, file_in, file_out): here_doc_delim = re.compile("^%s$" % here_doc.group(1)) file_out.write(line) continue + # Note: here-documents are handled before fuctions since otherwise + # it would be possible for the content of a here-document to be + # mistaken as the end of a function. + if in_func: + if func_end_re.match(line) is not None: + in_func = None + file_out.write(line) + continue + in_func = func_start_re.match(line) + if in_func is not None: + 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 " + \ + "while leaving bash function definitions and here-documents " + \ + "intact. The PATTERN should use python regular expression syntax" + \ + " but [:digit:], [:space:] and " + \ "[:alnum:] character classes will be automatically translated " + \ "for compatibility with egrep syntax." usage = "usage: %s PATTERN" % os.path.basename(sys.argv[0]) |