Commit 3a1c6cccc5389f74b59863e6da8b3d1babade015
Exists in
spb-stable
and in
3 other branches
Merge branch 'bug/500_tag_name' into 'master'
Fix 500 on tags page Fix bug when grit parse tags wrong and raise exception on tags page. Fixes #993
Showing
13 changed files
with
114 additions
and
72 deletions
Show diff stats
Gemfile
@@ -29,7 +29,7 @@ gem 'omniauth-github' | @@ -29,7 +29,7 @@ gem 'omniauth-github' | ||
29 | 29 | ||
30 | # Extracting information from a git repository | 30 | # Extracting information from a git repository |
31 | # Provide access to Gitlab::Git library | 31 | # Provide access to Gitlab::Git library |
32 | -gem "gitlab_git", "~> 5.0.0" | 32 | +gem "gitlab_git", git: 'https://gitlab.com/gitlab-org/gitlab_git.git', ref: '39bc4f043414f1e49f802ed633fa20e6400bfa49' |
33 | 33 | ||
34 | # Ruby/Rack Git Smart-HTTP Server Handler | 34 | # Ruby/Rack Git Smart-HTTP Server Handler |
35 | gem 'gitlab-grack', '~> 2.0.0.pre', require: 'grack' | 35 | gem 'gitlab-grack', '~> 2.0.0.pre', require: 'grack' |
Gemfile.lock
@@ -5,6 +5,17 @@ GIT | @@ -5,6 +5,17 @@ GIT | ||
5 | specs: | 5 | specs: |
6 | github-markup (0.7.6) | 6 | github-markup (0.7.6) |
7 | 7 | ||
8 | +GIT | ||
9 | + remote: https://gitlab.com/gitlab-org/gitlab_git.git | ||
10 | + revision: 39bc4f043414f1e49f802ed633fa20e6400bfa49 | ||
11 | + ref: 39bc4f043414f1e49f802ed633fa20e6400bfa49 | ||
12 | + specs: | ||
13 | + gitlab_git (5.1.0.pre) | ||
14 | + activesupport (~> 4.0.0) | ||
15 | + gitlab-grit (~> 2.6.1) | ||
16 | + gitlab-linguist (~> 3.0.0) | ||
17 | + rugged (~> 0.19.0) | ||
18 | + | ||
8 | GEM | 19 | GEM |
9 | remote: https://rubygems.org/ | 20 | remote: https://rubygems.org/ |
10 | specs: | 21 | specs: |
@@ -176,10 +187,6 @@ GEM | @@ -176,10 +187,6 @@ GEM | ||
176 | charlock_holmes (~> 0.6.6) | 187 | charlock_holmes (~> 0.6.6) |
177 | escape_utils (~> 0.2.4) | 188 | escape_utils (~> 0.2.4) |
178 | mime-types (~> 1.19) | 189 | mime-types (~> 1.19) |
179 | - gitlab_git (5.0.0) | ||
180 | - activesupport (~> 4.0.0) | ||
181 | - gitlab-grit (~> 2.6.1) | ||
182 | - gitlab-linguist (~> 3.0.0) | ||
183 | gitlab_meta (6.0) | 190 | gitlab_meta (6.0) |
184 | gitlab_omniauth-ldap (1.0.4) | 191 | gitlab_omniauth-ldap (1.0.4) |
185 | net-ldap (~> 0.3.1) | 192 | net-ldap (~> 0.3.1) |
@@ -417,6 +424,7 @@ GEM | @@ -417,6 +424,7 @@ GEM | ||
417 | ruby-hmac (0.4.0) | 424 | ruby-hmac (0.4.0) |
418 | ruby-progressbar (1.2.0) | 425 | ruby-progressbar (1.2.0) |
419 | rubyntlm (0.1.1) | 426 | rubyntlm (0.1.1) |
427 | + rugged (0.19.0) | ||
420 | safe_yaml (0.9.7) | 428 | safe_yaml (0.9.7) |
421 | sanitize (2.0.6) | 429 | sanitize (2.0.6) |
422 | nokogiri (>= 1.4.4) | 430 | nokogiri (>= 1.4.4) |
@@ -574,7 +582,7 @@ DEPENDENCIES | @@ -574,7 +582,7 @@ DEPENDENCIES | ||
574 | gitlab-gollum-lib (~> 1.1.0) | 582 | gitlab-gollum-lib (~> 1.1.0) |
575 | gitlab-grack (~> 2.0.0.pre) | 583 | gitlab-grack (~> 2.0.0.pre) |
576 | gitlab-linguist (~> 3.0.0) | 584 | gitlab-linguist (~> 3.0.0) |
577 | - gitlab_git (~> 5.0.0) | 585 | + gitlab_git! |
578 | gitlab_meta (= 6.0) | 586 | gitlab_meta (= 6.0) |
579 | gitlab_omniauth-ldap (= 1.0.4) | 587 | gitlab_omniauth-ldap (= 1.0.4) |
580 | gon (~> 5.0.0) | 588 | gon (~> 5.0.0) |
app/controllers/projects/tags_controller.rb
@@ -8,7 +8,7 @@ class Projects::TagsController < Projects::ApplicationController | @@ -8,7 +8,7 @@ class Projects::TagsController < Projects::ApplicationController | ||
8 | before_filter :authorize_admin_project!, only: [:destroy] | 8 | before_filter :authorize_admin_project!, only: [:destroy] |
9 | 9 | ||
10 | def index | 10 | def index |
11 | - @tags = Kaminari.paginate_array(@repository.tags).page(params[:page]).per(30) | 11 | + @tags = Kaminari.paginate_array(@repository.tags.reverse).page(params[:page]).per(30) |
12 | end | 12 | end |
13 | 13 | ||
14 | def create | 14 | def create |
app/helpers/gitlab_markdown_helper.rb
@@ -166,13 +166,13 @@ module GitlabMarkdownHelper | @@ -166,13 +166,13 @@ module GitlabMarkdownHelper | ||
166 | 166 | ||
167 | def file_exists?(path) | 167 | def file_exists?(path) |
168 | return false if path.nil? || path.empty? | 168 | return false if path.nil? || path.empty? |
169 | - return @repository.blob_at(current_ref, path).present? || Tree.new(@repository, current_ref, path).entries.any? | 169 | + return @repository.blob_at(current_ref, path).present? || @repository.tree(:head, path).entries.any? |
170 | end | 170 | end |
171 | 171 | ||
172 | # Check if the path is pointing to a directory(tree) or a file(blob) | 172 | # Check if the path is pointing to a directory(tree) or a file(blob) |
173 | # eg. doc/api is directory and doc/README.md is file | 173 | # eg. doc/api is directory and doc/README.md is file |
174 | def local_path(path) | 174 | def local_path(path) |
175 | - return "tree" if Tree.new(@repository, current_ref, path).entries.any? | 175 | + return "tree" if @repository.tree(:head, path).entries.any? |
176 | return "raw" if @repository.blob_at(current_ref, path).image? | 176 | return "raw" if @repository.blob_at(current_ref, path).image? |
177 | return "blob" | 177 | return "blob" |
178 | end | 178 | end |
app/models/commit.rb
@@ -16,29 +16,31 @@ class Commit | @@ -16,29 +16,31 @@ class Commit | ||
16 | DIFF_HARD_LIMIT_FILES = 500 | 16 | DIFF_HARD_LIMIT_FILES = 500 |
17 | DIFF_HARD_LIMIT_LINES = 10000 | 17 | DIFF_HARD_LIMIT_LINES = 10000 |
18 | 18 | ||
19 | - def self.decorate(commits) | ||
20 | - commits.map { |c| self.new(c) } | ||
21 | - end | 19 | + class << self |
20 | + def decorate(commits) | ||
21 | + commits.map { |c| self.new(c) } | ||
22 | + end | ||
22 | 23 | ||
23 | - # Calculate number of lines to render for diffs | ||
24 | - def self.diff_line_count(diffs) | ||
25 | - diffs.reduce(0){|sum, d| sum + d.diff.lines.count} | ||
26 | - end | 24 | + # Calculate number of lines to render for diffs |
25 | + def diff_line_count(diffs) | ||
26 | + diffs.reduce(0){|sum, d| sum + d.diff.lines.count} | ||
27 | + end | ||
27 | 28 | ||
28 | - def self.diff_suppress?(diffs, line_count = nil) | ||
29 | - # optimize - check file count first | ||
30 | - return true if diffs.size > DIFF_SAFE_FILES | 29 | + def diff_suppress?(diffs, line_count = nil) |
30 | + # optimize - check file count first | ||
31 | + return true if diffs.size > DIFF_SAFE_FILES | ||
31 | 32 | ||
32 | - line_count ||= Commit::diff_line_count(diffs) | ||
33 | - line_count > DIFF_SAFE_LINES | ||
34 | - end | 33 | + line_count ||= Commit::diff_line_count(diffs) |
34 | + line_count > DIFF_SAFE_LINES | ||
35 | + end | ||
35 | 36 | ||
36 | - def self.diff_force_suppress?(diffs, line_count = nil) | ||
37 | - # optimize - check file count first | ||
38 | - return true if diffs.size > DIFF_HARD_LIMIT_FILES | 37 | + def diff_force_suppress?(diffs, line_count = nil) |
38 | + # optimize - check file count first | ||
39 | + return true if diffs.size > DIFF_HARD_LIMIT_FILES | ||
39 | 40 | ||
40 | - line_count ||= Commit::diff_line_count(diffs) | ||
41 | - line_count > DIFF_HARD_LIMIT_LINES | 41 | + line_count ||= Commit::diff_line_count(diffs) |
42 | + line_count > DIFF_HARD_LIMIT_LINES | ||
43 | + end | ||
42 | end | 44 | end |
43 | 45 | ||
44 | attr_accessor :raw | 46 | attr_accessor :raw |
app/models/repository.rb
@@ -57,7 +57,7 @@ class Repository | @@ -57,7 +57,7 @@ class Repository | ||
57 | 57 | ||
58 | def recent_branches(limit = 20) | 58 | def recent_branches(limit = 20) |
59 | branches.sort do |a, b| | 59 | branches.sort do |a, b| |
60 | - b.commit.committed_date <=> a.commit.committed_date | 60 | + commit(b.target).committed_date <=> commit(a.target).committed_date |
61 | end[0..limit] | 61 | end[0..limit] |
62 | end | 62 | end |
63 | 63 | ||
@@ -163,7 +163,19 @@ class Repository | @@ -163,7 +163,19 @@ class Repository | ||
163 | 163 | ||
164 | def readme | 164 | def readme |
165 | Rails.cache.fetch(cache_key(:readme)) do | 165 | Rails.cache.fetch(cache_key(:readme)) do |
166 | - Tree.new(self, self.root_ref).readme | 166 | + tree(:head).readme |
167 | end | 167 | end |
168 | end | 168 | end |
169 | + | ||
170 | + def head_commit | ||
171 | + commit(self.root_ref) | ||
172 | + end | ||
173 | + | ||
174 | + def tree(sha = :head, path = nil) | ||
175 | + if sha == :head | ||
176 | + sha = head_commit.sha | ||
177 | + end | ||
178 | + | ||
179 | + Tree.new(self, sha, path) | ||
180 | + end | ||
169 | end | 181 | end |
app/models/tree.rb
app/views/projects/branches/_branch.html.haml
1 | -- commit = Commit.new(Gitlab::Git::Commit.new(branch.commit)) | 1 | +- commit = @repository.commit(branch.target) |
2 | %li | 2 | %li |
3 | %h4 | 3 | %h4 |
4 | = link_to project_commits_path(@project, branch.name) do | 4 | = link_to project_commits_path(@project, branch.name) do |
@@ -19,10 +19,14 @@ | @@ -19,10 +19,14 @@ | ||
19 | = link_to project_branch_path(@project, branch.name), class: 'btn grouped btn-small remove-row', method: :delete, data: { confirm: 'Removed branch cannot be restored. Are you sure?'}, remote: true do | 19 | = link_to project_branch_path(@project, branch.name), class: 'btn grouped btn-small remove-row', method: :delete, data: { confirm: 'Removed branch cannot be restored. Are you sure?'}, remote: true do |
20 | %i.icon-trash | 20 | %i.icon-trash |
21 | 21 | ||
22 | - %p | ||
23 | - = link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do | ||
24 | - = commit.short_id | ||
25 | - = image_tag avatar_icon(commit.author_email), class: "avatar s16", alt: '' | ||
26 | - %span.light | ||
27 | - = gfm escape_once(truncate(commit.title, length: 40)) | ||
28 | - #{time_ago_with_tooltip(commit.committed_date)} | 22 | + - if commit |
23 | + %p | ||
24 | + = link_to project_commit_path(@project, commit.id), class: 'commit_short_id' do | ||
25 | + = commit.short_id | ||
26 | + = image_tag avatar_icon(commit.author_email), class: "avatar s16", alt: '' | ||
27 | + %span.light | ||
28 | + = gfm escape_once(truncate(commit.title, length: 40)) | ||
29 | + #{time_ago_with_tooltip(commit.committed_date)} | ||
30 | + - else | ||
31 | + %p | ||
32 | + Cant find HEAD commit for this branch |
@@ -0,0 +1,22 @@ | @@ -0,0 +1,22 @@ | ||
1 | +- commit = @repository.commit(tag.target) | ||
2 | +%li | ||
3 | + %h4 | ||
4 | + = link_to project_commits_path(@project, tag.name), class: "" do | ||
5 | + %i.icon-tag | ||
6 | + = tag.name | ||
7 | + .pull-right | ||
8 | + %small.cdark | ||
9 | + %i.icon-calendar | ||
10 | + #{time_ago_with_tooltip(commit.committed_date)} | ||
11 | + %p.prepend-left-20 | ||
12 | + = link_to commit.short_id(8), project_commit_path(@project, commit), class: "monospace" | ||
13 | + – | ||
14 | + = link_to_gfm truncate(commit.title, length: 70), project_commit_path(@project, commit.id), class: "cdark" | ||
15 | + | ||
16 | + %span.pull-right | ||
17 | + - if can? current_user, :download_code, @project | ||
18 | + = render 'projects/repositories/download_archive', ref: tag.name, btn_class: 'grouped btn-group-small' | ||
19 | + - if can?(current_user, :admin_project, @project) | ||
20 | + = link_to project_tag_path(@project, tag.name), class: 'btn btn-small remove-row grouped', method: :delete, data: { confirm: 'Removed tag cannot be restored. Are you sure?'}, remote: true do | ||
21 | + %i.icon-trash | ||
22 | + |
app/views/projects/tags/index.html.haml
@@ -13,29 +13,7 @@ | @@ -13,29 +13,7 @@ | ||
13 | - unless @tags.empty? | 13 | - unless @tags.empty? |
14 | %ul.bordered-list | 14 | %ul.bordered-list |
15 | - @tags.each do |tag| | 15 | - @tags.each do |tag| |
16 | - - commit = Commit.new(Gitlab::Git::Commit.new(tag.commit)) | ||
17 | - %li | ||
18 | - %h4 | ||
19 | - = link_to project_commits_path(@project, tag.name), class: "" do | ||
20 | - %i.icon-tag | ||
21 | - = tag.name | ||
22 | - %small | ||
23 | - = truncate(tag.message || '', length: 70) | ||
24 | - .pull-right | ||
25 | - %small.cdark | ||
26 | - %i.icon-calendar | ||
27 | - #{time_ago_with_tooltip(commit.committed_date)} | ||
28 | - %p.prepend-left-20 | ||
29 | - = link_to commit.short_id(8), project_commit_path(@project, commit), class: "monospace" | ||
30 | - – | ||
31 | - = link_to_gfm truncate(commit.title, length: 70), project_commit_path(@project, commit.id), class: "cdark" | ||
32 | - | ||
33 | - %span.pull-right | ||
34 | - - if can? current_user, :download_code, @project | ||
35 | - = render 'projects/repositories/download_archive', ref: tag.name, btn_class: 'grouped btn-group-small' | ||
36 | - - if can?(current_user, :admin_project, @project) | ||
37 | - = link_to project_tag_path(@project, tag.name), class: 'btn btn-small remove-row grouped', method: :delete, data: { confirm: 'Removed tag cannot be restored. Are you sure?'}, remote: true do | ||
38 | - %i.icon-trash | 16 | + = render 'tag', tag: tag |
39 | 17 | ||
40 | = paginate @tags, theme: 'gitlab' | 18 | = paginate @tags, theme: 'gitlab' |
41 | 19 |
lib/api/entities.rb
@@ -79,7 +79,16 @@ module API | @@ -79,7 +79,16 @@ module API | ||
79 | end | 79 | end |
80 | 80 | ||
81 | class RepoObject < Grape::Entity | 81 | class RepoObject < Grape::Entity |
82 | - expose :name, :commit | 82 | + expose :name |
83 | + | ||
84 | + expose :commit do |repo_obj, options| | ||
85 | + if repo_obj.respond_to?(:commit) | ||
86 | + repo_obj.commit | ||
87 | + elsif options[:project] | ||
88 | + options[:project].repository.commit(repo_obj.target) | ||
89 | + end | ||
90 | + end | ||
91 | + | ||
83 | expose :protected do |repo, options| | 92 | expose :protected do |repo, options| |
84 | if options[:project] | 93 | if options[:project] |
85 | options[:project].protected_branch? repo.name | 94 | options[:project].protected_branch? repo.name |
@@ -87,6 +96,16 @@ module API | @@ -87,6 +96,16 @@ module API | ||
87 | end | 96 | end |
88 | end | 97 | end |
89 | 98 | ||
99 | + class RepoTreeObject < Grape::Entity | ||
100 | + expose :id, :name, :type | ||
101 | + | ||
102 | + expose :mode do |obj, options| | ||
103 | + filemode = obj.mode.to_s(8) | ||
104 | + filemode = "0" + filemode if filemode.length < 6 | ||
105 | + filemode | ||
106 | + end | ||
107 | + end | ||
108 | + | ||
90 | class RepoCommit < Grape::Entity | 109 | class RepoCommit < Grape::Entity |
91 | expose :id, :short_id, :title, :author_name, :author_email, :created_at | 110 | expose :id, :short_id, :title, :author_name, :author_email, :created_at |
92 | end | 111 | end |
lib/api/repositories.rb
@@ -82,7 +82,7 @@ module API | @@ -82,7 +82,7 @@ module API | ||
82 | # Example Request: | 82 | # Example Request: |
83 | # GET /projects/:id/repository/tags | 83 | # GET /projects/:id/repository/tags |
84 | get ":id/repository/tags" do | 84 | get ":id/repository/tags" do |
85 | - present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject | 85 | + present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject, project: user_project |
86 | end | 86 | end |
87 | 87 | ||
88 | # Get a project repository commits | 88 | # Get a project repository commits |
@@ -141,15 +141,9 @@ module API | @@ -141,15 +141,9 @@ module API | ||
141 | path = params[:path] || nil | 141 | path = params[:path] || nil |
142 | 142 | ||
143 | commit = user_project.repository.commit(ref) | 143 | commit = user_project.repository.commit(ref) |
144 | - tree = Tree.new(user_project.repository, commit.id, path) | 144 | + tree = user_project.repository.tree(commit.id, path) |
145 | 145 | ||
146 | - trees = [] | ||
147 | - | ||
148 | - %w(trees blobs submodules).each do |type| | ||
149 | - trees += tree.send(type).map { |t| {name: t.name, type: type.singularize, mode: t.mode, id: t.id} } | ||
150 | - end | ||
151 | - | ||
152 | - trees | 146 | + present tree.sorted_entries, with: Entities::RepoTreeObject |
153 | end | 147 | end |
154 | 148 | ||
155 | # Get a raw file contents | 149 | # Get a raw file contents |
@@ -233,4 +227,3 @@ module API | @@ -233,4 +227,3 @@ module API | ||
233 | end | 227 | end |
234 | end | 228 | end |
235 | end | 229 | end |
236 | - |
lib/extracts_path.rb