Compare commits

...

35 Commits

Author SHA1 Message Date
Vicent Marti
98b99e38bb Merge pull request #2654 from github/vmg/git-linguist-fixes
Small fixes for git-linguist
2015-09-28 11:12:49 +02:00
Vicent Marti
d8e3bec499 Bump version 2015-09-28 01:45:49 -07:00
Vicent Marti
7c759d4d29 git-linguist: Do not write cache if repo is gone 2015-09-28 01:45:49 -07:00
Vicent Marti
41d438b47e repository: Do not attempt to scan large repos 2015-09-28 01:45:49 -07:00
Vicent Marti
41911d6921 git-linguist: Properly handle $GIT_DIR from git 2015-09-28 01:45:49 -07:00
Arfon Smith
dca18d77cb Merge pull request #2656 from iblech/better-test-description
Clarified that only nonprimary extensions should be sorted
2015-09-27 20:34:30 +01:00
Ingo Blechschmidt
040af5dad2 Clarify that only nonprimary extensions should be sorted 2015-09-25 19:23:06 +02:00
Arfon Smith
4867c49bd9 Merge pull request #2642 from github/license-in-gemspec
Include LICENSE in gem
2015-09-23 09:19:18 +01:00
Brandon Keepers
a354eddf4b Update github-linguist.gemspec 2015-09-22 16:33:08 -04:00
Vicent Marti
9b78c533a5 Merge pull request #2641 from github/js-syntax-fix
github-linguist-grammars 4.6.2
2015-09-21 21:56:33 +02:00
Mislav Marohnić
090ea576b9 github-linguist-grammars 4.6.2 2015-09-21 21:23:40 +02:00
Mislav Marohnić
6a2d33a4b3 Bump language-javascript for syntax highlighting fix
This is primarily to pull
https://github.com/atom/language-javascript/pull/227

Full changelog:
c5c381e...7b14bbb (diff-46d5c1ca71eaebb92619d6c7abc9388d)
2015-09-21 19:04:30 +02:00
Vicent Marti
2c62da7834 Merge pull request #2636 from github/vmg/git-linguist-oid
git-linguist: Delay loading @commit_oid
2015-09-16 16:48:12 +02:00
Vicent Marti
0145a0adb2 git-linguist: Delay loading @commit_oid 2015-09-16 05:50:35 -07:00
Vicent Marti
473282d64c Merge pull request #2630 from github/vmg/memory
4.6.0: Reduce memory pressure
2015-09-15 11:19:45 +02:00
Vicent Marti
c2c068e9db Bump version to 4.6.0 2015-09-14 08:43:10 -07:00
Vicent Marti
13d1f662d1 Add the git-linguist helper 2015-09-14 08:42:51 -07:00
Arfon Smith
bdd57f58a0 Merge pull request #2625 from github/handlebars-group
Adding Handlebars to the HTML group
2015-09-09 09:18:11 +01:00
Arfon Smith
b1bcabd6e6 Adding Handlebars to the HTML group 2015-09-08 12:25:05 +01:00
Arfon Smith
e128c3fa82 Merge pull request #2622 from miksen/patch-1
Language bar clarification in README.md
2015-09-08 12:08:42 +01:00
Arfon Smith
efac9fe750 Merge pull request #2624 from pchaigno/jsx-grammar
New JSX language under JavaScript group
2015-09-08 11:01:44 +01:00
Arfon Smith
2b8545a8fa Merge pull request #2567 from pcantrell/objc-import-statement
#import "*.h" detection for Objective-C
2015-09-08 10:53:32 +01:00
Vicent Marti
b275b5d728 Soften memory pressure 2015-09-07 22:03:29 +02:00
Paul Chaignon
1f46cfafa7 New JSX language under JavaScript group
A specific grammar is needed to highlight .jsx files
Thus, there are now in a distinct language but still in the JavaScript group
2015-09-05 13:31:17 +02:00
miksen
b1dcdf3418 Language bar clarification in README.md
Clarified what the percentages in the Language bar are based on.
2015-09-04 11:49:10 +02:00
Paul Cantrell
4bfd65deb8 #import "*.h" detection for Objective-C 2015-09-03 22:10:27 -05:00
Arfon Smith
61102812a0 Merge pull request #2619 from github/linguist-generated
Adding support for generated overrides
2015-09-03 15:02:16 +01:00
Arfon Smith
580cfce7fb Adding support for generated overrides 2015-09-03 14:39:27 +01:00
Arfon Smith
f1383d7a45 Merge pull request #2616 from scttnlsn/patch-1
Ignore spec fixtures
2015-09-02 18:35:07 +01:00
Scott Nelson
e4ce5bfe39 Ignore spec fixtures 2015-09-02 12:52:25 -04:00
Arfon Smith
6ed64f25a2 Merge pull request #2607 from Alhadis/master
Add .geojson/.topojson as JSON extensions / Fix NCL colour
2015-09-02 10:13:31 +01:00
Alhadis
114a331106 Add ".topojson" as a JSON extension 2015-09-02 07:04:51 +10:00
Alhadis
a167f852dd Alphabetise JSON extensions 2015-09-01 07:33:07 +10:00
Alhadis
b428bce126 Quote NCL language's colour value
Without double-quotes, the hex colour is interpreted as a YAML comment.

