lib/gitlab_git/blob.rb in gitlab_git-5.0.0 vs lib/gitlab_git/blob.rb in gitlab_git-5.1.0

- old
+ new

@@ -5,32 +5,74 @@ attr_accessor :name, :path, :size, :data, :mode, :id, :commit_id class << self def find(repository, sha, path) - commit = Commit.find(repository, sha) - grit_blob = commit.tree / path + commit = repository.lookup(sha) + root_tree = commit.tree - if grit_blob.kind_of?(Grit::Blob) + blob_entry = find_entry_by_path(repository, root_tree.oid, path) + + return nil unless blob_entry + + blob = repository.lookup(blob_entry[:oid]) + + if blob Blob.new( - id: grit_blob.id, - name: grit_blob.name, - size: grit_blob.size, - data: grit_blob.data, - mode: grit_blob.mode, + id: blob.oid, + name: blob_entry[:name], + size: blob.size, + data: blob.content, + mode: blob_entry[:mode], path: path, commit_id: sha, ) end end def raw(repository, sha) - grit_blob = repository.grit.blob(sha) + blob = repository.lookup(sha) + Blob.new( - id: grit_blob.id, - size: grit_blob.size, - data: grit_blob.data, + id: blob.oid, + size: blob.size, + data: blob.content, ) + end + + # Recursive search of blob id by path + # + # Ex. + # blog/ # oid: 1a + # app/ # oid: 2a + # models/ # oid: 3a + # file.rb # oid: 4a + # + # + # Blob.find_entry_by_path(repo, '1a', 'app/file.rb') # => '4a' + # + def find_entry_by_path(repository, root_id, path) + root_tree = repository.lookup(root_id) + path_arr = path.split('/') + + entry = root_tree.find do |entry| + entry[:name] == path_arr[0] + end + + return nil unless entry + + if path_arr.size > 1 + return nil unless entry[:type] == :tree + else + return nil unless entry[:type] == :blob + end + + if path_arr.size > 1 + path_arr.shift + find_entry_by_path(repository, entry[:oid], path_arr.join('/')) + else + entry + end end end def initialize(options) %w(id name path size data mode commit_id).each do |key|