diff --git a/Gemfile b/Gemfile index cfc205fd866..19171e94f46 100644 --- a/Gemfile +++ b/Gemfile @@ -31,7 +31,8 @@ gem 'omniauth-shibboleth' # Extracting information from a git repository # Provide access to Gitlab::Git library -gem "gitlab_git", '~> 6.0' +# gem "gitlab_git", path: '../../gitlab_git' +gem "gitlab_git", git: 'https://gitlab.com/gitlab-org/gitlab_git.git', ref: 'b53b948a9248ea3a4b7f2bd6c7f9938fbd5e952b' # Ruby/Rack Git Smart-HTTP Server Handler gem 'gitlab-grack', '~> 2.0.0.pre', require: 'grack' @@ -157,7 +158,7 @@ gem "rack-attack" # Ace editor gem 'ace-rails-ap' -# Keyboard shortcuts +# Keyboard shortcuts gem 'mousetrap-rails' # Semantic UI Sass for Sidebar diff --git a/Gemfile.lock b/Gemfile.lock index bd7ebf3ef44..eaa9f10105f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,15 @@ +GIT + remote: https://gitlab.com/gitlab-org/gitlab_git.git + revision: b53b948a9248ea3a4b7f2bd6c7f9938fbd5e952b + ref: b53b948a9248ea3a4b7f2bd6c7f9938fbd5e952b + specs: + gitlab_git (7.0.0.pre) + activesupport (~> 4.0) + charlock_holmes (~> 0.6) + gitlab-linguist (~> 3.0) + rubyzip (~> 1.1) + rugged (~> 0.21.0) + GEM remote: https://rubygems.org/ specs: @@ -179,12 +191,6 @@ GEM mime-types (~> 1.19) gitlab_emoji (0.0.1.1) emoji (~> 1.0.1) - gitlab_git (6.3.0) - activesupport (~> 4.0) - charlock_holmes (~> 0.6) - gitlab-grit (~> 2.6) - gitlab-linguist (~> 3.0) - rugged (~> 0.21.0) gitlab_meta (7.0) gitlab_omniauth-ldap (1.1.0) net-ldap (~> 0.7.0) @@ -440,6 +446,7 @@ GEM ruby-progressbar (1.2.0) rubyntlm (0.1.1) rubypants (0.2.0) + rubyzip (1.1.6) rugged (0.21.0) safe_yaml (0.9.7) sanitize (2.1.0) @@ -617,7 +624,7 @@ DEPENDENCIES gitlab-grack (~> 2.0.0.pre) gitlab-linguist (~> 3.0.0) gitlab_emoji (~> 0.0.1.1) - gitlab_git (~> 6.0) + gitlab_git! gitlab_meta (= 7.0) gitlab_omniauth-ldap (= 1.1.0) gollum-lib (~> 3.0.0) diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb index c344297ba8a..34bd682bd90 100644 --- a/app/controllers/projects/commit_controller.rb +++ b/app/controllers/projects/commit_controller.rb @@ -19,13 +19,7 @@ class Projects::CommitController < Projects::ApplicationController [] end - begin - @diffs = @commit.diffs - rescue Grit::Git::GitTimeout - @diffs = [] - @diff_timeout = true - end - + @diffs = @commit.diffs @note = project.build_commit_note(commit) @notes_count = project.notes.for_commit_id(commit.id).count @notes = project.notes.for_commit_id(@commit.id).not_inline.fresh diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb index f30eaadd928..c030320d037 100644 --- a/app/controllers/projects/repositories_controller.rb +++ b/app/controllers/projects/repositories_controller.rb @@ -5,7 +5,7 @@ class Projects::RepositoriesController < Projects::ApplicationController before_filter :require_non_empty_project def stats - @stats = Gitlab::Git::Stats.new(@repository.raw, @repository.root_ref) + @stats = Gitlab::Git::Stats.new(@repository.raw_repository, @repository.root_ref) @graph = @stats.graph end diff --git a/app/models/commit.rb b/app/models/commit.rb index ff5392957ce..c8b2e0475ff 100644 --- a/app/models/commit.rb +++ b/app/models/commit.rb @@ -108,4 +108,8 @@ class Commit super end + + def parents + @parents ||= Commit.decorate(super) + end end diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb index a82a300a672..770a26ed894 100644 --- a/app/models/project_wiki.rb +++ b/app/models/project_wiki.rb @@ -107,6 +107,18 @@ class ProjectWiki [title.gsub(/\.[^.]*$/, ""), title_array.join("/")] end + def search_files(query) + repository.search_files(query, default_branch) + end + + def repository + Repository.new(path_with_namespace, default_branch) + end + + def default_branch + wiki.class.default_ref + end + private def create_repo! diff --git a/app/models/repository.rb b/app/models/repository.rb index 9dd8603621f..a2bdfe87469 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -25,7 +25,7 @@ class Repository raw_repository.empty? end - def commit(id = nil) + def commit(id = 'HEAD') return nil unless raw_repository commit = Gitlab::Git::Commit.find(raw_repository, id) commit = Commit.new(commit) if commit @@ -137,7 +137,7 @@ class Repository def graph_log Rails.cache.fetch(cache_key(:graph_log)) do - stats = Gitlab::Git::GitStats.new(raw, root_ref, Gitlab.config.git.timeout) + stats = Gitlab::Git::GitStats.new(raw_repository, root_ref, Gitlab.config.git.timeout) stats.parsed_log end end diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index b8a0a9eb58b..b9ab6702c53 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -87,14 +87,14 @@ class WikiPage def version return nil unless persisted? - @version ||= Commit.new(Gitlab::Git::Commit.new(@page.version)) + @version ||= @page.version end # Returns an array of Gitlab Commit instances. def versions return [] unless persisted? - @page.versions.map { |v| Commit.new(Gitlab::Git::Commit.new(v)) } + @page.versions end def commit diff --git a/app/views/projects/wikis/history.html.haml b/app/views/projects/wikis/history.html.haml index 7bc566cf7f5..d3a66c48c9b 100644 --- a/app/views/projects/wikis/history.html.haml +++ b/app/views/projects/wikis/history.html.haml @@ -17,11 +17,11 @@ %tr %td = link_to project_wiki_path(@project, @page, version_id: commit.id) do - = commit.short_id + = commit.id[0..10] %td - = commit_author_link(commit, avatar: true, size: 24) + = commit.author.name %td - = commit.title + = commit.message %td #{time_ago_with_tooltip(version.date)} %td diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml index 74317faf9d6..264b48ec36c 100644 --- a/app/views/projects/wikis/pages.html.haml +++ b/app/views/projects/wikis/pages.html.haml @@ -8,5 +8,5 @@ = link_to wiki_page.title, project_wiki_path(@project, wiki_page) %small (#{wiki_page.format}) .pull-right - %small Last edited #{time_ago_with_tooltip(wiki_page.commit.created_at)} + %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} = paginate @wiki_pages, theme: 'gitlab' diff --git a/app/views/projects/wikis/show.html.haml b/app/views/projects/wikis/show.html.haml index cb923e4ca32..ede4fef9e24 100644 --- a/app/views/projects/wikis/show.html.haml +++ b/app/views/projects/wikis/show.html.haml @@ -17,4 +17,4 @@ %hr .wiki-last-edit-by - Last edited by #{commit_author_link(@page.commit, avatar: true, size: 16)} #{time_ago_with_tooltip(@page.commit.created_at)} + Last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} diff --git a/app/views/shared/_file_hljs.html.haml b/app/views/shared/_file_hljs.html.haml index 7dd97c2b25c..cbc01bd60e0 100644 --- a/app/views/shared/_file_hljs.html.haml +++ b/app/views/shared/_file_hljs.html.haml @@ -1,11 +1,12 @@ %div.highlighted-data{class: user_color_scheme_class} .line-numbers - - blob.data.lines.to_a.size.times do |index| - - offset = defined?(first_line_number) ? first_line_number : 1 - - i = index + offset - = link_to "#L#{i}", id: "L#{i}", rel: "#L#{i}" do - %i.icon-link - = i + - if blob.data.present? + - blob.data.lines.to_a.size.times do |index| + - offset = defined?(first_line_number) ? first_line_number : 1 + - i = index + offset + = link_to "#L#{i}", id: "L#{i}", rel: "#L#{i}" do + %i.icon-link + = i .highlight %pre %code{ class: highlightjs_class(blob.name) } diff --git a/lib/api/branches.rb b/lib/api/branches.rb index 75783628e3d..14f8b20f6b2 100644 --- a/lib/api/branches.rb +++ b/lib/api/branches.rb @@ -14,7 +14,7 @@ module API # Example Request: # GET /projects/:id/repository/branches get ":id/repository/branches" do - present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject, project: user_project + present user_project.repository.branches.sort_by(&:name), with: Entities::RepoObject, project: user_project end # Get a single branch @@ -25,7 +25,7 @@ module API # Example Request: # GET /projects/:id/repository/branches/:branch get ':id/repository/branches/:branch', requirements: { branch: /.*/ } do - @branch = user_project.repo.heads.find { |item| item.name == params[:branch] } + @branch = user_project.repository.branches.find { |item| item.name == params[:branch] } not_found!("Branch does not exist") if @branch.nil? present @branch, with: Entities::RepoObject, project: user_project end diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb index 19a1198c68c..4daf65331e8 100644 --- a/lib/gitlab/diff/file.rb +++ b/lib/gitlab/diff/file.rb @@ -24,7 +24,7 @@ module Gitlab end def raw_diff - diff.diff + diff.diff.to_s end def next_line(index) diff --git a/lib/gitlab/project_search_results.rb b/lib/gitlab/project_search_results.rb index 9dc8b34d9c7..8b85f3da83f 100644 --- a/lib/gitlab/project_search_results.rb +++ b/lib/gitlab/project_search_results.rb @@ -4,7 +4,11 @@ module Gitlab def initialize(project_id, query, repository_ref = nil) @project = Project.find(project_id) - @repository_ref = repository_ref + @repository_ref = if repository_ref.present? + repository_ref + else + nil + end @query = Shellwords.shellescape(query) if query.present? end @@ -41,7 +45,7 @@ module Gitlab private def blobs - if project.empty_repo? + if project.empty_repo? || query.blank? [] else project.repository.search_files(query, repository_ref) @@ -49,11 +53,11 @@ module Gitlab end def wiki_blobs - if project.wiki_enabled? - wiki_repo = Repository.new(ProjectWiki.new(project).path_with_namespace) + if project.wiki_enabled? && query.present? + project_wiki = ProjectWiki.new(project) - if wiki_repo.exists? - wiki_repo.search_files(query) + unless project_wiki.empty? + project_wiki.search_files(query) else [] end diff --git a/lib/gitlab/satellite/merge_action.rb b/lib/gitlab/satellite/merge_action.rb index 7c9b2294647..e9141f735aa 100644 --- a/lib/gitlab/satellite/merge_action.rb +++ b/lib/gitlab/satellite/merge_action.rb @@ -65,15 +65,16 @@ module Gitlab prepare_satellite!(merge_repo) update_satellite_source_and_target!(merge_repo) if merge_request.for_fork? - # Only show what is new in the source branch compared to the target branch, not the other way around. - # The line below with merge_base is equivalent to diff with three dots (git diff branch1...branch2) - # From the git documentation: "git diff A...B" is equivalent to "git diff $(git-merge-base A B) B" - common_commit = merge_repo.git.native(:merge_base, default_options, ["origin/#{merge_request.target_branch}", "source/#{merge_request.source_branch}"]).strip - diffs = merge_repo.diff(common_commit, "source/#{merge_request.source_branch}") + repository = Gitlab::Git::Repository.new(merge_repo.path) + diffs = Gitlab::Git::Diff.between( + repository, + "source/#{merge_request.source_branch}", + "origin/#{merge_request.target_branch}" + ) else raise "Attempt to determine diffs between for a non forked merge request in satellite MergeRequest.id:[#{merge_request.id}]" end - diffs = diffs.map { |diff| Gitlab::Git::Diff.new(diff) } + return diffs end rescue Grit::Git::CommandFailed => ex @@ -97,11 +98,16 @@ module Gitlab prepare_satellite!(merge_repo) update_satellite_source_and_target!(merge_repo) if (merge_request.for_fork?) - commits = merge_repo.commits_between("origin/#{merge_request.target_branch}", "source/#{merge_request.source_branch}") + repository = Gitlab::Git::Repository.new(merge_repo.path) + commits = Gitlab::Git::Commit.between( + repository, + "origin/#{merge_request.target_branch}", + "source/#{merge_request.source_branch}" + ) else raise "Attempt to determine commits between for a non forked merge request in satellite MergeRequest.id:[#{merge_request.id}]" end - commits = commits.map { |commit| Gitlab::Git::Commit.new(commit, nil) } + return commits end rescue Grit::Git::CommandFailed => ex diff --git a/spec/features/security/project/internal_access_spec.rb b/spec/features/security/project/internal_access_spec.rb index f86b3db32eb..598d554a946 100644 --- a/spec/features/security/project/internal_access_spec.rb +++ b/spec/features/security/project/internal_access_spec.rb @@ -90,7 +90,7 @@ describe "Internal Project Access", feature: true do describe "GET /:project_path/blob" do before do commit = project.repository.commit - path = commit.tree.contents.select { |i| i.is_a?(Grit::Blob) }.first.name + path = '.gitignore' @blob_path = project_blob_path(project, File.join(commit.id, path)) end diff --git a/spec/features/security/project/private_access_spec.rb b/spec/features/security/project/private_access_spec.rb index a27361f4d15..b1d4c79e05b 100644 --- a/spec/features/security/project/private_access_spec.rb +++ b/spec/features/security/project/private_access_spec.rb @@ -90,7 +90,7 @@ describe "Private Project Access", feature: true do describe "GET /:project_path/blob" do before do commit = project.repository.commit - path = commit.tree.contents.select { |i| i.is_a?(Grit::Blob) }.first.name + path = '.gitignore' @blob_path = project_blob_path(project, File.join(commit.id, path)) end diff --git a/spec/features/security/project/public_access_spec.rb b/spec/features/security/project/public_access_spec.rb index f114965bd4a..a4c8a2be25a 100644 --- a/spec/features/security/project/public_access_spec.rb +++ b/spec/features/security/project/public_access_spec.rb @@ -95,7 +95,7 @@ describe "Public Project Access", feature: true do describe "GET /:project_path/blob" do before do commit = project.repository.commit - path = commit.tree.contents.select { |i| i.is_a?(Grit::Blob) }.first.name + path = '.gitignore' @blob_path = project_blob_path(project, File.join(commit.id, path)) end diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index cb42822b9bb..d065431ee3a 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -36,7 +36,7 @@ describe WikiPage do end it "sets the version attribute" do - @wiki_page.version.should be_a Commit + @wiki_page.version.should be_a Grit::Commit end end end diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb index caded2c9289..8834a6cfa83 100644 --- a/spec/requests/api/branches_spec.rb +++ b/spec/requests/api/branches_spec.rb @@ -17,7 +17,7 @@ describe API::API, api: true do get api("/projects/#{project.id}/repository/branches", user) response.status.should == 200 json_response.should be_an Array - json_response.first['name'].should == project.repo.heads.sort_by(&:name).first.name + json_response.first['name'].should == project.repository.branch_names.first end end