Commit 5f4445c3d384741c45242f077b3c0dbf76234ee8

Authored by Dmitriy Zaporozhets
1 parent 7af16bbb

store commits for MR as array of hashes

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
lib/gitlab/git/tree.rb 0 → 100644
@@ -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 +