@@ -107,7 +107,8 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 |
|
110 | # Redmine needs to parse revisions per branch. | |
|
111 | # Branch "last_scmid" is for this requirement. | |||
111 | # |
|
112 | # | |
112 | # In Git and Mercurial, revisions are not in date order. |
|
113 | # In Git and Mercurial, revisions are not in date order. | |
113 | # Redmine Mercurial fixed issues. |
|
114 | # Redmine Mercurial fixed issues. | |
@@ -130,17 +131,9 class Repository::Git < Repository | |||||
130 | def fetch_changesets |
|
131 | def fetch_changesets | |
131 | scm_brs = branches |
|
132 | scm_brs = branches | |
132 | return if scm_brs.nil? || scm_brs.empty? |
|
133 | 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 | repo_heads = scm_brs.map{ |br| br.scmid } |
|
136 | h["branches"] ||= {} | |
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 |
|
||||
144 | h["db_consistent"] ||= {} |
|
137 | h["db_consistent"] ||= {} | |
145 | if changesets.count == 0 |
|
138 | if changesets.count == 0 | |
146 | h["db_consistent"]["ordering"] = 1 |
|
139 | h["db_consistent"]["ordering"] = 1 | |
@@ -151,19 +144,18 class Repository::Git < Repository | |||||
151 | merge_extra_info(h) |
|
144 | merge_extra_info(h) | |
152 | self.save |
|
145 | self.save | |
153 | end |
|
146 | end | |
154 |
|
147 | save_revisions(h, scm_brs) | ||
155 | save_revisions(prev_db_heads, repo_heads) |
|
|||
156 | end |
|
148 | end | |
157 |
|
149 | |||
158 |
def save_revisions( |
|
150 | def save_revisions(h, scm_brs) | |
159 | h = {} |
|
151 | scm_brs.each do |br1| | |
160 | opts = {} |
|
152 | br = br1.to_s | |
161 | opts[:reverse] = true |
|
153 | from_scmid = nil | |
162 | opts[:excludes] = prev_db_heads |
|
154 | from_scmid = h["branches"][br]["last_scmid"] if h["branches"][br] | |
163 | opts[:includes] = repo_heads |
|
155 | h["branches"][br] ||= {} | |
164 | begin |
|
156 | begin | |
165 |
scm.revisions('', |
|
157 | scm.revisions('', from_scmid, br, {:reverse => true}) do |rev| | |
166 |
db_rev = find_changeset_by_name(rev. |
|
158 | db_rev = find_changeset_by_name(rev.revision) | |
167 | transaction do |
|
159 | transaction do | |
168 | if db_rev.nil? |
|
160 | if db_rev.nil? | |
169 | db_saved_rev = save_revision(rev) |
|
161 | db_saved_rev = save_revision(rev) | |
@@ -173,19 +165,16 class Repository::Git < Repository | |||||
173 | ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact |
|
165 | ch.parents = chparents.collect{|rp| find_changeset_by_name(rp)}.compact | |
174 | end |
|
166 | end | |
175 | end |
|
167 | end | |
176 | h["heads"] = prev_db_heads.dup |
|
168 | h["branches"][br]["last_scmid"] = rev.scmid | |
177 | h["heads"] << rev.scmid |
|
|||
178 | merge_extra_info(h) |
|
169 | merge_extra_info(h) | |
179 | self.save |
|
170 | self.save | |
180 | end |
|
171 | end | |
181 | end |
|
172 | end | |
182 | h["heads"] = repo_heads.dup |
|
|||
183 | merge_extra_info(h) |
|
|||
184 | self.save |
|
|||
185 | rescue Redmine::Scm::Adapters::CommandFailed => e |
|
173 | rescue Redmine::Scm::Adapters::CommandFailed => e | |
186 | logger.error("save revisions error: #{e.message}") |
|
174 | logger.error("save revisions error: #{e.message}") | |
187 | end |
|
175 | end | |
188 | end |
|
176 | end | |
|
177 | end | |||
189 | private :save_revisions |
|
178 | private :save_revisions | |
190 |
|
179 | |||
191 | def save_revision(rev) |
|
180 | def save_revision(rev) |
@@ -116,7 +116,7 class RepositoryGitTest < ActiveSupport::TestCase | |||||
116 | assert_equal "README", change.path |
|
116 | assert_equal "README", change.path | |
117 | assert_equal "A", change.action |
|
117 | assert_equal "A", change.action | |
118 |
|
118 | |||
119 |
assert_equal NUM_HEAD, @repository.extra_info["he |
|
119 | assert_equal NUM_HEAD, @repository.extra_info["branches"].size | |
120 | end |
|
120 | end | |
121 |
|
121 | |||
122 | def test_fetch_changesets_incremental |
|
122 | def test_fetch_changesets_incremental | |
@@ -124,11 +124,11 class RepositoryGitTest < ActiveSupport::TestCase | |||||
124 | @repository.fetch_changesets |
|
124 | @repository.fetch_changesets | |
125 | @project.reload |
|
125 | @project.reload | |
126 | assert_equal NUM_REV, @repository.changesets.count |
|
126 | assert_equal NUM_REV, @repository.changesets.count | |
127 |
extra_info_ |
|
127 | extra_info_db = @repository.extra_info["branches"] | |
128 | assert_equal NUM_HEAD, extra_info_heads.size |
|
128 | assert_equal "1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127", | |
129 | extra_info_heads.delete_if { |x| x == "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c" } |
|
129 | extra_info_db["latin-1-path-encoding"]["last_scmid"] | |
130 | assert_equal 4, extra_info_heads.size |
|
130 | assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", | |
131 |
|
131 | extra_info_db["master"]["last_scmid"] | ||
132 | del_revs = [ |
|
132 | del_revs = [ | |
133 | "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", |
|
133 | "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", | |
134 | "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", |
|
134 | "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", | |
@@ -142,19 +142,20 class RepositoryGitTest < ActiveSupport::TestCase | |||||
142 | end |
|
142 | end | |
143 | @project.reload |
|
143 | @project.reload | |
144 | cs1 = @repository.changesets |
|
144 | cs1 = @repository.changesets | |
145 |
assert_equal |
|
145 | assert_equal 22, cs1.count | |
146 | extra_info_heads << "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8" |
|
146 | h = @repository.extra_info.dup | |
147 | h = {} |
|
147 | h["branches"]["master"]["last_scmid"] = | |
148 | h["heads"] = extra_info_heads |
|
148 | "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8" | |
149 | @repository.merge_extra_info(h) |
|
149 | @repository.merge_extra_info(h) | |
150 | @repository.save |
|
150 | @repository.save | |
151 | @project.reload |
|
151 | @project.reload | |
152 | assert @repository.extra_info["heads"].index("4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8") |
|
152 | extra_info_db_1 = @repository.extra_info["branches"] | |
|
153 | assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", | |||
|
154 | extra_info_db_1["master"]["last_scmid"] | |||
|
155 | ||||
153 | @repository.fetch_changesets |
|
156 | @repository.fetch_changesets | |
154 | @project.reload |
|
157 | @project.reload | |
155 | assert_equal NUM_REV, @repository.changesets.count |
|
158 | assert_equal NUM_REV, @repository.changesets.count | |
156 | assert_equal NUM_HEAD, @repository.extra_info["heads"].size |
|
|||
157 | assert @repository.extra_info["heads"].index("83ca5fd546063a3c7dc2e568ba3355661a9e2b2c") |
|
|||
158 | end |
|
159 | end | |
159 |
|
160 | |||
160 | def test_fetch_changesets_history_editing |
|
161 | def test_fetch_changesets_history_editing | |
@@ -162,11 +163,9 class RepositoryGitTest < ActiveSupport::TestCase | |||||
162 | @repository.fetch_changesets |
|
163 | @repository.fetch_changesets | |
163 | @project.reload |
|
164 | @project.reload | |
164 | assert_equal NUM_REV, @repository.changesets.count |
|
165 | assert_equal NUM_REV, @repository.changesets.count | |
165 |
|
|
166 | assert_equal NUM_HEAD, @repository.extra_info["branches"].size | |
166 | assert_equal NUM_HEAD, extra_info_heads.size |
|
167 | assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", | |
167 | extra_info_heads.delete_if { |x| x == "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c" } |
|
168 | @repository.extra_info["branches"]["master"]["last_scmid"] | |
168 | assert_equal 4, extra_info_heads.size |
|
|||
169 |
|
||||
170 | del_revs = [ |
|
169 | del_revs = [ | |
171 | "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", |
|
170 | "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", | |
172 | "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", |
|
171 | "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", | |
@@ -190,21 +189,17 class RepositoryGitTest < ActiveSupport::TestCase | |||||
190 | @project.reload |
|
189 | @project.reload | |
191 | assert_equal NUM_REV - 5, @repository.changesets.count |
|
190 | assert_equal NUM_REV - 5, @repository.changesets.count | |
192 |
|
191 | |||
193 | extra_info_heads << "abcd1234efgh" |
|
192 | h = @repository.extra_info.dup | |
194 | h = {} |
|
193 | h["branches"]["master"]["last_scmid"] = "abcd1234efgh" | |
195 | h["heads"] = extra_info_heads |
|
|||
196 | @repository.merge_extra_info(h) |
|
194 | @repository.merge_extra_info(h) | |
197 | @repository.save |
|
195 | @repository.save | |
198 | @project.reload |
|
196 | @project.reload | |
199 | h1 = @repository.extra_info["heads"].dup |
|
197 | assert_equal "abcd1234efgh", | |
200 | assert h1.index("abcd1234efgh") |
|
198 | @repository.extra_info["branches"]["master"]["last_scmid"] | |
201 | assert_equal 5, h1.size |
|
|||
202 |
|
199 | |||
203 | @repository.fetch_changesets |
|
200 | @repository.fetch_changesets | |
204 | @project.reload |
|
201 | @project.reload | |
205 | assert_equal NUM_REV - 5, @repository.changesets.count |
|
202 | assert_equal NUM_REV - 5, @repository.changesets.count | |
206 | h2 = @repository.extra_info["heads"].dup |
|
|||
207 | assert_equal h1, h2 |
|
|||
208 | end |
|
203 | end | |
209 |
|
204 | |||
210 | def test_parents |
|
205 | def test_parents | |
@@ -251,8 +246,6 class RepositoryGitTest < ActiveSupport::TestCase | |||||
251 | @project.reload |
|
246 | @project.reload | |
252 | assert_equal 0, @repository.extra_info["db_consistent"]["ordering"] |
|
247 | assert_equal 0, @repository.extra_info["db_consistent"]["ordering"] | |
253 |
|
248 | |||
254 | extra_info_heads = @repository.extra_info["heads"].dup |
|
|||
255 | extra_info_heads.delete_if { |x| x == "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c" } |
|
|||
256 | del_revs = [ |
|
249 | del_revs = [ | |
257 | "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", |
|
250 | "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", | |
258 | "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", |
|
251 | "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", | |
@@ -268,19 +261,18 class RepositoryGitTest < ActiveSupport::TestCase | |||||
268 | cs1 = @repository.changesets |
|
261 | cs1 = @repository.changesets | |
269 | assert_equal NUM_REV - 6, cs1.count |
|
262 | assert_equal NUM_REV - 6, cs1.count | |
270 | assert_equal 0, @repository.extra_info["db_consistent"]["ordering"] |
|
263 | assert_equal 0, @repository.extra_info["db_consistent"]["ordering"] | |
271 |
|
264 | h = @repository.extra_info.dup | ||
272 | extra_info_heads << "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8" |
|
265 | h["branches"]["master"]["last_scmid"] = | |
273 | h = {} |
|
266 | "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8" | |
274 | h["heads"] = extra_info_heads |
|
|||
275 | @repository.merge_extra_info(h) |
|
267 | @repository.merge_extra_info(h) | |
276 | @repository.save |
|
268 | @repository.save | |
277 | @project.reload |
|
269 | @project.reload | |
278 | assert @repository.extra_info["heads"].index("4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8") |
|
270 | extra_info_db_1 = @repository.extra_info["branches"] | |
|
271 | assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", | |||
|
272 | extra_info_db_1["master"]["last_scmid"] | |||
|
273 | ||||
279 | @repository.fetch_changesets |
|
274 | @repository.fetch_changesets | |
280 | @project.reload |
|
|||
281 | assert_equal NUM_REV, @repository.changesets.count |
|
275 | assert_equal NUM_REV, @repository.changesets.count | |
282 | assert_equal NUM_HEAD, @repository.extra_info["heads"].size |
|
|||
283 |
|
||||
284 | assert_equal 0, @repository.extra_info["db_consistent"]["ordering"] |
|
276 | assert_equal 0, @repository.extra_info["db_consistent"]["ordering"] | |
285 | end |
|
277 | end | |
286 |
|
278 | |||
@@ -519,7 +511,7 class RepositoryGitTest < ActiveSupport::TestCase | |||||
519 | @repository.fetch_changesets |
|
511 | @repository.fetch_changesets | |
520 | @project.reload |
|
512 | @project.reload | |
521 | assert_equal NUM_REV, @repository.changesets.count |
|
513 | assert_equal NUM_REV, @repository.changesets.count | |
522 | %w|7234cb2750b63f47bff735edc50a1c0a433c2518 7234cb275|.each do |r1| |
|
514 | %w|95488a44bc25f7d1f97d775a31359539ff333a63 95488a44b|.each do |r1| | |
523 | changeset = @repository.find_changeset_by_name(r1) |
|
515 | changeset = @repository.find_changeset_by_name(r1) | |
524 | assert_nil changeset.previous |
|
516 | assert_nil changeset.previous | |
525 | end |
|
517 | end | |
@@ -543,7 +535,7 class RepositoryGitTest < ActiveSupport::TestCase | |||||
543 | @repository.fetch_changesets |
|
535 | @repository.fetch_changesets | |
544 | @project.reload |
|
536 | @project.reload | |
545 | assert_equal NUM_REV, @repository.changesets.count |
|
537 | assert_equal NUM_REV, @repository.changesets.count | |
546 | %w|2a682156a3b6e77a8bf9cd4590e8db757f3c6c78 2a682156a3b6e77a|.each do |r1| |
|
538 | %w|67e7792ce20ccae2e4bb73eed09bb397819c8834 67e7792ce20cca|.each do |r1| | |
547 | changeset = @repository.find_changeset_by_name(r1) |
|
539 | changeset = @repository.find_changeset_by_name(r1) | |
548 | assert_nil changeset.next |
|
540 | assert_nil changeset.next | |
549 | end |
|
541 | end |
General Comments 0
You need to be logged in to leave comments.
Login now