##// END OF EJS Templates
scm: git: call "git log" only once instead of per branch in fetching revisions (#8857)...
Toshi MARUYAMA -
r8719:1e5f16722fc3
parent child
Show More
@@ -107,8 +107,7 class Repository::Git < Repository
107 # However, Git does not have a sequential commit numbering.
107 # However, Git does not have a sequential commit numbering.
108 #
108 #
109 # In order to fetch only new adding revisions,
109 # In order to fetch only new adding revisions,
110 # Redmine needs to parse revisions per branch.
110 # Redmine needs to save "heads".
111 # Branch "last_scmid" is for this requirement.
112 #
111 #
113 # In Git and Mercurial, revisions are not in date order.
112 # In Git and Mercurial, revisions are not in date order.
114 # Redmine Mercurial fixed issues.
113 # Redmine Mercurial fixed issues.
@@ -131,9 +130,17 class Repository::Git < Repository
131 def fetch_changesets
130 def fetch_changesets
132 scm_brs = branches
131 scm_brs = branches
133 return if scm_brs.nil? || scm_brs.empty?
132 return if scm_brs.nil? || scm_brs.empty?
133
134 h1 = extra_info || {}
134 h1 = extra_info || {}
135 h = h1.dup
135 h = h1.dup
136 h["branches"] ||= {}
136 repo_heads = scm_brs.map{ |br| br.scmid }
137 h["heads"] ||= []
138 prev_db_heads = h["heads"].dup
139 if prev_db_heads.empty?
140 prev_db_heads += heads_from_branches_hash
141 end
142 return if prev_db_heads.sort == repo_heads.sort
143
137 h["db_consistent"] ||= {}
144 h["db_consistent"] ||= {}
138 if changesets.count == 0
145 if changesets.count == 0
139 h["db_consistent"]["ordering"] = 1
146 h["db_consistent"]["ordering"] = 1
@@ -144,35 +151,39 class Repository::Git < Repository
144 merge_extra_info(h)
151 merge_extra_info(h)
145 self.save
152 self.save
146 end
153 end
147 save_revisions(h, scm_brs)
154
148 end
155 save_revisions(prev_db_heads, repo_heads)
149
156 end
150 def save_revisions(h, scm_brs)
157
151 scm_brs.each do |br1|
158 def save_revisions(prev_db_heads, repo_heads)
152 br = br1.to_s
159 h = {}
153 from_scmid = nil
160 opts = {}
154 from_scmid = h["branches"][br]["last_scmid"] if h["branches"][br]
161 opts[:reverse] = true
155 h["branches"][br] ||= {}
162 opts[:excludes] = prev_db_heads
156 begin
163 opts[:includes] = repo_heads
157 scm.revisions('', from_scmid, br, {:reverse => true}) do |rev|
164 begin
158 db_rev = find_changeset_by_name(rev.revision)
165 scm.revisions('', nil, nil, opts) do |rev|
159 transaction do
166 db_rev = find_changeset_by_name(rev.scmid)
160 if db_rev.nil?
167 transaction do
161 db_saved_rev = save_revision(rev)
168 if db_rev.nil?
162 parents = {}
169 db_saved_rev = save_revision(rev)
163 parents[db_saved_rev] = rev.parents unless rev.parents.nil?
170 parents = {}
164 parents.each do |ch, chparents|
171 parents[db_saved_rev] = rev.parents unless rev.parents.nil?
165 ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact
172 parents.each do |ch, chparents|
166 end
173 ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact
167 end
174 end
168 h["branches"][br]["last_scmid"] = rev.scmid
169 merge_extra_info(h)
170 self.save
171 end
175 end
176 h["heads"] = prev_db_heads.dup
177 h["heads"] << rev.scmid
178 merge_extra_info(h)
179 self.save
172 end
180 end
173 rescue Redmine::Scm::Adapters::CommandFailed => e
174 logger.error("save revisions error: #{e.message}")
175 end
181 end
182 h["heads"] = repo_heads.dup
183 merge_extra_info(h)
184 self.save
185 rescue Redmine::Scm::Adapters::CommandFailed => e
186 logger.error("save revisions error: #{e.message}")
176 end
187 end
177 end
188 end
178 private :save_revisions
189 private :save_revisions
@@ -87,7 +87,7 class RepositoryGitTest < ActiveSupport::TestCase
87 assert_equal "README", change.path
87 assert_equal "README", change.path
88 assert_equal "A", change.action
88 assert_equal "A", change.action
89
89
90 assert_equal 5, @repository.extra_info["branches"].size
90 assert_equal 5, @repository.extra_info["heads"].size
91 end
91 end
92
92
93 def test_fetch_changesets_incremental
93 def test_fetch_changesets_incremental
@@ -95,11 +95,10 class RepositoryGitTest < ActiveSupport::TestCase
95 @repository.fetch_changesets
95 @repository.fetch_changesets
96 @project.reload
96 @project.reload
97 assert_equal NUM_REV, @repository.changesets.count
97 assert_equal NUM_REV, @repository.changesets.count
98 extra_info_db = @repository.extra_info["branches"]
98 extra_info_heads = @repository.extra_info["heads"].dup
99 assert_equal "1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127",
99 assert_equal 5, extra_info_heads.size
100 extra_info_db["latin-1-path-encoding"]["last_scmid"]
100 extra_info_heads.delete_if { |x| x == "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c" }
101 assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
101 assert_equal 4, extra_info_heads.size
102 extra_info_db["master"]["last_scmid"]
103
102
104 del_revs = [
103 del_revs = [
105 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
104 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
@@ -114,20 +113,19 class RepositoryGitTest < ActiveSupport::TestCase
114 end
113 end
115 @project.reload
114 @project.reload
116 cs1 = @repository.changesets
115 cs1 = @repository.changesets
117 assert_equal 22, cs1.count
116 assert_equal NUM_REV - 6, cs1.count
118 h = @repository.extra_info.dup
117 extra_info_heads << "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8"
119 h["branches"]["master"]["last_scmid"] =
118 h = {}
120 "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8"
119 h["heads"] = extra_info_heads
121 @repository.merge_extra_info(h)
120 @repository.merge_extra_info(h)
122 @repository.save
121 @repository.save
123 @project.reload
122 @project.reload
124 extra_info_db_1 = @repository.extra_info["branches"]
123 assert @repository.extra_info["heads"].index("4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8")
125 assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8",
126 extra_info_db_1["master"]["last_scmid"]
127
128 @repository.fetch_changesets
124 @repository.fetch_changesets
129 @project.reload
125 @project.reload
130 assert_equal NUM_REV, @repository.changesets.count
126 assert_equal NUM_REV, @repository.changesets.count
127 assert_equal 5, @repository.extra_info["heads"].size
128 assert @repository.extra_info["heads"].index("83ca5fd546063a3c7dc2e568ba3355661a9e2b2c")
131 end
129 end
132
130
133 def test_fetch_changesets_history_editing
131 def test_fetch_changesets_history_editing
@@ -135,9 +133,10 class RepositoryGitTest < ActiveSupport::TestCase
135 @repository.fetch_changesets
133 @repository.fetch_changesets
136 @project.reload
134 @project.reload
137 assert_equal NUM_REV, @repository.changesets.count
135 assert_equal NUM_REV, @repository.changesets.count
138 assert_equal 5, @repository.extra_info["branches"].size
136 extra_info_heads = @repository.extra_info["heads"].dup
139 assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
137 assert_equal 5, extra_info_heads.size
140 @repository.extra_info["branches"]["master"]["last_scmid"]
138 extra_info_heads.delete_if { |x| x == "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c" }
139 assert_equal 4, extra_info_heads.size
141
140
142 del_revs = [
141 del_revs = [
143 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
142 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
@@ -162,17 +161,21 class RepositoryGitTest < ActiveSupport::TestCase
162 @project.reload
161 @project.reload
163 assert_equal NUM_REV - 5, @repository.changesets.count
162 assert_equal NUM_REV - 5, @repository.changesets.count
164
163
165 h = @repository.extra_info.dup
164 extra_info_heads << "abcd1234efgh"
166 h["branches"]["master"]["last_scmid"] = "abcd1234efgh"
165 h = {}
166 h["heads"] = extra_info_heads
167 @repository.merge_extra_info(h)
167 @repository.merge_extra_info(h)
168 @repository.save
168 @repository.save
169 @project.reload
169 @project.reload
170 assert_equal "abcd1234efgh",
170 h1 = @repository.extra_info["heads"].dup
171 @repository.extra_info["branches"]["master"]["last_scmid"]
171 assert h1.index("abcd1234efgh")
172 assert_equal 5, h1.size
172
173
173 @repository.fetch_changesets
174 @repository.fetch_changesets
174 @project.reload
175 @project.reload
175 assert_equal NUM_REV - 5, @repository.changesets.count
176 assert_equal NUM_REV - 5, @repository.changesets.count
177 h2 = @repository.extra_info["heads"].dup
178 assert_equal h1, h2
176 end
179 end
177
180
178 def test_parents
181 def test_parents
@@ -216,6 +219,8 class RepositoryGitTest < ActiveSupport::TestCase
216 @project.reload
219 @project.reload
217 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
220 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
218
221
222 extra_info_heads = @repository.extra_info["heads"].dup
223 extra_info_heads.delete_if { |x| x == "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c" }
219 del_revs = [
224 del_revs = [
220 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
225 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
221 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b",
226 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b",
@@ -231,18 +236,19 class RepositoryGitTest < ActiveSupport::TestCase
231 cs1 = @repository.changesets
236 cs1 = @repository.changesets
232 assert_equal NUM_REV - 6, cs1.count
237 assert_equal NUM_REV - 6, cs1.count
233 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
238 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
234 h = @repository.extra_info.dup
239
235 h["branches"]["master"]["last_scmid"] =
240 extra_info_heads << "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8"
236 "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8"
241 h = {}
242 h["heads"] = extra_info_heads
237 @repository.merge_extra_info(h)
243 @repository.merge_extra_info(h)
238 @repository.save
244 @repository.save
239 @project.reload
245 @project.reload
240 extra_info_db_1 = @repository.extra_info["branches"]
246 assert @repository.extra_info["heads"].index("4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8")
241 assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8",
242 extra_info_db_1["master"]["last_scmid"]
243
244 @repository.fetch_changesets
247 @repository.fetch_changesets
248 @project.reload
245 assert_equal NUM_REV, @repository.changesets.count
249 assert_equal NUM_REV, @repository.changesets.count
250 assert_equal 5, @repository.extra_info["heads"].size
251
246 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
252 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"]
247 end
253 end
248
254
@@ -481,7 +487,7 class RepositoryGitTest < ActiveSupport::TestCase
481 @repository.fetch_changesets
487 @repository.fetch_changesets
482 @project.reload
488 @project.reload
483 assert_equal NUM_REV, @repository.changesets.count
489 assert_equal NUM_REV, @repository.changesets.count
484 %w|95488a44bc25f7d1f97d775a31359539ff333a63 95488a44b|.each do |r1|
490 %w|7234cb2750b63f47bff735edc50a1c0a433c2518 7234cb275|.each do |r1|
485 changeset = @repository.find_changeset_by_name(r1)
491 changeset = @repository.find_changeset_by_name(r1)
486 assert_nil changeset.previous
492 assert_nil changeset.previous
487 end
493 end
@@ -505,7 +511,7 class RepositoryGitTest < ActiveSupport::TestCase
505 @repository.fetch_changesets
511 @repository.fetch_changesets
506 @project.reload
512 @project.reload
507 assert_equal NUM_REV, @repository.changesets.count
513 assert_equal NUM_REV, @repository.changesets.count
508 %w|67e7792ce20ccae2e4bb73eed09bb397819c8834 67e7792ce20cca|.each do |r1|
514 %w|2a682156a3b6e77a8bf9cd4590e8db757f3c6c78 2a682156a3b6e77a|.each do |r1|
509 changeset = @repository.find_changeset_by_name(r1)
515 changeset = @repository.find_changeset_by_name(r1)
510 assert_nil changeset.next
516 assert_nil changeset.next
511 end
517 end
General Comments 0
You need to be logged in to leave comments. Login now