mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Merge pull request #1854 from github/more-shebang-fixes
More shebang fixes
This commit is contained in:
@@ -18,23 +18,32 @@ module Linguist
|
|||||||
#
|
#
|
||||||
# Returns a String or nil
|
# Returns a String or nil
|
||||||
def self.interpreter(data)
|
def self.interpreter(data)
|
||||||
lines = data.lines
|
shebang = data.lines.first
|
||||||
return unless match = /^#! ?(.+)$/.match(lines.first)
|
|
||||||
|
|
||||||
tokens = match[1].split(' ')
|
# First line must start with #!
|
||||||
script = tokens.first.split('/').last
|
return unless shebang && shebang.start_with?("#!")
|
||||||
|
|
||||||
|
# Get the parts of the shebang without the #!
|
||||||
|
tokens = shebang.sub(/^#!\s*/, '').strip.split(' ')
|
||||||
|
|
||||||
|
# There was nothing after the #!
|
||||||
|
return if tokens.empty?
|
||||||
|
|
||||||
|
# Get the name of the interpreter
|
||||||
|
script = File.basename(tokens.first)
|
||||||
|
|
||||||
|
# Get next argument if interpreter was /usr/bin/env
|
||||||
script = tokens[1] if script == 'env'
|
script = tokens[1] if script == 'env'
|
||||||
|
|
||||||
# If script has an invalid shebang, we might get here
|
# Interpreter was /usr/bin/env with no arguments
|
||||||
return unless script
|
return unless script
|
||||||
|
|
||||||
# "python2.6" -> "python2"
|
# "python2.6" -> "python2"
|
||||||
script.sub! $1, '' if script =~ /(\.\d+)$/
|
script.sub! /(\.\d+)$/, ''
|
||||||
|
|
||||||
# Check for multiline shebang hacks that call `exec`
|
# Check for multiline shebang hacks that call `exec`
|
||||||
if script == 'sh' &&
|
if script == 'sh' &&
|
||||||
lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
|
data.lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
|
||||||
script = $1
|
script = $1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ class TestShebang < Test::Unit::TestCase
|
|||||||
assert_interpreter nil, " #!/usr/sbin/ruby"
|
assert_interpreter nil, " #!/usr/sbin/ruby"
|
||||||
assert_interpreter nil, "\n#!/usr/sbin/ruby"
|
assert_interpreter nil, "\n#!/usr/sbin/ruby"
|
||||||
assert_interpreter nil, "#!"
|
assert_interpreter nil, "#!"
|
||||||
|
assert_interpreter nil, "#! "
|
||||||
|
assert_interpreter nil, "#!/usr/bin/env"
|
||||||
|
|
||||||
assert_interpreter "ruby", "#!/usr/sbin/ruby\n# bar"
|
assert_interpreter "ruby", "#!/usr/sbin/ruby\n# bar"
|
||||||
assert_interpreter "ruby", "#!/usr/bin/ruby\n# foo"
|
assert_interpreter "ruby", "#!/usr/bin/ruby\n# foo"
|
||||||
@@ -34,6 +36,8 @@ class TestShebang < Test::Unit::TestCase
|
|||||||
assert_interpreter "python3", "#!/usr/bin/python3\n\n\n\n"
|
assert_interpreter "python3", "#!/usr/bin/python3\n\n\n\n"
|
||||||
assert_interpreter "sbcl", "#!/usr/bin/sbcl --script\n\n"
|
assert_interpreter "sbcl", "#!/usr/bin/sbcl --script\n\n"
|
||||||
assert_interpreter "perl", "#! perl"
|
assert_interpreter "perl", "#! perl"
|
||||||
|
|
||||||
|
assert_interpreter "ruby", "#!/bin/sh\n\n\nexec ruby $0 $@"
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user