From fa5496eef49a34f8ff86e5ce27b49eb7ce395c7c Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Wed, 1 Apr 2015 20:23:16 -0500 Subject: [PATCH] Fixing up shebang detection to match new tokenizer behaviour --- lib/linguist/shebang.rb | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/linguist/shebang.rb b/lib/linguist/shebang.rb index 6f04e866..5b27532a 100644 --- a/lib/linguist/shebang.rb +++ b/lib/linguist/shebang.rb @@ -23,17 +23,20 @@ module Linguist # First line must start with #! return unless shebang && shebang.start_with?("#!") - # Get the parts of the shebang without the #! - tokens = shebang.sub(/^#!\s*/, '').strip.split(' ') + s = StringScanner.new(shebang) # There was nothing after the #! - return if tokens.empty? + return unless path = s.scan(/^#!\s*\S+/) - # Get the name of the interpreter - script = File.basename(tokens.first) + # Keep going + script = path.split('/').last - # Get next argument if interpreter was /usr/bin/env - script = tokens[1] if script == 'env' + # if /usr/bin/env type shebang then walk the string + if script == 'env' + s.scan(/\s+/) + s.scan(/.*=[^\s]+\s+/) # skip over variable arguments e.g. foo=bar + script = s.scan(/\S+/) + end # Interpreter was /usr/bin/env with no arguments return unless script @@ -41,6 +44,9 @@ module Linguist # "python2.6" -> "python2" script.sub! /(\.\d+)$/, '' + # #! perl -> perl + script.sub! /^#!\s*/, '' + # Check for multiline shebang hacks that call `exec` if script == 'sh' && data.lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }