diff --git a/README.md b/README.md index 3fba928a..241b4aee 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ The repository stats API, accessed through `#languages`, can be used on a direct ***API UPDATE*** -Since [Version 3.0.0](https://github.com/github/linguist/releases/tag/v3.0.0) Linguist requires a git repository (in the form of a [Rugged::Repository](https://github.com/libgit2/rugged#repositories)) to be passed when initializing `Linguist::Repository`. +Since [Version 3.0.0](https://github.com/github/linguist/releases/tag/v3.0.0) Linguist expects a git repository (in the form of a [Rugged::Repository](https://github.com/libgit2/rugged#repositories)) to be passed when initializing `Linguist::Repository`. ```ruby diff --git a/lib/linguist/repository.rb b/lib/linguist/repository.rb index 1f9e09c4..41e829c5 100644 --- a/lib/linguist/repository.rb +++ b/lib/linguist/repository.rb @@ -128,13 +128,20 @@ module Linguist protected def compute_stats(old_commit_oid, cache = nil) - file_map = cache ? cache.dup : {} 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 + if cache && diff.each_delta.any? { |delta| File.basename(delta.new_file[:path]) == ".gitattributes" } + diff = Rugged::Tree.diff(repository, old_tree = nil, current_tree) + file_map = {} + else + file_map = cache ? cache.dup : {} + end + diff.each_delta do |delta| old = delta.old_file[:path] new = delta.new_file[:path] diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index 2edc3c5a..12d2ceb3 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "3.3.1" + VERSION = "3.4.0" end diff --git a/test/test_repository.rb b/test/test_repository.rb index 8e10e9b6..1fba9b57 100644 --- a/test/test_repository.rb +++ b/test/test_repository.rb @@ -68,6 +68,19 @@ class TestRepository < Test::Unit::TestCase assert !repo.breakdown_by_file["Ruby"].empty? end + def test_commit_with_git_attributes_data + # Before we had any .gitattributes data + old_commit = '4a017d9033f91b2776eb85275463f9613cc371ef' + old_repo = linguist_repo(old_commit) + + # With some .gitattributes data + attr_commit = '7ee006cbcb2d7261f9e648510a684ee9ac64126b' + # It's incremental but should bust the cache + new_repo = Linguist::Repository.incremental(rugged_repository, attr_commit, old_commit, old_repo.cache) + + assert new_repo.breakdown_by_file["Java"].include?("lib/linguist.rb") + end + def test_linguist_override_vendored? attr_commit = '351c1cc8fd57340839bdb400d7812332af80e9bd' repo = linguist_repo(attr_commit).read_index