diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb index da02b110..d2d44466 100644 --- a/lib/linguist/language.rb +++ b/lib/linguist/language.rb @@ -541,7 +541,7 @@ module Linguist if extnames = extensions[name] extnames.each do |extname| if !options['extensions'].index { |x| x.downcase.end_with? extname.downcase } - warn "#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml" unless extname == '.script!' + warn "#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml" options['extensions'] << extname end end diff --git a/lib/linguist/samples.rb b/lib/linguist/samples.rb index efcba365..a7ecd1bd 100644 --- a/lib/linguist/samples.rb +++ b/lib/linguist/samples.rb @@ -50,16 +50,13 @@ module Linguist end else path = File.join(dirname, filename) - - if File.extname(filename) == "" - raise "#{path} is missing an extension, maybe it belongs in filenames/ subdir" - end + extname = File.extname(filename) yield({ :path => path, :language => category, :interpreter => Shebang.interpreter(File.read(path)), - :extname => File.extname(filename) + :extname => extname.empty? ? nil : extname }) end end diff --git a/lib/linguist/strategy/filename.rb b/lib/linguist/strategy/filename.rb index e682863b..b8c819eb 100644 --- a/lib/linguist/strategy/filename.rb +++ b/lib/linguist/strategy/filename.rb @@ -3,17 +3,7 @@ module Linguist # Detects language based on filename and/or extension class Filename def self.call(blob, _) - name = blob.name.to_s - - # A bit of an elegant hack. If the file is executable but extensionless, - # append a "magic" extension so it can be classified with other - # languages that have shebang scripts. - extensions = FileBlob.new(name).extensions - if extensions.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05 - name += ".script!" - end - - Language.find_by_filename(name) + Language.find_by_filename(blob.name.to_s) end end end diff --git a/samples/Erlang/factorial.script! b/samples/Erlang/factorial similarity index 100% rename from samples/Erlang/factorial.script! rename to samples/Erlang/factorial diff --git a/samples/Erlang/release.script! b/samples/Erlang/release similarity index 100% rename from samples/Erlang/release.script! rename to samples/Erlang/release diff --git a/samples/Groovy/build.script! b/samples/Groovy/build.script! deleted file mode 100644 index c1ac812c..00000000 --- a/samples/Groovy/build.script! +++ /dev/null @@ -1,17 +0,0 @@ -task echoDirListViaAntBuilder() { - description = 'Uses the built-in AntBuilder instance to echo and list files' - //Docs: http://ant.apache.org/manual/Types/fileset.html - - //Echo the Gradle project name via the ant echo plugin - ant.echo(message: project.name) - ant.echo(path) - ant.echo("${projectDir}/samples") - - //Gather list of files in a subdirectory - ant.fileScanner{ - fileset(dir:"samples") - }.each{ - //Print each file to screen with the CWD (projectDir) path removed. - println it.toString() - "${projectDir}" - } -} diff --git a/samples/Groovy/groovy.script! b/samples/Groovy/groovy similarity index 100% rename from samples/Groovy/groovy.script! rename to samples/Groovy/groovy diff --git a/samples/JavaScript/js.script! b/samples/JavaScript/js similarity index 100% rename from samples/JavaScript/js.script! rename to samples/JavaScript/js diff --git a/samples/JavaScript/js2.script! b/samples/JavaScript/js2 similarity index 100% rename from samples/JavaScript/js2.script! rename to samples/JavaScript/js2 diff --git a/samples/Makefile/makefile.script! b/samples/Makefile/makefile similarity index 100% rename from samples/Makefile/makefile.script! rename to samples/Makefile/makefile diff --git a/samples/Nu/nu.script! b/samples/Nu/nu similarity index 100% rename from samples/Nu/nu.script! rename to samples/Nu/nu diff --git a/samples/PHP/drupal.script! b/samples/PHP/drupal.module similarity index 100% rename from samples/PHP/drupal.script! rename to samples/PHP/drupal.module diff --git a/samples/PHP/php.script! b/samples/PHP/php similarity index 100% rename from samples/PHP/php.script! rename to samples/PHP/php diff --git a/samples/PHP/php-script.script! b/samples/PHP/php-script similarity index 100% rename from samples/PHP/php-script.script! rename to samples/PHP/php-script diff --git a/samples/PHP/php2.script! b/samples/PHP/php2 similarity index 100% rename from samples/PHP/php2.script! rename to samples/PHP/php2 diff --git a/samples/Perl/perl.script! b/samples/Perl/perl similarity index 100% rename from samples/Perl/perl.script! rename to samples/Perl/perl diff --git a/samples/Prolog/dleak-report.script! b/samples/Prolog/dleak-report similarity index 100% rename from samples/Prolog/dleak-report.script! rename to samples/Prolog/dleak-report diff --git a/samples/Python/python.script! b/samples/Python/python similarity index 100% rename from samples/Python/python.script! rename to samples/Python/python diff --git a/samples/Python/python2.script! b/samples/Python/python2 similarity index 100% rename from samples/Python/python2.script! rename to samples/Python/python2 diff --git a/samples/Python/python3.script! b/samples/Python/python3 similarity index 100% rename from samples/Python/python3.script! rename to samples/Python/python3 diff --git a/samples/QMake/qmake.script! b/samples/QMake/qmake similarity index 100% rename from samples/QMake/qmake.script! rename to samples/QMake/qmake diff --git a/samples/R/git-punchcard.script! b/samples/R/git-punchcard similarity index 100% rename from samples/R/git-punchcard.script! rename to samples/R/git-punchcard diff --git a/samples/Ruby/macruby.script! b/samples/Ruby/macruby similarity index 100% rename from samples/Ruby/macruby.script! rename to samples/Ruby/macruby diff --git a/samples/Ruby/ruby.script! b/samples/Ruby/ruby similarity index 100% rename from samples/Ruby/ruby.script! rename to samples/Ruby/ruby diff --git a/samples/Ruby/ruby2.script! b/samples/Ruby/ruby2 similarity index 100% rename from samples/Ruby/ruby2.script! rename to samples/Ruby/ruby2 diff --git a/samples/Scala/99-bottles-of-beer.script! b/samples/Scala/99-bottles-of-beer similarity index 100% rename from samples/Scala/99-bottles-of-beer.script! rename to samples/Scala/99-bottles-of-beer diff --git a/samples/Scala/scala.script! b/samples/Scala/scala similarity index 100% rename from samples/Scala/scala.script! rename to samples/Scala/scala diff --git a/samples/Shell/99-bottles-of-beer.script! b/samples/Shell/99-bottles-of-beer similarity index 100% rename from samples/Shell/99-bottles-of-beer.script! rename to samples/Shell/99-bottles-of-beer diff --git a/samples/Shell/bash.script! b/samples/Shell/bash similarity index 100% rename from samples/Shell/bash.script! rename to samples/Shell/bash diff --git a/samples/Shell/plugin.script! b/samples/Shell/plugin similarity index 100% rename from samples/Shell/plugin.script! rename to samples/Shell/plugin diff --git a/samples/Shell/sbt.script! b/samples/Shell/sbt similarity index 100% rename from samples/Shell/sbt.script! rename to samples/Shell/sbt diff --git a/samples/Shell/sh.script! b/samples/Shell/sh similarity index 100% rename from samples/Shell/sh.script! rename to samples/Shell/sh diff --git a/samples/Shell/string-chopping.script! b/samples/Shell/string-chopping similarity index 100% rename from samples/Shell/string-chopping.script! rename to samples/Shell/string-chopping diff --git a/samples/Shell/zsh.script! b/samples/Shell/zsh similarity index 100% rename from samples/Shell/zsh.script! rename to samples/Shell/zsh diff --git a/test/test_samples.rb b/test/test_samples.rb index 6de1c7e9..dc3524c2 100644 --- a/test/test_samples.rb +++ b/test/test_samples.rb @@ -34,6 +34,14 @@ class TestSamples < Minitest::Test assert !data["interpreters"].empty? end + def test_ext_or_shebang + Samples.each do |sample| + if sample[:extname].to_s.empty? && !sample[:filename] + assert sample[:interpreter], "#{sample[:path]} should have a file extension or a shebang, maybe it belongs in filenames/ subdir" + end + end + end + # Check that there aren't samples with extensions or interpreters that # aren't explicitly defined in languages.yml languages_yml = File.expand_path("../../lib/linguist/languages.yml", __FILE__) @@ -42,7 +50,6 @@ class TestSamples < Minitest::Test options['extensions'] ||= [] if extnames = Samples.cache['extnames'][name] extnames.each do |extname| - next if extname == '.script!' assert options['extensions'].index { |x| x.downcase.end_with? extname.downcase }, "#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml" end end @@ -50,8 +57,8 @@ class TestSamples < Minitest::Test options['interpreters'] ||= [] if interpreters = Samples.cache['interpreters'][name] interpreters.each do |interpreter| - # next if extname == '.script!' - assert options['interpreters'].include?(interpreter), "#{name} has a sample with an interpreter (#{interpreter}) that isn't explicitly defined in languages.yml" + assert options['interpreters'].include?(interpreter), + "#{name} has a sample with an interpreter (#{interpreter}) that isn't explicitly defined in languages.yml" end end end diff --git a/test/test_tokenizer.rb b/test/test_tokenizer.rb index 8d7da0c0..75f854a9 100644 --- a/test/test_tokenizer.rb +++ b/test/test_tokenizer.rb @@ -84,16 +84,16 @@ class TestTokenizer < Minitest::Test end def test_shebang - assert_equal "SHEBANG#!sh", tokenize(:"Shell/sh.script!")[0] - assert_equal "SHEBANG#!bash", tokenize(:"Shell/bash.script!")[0] - assert_equal "SHEBANG#!zsh", tokenize(:"Shell/zsh.script!")[0] - assert_equal "SHEBANG#!perl", tokenize(:"Perl/perl.script!")[0] - assert_equal "SHEBANG#!python", tokenize(:"Python/python.script!")[0] - assert_equal "SHEBANG#!ruby", tokenize(:"Ruby/ruby.script!")[0] - assert_equal "SHEBANG#!ruby", tokenize(:"Ruby/ruby2.script!")[0] - assert_equal "SHEBANG#!node", tokenize(:"JavaScript/js.script!")[0] - assert_equal "SHEBANG#!php", tokenize(:"PHP/php.script!")[0] - assert_equal "SHEBANG#!escript", tokenize(:"Erlang/factorial.script!")[0] + assert_equal "SHEBANG#!sh", tokenize(:"Shell/sh")[0] + assert_equal "SHEBANG#!bash", tokenize(:"Shell/bash")[0] + assert_equal "SHEBANG#!zsh", tokenize(:"Shell/zsh")[0] + assert_equal "SHEBANG#!perl", tokenize(:"Perl/perl")[0] + assert_equal "SHEBANG#!python", tokenize(:"Python/python")[0] + assert_equal "SHEBANG#!ruby", tokenize(:"Ruby/ruby")[0] + assert_equal "SHEBANG#!ruby", tokenize(:"Ruby/ruby2")[0] + assert_equal "SHEBANG#!node", tokenize(:"JavaScript/js")[0] + assert_equal "SHEBANG#!php", tokenize(:"PHP/php")[0] + assert_equal "SHEBANG#!escript", tokenize(:"Erlang/factorial")[0] assert_equal "echo", tokenize(:"Shell/invalid-shebang.sh")[0] end