diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index eb68607f050..3b9cd67636d 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -166,13 +166,13 @@ module GitlabMarkdownHelper def file_exists?(path) return false if path.nil? || path.empty? - return @repository.blob_at(current_ref, path).present? || Tree.new(@repository, current_ref, path).entries.any? + return @repository.blob_at(current_ref, path).present? || @repository.tree(:head, path).entries.any? end # Check if the path is pointing to a directory(tree) or a file(blob) # eg. doc/api is directory and doc/README.md is file def local_path(path) - return "tree" if Tree.new(@repository, current_ref, path).entries.any? + return "tree" if @repository.tree(:head, path).entries.any? return "raw" if @repository.blob_at(current_ref, path).image? return "blob" end diff --git a/app/models/repository.rb b/app/models/repository.rb index aedca5ed61d..271c2e4dbbc 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -163,7 +163,19 @@ class Repository def readme Rails.cache.fetch(cache_key(:readme)) do - Tree.new(self, self.root_ref).readme + tree(:head).readme end end + + def head_commit + commit(self.root_ref) + end + + def tree(sha = :head, path = nil) + if sha == :head + sha = head_commit.sha + end + + Tree.new(self, sha, path) + end end diff --git a/app/models/tree.rb b/app/models/tree.rb index ed06cb1a128..4f866f1a33d 100644 --- a/app/models/tree.rb +++ b/app/models/tree.rb @@ -23,4 +23,8 @@ class Tree def submodules @entries.select(&:submodule?) end + + def sorted_entries + trees + blobs + submodules + end end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 4f636fc54a3..8f54d0d4d84 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -79,7 +79,16 @@ module API end class RepoObject < Grape::Entity - expose :name, :commit + expose :name + + expose :commit do |repo_obj, options| + if repo_obj.respond_to?(:commit) + repo_obj.commit + elsif options[:project] + options[:project].repository.commit(repo_obj.target) + end + end + expose :protected do |repo, options| if options[:project] options[:project].protected_branch? repo.name @@ -87,6 +96,16 @@ module API end end + class RepoTreeObject < Grape::Entity + expose :id, :name, :type + + expose :mode do |obj, options| + filemode = obj.mode.to_s(8) + filemode = "0" + filemode if filemode.length < 6 + filemode + end + end + class RepoCommit < Grape::Entity expose :id, :short_id, :title, :author_name, :author_email, :created_at end diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb index 878929b8032..cad64760abb 100644 --- a/lib/api/repositories.rb +++ b/lib/api/repositories.rb @@ -82,7 +82,7 @@ module API # Example Request: # GET /projects/:id/repository/tags get ":id/repository/tags" do - present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject + present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject, project: user_project end # Get a project repository commits @@ -141,15 +141,9 @@ module API path = params[:path] || nil commit = user_project.repository.commit(ref) - tree = Tree.new(user_project.repository, commit.id, path) + tree = user_project.repository.tree(commit.id, path) - trees = [] - - %w(trees blobs submodules).each do |type| - trees += tree.send(type).map { |t| {name: t.name, type: type.singularize, mode: t.mode, id: t.id} } - end - - trees + present tree.sorted_entries, with: Entities::RepoTreeObject end # Get a raw file contents @@ -233,4 +227,3 @@ module API end end end - diff --git a/lib/extracts_path.rb b/lib/extracts_path.rb index 6e7872dcd03..e51cb30bdd9 100644 --- a/lib/extracts_path.rb +++ b/lib/extracts_path.rb @@ -117,7 +117,7 @@ module ExtractsPath end def tree - @tree ||= Tree.new(@repo, @commit.id, @path) + @tree ||= @repo.tree(@commit.id, @path) end private