You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

repository_mercurial_test.rb 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. # Redmine - project management software
  2. # Copyright (C) 2006-2013 Jean-Philippe Lang
  3. #
  4. # This program is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU General Public License
  6. # as published by the Free Software Foundation; either version 2
  7. # of the License, or (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU General Public License for more details.
  13. #
  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
  16. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  17. require File.expand_path('../../test_helper', __FILE__)
  18. class RepositoryMercurialTest < ActiveSupport::TestCase
  19. fixtures :projects
  20. include Redmine::I18n
  21. REPOSITORY_PATH = Rails.root.join('tmp/test/mercurial_repository').to_s
  22. NUM_REV = 32
  23. CHAR_1_HEX = "\xc3\x9c"
  24. def setup
  25. @project = Project.find(3)
  26. @repository = Repository::Mercurial.create(
  27. :project => @project,
  28. :url => REPOSITORY_PATH,
  29. :path_encoding => 'ISO-8859-1'
  30. )
  31. assert @repository
  32. @char_1 = CHAR_1_HEX.dup
  33. @tag_char_1 = "tag-#{CHAR_1_HEX}-00"
  34. @branch_char_0 = "branch-#{CHAR_1_HEX}-00"
  35. @branch_char_1 = "branch-#{CHAR_1_HEX}-01"
  36. if @char_1.respond_to?(:force_encoding)
  37. @char_1.force_encoding('UTF-8')
  38. @tag_char_1.force_encoding('UTF-8')
  39. @branch_char_0.force_encoding('UTF-8')
  40. @branch_char_1.force_encoding('UTF-8')
  41. end
  42. end
  43. def test_blank_path_to_repository_error_message
  44. set_language_if_valid 'en'
  45. repo = Repository::Mercurial.new(
  46. :project => @project,
  47. :identifier => 'test'
  48. )
  49. assert !repo.save
  50. assert_include "Path to repository can't be blank",
  51. repo.errors.full_messages
  52. end
  53. def test_blank_path_to_repository_error_message_fr
  54. set_language_if_valid 'fr'
  55. str = "Chemin du d\xc3\xa9p\xc3\xb4t doit \xc3\xaatre renseign\xc3\xa9(e)"
  56. str.force_encoding('UTF-8') if str.respond_to?(:force_encoding)
  57. repo = Repository::Mercurial.new(
  58. :project => @project,
  59. :url => "",
  60. :identifier => 'test',
  61. :path_encoding => ''
  62. )
  63. assert !repo.save
  64. assert_include str, repo.errors.full_messages
  65. end
  66. if File.directory?(REPOSITORY_PATH)
  67. def test_scm_available
  68. klass = Repository::Mercurial
  69. assert_equal "Mercurial", klass.scm_name
  70. assert klass.scm_adapter_class
  71. assert_not_equal "", klass.scm_command
  72. assert_equal true, klass.scm_available
  73. end
  74. def test_entries
  75. entries = @repository.entries
  76. assert_kind_of Redmine::Scm::Adapters::Entries, entries
  77. end
  78. def test_fetch_changesets_from_scratch
  79. assert_equal 0, @repository.changesets.count
  80. @repository.fetch_changesets
  81. @project.reload
  82. assert_equal NUM_REV, @repository.changesets.count
  83. assert_equal 46, @repository.filechanges.count
  84. assert_equal "Initial import.\nThe repository contains 3 files.",
  85. @repository.changesets.find_by_revision('0').comments
  86. end
  87. def test_fetch_changesets_incremental
  88. assert_equal 0, @repository.changesets.count
  89. @repository.fetch_changesets
  90. @project.reload
  91. assert_equal NUM_REV, @repository.changesets.count
  92. # Remove changesets with revision > 2
  93. @repository.changesets.all.each {|c| c.destroy if c.revision.to_i > 2}
  94. @project.reload
  95. assert_equal 3, @repository.changesets.count
  96. @repository.fetch_changesets
  97. @project.reload
  98. assert_equal NUM_REV, @repository.changesets.count
  99. end
  100. def test_isodatesec
  101. # Template keyword 'isodatesec' supported in Mercurial 1.0 and higher
  102. if @repository.scm.class.client_version_above?([1, 0])
  103. assert_equal 0, @repository.changesets.count
  104. @repository.fetch_changesets
  105. @project.reload
  106. assert_equal NUM_REV, @repository.changesets.count
  107. rev0_committed_on = Time.gm(2007, 12, 14, 9, 22, 52)
  108. assert_equal @repository.changesets.find_by_revision('0').committed_on, rev0_committed_on
  109. end
  110. end
  111. def test_changeset_order_by_revision
  112. assert_equal 0, @repository.changesets.count
  113. @repository.fetch_changesets
  114. @project.reload
  115. assert_equal NUM_REV, @repository.changesets.count
  116. c0 = @repository.latest_changeset
  117. c1 = @repository.changesets.find_by_revision('0')
  118. # sorted by revision (id), not by date
  119. assert c0.revision.to_i > c1.revision.to_i
  120. assert c0.committed_on < c1.committed_on
  121. end
  122. def test_latest_changesets
  123. assert_equal 0, @repository.changesets.count
  124. @repository.fetch_changesets
  125. @project.reload
  126. assert_equal NUM_REV, @repository.changesets.count
  127. # with_limit
  128. changesets = @repository.latest_changesets('', nil, 2)
  129. assert_equal %w|31 30|, changesets.collect(&:revision)
  130. # with_filepath
  131. changesets = @repository.latest_changesets(
  132. '/sql_escape/percent%dir/percent%file1.txt', nil)
  133. assert_equal %w|30 11 10 9|, changesets.collect(&:revision)
  134. changesets = @repository.latest_changesets(
  135. '/sql_escape/underscore_dir/understrike_file.txt', nil)
  136. assert_equal %w|30 12 9|, changesets.collect(&:revision)
  137. changesets = @repository.latest_changesets('README', nil)
  138. assert_equal %w|31 30 28 17 8 6 1 0|, changesets.collect(&:revision)
  139. changesets = @repository.latest_changesets('README','8')
  140. assert_equal %w|8 6 1 0|, changesets.collect(&:revision)
  141. changesets = @repository.latest_changesets('README','8', 2)
  142. assert_equal %w|8 6|, changesets.collect(&:revision)
  143. # with_dirpath
  144. changesets = @repository.latest_changesets('images', nil)
  145. assert_equal %w|1 0|, changesets.collect(&:revision)
  146. path = 'sql_escape/percent%dir'
  147. changesets = @repository.latest_changesets(path, nil)
  148. assert_equal %w|30 13 11 10 9|, changesets.collect(&:revision)
  149. changesets = @repository.latest_changesets(path, '11')
  150. assert_equal %w|11 10 9|, changesets.collect(&:revision)
  151. changesets = @repository.latest_changesets(path, '11', 2)
  152. assert_equal %w|11 10|, changesets.collect(&:revision)
  153. path = 'sql_escape/underscore_dir'
  154. changesets = @repository.latest_changesets(path, nil)
  155. assert_equal %w|30 13 12 9|, changesets.collect(&:revision)
  156. changesets = @repository.latest_changesets(path, '12')
  157. assert_equal %w|12 9|, changesets.collect(&:revision)
  158. changesets = @repository.latest_changesets(path, '12', 1)
  159. assert_equal %w|12|, changesets.collect(&:revision)
  160. # tag
  161. changesets = @repository.latest_changesets('', 'tag_test.00')
  162. assert_equal %w|5 4 3 2 1 0|, changesets.collect(&:revision)
  163. changesets = @repository.latest_changesets('', 'tag_test.00', 2)
  164. assert_equal %w|5 4|, changesets.collect(&:revision)
  165. changesets = @repository.latest_changesets('sources', 'tag_test.00')
  166. assert_equal %w|4 3 2 1 0|, changesets.collect(&:revision)
  167. changesets = @repository.latest_changesets('sources', 'tag_test.00', 2)
  168. assert_equal %w|4 3|, changesets.collect(&:revision)
  169. # named branch
  170. if @repository.scm.class.client_version_above?([1, 6])
  171. changesets = @repository.latest_changesets('', @branch_char_1)
  172. assert_equal %w|27 26|, changesets.collect(&:revision)
  173. end
  174. changesets = @repository.latest_changesets("latin-1-dir/test-#{@char_1}-subdir", @branch_char_1)
  175. assert_equal %w|27|, changesets.collect(&:revision)
  176. end
  177. def test_copied_files
  178. assert_equal 0, @repository.changesets.count
  179. @repository.fetch_changesets
  180. @project.reload
  181. assert_equal NUM_REV, @repository.changesets.count
  182. cs1 = @repository.changesets.find_by_revision('13')
  183. assert_not_nil cs1
  184. c1 = cs1.filechanges.sort_by(&:path)
  185. assert_equal 2, c1.size
  186. assert_equal 'A', c1[0].action
  187. assert_equal '/sql_escape/percent%dir/percentfile1.txt', c1[0].path
  188. assert_equal '/sql_escape/percent%dir/percent%file1.txt', c1[0].from_path
  189. assert_equal '3a330eb32958', c1[0].from_revision
  190. assert_equal 'A', c1[1].action
  191. assert_equal '/sql_escape/underscore_dir/understrike-file.txt', c1[1].path
  192. assert_equal '/sql_escape/underscore_dir/understrike_file.txt', c1[1].from_path
  193. cs2 = @repository.changesets.find_by_revision('15')
  194. c2 = cs2.filechanges
  195. assert_equal 1, c2.size
  196. assert_equal 'A', c2[0].action
  197. assert_equal '/README (1)[2]&,%.-3_4', c2[0].path
  198. assert_equal '/README', c2[0].from_path
  199. assert_equal '933ca60293d7', c2[0].from_revision
  200. cs3 = @repository.changesets.find_by_revision('19')
  201. c3 = cs3.filechanges
  202. assert_equal 1, c3.size
  203. assert_equal 'A', c3[0].action
  204. assert_equal "/latin-1-dir/test-#{@char_1}-1.txt", c3[0].path
  205. assert_equal "/latin-1-dir/test-#{@char_1}.txt", c3[0].from_path
  206. assert_equal '5d9891a1b425', c3[0].from_revision
  207. end
  208. def test_find_changeset_by_name
  209. assert_equal 0, @repository.changesets.count
  210. @repository.fetch_changesets
  211. @project.reload
  212. assert_equal NUM_REV, @repository.changesets.count
  213. %w|2 400bb8672109 400|.each do |r|
  214. assert_equal '2', @repository.find_changeset_by_name(r).revision
  215. end
  216. end
  217. def test_find_changeset_by_invalid_name
  218. assert_equal 0, @repository.changesets.count
  219. @repository.fetch_changesets
  220. @project.reload
  221. assert_equal NUM_REV, @repository.changesets.count
  222. assert_nil @repository.find_changeset_by_name('100000')
  223. end
  224. def test_identifier
  225. assert_equal 0, @repository.changesets.count
  226. @repository.fetch_changesets
  227. @project.reload
  228. assert_equal NUM_REV, @repository.changesets.count
  229. c = @repository.changesets.find_by_revision('2')
  230. assert_equal c.scmid, c.identifier
  231. end
  232. def test_format_identifier
  233. assert_equal 0, @repository.changesets.count
  234. @repository.fetch_changesets
  235. @project.reload
  236. assert_equal NUM_REV, @repository.changesets.count
  237. c = @repository.changesets.find_by_revision('2')
  238. assert_equal '2:400bb8672109', c.format_identifier
  239. end
  240. def test_find_changeset_by_empty_name
  241. assert_equal 0, @repository.changesets.count
  242. @repository.fetch_changesets
  243. @project.reload
  244. assert_equal NUM_REV, @repository.changesets.count
  245. ['', ' ', nil].each do |r|
  246. assert_nil @repository.find_changeset_by_name(r)
  247. end
  248. end
  249. def test_parents
  250. assert_equal 0, @repository.changesets.count
  251. @repository.fetch_changesets
  252. @project.reload
  253. assert_equal NUM_REV, @repository.changesets.count
  254. r1 = @repository.changesets.find_by_revision('0')
  255. assert_equal [], r1.parents
  256. r2 = @repository.changesets.find_by_revision('1')
  257. assert_equal 1, r2.parents.length
  258. assert_equal "0885933ad4f6",
  259. r2.parents[0].identifier
  260. r3 = @repository.changesets.find_by_revision('30')
  261. assert_equal 2, r3.parents.length
  262. r4 = [r3.parents[0].identifier, r3.parents[1].identifier].sort
  263. assert_equal "3a330eb32958", r4[0]
  264. assert_equal "a94b0528f24f", r4[1]
  265. end
  266. def test_activities
  267. c = Changeset.new(:repository => @repository,
  268. :committed_on => Time.now,
  269. :revision => '123',
  270. :scmid => 'abc400bb8672',
  271. :comments => 'test')
  272. assert c.event_title.include?('123:abc400bb8672:')
  273. assert_equal 'abc400bb8672', c.event_url[:rev]
  274. end
  275. def test_previous
  276. assert_equal 0, @repository.changesets.count
  277. @repository.fetch_changesets
  278. @project.reload
  279. assert_equal NUM_REV, @repository.changesets.count
  280. %w|28 3ae45e2d177d 3ae45|.each do |r1|
  281. changeset = @repository.find_changeset_by_name(r1)
  282. %w|27 7bbf4c738e71 7bbf|.each do |r2|
  283. assert_equal @repository.find_changeset_by_name(r2), changeset.previous
  284. end
  285. end
  286. end
  287. def test_previous_nil
  288. assert_equal 0, @repository.changesets.count
  289. @repository.fetch_changesets
  290. @project.reload
  291. assert_equal NUM_REV, @repository.changesets.count
  292. %w|0 0885933ad4f6 0885|.each do |r1|
  293. changeset = @repository.find_changeset_by_name(r1)
  294. assert_nil changeset.previous
  295. end
  296. end
  297. def test_next
  298. assert_equal 0, @repository.changesets.count
  299. @repository.fetch_changesets
  300. @project.reload
  301. assert_equal NUM_REV, @repository.changesets.count
  302. %w|27 7bbf4c738e71 7bbf|.each do |r2|
  303. changeset = @repository.find_changeset_by_name(r2)
  304. %w|28 3ae45e2d177d 3ae45|.each do |r1|
  305. assert_equal @repository.find_changeset_by_name(r1), changeset.next
  306. end
  307. end
  308. end
  309. def test_next_nil
  310. assert_equal 0, @repository.changesets.count
  311. @repository.fetch_changesets
  312. @project.reload
  313. assert_equal NUM_REV, @repository.changesets.count
  314. %w|31 31eeee7395c8 31eee|.each do |r1|
  315. changeset = @repository.find_changeset_by_name(r1)
  316. assert_nil changeset.next
  317. end
  318. end
  319. else
  320. puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
  321. def test_fake; assert true end
  322. end
  323. end