Originally added in 2d39258.
2015-09-01 07:24:17 +10:00
Alhadis
e62d0e19a5 Add ".geojson" as a JSON extension 2015-09-01 07:12:18 +10:00
20 changed files with 339 additions and 26 deletions

3
.gitmodules vendored
View File

@@ -677,3 +677,6 @@
[submodule "vendor/grammars/X10"]
path = vendor/grammars/X10
url = git@github.com:x10-lang/x10-highlighting.git
[submodule "vendor/grammars/language-babel"]
path = vendor/grammars/language-babel
url = https://github.com/gandm/language-babel

View File

@@ -13,7 +13,7 @@ See [Troubleshooting](#troubleshooting) and [`CONTRIBUTING.md`](/CONTRIBUTING.md
![language stats bar](https://cloud.githubusercontent.com/assets/173/5562290/48e24654-8ddf-11e4-8fe7-735b0ce3a0d3.png)
The Language stats bar is built by aggregating the languages of each file in that repository. If it is reporting a language that you don't expect:
The Language stats bar displays languages percentages for the files in the repository. The percentages are calculated based on the bytes of code for each language as reported by the [List Languages](https://developer.github.com/v3/repos/#list-languages) API. If the bar is reporting a language that you don't expect:
0. Click on the name of the language in the stats bar to see a list of the files that are identified as that language.
0. If you see files that you didn't write, consider moving the files into one of the [paths for vendored code](/lib/linguist/vendor.yml), or use the [manual overrides](#overrides) feature to ignore them.

137
bin/git-linguist Executable file
View File

@@ -0,0 +1,137 @@
#!/usr/bin/env ruby
require 'linguist'
require 'rugged'
require 'optparse'
require 'json'
require 'tmpdir'
require 'zlib'
class GitLinguist
def initialize(path, commit_oid, incremental = true)
@repo_path = path
@commit_oid = commit_oid
@incremental = incremental
end
def linguist
if @commit_oid.nil?
raise "git-linguist must be called with a specific commit OID to perform language computation"
end
repo = Linguist::Repository.new(rugged, @commit_oid)
if @incremental && stats = load_language_stats
old_commit_oid, old_stats = stats
# A cache with NULL oid means that we want to froze
# these language stats in place and stop computing
# them (for performance reasons)
return old_stats if old_commit_oid == NULL_OID
repo.load_existing_stats(old_commit_oid, old_stats)
end
result = yield repo
save_language_stats(@commit_oid, repo.cache)
result
end
def load_language_stats
version, oid, stats = load_cache
if version == LANGUAGE_STATS_CACHE_VERSION && oid && stats
[oid, stats]
end
end
def save_language_stats(oid, stats)
cache = [LANGUAGE_STATS_CACHE_VERSION, oid, stats]
write_cache(cache)
end
def clear_language_stats
File.unlink(cache_file)
end
def disable_language_stats
save_language_stats(NULL_OID, {})
end
protected
NULL_OID = ("0" * 40).freeze
LANGUAGE_STATS_CACHE = 'language-stats.cache'
LANGUAGE_STATS_CACHE_VERSION = "v3:#{Linguist::VERSION}"
def rugged
@rugged ||= Rugged::Repository.bare(@repo_path)
end
def cache_file
File.join(@repo_path, LANGUAGE_STATS_CACHE)
end
def write_cache(object)
return unless File.directory? @repo_path
begin
tmp_path = Dir::Tmpname.make_tmpname(cache_file, nil)
File.open(tmp_path, "wb") do |f|
marshal = Marshal.dump(object)
f.write(Zlib::Deflate.deflate(marshal))
end
File.rename(tmp_path, cache_file)
rescue => e
(File.unlink(tmp_path) rescue nil)
raise e
end
end
def load_cache
marshal = File.open(cache_file, "rb") { |f| Zlib::Inflate.inflate(f.read) }
Marshal.load(marshal)
rescue SystemCallError, ::Zlib::DataError, ::Zlib::BufError, TypeError
nil
end
end
def git_linguist(args)
incremental = true
commit = nil
parser = OptionParser.new do |opts|
opts.banner = "Usage: git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable"
opts.on("-f", "--force", "Force a full rescan") { incremental = false }
opts.on("--commit=COMMIT", "Commit to index") { |v| commit = v}
end
parser.parse!(args)
git_dir = `git rev-parse --git-dir`.strip
raise "git-linguist must be ran in a Git repository" unless $?.success?
wrapper = GitLinguist.new(git_dir, commit, incremental)
case args.pop
when "stats"
wrapper.linguist do |linguist|
puts JSON.dump(linguist.languages)
end
when "breakdown"
wrapper.linguist do |linguist|
puts JSON.dump(linguist.breakdown_by_file)
end
when "dump-cache"
puts JSON.dump(wrapper.load_language_stats)
when "clear"
wrapper.clear_language_stats
when "disable"
wrapper.disable_language_stats
else
$stderr.print(parser.help)
exit 1
end
end
git_linguist(ARGV)

View File

@@ -10,8 +10,8 @@ Gem::Specification.new do |s|
s.homepage = "https://github.com/github/linguist"
s.license = "MIT"
s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb']
s.executables << 'linguist'
s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] + ['LICENSE']
s.executables = ['linguist', 'git-linguist']
s.add_dependency 'charlock_holmes', '~> 0.7.3'
s.add_dependency 'escape_utils', '~> 1.1.0'

View File

@@ -314,6 +314,9 @@ vendor/grammars/json.tmbundle:
- source.json
vendor/grammars/kotlin-sublime-package:
- source.Kotlin
vendor/grammars/language-babel/:
- source.js.jsx
- source.regexp.babel
vendor/grammars/language-clojure:
- source.clojure
vendor/grammars/language-coffee-script:

View File

@@ -241,22 +241,26 @@ module Linguist
return lines[0].include?("Code generated by")
end
PROTOBUF_EXTENSIONS = ['.py', '.java', '.h', '.cc', '.cpp']
# Internal: Is the blob a C++, Java or Python source file generated by the
# Protocol Buffer compiler?
#
# Returns true of false.
def generated_protocol_buffer?
return false unless ['.py', '.java', '.h', '.cc', '.cpp'].include?(extname)
return false unless PROTOBUF_EXTENSIONS.include?(extname)
return false unless lines.count > 1
return lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!")
end
APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp']
# Internal: Is the blob generated by Apache Thrift compiler?
#
# Returns true or false
def generated_apache_thrift?
return false unless ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp'].include?(extname)
return false unless APACHE_THRIFT_EXTENSIONS.include?(extname)
return false unless lines.count > 1
return lines[0].include?("Autogenerated by Thrift Compiler") || lines[1].include?("Autogenerated by Thrift Compiler")

View File

@@ -56,7 +56,8 @@ module Linguist
# Internal: Check if this heuristic matches the candidate languages.
def matches?(filename)
@extensions.any? { |ext| filename.downcase.end_with?(ext) }
filename = filename.downcase
@extensions.any? { |ext| filename.end_with?(ext) }
end
# Internal: Perform the heuristic
@@ -65,7 +66,7 @@ module Linguist
end
# Common heuristics
ObjectiveCRegex = /^[ \t]*@(interface|class|protocol|property|end|synchronized|selector|implementation)\b/
ObjectiveCRegex = /^\s*(@(interface|class|protocol|property|end|synchronised|selector|implementation)\b|#import\s+.+\.h[">])/
disambiguate ".asc" do |data|
if /^(----[- ]BEGIN|ssh-(rsa|dss)) /.match(data)

View File

@@ -8,7 +8,8 @@
# Use "text" if a mode does not exist.
# wrap - Boolean wrap to enable line wrapping (default: false)
# extensions - An Array of associated extensions (the first one is
# considered the primary extension)
# considered the primary extension, the others should be
# listed alphabetically)
# interpreters - An Array of associated interpreters
# searchable - Boolean flag to enable searching (defaults to true)
# search_term - Deprecated: Some languages maybe indexed under a
@@ -1367,6 +1368,7 @@ Haml:
Handlebars:
type: markup
color: "#01a9d6"
group: HTML
aliases:
- hbs
- htmlbars
@@ -1545,7 +1547,9 @@ JSON:
searchable: false
extensions:
- .json
- .geojson
- .lock
- .topojson
filenames:
- .jshintrc
- composer.lock
@@ -1573,6 +1577,14 @@ JSONiq:
- .jq
tm_scope: source.jq
JSX:
type: programming
group: JavaScript
extensions:
- .jsx
tm_scope: source.js.jsx
ace_mode: javascript
Jade:
group: HTML
type: markup
@@ -1626,7 +1638,6 @@ JavaScript:
- .jsfl
- .jsm
- .jss
- .jsx
- .njs
- .pac
- .sjs
@@ -2127,7 +2138,7 @@ Myghty:
NCL:
type: programming
color: #28431f
color: "#28431f"
extensions:
- .ncl
tm_scope: source.ncl

View File

@@ -4,7 +4,11 @@ require 'rugged'
module Linguist
class LazyBlob
GIT_ATTR = ['linguist-documentation', 'linguist-language', 'linguist-vendored']
GIT_ATTR = ['linguist-documentation',
'linguist-language',
'linguist-vendored',
'linguist-generated']
GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true }
GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS)
@@ -31,14 +35,6 @@ module Linguist
name, GIT_ATTR, GIT_ATTR_FLAGS)
end
def vendored?
if attr = git_attributes['linguist-vendored']
return boolean_attribute(attr)
else
return super
end
end
def documentation?
if attr = git_attributes['linguist-documentation']
boolean_attribute(attr)
@@ -47,6 +43,22 @@ module Linguist
end
end
def generated?
if attr = git_attributes['linguist-generated']
boolean_attribute(attr)
else
super
end
end
def vendored?
if attr = git_attributes['linguist-vendored']
return boolean_attribute(attr)
else
super
end
end
def language
return @language if defined?(@language)
@@ -67,6 +79,10 @@ module Linguist
@size
end
def cleanup!
@data.clear if @data
end
protected
# Returns true if the attribute is present and not the string "false".

