github-linguist 4.5.4 → 4.5.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -50,16 +50,13 @@ module Linguist
50
50
  end
51
51
  else
52
52
  path = File.join(dirname, filename)
53
-
54
- if File.extname(filename) == ""
55
- raise "#{path} is missing an extension, maybe it belongs in filenames/ subdir"
56
- end
53
+ extname = File.extname(filename)
57
54
 
58
55
  yield({
59
56
  :path => path,
60
57
  :language => category,
61
58
  :interpreter => Shebang.interpreter(File.read(path)),
62
- :extname => File.extname(filename)
59
+ :extname => extname.empty? ? nil : extname
63
60
  })
64
61
  end
65
62
  end
@@ -23,17 +23,20 @@ module Linguist
23
23
  # First line must start with #!
24
24
  return unless shebang && shebang.start_with?("#!")
25
25
 
26
- # Get the parts of the shebang without the #!
27
- tokens = shebang.sub(/^#!\s*/, '').strip.split(' ')
26
+ s = StringScanner.new(shebang)
28
27
 
29
28
  # There was nothing after the #!
30
- return if tokens.empty?
29
+ return unless path = s.scan(/^#!\s*\S+/)
31
30
 
32
- # Get the name of the interpreter
33
- script = File.basename(tokens.first)
31
+ # Keep going
32
+ script = path.split('/').last
34
33
 
35
- # Get next argument if interpreter was /usr/bin/env
36
- script = tokens[1] if script == 'env'
34
+ # if /usr/bin/env type shebang then walk the string
35
+ if script == 'env'
36
+ s.scan(/\s+/)
37
+ s.scan(/.*=[^\s]+\s+/) # skip over variable arguments e.g. foo=bar
38
+ script = s.scan(/\S+/)
39
+ end
37
40
 
38
41
  # Interpreter was /usr/bin/env with no arguments
39
42
  return unless script
@@ -41,6 +44,9 @@ module Linguist
41
44
  # "python2.6" -> "python2"
42
45
  script.sub! /(\.\d+)$/, ''
43
46
 
47
+ # #! perl -> perl
48
+ script.sub! /^#!\s*/, ''
49
+
44
50
  # Check for multiline shebang hacks that call `exec`
45
51
  if script == 'sh' &&
46
52
  data.lines.first(5).any? { |l| l.match(/exec (\w+).+\$0.+\$@/) }
@@ -3,17 +3,7 @@ module Linguist
3
3
  # Detects language based on filename and/or extension
4
4
  class Filename
5
5
  def self.call(blob, _)
6
- name = blob.name.to_s
7
-
8
- # A bit of an elegant hack. If the file is executable but extensionless,
9
- # append a "magic" extension so it can be classified with other
10
- # languages that have shebang scripts.
11
- extensions = FileBlob.new(name).extensions
12
- if extensions.empty? && blob.mode && (blob.mode.to_i(8) & 05) == 05
13
- name += ".script!"
14
- end
15
-
16
- Language.find_by_filename(name)
6
+ Language.find_by_filename(blob.name.to_s)
17
7
  end
18
8
  end
19
9
  end
@@ -2,7 +2,7 @@ module Linguist
2
2
  module Strategy
3
3
  class Modeline
4
4
  EmacsModeline = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
5
- VimModeline = /\/\*\s*vim:\s*set\s*(?:ft|filetype)=(\w+):\s*\*\//i
5
+ VimModeline = /vim:\s*set\s*(?:ft|filetype)=(\w+):/i
6
6
 
7
7
  # Public: Detects language based on Vim and Emacs modelines
8
8
  #
@@ -22,8 +22,10 @@ module Linguist
22
22
  # Start state on token, ignore anything till the next newline
23
23
  SINGLE_LINE_COMMENTS = [
24
24
  '//', # C
25
+ '--', # Ada, Haskell, AppleScript
25
26
  '#', # Ruby
26
27
  '%', # Tex
28
+ '"', # Vim
27
29
  ]
28
30
 
29
31
  # Start state on opening token, ignore anything until the closing
@@ -130,6 +132,9 @@ module Linguist
130
132
  # extract_shebang("#!/usr/bin/env node")
131
133
  # # => "node"
132
134
  #
135
+ # extract_shebang("#!/usr/bin/env A=B foo=bar awk -f")
136
+ # # => "awk"
137
+ #
133
138
  # Returns String token or nil it couldn't be parsed.
134
139
  def extract_shebang(data)
135
140
  s = StringScanner.new(data)
@@ -138,6 +143,7 @@ module Linguist
138
143
  script = path.split('/').last
139
144
  if script == 'env'
140
145
  s.scan(/\s+/)
146
+ s.scan(/.*=[^\s]+\s+/)
141
147
  script = s.scan(/\S+/)
142
148
  end
143
149
  script = script[/[^\d]+/, 0] if script
@@ -1,3 +1,3 @@
1
1
  module Linguist
2
- VERSION = "4.5.4"
2
+ VERSION = "4.5.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: github-linguist
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.5.4
4
+ version: 4.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-01 00:00:00.000000000 Z
11
+ date: 2015-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: charlock_holmes
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: color-proximity
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.2.1
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.2.1
139
153
  description: We use this library at GitHub to detect blob languages, highlight code,
140
154
  ignore binary files, suppress generated files in diffs, and generate language breakdown
141
155
  graphs.