Commit 5f4445c3d384741c45242f077b3c0dbf76234ee8
1 parent
7af16bbb
Exists in
master
and in
4 other branches
store commits for MR as array of hashes
Showing
8 changed files
with
113 additions
and
66 deletions
Show diff stats
app/controllers/refs_controller.rb
@@ -48,7 +48,7 @@ class RefsController < ProjectResourceController | @@ -48,7 +48,7 @@ class RefsController < ProjectResourceController | ||
48 | 48 | ||
49 | @repo = project.repository | 49 | @repo = project.repository |
50 | @commit = @repo.commit(@ref) | 50 | @commit = @repo.commit(@ref) |
51 | - @tree = Tree.new(@commit.tree, @ref, params[:path]) | 51 | + @tree = Tree.new(@repo, @commit.id, @ref, params[:path]) |
52 | @hex_path = Digest::SHA1.hexdigest(params[:path] || "") | 52 | @hex_path = Digest::SHA1.hexdigest(params[:path] || "") |
53 | 53 | ||
54 | if params[:path] | 54 | if params[:path] |
app/models/merge_request.rb
@@ -152,17 +152,7 @@ class MergeRequest < ActiveRecord::Base | @@ -152,17 +152,7 @@ class MergeRequest < ActiveRecord::Base | ||
152 | end | 152 | end |
153 | 153 | ||
154 | def commits | 154 | def commits |
155 | - if st_commits.present? | ||
156 | - # check if merge request commits are valid | ||
157 | - if st_commits.first.respond_to?(:short_id) | ||
158 | - st_commits | ||
159 | - else | ||
160 | - # if commits are invalid - simply reload it from repo | ||
161 | - reloaded_commits | ||
162 | - end | ||
163 | - else | ||
164 | - [] | ||
165 | - end | 155 | + load_commits(st_commits) || [] |
166 | end | 156 | end |
167 | 157 | ||
168 | def probably_merged? | 158 | def probably_merged? |
@@ -172,13 +162,7 @@ class MergeRequest < ActiveRecord::Base | @@ -172,13 +162,7 @@ class MergeRequest < ActiveRecord::Base | ||
172 | 162 | ||
173 | def reloaded_commits | 163 | def reloaded_commits |
174 | if opened? && unmerged_commits.any? | 164 | if opened? && unmerged_commits.any? |
175 | - # we need to reset st_commits field first | ||
176 | - # in order to prevent internal rails comparison | ||
177 | - self.st_commits = [] | ||
178 | - save | ||
179 | - | ||
180 | - # Then we can safely write unmerged commits | ||
181 | - self.st_commits = unmerged_commits | 165 | + self.st_commits = dump_commits(unmerged_commits) |
182 | save | 166 | save |
183 | end | 167 | end |
184 | commits | 168 | commits |
@@ -228,4 +212,14 @@ class MergeRequest < ActiveRecord::Base | @@ -228,4 +212,14 @@ class MergeRequest < ActiveRecord::Base | ||
228 | def last_commit_short_sha | 212 | def last_commit_short_sha |
229 | @last_commit_short_sha ||= last_commit.sha[0..10] | 213 | @last_commit_short_sha ||= last_commit.sha[0..10] |
230 | end | 214 | end |
215 | + | ||
216 | + private | ||
217 | + | ||
218 | + def dump_commits(commits) | ||
219 | + commits.map(&:to_hash) | ||
220 | + end | ||
221 | + | ||
222 | + def load_commits(array) | ||
223 | + array.map { |hash| Commit.new(Gitlab::Git::Commit.new(hash)) } | ||
224 | + end | ||
231 | end | 225 | end |
app/models/tree.rb
1 | class Tree | 1 | class Tree |
2 | - include Linguist::BlobHelper | ||
3 | - | ||
4 | attr_accessor :path, :tree, :ref | 2 | attr_accessor :path, :tree, :ref |
5 | 3 | ||
6 | - delegate :contents, :basename, :name, :data, :mime_type, | ||
7 | - :mode, :size, :text?, :colorize, to: :tree | ||
8 | - | ||
9 | - def initialize(raw_tree, ref = nil, path = nil) | ||
10 | - @ref, @path = ref, path | ||
11 | - @tree = if path.present? | ||
12 | - raw_tree / path | ||
13 | - else | ||
14 | - raw_tree | ||
15 | - end | ||
16 | - end | ||
17 | - | ||
18 | - def is_blob? | ||
19 | - tree.is_a?(Grit::Blob) | 4 | + def initialize(repository, sha, ref = nil, path = nil) |
5 | + @raw = Gitlab::Git::Tree.new(repository, sha, ref, path) | ||
20 | end | 6 | end |
21 | 7 | ||
22 | def invalid? | 8 | def invalid? |
23 | - tree.nil? | 9 | + @raw.nil? |
24 | end | 10 | end |
25 | 11 | ||
26 | - def empty? | ||
27 | - data.blank? | 12 | + def method_missing(m, *args, &block) |
13 | + @raw.send(m, *args, &block) | ||
28 | end | 14 | end |
29 | 15 | ||
30 | - def up_dir? | ||
31 | - path.present? | ||
32 | - end | 16 | + def respond_to?(method) |
17 | + return true if @raw.respond_to?(method) | ||
33 | 18 | ||
34 | - def readme | ||
35 | - @readme ||= contents.find { |c| c.is_a?(Grit::Blob) and c.name =~ /^readme/i } | 19 | + super |
36 | end | 20 | end |
37 | end | 21 | end |
app/services/git_push_service.rb
@@ -104,7 +104,7 @@ class GitPushService | @@ -104,7 +104,7 @@ class GitPushService | ||
104 | data[:commits] << { | 104 | data[:commits] << { |
105 | id: commit.id, | 105 | id: commit.id, |
106 | message: commit.safe_message, | 106 | message: commit.safe_message, |
107 | - timestamp: commit.date.xmlschema, | 107 | + timestamp: commit.committed_date.xmlschema, |
108 | url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/commit/#{commit.id}", | 108 | url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/commit/#{commit.id}", |
109 | author: { | 109 | author: { |
110 | name: commit.author_name, | 110 | name: commit.author_name, |
app/views/commits/_diffs.html.haml
@@ -16,7 +16,7 @@ | @@ -16,7 +16,7 @@ | ||
16 | - unless @suppress_diff | 16 | - unless @suppress_diff |
17 | - diffs.each_with_index do |diff, i| | 17 | - diffs.each_with_index do |diff, i| |
18 | - next if diff.diff.empty? | 18 | - next if diff.diff.empty? |
19 | - - file = (@commit.tree / diff.new_path) | 19 | + - file = Tree.new(@repository, @commit.id, @ref, diff.new_path) |
20 | - file = (@commit.prev_commit.tree / diff.old_path) unless file | 20 | - file = (@commit.prev_commit.tree / diff.old_path) unless file |
21 | - next unless file | 21 | - next unless file |
22 | .file{id: "diff-#{i}"} | 22 | .file{id: "diff-#{i}"} |
lib/extracts_path.rb
@@ -102,7 +102,7 @@ module ExtractsPath | @@ -102,7 +102,7 @@ module ExtractsPath | ||
102 | # because "@project.repository.commit(@ref)" returns wrong commit when @ref is tag name. | 102 | # because "@project.repository.commit(@ref)" returns wrong commit when @ref is tag name. |
103 | @commit = @project.repository.commits(@ref, @path, 1, 0).first | 103 | @commit = @project.repository.commits(@ref, @path, 1, 0).first |
104 | 104 | ||
105 | - @tree = Tree.new(@commit.tree, @ref, @path) | 105 | + @tree = Tree.new(@project.repository, @commit.id, @ref, @path) |
106 | 106 | ||
107 | raise InvalidPathError if @tree.invalid? | 107 | raise InvalidPathError if @tree.invalid? |
108 | rescue RuntimeError, NoMethodError, InvalidPathError | 108 | rescue RuntimeError, NoMethodError, InvalidPathError |
lib/gitlab/git/commit.rb
@@ -4,13 +4,19 @@ | @@ -4,13 +4,19 @@ | ||
4 | module Gitlab | 4 | module Gitlab |
5 | module Git | 5 | module Git |
6 | class Commit | 6 | class Commit |
7 | - attr_accessor :raw_commit, :head, :refs | 7 | + attr_accessor :raw_commit, :head, :refs, |
8 | + :sha, :authored_date, :committed_date, :message, | ||
9 | + :author_name, :author_email, | ||
10 | + :committer_name, :committer_email | ||
8 | 11 | ||
9 | - delegate :message, :authored_date, :committed_date, :parents, :sha, | ||
10 | - :date, :committer, :author, :diffs, :tree, :id, :stats, :to_patch, | 12 | + delegate :parents, :diffs, :tree, :stats, :to_patch, |
11 | to: :raw_commit | 13 | to: :raw_commit |
12 | 14 | ||
13 | class << self | 15 | class << self |
16 | + def serialize_keys | ||
17 | + %w(sha authored_date committed_date author_name author_email committer_name committer_email message) | ||
18 | + end | ||
19 | + | ||
14 | def find_or_first(repo, commit_id = nil, root_ref) | 20 | def find_or_first(repo, commit_id = nil, root_ref) |
15 | commit = if commit_id | 21 | commit = if commit_id |
16 | repo.commit(commit_id) | 22 | repo.commit(commit_id) |
@@ -73,10 +79,19 @@ module Gitlab | @@ -73,10 +79,19 @@ module Gitlab | ||
73 | def initialize(raw_commit, head = nil) | 79 | def initialize(raw_commit, head = nil) |
74 | raise "Nil as raw commit passed" unless raw_commit | 80 | raise "Nil as raw commit passed" unless raw_commit |
75 | 81 | ||
76 | - @raw_commit = raw_commit | 82 | + if raw_commit.is_a?(Hash) |
83 | + init_from_hash(raw_commit) | ||
84 | + else | ||
85 | + init_from_grit(raw_commit) | ||
86 | + end | ||
87 | + | ||
77 | @head = head | 88 | @head = head |
78 | end | 89 | end |
79 | 90 | ||
91 | + def id | ||
92 | + sha | ||
93 | + end | ||
94 | + | ||
80 | def short_id(length = 10) | 95 | def short_id(length = 10) |
81 | id.to_s[0..length] | 96 | id.to_s[0..length] |
82 | end | 97 | end |
@@ -89,27 +104,11 @@ module Gitlab | @@ -89,27 +104,11 @@ module Gitlab | ||
89 | committed_date | 104 | committed_date |
90 | end | 105 | end |
91 | 106 | ||
92 | - def author_email | ||
93 | - author.email | ||
94 | - end | ||
95 | - | ||
96 | - def author_name | ||
97 | - author.name | ||
98 | - end | ||
99 | - | ||
100 | # Was this commit committed by a different person than the original author? | 107 | # Was this commit committed by a different person than the original author? |
101 | def different_committer? | 108 | def different_committer? |
102 | author_name != committer_name || author_email != committer_email | 109 | author_name != committer_name || author_email != committer_email |
103 | end | 110 | end |
104 | 111 | ||
105 | - def committer_name | ||
106 | - committer.name | ||
107 | - end | ||
108 | - | ||
109 | - def committer_email | ||
110 | - committer.email | ||
111 | - end | ||
112 | - | ||
113 | def prev_commit | 112 | def prev_commit |
114 | @prev_commit ||= if parents.present? | 113 | @prev_commit ||= if parents.present? |
115 | Commit.new(parents.first) | 114 | Commit.new(parents.first) |
@@ -148,6 +147,38 @@ module Gitlab | @@ -148,6 +147,38 @@ module Gitlab | ||
148 | def no_commit_message | 147 | def no_commit_message |
149 | "--no commit message" | 148 | "--no commit message" |
150 | end | 149 | end |
150 | + | ||
151 | + def to_hash | ||
152 | + hash = {} | ||
153 | + | ||
154 | + keys = Commit.serialize_keys | ||
155 | + | ||
156 | + keys.each do |key| | ||
157 | + hash[key] = send(key) | ||
158 | + end | ||
159 | + | ||
160 | + hash | ||
161 | + end | ||
162 | + | ||
163 | + private | ||
164 | + | ||
165 | + def init_from_grit(grit) | ||
166 | + @raw_commit = grit | ||
167 | + @sha = grit.sha | ||
168 | + @message = grit.message | ||
169 | + @authored_date = grit.authored_date | ||
170 | + @committed_date = grit.committed_date | ||
171 | + @author_name = grit.author.name | ||
172 | + @author_email = grit.author.email | ||
173 | + @committer_name = grit.committer.name | ||
174 | + @committer_email = grit.committer.email | ||
175 | + end | ||
176 | + | ||
177 | + def init_from_hash(hash) | ||
178 | + Commit.serialize_keys.each do |key| | ||
179 | + send(:"#{key}=", hash[key]) | ||
180 | + end | ||
181 | + end | ||
151 | end | 182 | end |
152 | end | 183 | end |
153 | end | 184 | end |
@@ -0,0 +1,38 @@ | @@ -0,0 +1,38 @@ | ||
1 | +module Gitlab | ||
2 | + module Git | ||
3 | + class Tree | ||
4 | + include Linguist::BlobHelper | ||
5 | + | ||
6 | + attr_accessor :repository, :sha, :path, :ref, :raw_tree | ||
7 | + | ||
8 | + def initialize(repository, sha, ref = nil, path = nil) | ||
9 | + @repository, @sha, @ref = repository, sha, ref | ||
10 | + | ||
11 | + # Load tree from repository | ||
12 | + @commit = @repository.commit(sha) | ||
13 | + @raw_tree = @repository.tree(@commit, path) | ||
14 | + end | ||
15 | + | ||
16 | + def empty? | ||
17 | + data.blank? | ||
18 | + end | ||
19 | + | ||
20 | + def data | ||
21 | + raw_tree.data | ||
22 | + end | ||
23 | + | ||
24 | + def is_blob? | ||
25 | + tree.is_a?(Grit::Blob) | ||
26 | + end | ||
27 | + | ||
28 | + def up_dir? | ||
29 | + path.present? | ||
30 | + end | ||
31 | + | ||
32 | + def readme | ||
33 | + @readme ||= contents.find { |c| c.is_a?(Grit::Blob) and c.name =~ /^readme/i } | ||
34 | + end | ||
35 | + end | ||
36 | + end | ||
37 | +end | ||
38 | + |