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 | 48 | |
49 | 49 | @repo = project.repository |
50 | 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 | 52 | @hex_path = Digest::SHA1.hexdigest(params[:path] || "") |
53 | 53 | |
54 | 54 | if params[:path] | ... | ... |
app/models/merge_request.rb
... | ... | @@ -152,17 +152,7 @@ class MergeRequest < ActiveRecord::Base |
152 | 152 | end |
153 | 153 | |
154 | 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 | 156 | end |
167 | 157 | |
168 | 158 | def probably_merged? |
... | ... | @@ -172,13 +162,7 @@ class MergeRequest < ActiveRecord::Base |
172 | 162 | |
173 | 163 | def reloaded_commits |
174 | 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 | 166 | save |
183 | 167 | end |
184 | 168 | commits |
... | ... | @@ -228,4 +212,14 @@ class MergeRequest < ActiveRecord::Base |
228 | 212 | def last_commit_short_sha |
229 | 213 | @last_commit_short_sha ||= last_commit.sha[0..10] |
230 | 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 | 225 | end | ... | ... |
app/models/tree.rb
1 | 1 | class Tree |
2 | - include Linguist::BlobHelper | |
3 | - | |
4 | 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 | 6 | end |
21 | 7 | |
22 | 8 | def invalid? |
23 | - tree.nil? | |
9 | + @raw.nil? | |
24 | 10 | end |
25 | 11 | |
26 | - def empty? | |
27 | - data.blank? | |
12 | + def method_missing(m, *args, &block) | |
13 | + @raw.send(m, *args, &block) | |
28 | 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 | 20 | end |
37 | 21 | end | ... | ... |
app/services/git_push_service.rb
... | ... | @@ -104,7 +104,7 @@ class GitPushService |
104 | 104 | data[:commits] << { |
105 | 105 | id: commit.id, |
106 | 106 | message: commit.safe_message, |
107 | - timestamp: commit.date.xmlschema, | |
107 | + timestamp: commit.committed_date.xmlschema, | |
108 | 108 | url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/commit/#{commit.id}", |
109 | 109 | author: { |
110 | 110 | name: commit.author_name, | ... | ... |
app/views/commits/_diffs.html.haml
... | ... | @@ -16,7 +16,7 @@ |
16 | 16 | - unless @suppress_diff |
17 | 17 | - diffs.each_with_index do |diff, i| |
18 | 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 | 20 | - file = (@commit.prev_commit.tree / diff.old_path) unless file |
21 | 21 | - next unless file |
22 | 22 | .file{id: "diff-#{i}"} | ... | ... |
lib/extracts_path.rb
... | ... | @@ -102,7 +102,7 @@ module ExtractsPath |
102 | 102 | # because "@project.repository.commit(@ref)" returns wrong commit when @ref is tag name. |
103 | 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 | 107 | raise InvalidPathError if @tree.invalid? |
108 | 108 | rescue RuntimeError, NoMethodError, InvalidPathError | ... | ... |
lib/gitlab/git/commit.rb
... | ... | @@ -4,13 +4,19 @@ |
4 | 4 | module Gitlab |
5 | 5 | module Git |
6 | 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 | 13 | to: :raw_commit |
12 | 14 | |
13 | 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 | 20 | def find_or_first(repo, commit_id = nil, root_ref) |
15 | 21 | commit = if commit_id |
16 | 22 | repo.commit(commit_id) |
... | ... | @@ -73,10 +79,19 @@ module Gitlab |
73 | 79 | def initialize(raw_commit, head = nil) |
74 | 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 | 88 | @head = head |
78 | 89 | end |
79 | 90 | |
91 | + def id | |
92 | + sha | |
93 | + end | |
94 | + | |
80 | 95 | def short_id(length = 10) |
81 | 96 | id.to_s[0..length] |
82 | 97 | end |
... | ... | @@ -89,27 +104,11 @@ module Gitlab |
89 | 104 | committed_date |
90 | 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 | 107 | # Was this commit committed by a different person than the original author? |
101 | 108 | def different_committer? |
102 | 109 | author_name != committer_name || author_email != committer_email |
103 | 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 | 112 | def prev_commit |
114 | 113 | @prev_commit ||= if parents.present? |
115 | 114 | Commit.new(parents.first) |
... | ... | @@ -148,6 +147,38 @@ module Gitlab |
148 | 147 | def no_commit_message |
149 | 148 | "--no commit message" |
150 | 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 | 182 | end |
152 | 183 | end |
153 | 184 | end | ... | ... |
... | ... | @@ -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 | + | ... | ... |