On Sat, Oct 27, 2012 at 04:08:31PM +0200, Michał Górny wrote: > On Sat, 27 Oct 2012 16:27:27 +0300 > Reinis Danne <[email protected]> wrote: > > > On Sat, Oct 27, 2012 at 01:02:47PM +0200, Michał Górny wrote: > > > This can be used to create copies of Python scripts for various > > > implementation when build system doesn't do that. > > > --- > > > gx86/eclass/python-r1.eclass | 126 > > > +++++++++++++++++++++++++++++++++++++++++++ > > > 1 file changed, 126 insertions(+) > > > > > > diff --git a/gx86/eclass/python-r1.eclass b/gx86/eclass/python-r1.eclass > > > index d7cdfa8..6178969 100644 > > > --- a/gx86/eclass/python-r1.eclass > > > +++ b/gx86/eclass/python-r1.eclass > > > @@ -412,3 +412,129 @@ python_export_best() { > > > debug-print "${FUNCNAME}: Best implementation is: ${impl}" > > > python_export "${impl}" "${@}" > > > } > > > + > > > +# @FUNCTION: _python_rewrite_shebang > > > +# @INTERNAL > > > +# @USAGE: [<EPYTHON>] <path>... > > > +# @DESCRIPTION: > > > +# Replaces 'python' executable in the shebang with the executable name > > > +# of the specified interpreter. If no EPYTHON value (implementation) is > > > +# used, the current ${EPYTHON} will be used. > > > +# > > > +# All specified files must start with a 'python' shebang. A file not > > > +# having a matching shebang will be refused. The exact shebang style > > > +# will be preserved in order not to break anything. > > > +# > > > +# Example conversions: > > > +# @CODE > > > +# From: #!/usr/bin/python -R > > > +# To: #!/usr/bin/python2.7 -R > > > +# > > > +# From: #!/usr/bin/env FOO=bar python > > > +# To: #!/usr/bin/env FOO=bar python2.7 > > > +# @CODE > > > +_python_rewrite_shebang() { > > > + debug-print-function ${FUNCNAME} "${@}" > > > + > > > + local impl > > > + case "${1}" in > > > + python*|jython*|pypy-c*) > > > + impl=${1} > > > + shift > > > + ;; > > > + *) > > > + impl=${EPYTHON} > > > + [[ ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON" > > > + ;; > > > + esac > > > + debug-print "${FUNCNAME}: implementation: ${impl}" > > > + > > > + local f > > > + for f; do > > > + local shebang=$(head -n 1 "${f}") > > > + debug-print "${FUNCNAME}: path = ${f}" > > > + debug-print "${FUNCNAME}: shebang = ${shebang}" > > > + > > > + if [[ ${shebang} != *python* ]]; then > > > + eerror "A file does not seem to have a supported > > > shebang:" > > > + eerror " file: ${f}" > > > + eerror " shebang: ${shebang}" > > > + die "${FUNCNAME}: ${f} does not seem to have a valid > > > shebang" > > > + fi > > > + > > > + sed -i -e "s:python:${impl}:" "${f}" || die > > > + done > > > +} > > > > Better would be also to check if the shebang already has > > specific python version and in such a case probably an error > > message would be appropriate, so ebuild should explicitly change > > it to bare "python" if replication for versions is desired. > > To be honest, I think I lack a good, simple way of guessing that. But I > guess a hack like [[ "${shebang} " != *'python '* ]] could work. > > On the other hand, I'm not sure if it shouldn't work on things like > 'python2' as well. But then, if someone ever needs that working, he can > ping me/report a bug.
I think if there is anything else than "*\bpython[23]?\ *" it becomes really error prone. I'm not sure how useful would be to handle [23] though. Reinis