View File

@@ -126,12 +126,13 @@ module Linguist
end
protected
MAX_TREE_SIZE = 100_000
def compute_stats(old_commit_oid, cache = nil)
return {} if current_tree.count_recursive(MAX_TREE_SIZE) >= MAX_TREE_SIZE
old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
read_index
diff = Rugged::Tree.diff(repository, old_tree, current_tree)
# Clear file map and fetch full diff if any .gitattributes files are changed
@@ -157,8 +158,11 @@ module Linguist
blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8))
next unless blob.include_in_language_stats?
file_map[new] = [blob.language.group.name, blob.size]
if blob.include_in_language_stats?
file_map[new] = [blob.language.group.name, blob.size]
end
blob.cleanup!
end
end

View File

@@ -266,6 +266,7 @@
# Test fixtures
- ^[Tt]ests?/fixtures/
- ^[Ss]pecs?/fixtures/
# PhoneGap/Cordova
- (^|/)cordova([^.]*)\.js$

View File

@@ -1,3 +1,3 @@
module Linguist
VERSION = "4.5.15"
VERSION = "4.6.3"
end

82
samples/JSON/geo.geojson Normal file
View File

@@ -0,0 +1,82 @@
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "Australia Post - North Ryde BC",
"geo": [-33.787792, 151.13288],
"streetAddress": "11 Waterloo Road",
"addressLocality": "Macquarie Park",
"addressRegion": "New South Wales",
"addressCountry": "Australia",
"postalCode": "2113"
},
"geometry": {
"type": "Point",
"coordinates": [151.13288, -33.787792, 0]
}
},
{
"type": "Feature",
"properties": {
"name": "George Weston Foods Limited",
"geo": [-37.8263884, 144.9105381],
"streetAddress": "Level 3, 187 Todd Road",
"addressLocality": "Port Melbourne",
"addressRegion": "Victoria",
"addressCountry": "Australia",
"postalCode": "3207"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[144.9097088901841, -37.82622654171794, 0],
[144.9099724266943, -37.82679388891783, 0],
[144.9110127325916, -37.82651526396403, 0],
[144.9112227645738, -37.82655667152123, 0],
[144.9113739439796, -37.82618552508767, 0],
[144.9112740633105, -37.82615750100924, 0],
[144.9111355846674, -37.82584493693527, 0],
[144.9097088901841, -37.82622654171794, 0]
]
]
}
},
{
"type": "Feature",
"properties": {
"name": "George Weston Foods Limited",
"geo": [-37.05202791502396, 144.2085614999388],
"streetAddress": "67 Richards Road",
"addressLocality": "Castlemaine",
"addressRegion": "Victoria",
"addressCountry": "Australia",
"postalCode": "3450"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[144.2052428913937, -37.04906391287216, 0],
[144.205540392692, -37.05049727485623, 0],
[144.2059800881858, -37.05066835966983, 0],
[144.206490656024, -37.05279538900776, 0],
[144.2064525845008, -37.05366195881602, 0],
[144.2084322301922, -37.0538920493147, 0],
[144.2084811895712, -37.05266519735124, 0],
[144.2079784002005, -37.05041270555773, 0],
[144.2074017905817, -37.04817406993293, 0],
[144.2061363939852, -37.04834972871226, 0],
[144.2052428913937, -37.04906391287216, 0]
]
]
}
}
]
}

