Mercurial > hg > soundsoftware-site
comparison test/unit/repository_git_test.rb @ 524:1248a47e81b3 feature_36
Merge from branch "luisf"
author | luisf <luis.figueira@eecs.qmul.ac.uk> |
---|---|
date | Mon, 25 Jul 2011 14:39:38 +0100 |
parents | cbce1fd3b1b7 |
children | cbb26bc654de |
comparison
equal
deleted
inserted
replaced
519:3be6bc3c2a17 | 524:1248a47e81b3 |
---|---|
1 # redMine - project management software | 1 # Redmine - project management software |
2 # Copyright (C) 2006-2007 Jean-Philippe Lang | 2 # Copyright (C) 2006-2011 Jean-Philippe Lang |
3 # | 3 # |
4 # This program is free software; you can redistribute it and/or | 4 # This program is free software; you can redistribute it and/or |
5 # modify it under the terms of the GNU General Public License | 5 # modify it under the terms of the GNU General Public License |
6 # as published by the Free Software Foundation; either version 2 | 6 # as published by the Free Software Foundation; either version 2 |
7 # of the License, or (at your option) any later version. | 7 # of the License, or (at your option) any later version. |
8 # | 8 # |
9 # This program is distributed in the hope that it will be useful, | 9 # This program is distributed in the hope that it will be useful, |
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 # GNU General Public License for more details. | 12 # GNU General Public License for more details. |
13 # | 13 # |
14 # You should have received a copy of the GNU General Public License | 14 # You should have received a copy of the GNU General Public License |
15 # along with this program; if not, write to the Free Software | 15 # along with this program; if not, write to the Free Software |
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
17 | 17 |
18 require File.dirname(__FILE__) + '/../test_helper' | 18 require File.expand_path('../../test_helper', __FILE__) |
19 | 19 |
20 class RepositoryGitTest < ActiveSupport::TestCase | 20 class RepositoryGitTest < ActiveSupport::TestCase |
21 fixtures :projects | 21 fixtures :projects, :repositories, :enabled_modules, :users, :roles |
22 | 22 |
23 # No '..' in the repository path | 23 # No '..' in the repository path |
24 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository' | 24 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository' |
25 REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin? | 25 REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin? |
26 | 26 |
27 def setup | 27 FELIX_HEX = "Felix Sch\xC3\xA4fer" |
28 @project = Project.find(1) | 28 CHAR_1_HEX = "\xc3\x9c" |
29 assert @repository = Repository::Git.create(:project => @project, :url => REPOSITORY_PATH) | 29 |
30 end | 30 ## Ruby uses ANSI api to fork a process on Windows. |
31 | 31 ## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem |
32 if File.directory?(REPOSITORY_PATH) | 32 ## and these are incompatible with ASCII. |
33 # WINDOWS_PASS = Redmine::Platform.mswin? | |
34 WINDOWS_PASS = false | |
35 | |
36 if File.directory?(REPOSITORY_PATH) | |
37 def setup | |
38 klass = Repository::Git | |
39 assert_equal "Git", klass.scm_name | |
40 assert klass.scm_adapter_class | |
41 assert_not_equal "", klass.scm_command | |
42 assert_equal true, klass.scm_available | |
43 | |
44 @project = Project.find(3) | |
45 @repository = Repository::Git.create( | |
46 :project => @project, | |
47 :url => REPOSITORY_PATH, | |
48 :path_encoding => 'ISO-8859-1' | |
49 ) | |
50 assert @repository | |
51 @char_1 = CHAR_1_HEX.dup | |
52 if @char_1.respond_to?(:force_encoding) | |
53 @char_1.force_encoding('UTF-8') | |
54 end | |
55 end | |
56 | |
33 def test_fetch_changesets_from_scratch | 57 def test_fetch_changesets_from_scratch |
34 @repository.fetch_changesets | 58 assert_nil @repository.extra_info |
35 @repository.reload | 59 |
36 | 60 @repository.fetch_changesets |
37 assert_equal 15, @repository.changesets.count | 61 @repository.reload |
38 assert_equal 24, @repository.changes.count | 62 |
39 | 63 assert_equal 21, @repository.changesets.count |
64 assert_equal 33, @repository.changes.count | |
65 | |
40 commit = @repository.changesets.find(:first, :order => 'committed_on ASC') | 66 commit = @repository.changesets.find(:first, :order => 'committed_on ASC') |
41 assert_equal "Initial import.\nThe repository contains 3 files.", commit.comments | 67 assert_equal "Initial import.\nThe repository contains 3 files.", commit.comments |
42 assert_equal "jsmith <jsmith@foo.bar>", commit.committer | 68 assert_equal "jsmith <jsmith@foo.bar>", commit.committer |
43 assert_equal User.find_by_login('jsmith'), commit.user | 69 assert_equal User.find_by_login('jsmith'), commit.user |
44 # TODO: add a commit with commit time <> author time to the test repository | 70 # TODO: add a commit with commit time <> author time to the test repository |
48 assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518", commit.scmid | 74 assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518", commit.scmid |
49 assert_equal 3, commit.changes.count | 75 assert_equal 3, commit.changes.count |
50 change = commit.changes.sort_by(&:path).first | 76 change = commit.changes.sort_by(&:path).first |
51 assert_equal "README", change.path | 77 assert_equal "README", change.path |
52 assert_equal "A", change.action | 78 assert_equal "A", change.action |
53 end | 79 |
54 | 80 assert_equal 4, @repository.extra_info["branches"].size |
81 end | |
82 | |
55 def test_fetch_changesets_incremental | 83 def test_fetch_changesets_incremental |
56 @repository.fetch_changesets | 84 @repository.fetch_changesets |
57 # Remove the 3 latest changesets | 85 @repository.reload |
58 @repository.changesets.find(:all, :order => 'committed_on DESC', :limit => 3).each(&:destroy) | 86 assert_equal 21, @repository.changesets.count |
59 @repository.reload | 87 assert_equal 33, @repository.changes.count |
60 assert_equal 12, @repository.changesets.count | 88 extra_info_db = @repository.extra_info["branches"] |
61 | 89 assert_equal 4, extra_info_db.size |
90 assert_equal "1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127", | |
91 extra_info_db["latin-1-path-encoding"]["last_scmid"] | |
92 assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", | |
93 extra_info_db["master"]["last_scmid"] | |
94 | |
95 del_revs = [ | |
96 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", | |
97 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", | |
98 "4f26664364207fa8b1af9f8722647ab2d4ac5d43", | |
99 "deff712f05a90d96edbd70facc47d944be5897e3", | |
100 "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf", | |
101 "7e61ac704deecde634b51e59daa8110435dcb3da", | |
102 ] | |
103 @repository.changesets.each do |rev| | |
104 rev.destroy if del_revs.detect {|r| r == rev.scmid.to_s } | |
105 end | |
106 @repository.reload | |
107 cs1 = @repository.changesets | |
108 assert_equal 15, cs1.count | |
109 h = @repository.extra_info.dup | |
110 h["branches"]["master"]["last_scmid"] = | |
111 "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8" | |
112 @repository.merge_extra_info(h) | |
113 @repository.save | |
114 @repository.reload | |
115 extra_info_db_1 = @repository.extra_info["branches"] | |
116 assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", | |
117 extra_info_db_1["master"]["last_scmid"] | |
118 | |
119 @repository.fetch_changesets | |
120 assert_equal 21, @repository.changesets.count | |
121 end | |
122 | |
123 def test_fetch_changesets_invalid_rev | |
124 @repository.fetch_changesets | |
125 @repository.reload | |
126 assert_equal 21, @repository.changesets.count | |
127 assert_equal 33, @repository.changes.count | |
128 extra_info_db = @repository.extra_info["branches"] | |
129 assert_equal 4, extra_info_db.size | |
130 assert_equal "1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127", | |
131 extra_info_db["latin-1-path-encoding"]["last_scmid"] | |
132 assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", | |
133 extra_info_db["master"]["last_scmid"] | |
134 | |
135 del_revs = [ | |
136 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", | |
137 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", | |
138 "4f26664364207fa8b1af9f8722647ab2d4ac5d43", | |
139 "deff712f05a90d96edbd70facc47d944be5897e3", | |
140 "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf", | |
141 "7e61ac704deecde634b51e59daa8110435dcb3da", | |
142 ] | |
143 @repository.changesets.each do |rev| | |
144 rev.destroy if del_revs.detect {|r| r == rev.scmid.to_s } | |
145 end | |
146 @repository.reload | |
147 cs1 = @repository.changesets | |
148 assert_equal 15, cs1.count | |
149 h = @repository.extra_info.dup | |
150 h["branches"]["master"]["last_scmid"] = | |
151 "abcd1234efgh" | |
152 @repository.merge_extra_info(h) | |
153 @repository.save | |
154 @repository.reload | |
155 extra_info_db_1 = @repository.extra_info["branches"] | |
156 assert_equal "abcd1234efgh", | |
157 extra_info_db_1["master"]["last_scmid"] | |
158 | |
62 @repository.fetch_changesets | 159 @repository.fetch_changesets |
63 assert_equal 15, @repository.changesets.count | 160 assert_equal 15, @repository.changesets.count |
161 end | |
162 | |
163 def test_db_consistent_ordering_init | |
164 assert_nil @repository.extra_info | |
165 @repository.fetch_changesets | |
166 @repository.reload | |
167 assert_equal 1, @repository.extra_info["db_consistent"]["ordering"] | |
168 end | |
169 | |
170 def test_db_consistent_ordering_before_1_2 | |
171 assert_nil @repository.extra_info | |
172 @repository.fetch_changesets | |
173 @repository.reload | |
174 assert_equal 21, @repository.changesets.count | |
175 assert_not_nil @repository.extra_info | |
176 @repository.write_attribute(:extra_info, nil) | |
177 @repository.save | |
178 assert_nil @repository.extra_info | |
179 assert_equal 21, @repository.changesets.count | |
180 @repository.fetch_changesets | |
181 @repository.reload | |
182 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"] | |
183 | |
184 del_revs = [ | |
185 "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c", | |
186 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", | |
187 "4f26664364207fa8b1af9f8722647ab2d4ac5d43", | |
188 "deff712f05a90d96edbd70facc47d944be5897e3", | |
189 "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf", | |
190 "7e61ac704deecde634b51e59daa8110435dcb3da", | |
191 ] | |
192 @repository.changesets.each do |rev| | |
193 rev.destroy if del_revs.detect {|r| r == rev.scmid.to_s } | |
194 end | |
195 @repository.reload | |
196 cs1 = @repository.changesets | |
197 assert_equal 15, cs1.count | |
198 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"] | |
199 h = @repository.extra_info.dup | |
200 h["branches"]["master"]["last_scmid"] = | |
201 "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8" | |
202 @repository.merge_extra_info(h) | |
203 @repository.save | |
204 @repository.reload | |
205 extra_info_db_1 = @repository.extra_info["branches"] | |
206 assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", | |
207 extra_info_db_1["master"]["last_scmid"] | |
208 | |
209 @repository.fetch_changesets | |
210 assert_equal 21, @repository.changesets.count | |
211 assert_equal 0, @repository.extra_info["db_consistent"]["ordering"] | |
212 end | |
213 | |
214 def test_latest_changesets | |
215 @repository.fetch_changesets | |
216 @repository.reload | |
217 # with limit | |
218 changesets = @repository.latest_changesets('', nil, 2) | |
219 assert_equal 2, changesets.size | |
220 | |
221 # with path | |
222 changesets = @repository.latest_changesets('images', nil) | |
223 assert_equal [ | |
224 'deff712f05a90d96edbd70facc47d944be5897e3', | |
225 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
226 '7234cb2750b63f47bff735edc50a1c0a433c2518', | |
227 ], changesets.collect(&:revision) | |
228 | |
229 changesets = @repository.latest_changesets('README', nil) | |
230 assert_equal [ | |
231 '32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf', | |
232 '4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8', | |
233 '713f4944648826f558cf548222f813dabe7cbb04', | |
234 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1', | |
235 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
236 '7234cb2750b63f47bff735edc50a1c0a433c2518', | |
237 ], changesets.collect(&:revision) | |
238 | |
239 # with path, revision and limit | |
240 changesets = @repository.latest_changesets('images', '899a15dba') | |
241 assert_equal [ | |
242 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
243 '7234cb2750b63f47bff735edc50a1c0a433c2518', | |
244 ], changesets.collect(&:revision) | |
245 | |
246 changesets = @repository.latest_changesets('images', '899a15dba', 1) | |
247 assert_equal [ | |
248 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
249 ], changesets.collect(&:revision) | |
250 | |
251 changesets = @repository.latest_changesets('README', '899a15dba') | |
252 assert_equal [ | |
253 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
254 '7234cb2750b63f47bff735edc50a1c0a433c2518', | |
255 ], changesets.collect(&:revision) | |
256 | |
257 changesets = @repository.latest_changesets('README', '899a15dba', 1) | |
258 assert_equal [ | |
259 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
260 ], changesets.collect(&:revision) | |
261 | |
262 # with path, tag and limit | |
263 changesets = @repository.latest_changesets('images', 'tag01.annotated') | |
264 assert_equal [ | |
265 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
266 '7234cb2750b63f47bff735edc50a1c0a433c2518', | |
267 ], changesets.collect(&:revision) | |
268 | |
269 changesets = @repository.latest_changesets('images', 'tag01.annotated', 1) | |
270 assert_equal [ | |
271 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
272 ], changesets.collect(&:revision) | |
273 | |
274 changesets = @repository.latest_changesets('README', 'tag01.annotated') | |
275 assert_equal [ | |
276 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
277 '7234cb2750b63f47bff735edc50a1c0a433c2518', | |
278 ], changesets.collect(&:revision) | |
279 | |
280 changesets = @repository.latest_changesets('README', 'tag01.annotated', 1) | |
281 assert_equal [ | |
282 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
283 ], changesets.collect(&:revision) | |
284 | |
285 # with path, branch and limit | |
286 changesets = @repository.latest_changesets('images', 'test_branch') | |
287 assert_equal [ | |
288 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
289 '7234cb2750b63f47bff735edc50a1c0a433c2518', | |
290 ], changesets.collect(&:revision) | |
291 | |
292 changesets = @repository.latest_changesets('images', 'test_branch', 1) | |
293 assert_equal [ | |
294 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
295 ], changesets.collect(&:revision) | |
296 | |
297 changesets = @repository.latest_changesets('README', 'test_branch') | |
298 assert_equal [ | |
299 '713f4944648826f558cf548222f813dabe7cbb04', | |
300 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1', | |
301 '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', | |
302 '7234cb2750b63f47bff735edc50a1c0a433c2518', | |
303 ], changesets.collect(&:revision) | |
304 | |
305 changesets = @repository.latest_changesets('README', 'test_branch', 2) | |
306 assert_equal [ | |
307 '713f4944648826f558cf548222f813dabe7cbb04', | |
308 '61b685fbe55ab05b5ac68402d5720c1a6ac973d1', | |
309 ], changesets.collect(&:revision) | |
310 | |
311 # latin-1 encoding path | |
312 changesets = @repository.latest_changesets( | |
313 "latin-1-dir/test-#{@char_1}-2.txt", '64f1f3e89') | |
314 assert_equal [ | |
315 '64f1f3e89ad1cb57976ff0ad99a107012ba3481d', | |
316 '4fc55c43bf3d3dc2efb66145365ddc17639ce81e', | |
317 ], changesets.collect(&:revision) | |
318 | |
319 changesets = @repository.latest_changesets( | |
320 "latin-1-dir/test-#{@char_1}-2.txt", '64f1f3e89', 1) | |
321 assert_equal [ | |
322 '64f1f3e89ad1cb57976ff0ad99a107012ba3481d', | |
323 ], changesets.collect(&:revision) | |
324 end | |
325 | |
326 def test_latest_changesets_latin_1_dir | |
327 if WINDOWS_PASS | |
328 # | |
329 else | |
330 @repository.fetch_changesets | |
331 @repository.reload | |
332 changesets = @repository.latest_changesets( | |
333 "latin-1-dir/test-#{@char_1}-subdir", '1ca7f5ed') | |
334 assert_equal [ | |
335 '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', | |
336 ], changesets.collect(&:revision) | |
337 end | |
338 end | |
339 | |
340 def test_find_changeset_by_name | |
341 @repository.fetch_changesets | |
342 @repository.reload | |
343 ['7234cb2750b63f47bff735edc50a1c0a433c2518', '7234cb2750b'].each do |r| | |
344 assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', | |
345 @repository.find_changeset_by_name(r).revision | |
346 end | |
347 end | |
348 | |
349 def test_find_changeset_by_empty_name | |
350 @repository.fetch_changesets | |
351 @repository.reload | |
352 ['', ' ', nil].each do |r| | |
353 assert_nil @repository.find_changeset_by_name(r) | |
354 end | |
355 end | |
356 | |
357 def test_identifier | |
358 @repository.fetch_changesets | |
359 @repository.reload | |
360 c = @repository.changesets.find_by_revision( | |
361 '7234cb2750b63f47bff735edc50a1c0a433c2518') | |
362 assert_equal c.scmid, c.identifier | |
363 end | |
364 | |
365 def test_format_identifier | |
366 @repository.fetch_changesets | |
367 @repository.reload | |
368 c = @repository.changesets.find_by_revision( | |
369 '7234cb2750b63f47bff735edc50a1c0a433c2518') | |
370 assert_equal '7234cb27', c.format_identifier | |
371 end | |
372 | |
373 def test_activities | |
374 c = Changeset.new(:repository => @repository, | |
375 :committed_on => Time.now, | |
376 :revision => 'abc7234cb2750b63f47bff735edc50a1c0a433c2', | |
377 :scmid => 'abc7234cb2750b63f47bff735edc50a1c0a433c2', | |
378 :comments => 'test') | |
379 assert c.event_title.include?('abc7234c:') | |
380 assert_equal 'abc7234cb2750b63f47bff735edc50a1c0a433c2', c.event_url[:rev] | |
381 end | |
382 | |
383 def test_log_utf8 | |
384 @repository.fetch_changesets | |
385 @repository.reload | |
386 str_felix_hex = FELIX_HEX.dup | |
387 if str_felix_hex.respond_to?(:force_encoding) | |
388 str_felix_hex.force_encoding('UTF-8') | |
389 end | |
390 c = @repository.changesets.find_by_revision( | |
391 'ed5bb786bbda2dee66a2d50faf51429dbc043a7b') | |
392 assert_equal "#{str_felix_hex} <felix@fachschaften.org>", c.committer | |
393 end | |
394 | |
395 def test_previous | |
396 @repository.fetch_changesets | |
397 @repository.reload | |
398 %w|1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127 1ca7f5ed|.each do |r1| | |
399 changeset = @repository.find_changeset_by_name(r1) | |
400 %w|64f1f3e89ad1cb57976ff0ad99a107012ba3481d 64f1f3e89ad1|.each do |r2| | |
401 assert_equal @repository.find_changeset_by_name(r2), changeset.previous | |
402 end | |
403 end | |
404 end | |
405 | |
406 def test_previous_nil | |
407 @repository.fetch_changesets | |
408 @repository.reload | |
409 %w|7234cb2750b63f47bff735edc50a1c0a433c2518 7234cb2|.each do |r1| | |
410 changeset = @repository.find_changeset_by_name(r1) | |
411 assert_nil changeset.previous | |
412 end | |
413 end | |
414 | |
415 def test_next | |
416 @repository.fetch_changesets | |
417 @repository.reload | |
418 %w|64f1f3e89ad1cb57976ff0ad99a107012ba3481d 64f1f3e89ad1|.each do |r2| | |
419 changeset = @repository.find_changeset_by_name(r2) | |
420 %w|1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127 1ca7f5ed|.each do |r1| | |
421 assert_equal @repository.find_changeset_by_name(r1), changeset.next | |
422 end | |
423 end | |
424 end | |
425 | |
426 def test_next_nil | |
427 @repository.fetch_changesets | |
428 @repository.reload | |
429 %w|67e7792ce20ccae2e4bb73eed09bb397819c8834 67e7792ce20cca|.each do |r1| | |
430 changeset = @repository.find_changeset_by_name(r1) | |
431 assert_nil changeset.next | |
432 end | |
64 end | 433 end |
65 else | 434 else |
66 puts "Git test repository NOT FOUND. Skipping unit tests !!!" | 435 puts "Git test repository NOT FOUND. Skipping unit tests !!!" |
67 def test_fake; assert true end | 436 def test_fake; assert true end |
68 end | 437 end |