Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

git_adapter_test.rb 27KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. # frozen_string_literal: true
  2. # Redmine - project management software
  3. # Copyright (C) 2006-2023 Jean-Philippe Lang
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU General Public License
  7. # as published by the Free Software Foundation; either version 2
  8. # of the License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. require_relative '../../../../../test_helper'
  19. class GitAdapterTest < ActiveSupport::TestCase
  20. REPOSITORY_PATH = Rails.root.join('tmp/test/git_repository').to_s
  21. ## Git, Mercurial and CVS path encodings are binary.
  22. ## Subversion supports URL encoding for path.
  23. ## Redmine Mercurial adapter and extension use URL encoding.
  24. ## Git accepts only binary path in command line parameter.
  25. ## So, there is no way to use binary command line parameter in JRuby.
  26. JRUBY_SKIP = (RUBY_PLATFORM == 'java')
  27. JRUBY_SKIP_STR = "TODO: This test fails in JRuby"
  28. if File.directory?(REPOSITORY_PATH)
  29. ## Ruby uses ANSI api to fork a process on Windows.
  30. ## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem
  31. ## and these are incompatible with ASCII.
  32. ## Git for Windows (msysGit) changed internal API from ANSI to Unicode in 1.7.10
  33. ## http://code.google.com/p/msysgit/issues/detail?id=80
  34. ## So, Latin-1 path tests fail on Japanese Windows
  35. WINDOWS_PASS = (Redmine::Platform.mswin? &&
  36. Redmine::Scm::Adapters::GitAdapter.client_version_above?([1, 7, 10]))
  37. WINDOWS_SKIP_STR = "TODO: This test fails in Git for Windows above 1.7.10"
  38. def setup
  39. adapter_class = Redmine::Scm::Adapters::GitAdapter
  40. assert adapter_class
  41. assert adapter_class.client_command
  42. assert_equal true, adapter_class.client_available
  43. assert_equal true, adapter_class.client_version_above?([1])
  44. assert_equal true, adapter_class.client_version_above?([1, 0])
  45. @adapter =
  46. Redmine::Scm::Adapters::GitAdapter.
  47. new(
  48. REPOSITORY_PATH,
  49. nil,
  50. nil,
  51. nil,
  52. 'ISO-8859-1'
  53. )
  54. assert @adapter
  55. @char_1 = 'Ü'
  56. @str_felix_hex = "Felix Sch\xC3\xA4fer".b
  57. end
  58. def test_scm_version
  59. to_test = {
  60. "git version 1.7.3.4\n" => [1, 7, 3, 4],
  61. "1.6.1\n1.7\n1.8" => [1, 6, 1],
  62. "1.6.2\r\n1.8.1\r\n1.9.1" => [1, 6, 2]
  63. }
  64. to_test.each do |s, v|
  65. test_scm_version_for(s, v)
  66. end
  67. end
  68. def test_branches
  69. brs = []
  70. @adapter.branches.each do |b|
  71. brs << b
  72. end
  73. assert_equal 8, brs.length
  74. br_issue_8857 = brs[0]
  75. assert_equal 'issue-8857', br_issue_8857.to_s
  76. assert_equal '2a682156a3b6e77a8bf9cd4590e8db757f3c6c78', br_issue_8857.revision
  77. assert_equal br_issue_8857.scmid, br_issue_8857.revision
  78. assert_equal false, br_issue_8857.is_default
  79. br_latin_1_branch1 = brs[1]
  80. assert_equal "latin-1-branch-#{@char_1}-01", br_latin_1_branch1.to_s
  81. assert_equal '4fc55c43bf3d3dc2efb66145365ddc17639ce81e', br_latin_1_branch1.revision
  82. assert_equal br_latin_1_branch1.scmid, br_latin_1_branch1.revision
  83. assert_equal false, br_latin_1_branch1.is_default
  84. br_latin_1_branch2 = brs[2]
  85. assert_equal "latin-1-branch-#{@char_1}-02", br_latin_1_branch2.to_s
  86. assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', br_latin_1_branch2.revision
  87. assert_equal br_latin_1_branch2.scmid, br_latin_1_branch2.revision
  88. assert_equal false, br_latin_1_branch2.is_default
  89. br_latin_1_path = brs[3]
  90. assert_equal 'latin-1-path-encoding', br_latin_1_path.to_s
  91. assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', br_latin_1_path.revision
  92. assert_equal br_latin_1_path.scmid, br_latin_1_path.revision
  93. assert_equal false, br_latin_1_path.is_default
  94. br_master = brs[4]
  95. assert_equal 'master', br_master.to_s
  96. assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', br_master.revision
  97. assert_equal br_master.scmid, br_master.revision
  98. assert_equal false, br_master.is_default
  99. br_master_20120212 = brs[5]
  100. assert_equal 'master-20120212', br_master_20120212.to_s
  101. assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', br_master_20120212.revision
  102. assert_equal br_master_20120212.scmid, br_master_20120212.revision
  103. assert_equal true, br_master_20120212.is_default
  104. br_latin_1 = brs[-2]
  105. assert_equal 'test-latin-1', br_latin_1.to_s
  106. assert_equal '67e7792ce20ccae2e4bb73eed09bb397819c8834', br_latin_1.revision
  107. assert_equal br_latin_1.scmid, br_latin_1.revision
  108. assert_equal false, br_latin_1.is_default
  109. br_test = brs[-1]
  110. assert_equal 'test_branch', br_test.to_s
  111. assert_equal 'fba357b886984ee71185ad2065e65fc0417d9b92', br_test.revision
  112. assert_equal br_test.scmid, br_test.revision
  113. assert_equal false, br_test.is_default
  114. end
  115. def test_default_branch
  116. assert_equal 'master-20120212', @adapter.default_branch
  117. # When no branch is marked as the default, GitAdapter treats
  118. # "main" or "master" branch as the default
  119. b_foo, b_bar, b_main, b_master =
  120. %w[foo bar main master].map do |name|
  121. Redmine::Scm::Adapters::GitAdapter::GitBranch.new(name)
  122. end
  123. @adapter.stubs(:branches).returns([b_foo, b_main, b_bar])
  124. assert_equal 'main', @adapter.default_branch
  125. @adapter.stubs(:branches).returns([b_foo, b_master, b_bar])
  126. assert_equal 'master', @adapter.default_branch
  127. # The first found branch is treated as the default branch
  128. # when neither "main" nor "master" is found
  129. @adapter.stubs(:branches).returns([b_foo, b_bar])
  130. assert_equal 'foo', @adapter.default_branch
  131. @adapter.stubs(:branches).returns([])
  132. assert_nil @adapter.default_branch
  133. end
  134. def test_tags
  135. assert_equal(
  136. [
  137. "tag00.lightweight",
  138. "tag01.annotated",
  139. "tag02.lightweight.#{@char_1}.01",
  140. ],
  141. @adapter.tags
  142. )
  143. end
  144. def test_revisions_master_all
  145. revs1 = []
  146. @adapter.revisions('', nil, "master", {}) do |rev|
  147. revs1 << rev
  148. end
  149. assert_equal 15, revs1.length
  150. assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs1[0].identifier
  151. assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs1[-1].identifier
  152. revs2 = []
  153. @adapter.revisions('', nil, "master",
  154. {:reverse => true}) do |rev|
  155. revs2 << rev
  156. end
  157. assert_equal 15, revs2.length
  158. assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs2[-1].identifier
  159. assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs2[0].identifier
  160. end
  161. def test_revisions_master_merged_rev
  162. revs1 = []
  163. @adapter.revisions('',
  164. "713f4944648826f558cf548222f813dabe7cbb04",
  165. "master",
  166. {:reverse => true}) do |rev|
  167. revs1 << rev
  168. end
  169. assert_equal 8, revs1.length
  170. assert_equal 'fba357b886984ee71185ad2065e65fc0417d9b92', revs1[0].identifier
  171. assert_equal '7e61ac704deecde634b51e59daa8110435dcb3da', revs1[1].identifier
  172. # 4a07fe31b is not a child of 713f49446
  173. assert_equal '4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8', revs1[2].identifier
  174. # Merged revision
  175. assert_equal '32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf', revs1[3].identifier
  176. assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs1[-1].identifier
  177. revs2 = []
  178. @adapter.revisions('',
  179. "fba357b886984ee71185ad2065e65fc0417d9b92",
  180. "master",
  181. {:reverse => true}) do |rev|
  182. revs2 << rev
  183. end
  184. assert_equal 7, revs2.length
  185. assert_equal '7e61ac704deecde634b51e59daa8110435dcb3da', revs2[0].identifier
  186. # 4a07fe31b is not a child of fba357b8869
  187. assert_equal '4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8', revs2[1].identifier
  188. # Merged revision
  189. assert_equal '32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf', revs2[2].identifier
  190. assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs2[-1].identifier
  191. end
  192. def test_revisions_branch_latin_1_path_encoding_all
  193. revs1 = []
  194. @adapter.revisions('', nil, "latin-1-path-encoding", {}) do |rev|
  195. revs1 << rev
  196. end
  197. assert_equal 8, revs1.length
  198. assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs1[0].identifier
  199. assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs1[-1].identifier
  200. revs2 = []
  201. @adapter.revisions('', nil, "latin-1-path-encoding",
  202. {:reverse => true}) do |rev|
  203. revs2 << rev
  204. end
  205. assert_equal 8, revs2.length
  206. assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs2[-1].identifier
  207. assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs2[0].identifier
  208. end
  209. def test_revisions_branch_latin_1_path_encoding_with_rev
  210. revs1 = []
  211. @adapter.revisions('',
  212. '7234cb2750b63f47bff735edc50a1c0a433c2518',
  213. "latin-1-path-encoding",
  214. {:reverse => true}) do |rev|
  215. revs1 << rev
  216. end
  217. assert_equal 7, revs1.length
  218. assert_equal '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', revs1[0].identifier
  219. assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs1[-1].identifier
  220. revs2 = []
  221. @adapter.revisions('',
  222. '57ca437c0acbbcb749821fdf3726a1367056d364',
  223. "latin-1-path-encoding",
  224. {:reverse => true}) do |rev|
  225. revs2 << rev
  226. end
  227. assert_equal 3, revs2.length
  228. assert_equal '4fc55c43bf3d3dc2efb66145365ddc17639ce81e', revs2[0].identifier
  229. assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs2[-1].identifier
  230. end
  231. def test_revisions_latin_1_identifier
  232. if WINDOWS_PASS
  233. puts WINDOWS_SKIP_STR
  234. elsif JRUBY_SKIP
  235. puts JRUBY_SKIP_STR
  236. else
  237. revs1 = []
  238. @adapter.revisions(
  239. '',
  240. "latin-1-branch-#{@char_1}-01",
  241. "latin-1-branch-#{@char_1}-02",
  242. {:reverse => true}
  243. ) do |rev|
  244. revs1 << rev
  245. end
  246. assert_equal 2, revs1.length
  247. assert_equal '64f1f3e89ad1cb57976ff0ad99a107012ba3481d', revs1[0].identifier
  248. assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs1[1].identifier
  249. end
  250. end
  251. def test_revisions_invalid_rev
  252. assert_equal [], @adapter.revisions('', '1234abcd', "master")
  253. assert_raise Redmine::Scm::Adapters::CommandFailed do
  254. revs1 = []
  255. @adapter.revisions(
  256. '',
  257. '1234abcd',
  258. "master",
  259. {:reverse => true}
  260. ) do |rev|
  261. revs1 << rev
  262. end
  263. end
  264. end
  265. def test_revisions_includes_master_two_revs
  266. revs1 = []
  267. @adapter.revisions('', nil, nil,
  268. {:reverse => true,
  269. :includes => ['83ca5fd546063a3c7dc2e568ba3355661a9e2b2c'],
  270. :excludes => ['4f26664364207fa8b1af9f8722647ab2d4ac5d43']}) do |rev|
  271. revs1 << rev
  272. end
  273. assert_equal 2, revs1.length
  274. assert_equal 'ed5bb786bbda2dee66a2d50faf51429dbc043a7b', revs1[0].identifier
  275. assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs1[-1].identifier
  276. end
  277. def test_revisions_includes_master_two_revs_from_origin
  278. revs1 = []
  279. @adapter.revisions('', nil, nil,
  280. {:reverse => true,
  281. :includes => ['899a15dba03a3b350b89c3f537e4bbe02a03cdc9'],
  282. :excludes => []}) do |rev|
  283. revs1 << rev
  284. end
  285. assert_equal 2, revs1.length
  286. assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs1[0].identifier
  287. assert_equal '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', revs1[1].identifier
  288. end
  289. def test_revisions_includes_merged_revs
  290. revs1 = []
  291. @adapter.revisions('', nil, nil,
  292. {:reverse => true,
  293. :includes => ['83ca5fd546063a3c7dc2e568ba3355661a9e2b2c'],
  294. :excludes => ['fba357b886984ee71185ad2065e65fc0417d9b92']}) do |rev|
  295. revs1 << rev
  296. end
  297. assert_equal 7, revs1.length
  298. assert_equal '7e61ac704deecde634b51e59daa8110435dcb3da', revs1[0].identifier
  299. assert_equal '4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8', revs1[1].identifier
  300. assert_equal '32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf', revs1[2].identifier
  301. assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs1[-1].identifier
  302. end
  303. def test_revisions_includes_two_heads
  304. revs1 = []
  305. @adapter.revisions('', nil, nil,
  306. {:reverse => true,
  307. :includes => ['83ca5fd546063a3c7dc2e568ba3355661a9e2b2c',
  308. '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127'],
  309. :excludes => ['4f26664364207fa8b1af9f8722647ab2d4ac5d43',
  310. '4fc55c43bf3d3dc2efb66145365ddc17639ce81e']}) do |rev|
  311. revs1 << rev
  312. end
  313. assert_equal 4, revs1.length
  314. assert_equal 'ed5bb786bbda2dee66a2d50faf51429dbc043a7b', revs1[0].identifier
  315. assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs1[1].identifier
  316. assert_equal '64f1f3e89ad1cb57976ff0ad99a107012ba3481d', revs1[-2].identifier
  317. assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs1[-1].identifier
  318. end
  319. def test_revisions_disjointed_histories_revisions
  320. revs1 = []
  321. @adapter.revisions('', nil, nil,
  322. {:reverse => true,
  323. :includes => ['83ca5fd546063a3c7dc2e568ba3355661a9e2b2c',
  324. '92397af84d22f27389c822848ecd5b463c181583'],
  325. :excludes => ['95488a44bc25f7d1f97d775a31359539ff333a63',
  326. '4f26664364207fa8b1af9f8722647ab2d4ac5d43']}) do |rev|
  327. revs1 << rev
  328. end
  329. assert_equal 4, revs1.length
  330. assert_equal 'ed5bb786bbda2dee66a2d50faf51429dbc043a7b', revs1[0].identifier
  331. assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs1[1].identifier
  332. assert_equal 'bc201c95999c4f10d018b0aa03b541cd6a2ff0ee', revs1[-2].identifier
  333. assert_equal '92397af84d22f27389c822848ecd5b463c181583', revs1[-1].identifier
  334. end
  335. def test_revisions_invalid_rev_excludes
  336. assert_equal [],
  337. @adapter.revisions('', nil, nil,
  338. {:reverse => true,
  339. :includes => ['83ca5fd546063a3c7dc2e568ba3355661a9e2b2c'],
  340. :excludes => ['0123abcd4567']})
  341. assert_raise Redmine::Scm::Adapters::CommandFailed do
  342. revs1 = []
  343. @adapter.revisions('', nil, nil,
  344. {:reverse => true,
  345. :includes => ['83ca5fd546063a3c7dc2e568ba3355661a9e2b2c'],
  346. :excludes => ['0123abcd4567']}) do |rev|
  347. revs1 << rev
  348. end
  349. end
  350. end
  351. def test_getting_revisions_with_spaces_in_filename
  352. assert_equal 1, @adapter.revisions("filemane with spaces.txt",
  353. nil, "master").length
  354. end
  355. def test_parents
  356. revs1 = []
  357. @adapter.revisions('',
  358. nil,
  359. "master",
  360. {:reverse => true}) do |rev|
  361. revs1 << rev
  362. end
  363. assert_equal 15, revs1.length
  364. assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518",
  365. revs1[0].identifier
  366. assert_nil revs1[0].parents
  367. assert_equal "899a15dba03a3b350b89c3f537e4bbe02a03cdc9",
  368. revs1[1].identifier
  369. assert_equal 1, revs1[1].parents.length
  370. assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518",
  371. revs1[1].parents[0]
  372. assert_equal "32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf",
  373. revs1[10].identifier
  374. assert_equal 2, revs1[10].parents.length
  375. assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8",
  376. revs1[10].parents[0]
  377. assert_equal "7e61ac704deecde634b51e59daa8110435dcb3da",
  378. revs1[10].parents[1]
  379. end
  380. def test_getting_revisions_with_leading_and_trailing_spaces_in_filename
  381. assert_equal(
  382. " filename with a leading space.txt ",
  383. @adapter.revisions(" filename with a leading space.txt ",
  384. nil, "master")[0].paths[0][:path]
  385. )
  386. end
  387. def test_getting_entries_with_leading_and_trailing_spaces_in_filename
  388. assert_equal(
  389. " filename with a leading space.txt ",
  390. @adapter.entries(
  391. '',
  392. '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c'
  393. )[3].name
  394. )
  395. end
  396. def test_annotate
  397. annotate = @adapter.annotate('sources/watchers_controller.rb')
  398. assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
  399. assert_equal 41, annotate.lines.size
  400. assert_equal "# This program is free software; you can redistribute it and/or",
  401. annotate.lines[4].strip
  402. assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518",
  403. annotate.revisions[4].identifier
  404. assert_equal "jsmith", annotate.revisions[4].author
  405. end
  406. def test_annotate_latin_1_identifier
  407. if WINDOWS_PASS
  408. puts WINDOWS_SKIP_STR
  409. elsif JRUBY_SKIP
  410. puts JRUBY_SKIP_STR
  411. else
  412. annotate = @adapter.annotate('sources/watchers_controller.rb',
  413. "latin-1-branch-#{@char_1}-02")
  414. assert_equal 40, annotate.lines.size
  415. assert_equal "# This program is free software; you can redistribute it and/or",
  416. annotate.lines[3].strip
  417. assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518",
  418. annotate.revisions[3].identifier
  419. assert_equal "jsmith", annotate.revisions[3].author
  420. end
  421. end
  422. def test_annotate_moved_file
  423. annotate = @adapter.annotate('renamed_test.txt')
  424. assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
  425. assert_equal 2, annotate.lines.size
  426. end
  427. def test_last_rev
  428. last_rev = @adapter.lastrev("README",
  429. "4f26664364207fa8b1af9f8722647ab2d4ac5d43")
  430. assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.scmid
  431. assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.identifier
  432. assert_equal "Adam Soltys <asoltys@gmail.com>", last_rev.author
  433. assert_equal Time.gm(2009, 6, 24, 5, 27, 38), last_rev.time
  434. end
  435. def test_last_rev_with_spaces_in_filename
  436. last_rev = @adapter.lastrev("filemane with spaces.txt",
  437. "ed5bb786bbda2dee66a2d50faf51429dbc043a7b")
  438. assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.scmid
  439. assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.identifier
  440. assert_equal "#{@str_felix_hex} <felix@fachschaften.org>",
  441. last_rev.author
  442. assert_equal Time.gm(2010, 9, 18, 19, 59, 46), last_rev.time
  443. end
  444. def test_latin_1_path
  445. if WINDOWS_PASS
  446. puts WINDOWS_SKIP_STR
  447. elsif JRUBY_SKIP
  448. puts JRUBY_SKIP_STR
  449. else
  450. p2 = "latin-1-dir/test-#{@char_1}-2.txt"
  451. ['4fc55c43bf3d3dc2efb66145365ddc17639ce81e', '4fc55c43bf3'].each do |r1|
  452. assert @adapter.diff(p2, r1)
  453. assert @adapter.cat(p2, r1)
  454. assert_equal 1, @adapter.annotate(p2, r1).lines.length
  455. ['64f1f3e89ad1cb57976ff0ad99a107012ba3481d', '64f1f3e89ad1cb5797'].each do |r2|
  456. assert @adapter.diff(p2, r1, r2)
  457. end
  458. end
  459. end
  460. end
  461. def test_latin_1_user_annotate
  462. ['83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', '83ca5fd546063a'].each do |r1|
  463. annotate = @adapter.annotate(" filename with a leading space.txt ", r1)
  464. assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
  465. assert_equal 1, annotate.lines.size
  466. assert_equal "And this is a file with a leading and trailing space...",
  467. annotate.lines[0].strip
  468. assert_equal "83ca5fd546063a3c7dc2e568ba3355661a9e2b2c",
  469. annotate.revisions[0].identifier
  470. assert_equal @str_felix_hex, annotate.revisions[0].author
  471. end
  472. end
  473. def test_entries_tag
  474. entries1 = @adapter.entries(nil, 'tag01.annotated',
  475. options = {:report_last_commit => true})
  476. assert entries1
  477. assert_equal 3, entries1.size
  478. assert_equal 'sources', entries1[1].name
  479. assert_equal 'sources', entries1[1].path
  480. assert_equal 'dir', entries1[1].kind
  481. readme = entries1[2]
  482. assert_equal 'README', readme.name
  483. assert_equal 'README', readme.path
  484. assert_equal 'file', readme.kind
  485. assert_equal 27, readme.size
  486. assert_equal '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', readme.lastrev.identifier
  487. assert_equal Time.gm(2007, 12, 14, 9, 24, 1), readme.lastrev.time
  488. end
  489. def test_entries_branch
  490. entries1 = @adapter.entries(nil, 'test_branch',
  491. options = {:report_last_commit => true})
  492. assert entries1
  493. assert_equal 4, entries1.size
  494. assert_equal 'sources', entries1[1].name
  495. assert_equal 'sources', entries1[1].path
  496. assert_equal 'dir', entries1[1].kind
  497. readme = entries1[2]
  498. assert_equal 'README', readme.name
  499. assert_equal 'README', readme.path
  500. assert_equal 'file', readme.kind
  501. assert_equal 159, readme.size
  502. assert_equal '713f4944648826f558cf548222f813dabe7cbb04', readme.lastrev.identifier
  503. assert_equal Time.gm(2009, 6, 19, 4, 37, 23), readme.lastrev.time
  504. end
  505. def test_entries_wrong_path_encoding
  506. adpt =
  507. Redmine::Scm::Adapters::GitAdapter.
  508. new(
  509. REPOSITORY_PATH,
  510. nil,
  511. nil,
  512. nil,
  513. 'EUC-JP'
  514. )
  515. entries1 = adpt.entries('latin-1-dir', '64f1f3e8')
  516. assert entries1
  517. assert_equal 3, entries1.size
  518. f1 = entries1[1]
  519. assert_nil f1.name
  520. assert_nil f1.path
  521. assert_equal 'file', f1.kind
  522. end
  523. def test_entries_latin_1_files
  524. entries1 = @adapter.entries('latin-1-dir', '64f1f3e8')
  525. assert entries1
  526. assert_equal 3, entries1.size
  527. f1 = entries1[1]
  528. assert_equal "test-#{@char_1}-2.txt", f1.name
  529. assert_equal "latin-1-dir/test-#{@char_1}-2.txt", f1.path
  530. assert_equal 'file', f1.kind
  531. end
  532. def test_entries_latin_1_dir
  533. if WINDOWS_PASS
  534. puts WINDOWS_SKIP_STR
  535. elsif JRUBY_SKIP
  536. puts JRUBY_SKIP_STR
  537. else
  538. entries1 = @adapter.entries("latin-1-dir/test-#{@char_1}-subdir",
  539. '1ca7f5ed')
  540. assert entries1
  541. assert_equal 3, entries1.size
  542. f1 = entries1[1]
  543. assert_equal "test-#{@char_1}-2.txt", f1.name
  544. assert_equal "latin-1-dir/test-#{@char_1}-subdir/test-#{@char_1}-2.txt", f1.path
  545. assert_equal 'file', f1.kind
  546. end
  547. end
  548. def test_entries_latin_1_identifier
  549. if WINDOWS_PASS
  550. puts WINDOWS_SKIP_STR
  551. elsif JRUBY_SKIP
  552. puts JRUBY_SKIP_STR
  553. else
  554. entries1 = @adapter.entries(nil,
  555. "latin-1-branch-#{@char_1}-02")
  556. assert entries1
  557. assert_equal 4, entries1.size
  558. f1 = entries1[0]
  559. assert_equal "images", f1.name
  560. assert_equal "images", f1.path
  561. assert_equal 'dir', f1.kind
  562. end
  563. end
  564. def test_entry
  565. entry = @adapter.entry
  566. assert_equal "", entry.path
  567. assert_equal "dir", entry.kind
  568. entry = @adapter.entry('')
  569. assert_equal "", entry.path
  570. assert_equal "dir", entry.kind
  571. assert_nil @adapter.entry('invalid')
  572. assert_nil @adapter.entry('/invalid')
  573. assert_nil @adapter.entry('/invalid/')
  574. assert_nil @adapter.entry('invalid/invalid')
  575. assert_nil @adapter.entry('invalid/invalid/')
  576. assert_nil @adapter.entry('/invalid/invalid')
  577. assert_nil @adapter.entry('/invalid/invalid/')
  578. ["README", "/README"].each do |path|
  579. entry = @adapter.entry(path, '7234cb2750b63f')
  580. assert_equal "README", entry.path
  581. assert_equal "file", entry.kind
  582. end
  583. ["sources", "/sources", "/sources/"].each do |path|
  584. entry = @adapter.entry(path, '7234cb2750b63f')
  585. assert_equal "sources", entry.path
  586. assert_equal "dir", entry.kind
  587. end
  588. ["sources/watchers_controller.rb", "/sources/watchers_controller.rb"].each do |path|
  589. entry = @adapter.entry(path, '7234cb2750b63f')
  590. assert_equal "sources/watchers_controller.rb", entry.path
  591. assert_equal "file", entry.kind
  592. end
  593. end
  594. def test_path_encoding_default_utf8
  595. adpt1 =
  596. Redmine::Scm::Adapters::GitAdapter.new(
  597. REPOSITORY_PATH
  598. )
  599. assert_equal "UTF-8", adpt1.path_encoding
  600. adpt2 =
  601. Redmine::Scm::Adapters::GitAdapter.new(
  602. REPOSITORY_PATH,
  603. nil,
  604. nil,
  605. nil,
  606. ""
  607. )
  608. assert_equal "UTF-8", adpt2.path_encoding
  609. end
  610. def test_cat_latin_1_identifier
  611. if WINDOWS_PASS
  612. puts WINDOWS_SKIP_STR
  613. elsif JRUBY_SKIP
  614. puts JRUBY_SKIP_STR
  615. else
  616. assert @adapter.cat('sources/watchers_controller.rb',
  617. "latin-1-branch-#{@char_1}-02")
  618. end
  619. end
  620. def test_cat_path_invalid
  621. assert_nil @adapter.cat('invalid')
  622. end
  623. def test_cat_revision_invalid
  624. assert @adapter.cat('README')
  625. assert_nil @adapter.cat('README', '1234abcd5678')
  626. end
  627. def test_diff_path_invalid
  628. assert_equal [], @adapter.diff('invalid', '713f4944648826f5')
  629. end
  630. def test_diff_revision_invalid
  631. assert_nil @adapter.diff(nil, '1234abcd5678')
  632. assert_nil @adapter.diff(nil, '713f4944648826f5', '1234abcd5678')
  633. assert_nil @adapter.diff(nil, '1234abcd5678', '713f4944648826f5')
  634. end
  635. def test_annotate_path_invalid
  636. assert_nil @adapter.annotate('invalid')
  637. end
  638. def test_annotate_revision_invalid
  639. assert @adapter.annotate('README')
  640. assert_nil @adapter.annotate('README', '1234abcd5678')
  641. end
  642. private
  643. def test_scm_version_for(scm_command_version, version)
  644. @adapter.class.expects(:scm_version_from_command_line).returns(scm_command_version)
  645. assert_equal version, @adapter.class.scm_command_version
  646. end
  647. else
  648. puts "Git test repository NOT FOUND. Skipping unit tests !!!"
  649. def test_fake; assert true end
  650. end
  651. end