File diff suppressed because one or more lines are too long

23
samples/JSX/sample.jsx Normal file
View File

@@ -0,0 +1,23 @@
'use strict';
const React = require('react')
module.exports = React.createClass({
render: function() {
let {feeds, log} = this.props;
log.info(feeds);
return <div className="feed-list">
<h3>News Feed's</h3>
<ul>
{feeds.map(function(feed) {
return <li key={feed.name} className={feed.fetched ? 'loaded' : 'loading'}>
{feed.data && feed.data.length > 0 ?
<span>{feed.name} <span className='light'>({feed.data.length})</span></span>
: 'feed.name' }
</li>
})}
</ul>
</div>;
}
});

View File

@@ -0,0 +1,16 @@
//
// Siesta.h
// Siesta
//
// Created by Paul on 2015/6/14.
// Copyright © 2015 Bust Out Solutions. MIT license.
//
#import <UIKit/UIKit.h>
//! Project version number for Siesta.
FOUNDATION_EXPORT double SiestaVersionNumber;
//! Project version string for Siesta.
FOUNDATION_EXPORT const unsigned char SiestaVersionString[];

View File

@@ -9,7 +9,7 @@ class TestPedantic < Minitest::Test
assert_sorted LANGUAGES.keys
end
def test_extensions_are_sorted
def test_nonprimary_extensions_are_sorted
LANGUAGES.each do |name, language|
extensions = language['extensions']
assert_sorted extensions[1..-1].map(&:downcase) if extensions && extensions.size > 1

View File

@@ -111,4 +111,14 @@ class TestRepository < Minitest::Test
refute_predicate readme, :documentation?
assert_predicate arduino, :documentation?
end
def test_linguist_override_generated?
attr_commit = "351c1cc8fd57340839bdb400d7812332af80e9bd"
repo = linguist_repo(attr_commit).read_index
rakefile = Linguist::LazyBlob.new(rugged_repository, attr_commit, "Rakefile")
# overridden .gitattributes
assert rakefile.generated?
end
end