Make sbang handle lua
- use --! instead of #! for patched lua scripts.
This commit is contained in:
parent
86893e3dc4
commit
27e9bc6d02
3 changed files with 35 additions and 6 deletions
11
bin/sbang
11
bin/sbang
|
@ -79,6 +79,15 @@
|
||||||
# Obviously, for this to work, `sbang` needs to have a short enough
|
# Obviously, for this to work, `sbang` needs to have a short enough
|
||||||
# path that *it* will run without hitting OS limits.
|
# path that *it* will run without hitting OS limits.
|
||||||
#
|
#
|
||||||
|
# For Lua, scripts the second line can't start with #!, as # is not
|
||||||
|
# the comment character in lua (even though lua ignores #! on the
|
||||||
|
# *first* line of a script). So, instrument a lua script like this,
|
||||||
|
# using -- instead of # on the second line:
|
||||||
|
#
|
||||||
|
# 1 #!/bin/bash /path/to/sbang
|
||||||
|
# 2 --!/long/path/to/lua with arguments
|
||||||
|
# 3
|
||||||
|
# 4 print "success!"
|
||||||
#
|
#
|
||||||
# How it works
|
# How it works
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
|
@ -95,6 +104,8 @@ lines=0
|
||||||
while read line && ((lines < 2)) ; do
|
while read line && ((lines < 2)) ; do
|
||||||
if [[ "$line" = '#!'* ]]; then
|
if [[ "$line" = '#!'* ]]; then
|
||||||
interpreter="${line#\#!}"
|
interpreter="${line#\#!}"
|
||||||
|
elif [[ "$line" = '--!'*lua* ]]; then
|
||||||
|
interpreter="${line#--!}"
|
||||||
fi
|
fi
|
||||||
lines=$((lines+1))
|
lines=$((lines+1))
|
||||||
done < "$script"
|
done < "$script"
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##############################################################################
|
##############################################################################
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
import llnl.util.tty as tty
|
import llnl.util.tty as tty
|
||||||
|
|
||||||
|
@ -57,11 +58,15 @@ def filter_shebang(path):
|
||||||
if original.startswith(new_sbang_line):
|
if original.startswith(new_sbang_line):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Use --! instead of #! on second line for lua.
|
||||||
|
if re.search(r'^#!(/[^/]*)*lua\b', original):
|
||||||
|
original = re.sub(r'^#', '--', original)
|
||||||
|
|
||||||
with open(path, 'w') as new_file:
|
with open(path, 'w') as new_file:
|
||||||
new_file.write(new_sbang_line)
|
new_file.write(new_sbang_line)
|
||||||
new_file.write(original)
|
new_file.write(original)
|
||||||
|
|
||||||
tty.warn("Patched overly long shebang in %s" % path)
|
tty.warn("Patched overlong shebang in %s" % path)
|
||||||
|
|
||||||
|
|
||||||
def filter_shebangs_in_directory(directory):
|
def filter_shebangs_in_directory(directory):
|
||||||
|
|
|
@ -34,10 +34,12 @@
|
||||||
from spack.hooks.sbang import filter_shebangs_in_directory
|
from spack.hooks.sbang import filter_shebangs_in_directory
|
||||||
import spack
|
import spack
|
||||||
|
|
||||||
short_line = "#!/this/is/short/bin/bash\n"
|
short_line = "#!/this/is/short/bin/bash\n"
|
||||||
long_line = "#!/this/" + ('x' * 200) + "/is/long\n"
|
long_line = "#!/this/" + ('x' * 200) + "/is/long\n"
|
||||||
sbang_line = '#!/bin/bash %s/bin/sbang\n' % spack.spack_root
|
lua_line = "#!/this/" + ('x' * 200) + "/is/lua\n"
|
||||||
last_line = "last!\n"
|
lua_line_patched = "--!/this/" + ('x' * 200) + "/is/lua\n"
|
||||||
|
sbang_line = '#!/bin/bash %s/bin/sbang\n' % spack.spack_root
|
||||||
|
last_line = "last!\n"
|
||||||
|
|
||||||
class SbangTest(unittest.TestCase):
|
class SbangTest(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -59,6 +61,12 @@ def setUp(self):
|
||||||
f.write(long_line)
|
f.write(long_line)
|
||||||
f.write(last_line)
|
f.write(last_line)
|
||||||
|
|
||||||
|
# Lua script with long shebang
|
||||||
|
self.lua_shebang = os.path.join(self.tempdir, 'lua')
|
||||||
|
with open(self.lua_shebang, 'w') as f:
|
||||||
|
f.write(lua_line)
|
||||||
|
f.write(last_line)
|
||||||
|
|
||||||
# Script already using sbang.
|
# Script already using sbang.
|
||||||
self.has_shebang = os.path.join(self.tempdir, 'shebang')
|
self.has_shebang = os.path.join(self.tempdir, 'shebang')
|
||||||
with open(self.has_shebang, 'w') as f:
|
with open(self.has_shebang, 'w') as f:
|
||||||
|
@ -71,7 +79,6 @@ def tearDown(self):
|
||||||
shutil.rmtree(self.tempdir, ignore_errors=True)
|
shutil.rmtree(self.tempdir, ignore_errors=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def test_shebang_handling(self):
|
def test_shebang_handling(self):
|
||||||
filter_shebangs_in_directory(self.tempdir)
|
filter_shebangs_in_directory(self.tempdir)
|
||||||
|
|
||||||
|
@ -86,6 +93,12 @@ def test_shebang_handling(self):
|
||||||
self.assertEqual(f.readline(), long_line)
|
self.assertEqual(f.readline(), long_line)
|
||||||
self.assertEqual(f.readline(), last_line)
|
self.assertEqual(f.readline(), last_line)
|
||||||
|
|
||||||
|
# Make sure this got patched.
|
||||||
|
with open(self.lua_shebang, 'r') as f:
|
||||||
|
self.assertEqual(f.readline(), sbang_line)
|
||||||
|
self.assertEqual(f.readline(), lua_line_patched)
|
||||||
|
self.assertEqual(f.readline(), last_line)
|
||||||
|
|
||||||
# Make sure this is untouched
|
# Make sure this is untouched
|
||||||
with open(self.has_shebang, 'r') as f:
|
with open(self.has_shebang, 'r') as f:
|
||||||
self.assertEqual(f.readline(), sbang_line)
|
self.assertEqual(f.readline(), sbang_line)
|
||||||
|
|
Loading…
Reference in a new issue