test_pagure_lib_git.py 93 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199
  1. # -*- coding: utf-8 -*-
  2. """
  3. (c) 2015-2018 - Copyright Red Hat Inc
  4. Authors:
  5. Pierre-Yves Chibon <pingou@pingoured.fr>
  6. """
  7. from __future__ import unicode_literals
  8. __requires__ = ['SQLAlchemy >= 0.8']
  9. import pkg_resources
  10. import datetime
  11. import os
  12. import shutil
  13. import sys
  14. import tempfile
  15. import time
  16. import unittest
  17. import pygit2
  18. import six
  19. from mock import patch, MagicMock
  20. sys.path.insert(0, os.path.join(os.path.dirname(
  21. os.path.abspath(__file__)), '..'))
  22. import pagure
  23. import pagure.lib.git
  24. import tests
  25. from pagure.lib.repo import PagureRepo
  26. class PagureLibGittests(tests.Modeltests):
  27. """ Tests for pagure.lib.git """
  28. def test_write_gitolite_acls(self):
  29. """ Test the write_gitolite_acls function of pagure.lib.git.
  30. when the new uesr is an made an admin """
  31. tests.create_projects(self.session)
  32. repo = pagure.lib.get_authorized_project(self.session, 'test')
  33. # Add an user to a project
  34. # The user will be an admin of the project
  35. msg = pagure.lib.add_user_to_project(
  36. session=self.session,
  37. project=repo,
  38. new_user='foo',
  39. user='pingou',
  40. )
  41. self.session.commit()
  42. self.assertEqual(msg, 'User added')
  43. # Add a forked project
  44. item = pagure.lib.model.Project(
  45. user_id=1, # pingou
  46. name='test3',
  47. description='test project #2',
  48. is_fork=True,
  49. parent_id=1,
  50. hook_token='aaabbbvvv',
  51. )
  52. self.session.add(item)
  53. self.session.commit()
  54. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  55. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  56. helper.write_gitolite_acls(
  57. self.session, configfile=outputconf, project=-1)
  58. self.assertTrue(os.path.exists(outputconf))
  59. with open(outputconf) as stream:
  60. data = stream.read()
  61. exp = """repo test
  62. R = @all
  63. RW+ = pingou
  64. RW+ = foo
  65. repo docs/test
  66. R = @all
  67. RW+ = pingou
  68. RW+ = foo
  69. repo tickets/test
  70. RW+ = pingou
  71. RW+ = foo
  72. repo requests/test
  73. RW+ = pingou
  74. RW+ = foo
  75. repo test2
  76. R = @all
  77. RW+ = pingou
  78. repo docs/test2
  79. R = @all
  80. RW+ = pingou
  81. repo tickets/test2
  82. RW+ = pingou
  83. repo requests/test2
  84. RW+ = pingou
  85. repo somenamespace/test3
  86. R = @all
  87. RW+ = pingou
  88. repo docs/somenamespace/test3
  89. R = @all
  90. RW+ = pingou
  91. repo tickets/somenamespace/test3
  92. RW+ = pingou
  93. repo requests/somenamespace/test3
  94. RW+ = pingou
  95. repo forks/pingou/test3
  96. R = @all
  97. RW+ = pingou
  98. repo docs/forks/pingou/test3
  99. R = @all
  100. RW+ = pingou
  101. repo tickets/forks/pingou/test3
  102. RW+ = pingou
  103. repo requests/forks/pingou/test3
  104. RW+ = pingou
  105. # end of body
  106. """
  107. #print data
  108. self.assertEqual(data, exp)
  109. os.unlink(outputconf)
  110. self.assertFalse(os.path.exists(outputconf))
  111. def test_write_gitolite_acls_preconf(self):
  112. """ Test the write_gitolite_acls function of pagure.lib.git with
  113. a preconf set """
  114. tests.create_projects(self.session)
  115. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  116. preconf = os.path.join(self.path, 'header_gitolite')
  117. with open(preconf, 'w') as stream:
  118. stream.write('# this is a header that is manually added')
  119. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  120. helper.write_gitolite_acls(
  121. self.session,
  122. outputconf,
  123. project=-1,
  124. preconf=preconf
  125. )
  126. self.assertTrue(os.path.exists(outputconf))
  127. with open(outputconf) as stream:
  128. data = stream.read()
  129. exp = """# this is a header that is manually added
  130. # end of header
  131. repo test
  132. R = @all
  133. RW+ = pingou
  134. repo docs/test
  135. R = @all
  136. RW+ = pingou
  137. repo tickets/test
  138. RW+ = pingou
  139. repo requests/test
  140. RW+ = pingou
  141. repo test2
  142. R = @all
  143. RW+ = pingou
  144. repo docs/test2
  145. R = @all
  146. RW+ = pingou
  147. repo tickets/test2
  148. RW+ = pingou
  149. repo requests/test2
  150. RW+ = pingou
  151. repo somenamespace/test3
  152. R = @all
  153. RW+ = pingou
  154. repo docs/somenamespace/test3
  155. R = @all
  156. RW+ = pingou
  157. repo tickets/somenamespace/test3
  158. RW+ = pingou
  159. repo requests/somenamespace/test3
  160. RW+ = pingou
  161. # end of body
  162. """
  163. #print data
  164. self.assertEqual(data.split('\n'), exp.split('\n'))
  165. os.unlink(outputconf)
  166. self.assertFalse(os.path.exists(outputconf))
  167. def test_write_gitolite_acls_preconf_postconf(self):
  168. """ Test the write_gitolite_acls function of pagure.lib.git with
  169. a postconf set """
  170. tests.create_projects(self.session)
  171. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  172. preconf = os.path.join(self.path, 'header_gitolite')
  173. with open(preconf, 'w') as stream:
  174. stream.write('# this is a header that is manually added')
  175. postconf = os.path.join(self.path, 'footer_gitolite')
  176. with open(postconf, 'w') as stream:
  177. stream.write('# end of generated configuration')
  178. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  179. helper.write_gitolite_acls(
  180. self.session,
  181. outputconf,
  182. project=-1,
  183. preconf=preconf,
  184. postconf=postconf
  185. )
  186. self.assertTrue(os.path.exists(outputconf))
  187. with open(outputconf) as stream:
  188. data = stream.read()
  189. exp = """# this is a header that is manually added
  190. # end of header
  191. repo test
  192. R = @all
  193. RW+ = pingou
  194. repo docs/test
  195. R = @all
  196. RW+ = pingou
  197. repo tickets/test
  198. RW+ = pingou
  199. repo requests/test
  200. RW+ = pingou
  201. repo test2
  202. R = @all
  203. RW+ = pingou
  204. repo docs/test2
  205. R = @all
  206. RW+ = pingou
  207. repo tickets/test2
  208. RW+ = pingou
  209. repo requests/test2
  210. RW+ = pingou
  211. repo somenamespace/test3
  212. R = @all
  213. RW+ = pingou
  214. repo docs/somenamespace/test3
  215. R = @all
  216. RW+ = pingou
  217. repo tickets/somenamespace/test3
  218. RW+ = pingou
  219. repo requests/somenamespace/test3
  220. RW+ = pingou
  221. # end of body
  222. # end of generated configuration
  223. """
  224. #print data
  225. self.assertEqual(data, exp)
  226. os.unlink(outputconf)
  227. self.assertFalse(os.path.exists(outputconf))
  228. def test_write_gitolite_acls_postconf(self):
  229. """ Test the write_gitolite_acls function of pagure.lib.git with
  230. a preconf and a postconf set """
  231. tests.create_projects(self.session)
  232. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  233. postconf = os.path.join(self.path, 'footer_gitolite')
  234. with open(postconf, 'w') as stream:
  235. stream.write('# end of generated configuration')
  236. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  237. helper.write_gitolite_acls(
  238. self.session,
  239. outputconf,
  240. project=-1,
  241. postconf=postconf
  242. )
  243. self.assertTrue(os.path.exists(outputconf))
  244. with open(outputconf) as stream:
  245. data = stream.read()
  246. exp = """repo test
  247. R = @all
  248. RW+ = pingou
  249. repo docs/test
  250. R = @all
  251. RW+ = pingou
  252. repo tickets/test
  253. RW+ = pingou
  254. repo requests/test
  255. RW+ = pingou
  256. repo test2
  257. R = @all
  258. RW+ = pingou
  259. repo docs/test2
  260. R = @all
  261. RW+ = pingou
  262. repo tickets/test2
  263. RW+ = pingou
  264. repo requests/test2
  265. RW+ = pingou
  266. repo somenamespace/test3
  267. R = @all
  268. RW+ = pingou
  269. repo docs/somenamespace/test3
  270. R = @all
  271. RW+ = pingou
  272. repo tickets/somenamespace/test3
  273. RW+ = pingou
  274. repo requests/somenamespace/test3
  275. RW+ = pingou
  276. # end of body
  277. # end of generated configuration
  278. """
  279. #print data
  280. self.assertEqual(data, exp)
  281. os.unlink(outputconf)
  282. self.assertFalse(os.path.exists(outputconf))
  283. def test_write_gitolite_acls_deploykeys(self):
  284. """ Test write_gitolite_acls function to add deploy keys. """
  285. tests.create_projects(self.session)
  286. repo = pagure.lib.get_authorized_project(self.session, 'test')
  287. # Add two deploy keys (one readonly one push)
  288. msg1 = pagure.lib.add_deploykey_to_project(
  289. session=self.session,
  290. project=repo,
  291. ssh_key='ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAzBMSIlvPRaEiLOTVInErkRIw9CzQQcnslDekAn1jFnGf+SNa1acvbTiATbCX71AA03giKrPxPH79dxcC7aDXerc6zRcKjJs6MAL9PrCjnbyxCKXRNNZU5U9X/DLaaL1b3caB+WD6OoorhS3LTEtKPX8xyjOzhf3OQSzNjhJp5Q==',
  292. pushaccess=False,
  293. user='pingou'
  294. )
  295. msg2 = pagure.lib.add_deploykey_to_project(
  296. session=self.session,
  297. project=repo,
  298. ssh_key='ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC9Xwc2RDzPBhlEDARfHldGjudIVoa04tqT1JVKGQmyllTFz7Rb8CngQL3e7zyNzotnhwYKHdoiLlPkVEiDee4dWMUe48ilqId+FJZQGhyv8fu4BoFdE1AJUVylzmltbLg14VqG5gjTpXgtlrEva9arKwBMHJjRYc8ScaSn3OgyQw==',
  299. pushaccess=True,
  300. user='pingou'
  301. )
  302. self.session.commit()
  303. self.assertEqual(msg1, 'Deploy key added')
  304. self.assertEqual(msg2, 'Deploy key added')
  305. # Add a forked project
  306. item = pagure.lib.model.Project(
  307. user_id=1, # pingou
  308. name='test3',
  309. description='test project #2',
  310. is_fork=True,
  311. parent_id=1,
  312. hook_token='aaabbbvvv',
  313. )
  314. self.session.add(item)
  315. self.session.commit()
  316. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  317. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  318. helper.write_gitolite_acls(self.session, outputconf, project=-1)
  319. self.assertTrue(os.path.exists(outputconf))
  320. with open(outputconf) as stream:
  321. data = stream.read()
  322. exp = """repo test
  323. R = @all
  324. RW+ = pingou
  325. R = deploykey_test_1
  326. RW+ = deploykey_test_2
  327. repo docs/test
  328. R = @all
  329. RW+ = pingou
  330. R = deploykey_test_1
  331. RW+ = deploykey_test_2
  332. repo tickets/test
  333. RW+ = pingou
  334. R = deploykey_test_1
  335. RW+ = deploykey_test_2
  336. repo requests/test
  337. RW+ = pingou
  338. R = deploykey_test_1
  339. RW+ = deploykey_test_2
  340. repo test2
  341. R = @all
  342. RW+ = pingou
  343. repo docs/test2
  344. R = @all
  345. RW+ = pingou
  346. repo tickets/test2
  347. RW+ = pingou
  348. repo requests/test2
  349. RW+ = pingou
  350. repo somenamespace/test3
  351. R = @all
  352. RW+ = pingou
  353. repo docs/somenamespace/test3
  354. R = @all
  355. RW+ = pingou
  356. repo tickets/somenamespace/test3
  357. RW+ = pingou
  358. repo requests/somenamespace/test3
  359. RW+ = pingou
  360. repo forks/pingou/test3
  361. R = @all
  362. RW+ = pingou
  363. repo docs/forks/pingou/test3
  364. R = @all
  365. RW+ = pingou
  366. repo tickets/forks/pingou/test3
  367. RW+ = pingou
  368. repo requests/forks/pingou/test3
  369. RW+ = pingou
  370. # end of body
  371. """
  372. #print data
  373. self.assertEqual(data, exp)
  374. os.unlink(outputconf)
  375. self.assertFalse(os.path.exists(outputconf))
  376. def test_write_gitolite_acls_ticket(self):
  377. """ Test the write_gitolite_acls function of pagure.lib.git.
  378. when the new uesr is just a ticketer """
  379. tests.create_projects(self.session)
  380. repo = pagure.lib.get_authorized_project(self.session, 'test')
  381. # Add an user to a project
  382. # The user will be an admin of the project
  383. msg = pagure.lib.add_user_to_project(
  384. session=self.session,
  385. project=repo,
  386. new_user='foo',
  387. user='pingou',
  388. access='ticket'
  389. )
  390. self.session.commit()
  391. self.assertEqual(msg, 'User added')
  392. # Add a forked project
  393. item = pagure.lib.model.Project(
  394. user_id=1, # pingou
  395. name='test3',
  396. description='test project #2',
  397. is_fork=True,
  398. parent_id=1,
  399. hook_token='aaabbbvvv',
  400. )
  401. self.session.add(item)
  402. self.session.commit()
  403. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  404. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  405. helper.write_gitolite_acls(self.session, outputconf, project=-1)
  406. self.assertTrue(os.path.exists(outputconf))
  407. with open(outputconf) as stream:
  408. data = stream.read()
  409. exp = """repo test
  410. R = @all
  411. RW+ = pingou
  412. repo docs/test
  413. R = @all
  414. RW+ = pingou
  415. repo tickets/test
  416. RW+ = pingou
  417. repo requests/test
  418. RW+ = pingou
  419. repo test2
  420. R = @all
  421. RW+ = pingou
  422. repo docs/test2
  423. R = @all
  424. RW+ = pingou
  425. repo tickets/test2
  426. RW+ = pingou
  427. repo requests/test2
  428. RW+ = pingou
  429. repo somenamespace/test3
  430. R = @all
  431. RW+ = pingou
  432. repo docs/somenamespace/test3
  433. R = @all
  434. RW+ = pingou
  435. repo tickets/somenamespace/test3
  436. RW+ = pingou
  437. repo requests/somenamespace/test3
  438. RW+ = pingou
  439. repo forks/pingou/test3
  440. R = @all
  441. RW+ = pingou
  442. repo docs/forks/pingou/test3
  443. R = @all
  444. RW+ = pingou
  445. repo tickets/forks/pingou/test3
  446. RW+ = pingou
  447. repo requests/forks/pingou/test3
  448. RW+ = pingou
  449. # end of body
  450. """
  451. #print data
  452. self.assertEqual(data, exp)
  453. os.unlink(outputconf)
  454. self.assertFalse(os.path.exists(outputconf))
  455. def test_write_gitolite_acls_commit(self):
  456. """ Test the write_gitolite_acls function of pagure.lib.git.
  457. when the new uesr is just a committer """
  458. tests.create_projects(self.session)
  459. repo = pagure.lib.get_authorized_project(self.session, 'test')
  460. # Add an user to a project
  461. # The user will be an admin of the project
  462. msg = pagure.lib.add_user_to_project(
  463. session=self.session,
  464. project=repo,
  465. new_user='foo',
  466. user='pingou',
  467. access='commit'
  468. )
  469. self.session.commit()
  470. self.assertEqual(msg, 'User added')
  471. # Add a forked project
  472. item = pagure.lib.model.Project(
  473. user_id=1, # pingou
  474. name='test3',
  475. description='test project #2',
  476. is_fork=True,
  477. parent_id=1,
  478. hook_token='aaabbbvvv',
  479. )
  480. self.session.add(item)
  481. self.session.commit()
  482. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  483. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  484. helper.write_gitolite_acls(self.session, outputconf, project=-1)
  485. self.assertTrue(os.path.exists(outputconf))
  486. with open(outputconf) as stream:
  487. data = stream.read()
  488. exp = """repo test
  489. R = @all
  490. RW+ = pingou
  491. RW+ = foo
  492. repo docs/test
  493. R = @all
  494. RW+ = pingou
  495. RW+ = foo
  496. repo tickets/test
  497. RW+ = pingou
  498. RW+ = foo
  499. repo requests/test
  500. RW+ = pingou
  501. RW+ = foo
  502. repo test2
  503. R = @all
  504. RW+ = pingou
  505. repo docs/test2
  506. R = @all
  507. RW+ = pingou
  508. repo tickets/test2
  509. RW+ = pingou
  510. repo requests/test2
  511. RW+ = pingou
  512. repo somenamespace/test3
  513. R = @all
  514. RW+ = pingou
  515. repo docs/somenamespace/test3
  516. R = @all
  517. RW+ = pingou
  518. repo tickets/somenamespace/test3
  519. RW+ = pingou
  520. repo requests/somenamespace/test3
  521. RW+ = pingou
  522. repo forks/pingou/test3
  523. R = @all
  524. RW+ = pingou
  525. repo docs/forks/pingou/test3
  526. R = @all
  527. RW+ = pingou
  528. repo tickets/forks/pingou/test3
  529. RW+ = pingou
  530. repo requests/forks/pingou/test3
  531. RW+ = pingou
  532. # end of body
  533. """
  534. #print data
  535. self.assertEqual(data, exp)
  536. os.unlink(outputconf)
  537. self.assertFalse(os.path.exists(outputconf))
  538. def test_write_gitolite_acls_groups(self):
  539. """ Test the write_gitolite_acls function of pagure.lib.git with
  540. groups as admin
  541. """
  542. tests.create_projects(self.session)
  543. repo = pagure.lib.get_authorized_project(self.session, 'test')
  544. # Add a couple of groups
  545. # They would be admins
  546. msg = pagure.lib.add_group(
  547. self.session,
  548. group_name='sysadmin',
  549. display_name='sysadmin group',
  550. description=None,
  551. group_type='user',
  552. user='pingou',
  553. is_admin=False,
  554. blacklist=[],
  555. )
  556. self.session.commit()
  557. self.assertEqual(msg, 'User `pingou` added to the group `sysadmin`.')
  558. msg = pagure.lib.add_group(
  559. self.session,
  560. group_name='devs',
  561. display_name='devs group',
  562. description=None,
  563. group_type='user',
  564. user='pingou',
  565. is_admin=False,
  566. blacklist=[],
  567. )
  568. self.session.commit()
  569. self.assertEqual(msg, 'User `pingou` added to the group `devs`.')
  570. # Associate these groups to a project
  571. msg = pagure.lib.add_group_to_project(
  572. session=self.session,
  573. project=repo,
  574. new_group='sysadmin',
  575. user='pingou',
  576. )
  577. self.session.commit()
  578. self.assertEqual(msg, 'Group added')
  579. msg = pagure.lib.add_group_to_project(
  580. session=self.session,
  581. project=repo,
  582. new_group='devs',
  583. user='pingou',
  584. )
  585. self.session.commit()
  586. self.assertEqual(msg, 'Group added')
  587. # Add an user to a project
  588. msg = pagure.lib.add_user_to_project(
  589. session=self.session,
  590. project=repo,
  591. new_user='foo',
  592. user='pingou',
  593. )
  594. self.session.commit()
  595. self.assertEqual(msg, 'User added')
  596. # Add a forked project
  597. item = pagure.lib.model.Project(
  598. user_id=1, # pingou
  599. name='test2',
  600. description='test project #2',
  601. is_fork=True,
  602. parent_id=1,
  603. hook_token='aaabbbvvv',
  604. )
  605. self.session.add(item)
  606. self.session.commit()
  607. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  608. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  609. helper.write_gitolite_acls(self.session, outputconf, project=-1)
  610. self.assertTrue(os.path.exists(outputconf))
  611. with open(outputconf) as stream:
  612. data = stream.read()
  613. exp = """@devs = pingou
  614. @sysadmin = pingou
  615. # end of groups
  616. repo test
  617. R = @all
  618. RW+ = @devs @sysadmin
  619. RW+ = pingou
  620. RW+ = foo
  621. repo docs/test
  622. R = @all
  623. RW+ = @devs @sysadmin
  624. RW+ = pingou
  625. RW+ = foo
  626. repo tickets/test
  627. RW+ = @devs @sysadmin
  628. RW+ = pingou
  629. RW+ = foo
  630. repo requests/test
  631. RW+ = @devs @sysadmin
  632. RW+ = pingou
  633. RW+ = foo
  634. repo test2
  635. R = @all
  636. RW+ = pingou
  637. repo docs/test2
  638. R = @all
  639. RW+ = pingou
  640. repo tickets/test2
  641. RW+ = pingou
  642. repo requests/test2
  643. RW+ = pingou
  644. repo somenamespace/test3
  645. R = @all
  646. RW+ = pingou
  647. repo docs/somenamespace/test3
  648. R = @all
  649. RW+ = pingou
  650. repo tickets/somenamespace/test3
  651. RW+ = pingou
  652. repo requests/somenamespace/test3
  653. RW+ = pingou
  654. repo forks/pingou/test2
  655. R = @all
  656. RW+ = pingou
  657. repo docs/forks/pingou/test2
  658. R = @all
  659. RW+ = pingou
  660. repo tickets/forks/pingou/test2
  661. RW+ = pingou
  662. repo requests/forks/pingou/test2
  663. RW+ = pingou
  664. # end of body
  665. """
  666. #print data
  667. self.assertEqual(data.split('\n'), exp.split('\n'))
  668. os.unlink(outputconf)
  669. self.assertFalse(os.path.exists(outputconf))
  670. def test_write_gitolite_acls_groups_ticket(self):
  671. """ Test the write_gitolite_acls function of pagure.lib.git with
  672. groups as ticketers
  673. """
  674. tests.create_projects(self.session)
  675. repo = pagure.lib.get_authorized_project(self.session, 'test')
  676. # Add a couple of groups
  677. # They would be ticketers
  678. msg = pagure.lib.add_group(
  679. self.session,
  680. group_name='sysadmin',
  681. display_name='sysadmin group',
  682. description=None,
  683. group_type='user',
  684. user='pingou',
  685. is_admin=False,
  686. blacklist=[],
  687. )
  688. self.session.commit()
  689. self.assertEqual(msg, 'User `pingou` added to the group `sysadmin`.')
  690. msg = pagure.lib.add_group(
  691. self.session,
  692. group_name='devs',
  693. display_name='devs group',
  694. description=None,
  695. group_type='user',
  696. user='pingou',
  697. is_admin=False,
  698. blacklist=[],
  699. )
  700. self.session.commit()
  701. self.assertEqual(msg, 'User `pingou` added to the group `devs`.')
  702. # Associate these groups to a project
  703. msg = pagure.lib.add_group_to_project(
  704. session=self.session,
  705. project=repo,
  706. new_group='sysadmin',
  707. user='pingou',
  708. access='ticket',
  709. )
  710. self.session.commit()
  711. self.assertEqual(msg, 'Group added')
  712. msg = pagure.lib.add_group_to_project(
  713. session=self.session,
  714. project=repo,
  715. new_group='devs',
  716. user='pingou',
  717. access='ticket'
  718. )
  719. self.session.commit()
  720. self.assertEqual(msg, 'Group added')
  721. # Add an user to a project
  722. msg = pagure.lib.add_user_to_project(
  723. session=self.session,
  724. project=repo,
  725. new_user='foo',
  726. user='pingou',
  727. )
  728. self.session.commit()
  729. self.assertEqual(msg, 'User added')
  730. # Add a forked project
  731. item = pagure.lib.model.Project(
  732. user_id=1, # pingou
  733. name='test2',
  734. description='test project #2',
  735. is_fork=True,
  736. parent_id=1,
  737. hook_token='aaabbbvvv',
  738. )
  739. self.session.add(item)
  740. self.session.commit()
  741. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  742. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  743. helper.write_gitolite_acls(self.session, outputconf, project=-1)
  744. self.assertTrue(os.path.exists(outputconf))
  745. with open(outputconf) as stream:
  746. data = stream.read()
  747. exp = """@devs = pingou
  748. @sysadmin = pingou
  749. # end of groups
  750. repo test
  751. R = @all
  752. RW+ = pingou
  753. RW+ = foo
  754. repo docs/test
  755. R = @all
  756. RW+ = pingou
  757. RW+ = foo
  758. repo tickets/test
  759. RW+ = pingou
  760. RW+ = foo
  761. repo requests/test
  762. RW+ = pingou
  763. RW+ = foo
  764. repo test2
  765. R = @all
  766. RW+ = pingou
  767. repo docs/test2
  768. R = @all
  769. RW+ = pingou
  770. repo tickets/test2
  771. RW+ = pingou
  772. repo requests/test2
  773. RW+ = pingou
  774. repo somenamespace/test3
  775. R = @all
  776. RW+ = pingou
  777. repo docs/somenamespace/test3
  778. R = @all
  779. RW+ = pingou
  780. repo tickets/somenamespace/test3
  781. RW+ = pingou
  782. repo requests/somenamespace/test3
  783. RW+ = pingou
  784. repo forks/pingou/test2
  785. R = @all
  786. RW+ = pingou
  787. repo docs/forks/pingou/test2
  788. R = @all
  789. RW+ = pingou
  790. repo tickets/forks/pingou/test2
  791. RW+ = pingou
  792. repo requests/forks/pingou/test2
  793. RW+ = pingou
  794. # end of body
  795. """
  796. #print data
  797. self.assertEqual(data.split('\n'), exp.split('\n'))
  798. os.unlink(outputconf)
  799. self.assertFalse(os.path.exists(outputconf))
  800. def test_write_gitolite_acls_groups_commit(self):
  801. """ Test the write_gitolite_acls function of pagure.lib.git with
  802. groups as committers
  803. """
  804. tests.create_projects(self.session)
  805. repo = pagure.lib.get_authorized_project(self.session, 'test')
  806. # Add a couple of groups
  807. # They would be committers
  808. msg = pagure.lib.add_group(
  809. self.session,
  810. group_name='sysadmin',
  811. display_name='sysadmin group',
  812. description=None,
  813. group_type='user',
  814. user='pingou',
  815. is_admin=False,
  816. blacklist=[],
  817. )
  818. self.session.commit()
  819. self.assertEqual(msg, 'User `pingou` added to the group `sysadmin`.')
  820. msg = pagure.lib.add_group(
  821. self.session,
  822. group_name='devs',
  823. display_name='devs group',
  824. description=None,
  825. group_type='user',
  826. user='pingou',
  827. is_admin=False,
  828. blacklist=[],
  829. )
  830. self.session.commit()
  831. self.assertEqual(msg, 'User `pingou` added to the group `devs`.')
  832. # Associate these groups to a project
  833. msg = pagure.lib.add_group_to_project(
  834. session=self.session,
  835. project=repo,
  836. new_group='sysadmin',
  837. user='pingou',
  838. access='commit'
  839. )
  840. self.session.commit()
  841. self.assertEqual(msg, 'Group added')
  842. msg = pagure.lib.add_group_to_project(
  843. session=self.session,
  844. project=repo,
  845. new_group='devs',
  846. user='pingou',
  847. access='commit'
  848. )
  849. self.session.commit()
  850. self.assertEqual(msg, 'Group added')
  851. # Add an user to a project
  852. msg = pagure.lib.add_user_to_project(
  853. session=self.session,
  854. project=repo,
  855. new_user='foo',
  856. user='pingou',
  857. )
  858. self.session.commit()
  859. self.assertEqual(msg, 'User added')
  860. # Add a forked project
  861. item = pagure.lib.model.Project(
  862. user_id=1, # pingou
  863. name='test2',
  864. description='test project #2',
  865. is_fork=True,
  866. parent_id=1,
  867. hook_token='aaabbbvvv',
  868. )
  869. self.session.add(item)
  870. self.session.commit()
  871. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  872. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  873. helper.write_gitolite_acls(self.session, outputconf, project=-1)
  874. self.assertTrue(os.path.exists(outputconf))
  875. with open(outputconf) as stream:
  876. data = stream.read()
  877. exp = """@devs = pingou
  878. @sysadmin = pingou
  879. # end of groups
  880. repo test
  881. R = @all
  882. RW+ = @devs @sysadmin
  883. RW+ = pingou
  884. RW+ = foo
  885. repo docs/test
  886. R = @all
  887. RW+ = @devs @sysadmin
  888. RW+ = pingou
  889. RW+ = foo
  890. repo tickets/test
  891. RW+ = @devs @sysadmin
  892. RW+ = pingou
  893. RW+ = foo
  894. repo requests/test
  895. RW+ = @devs @sysadmin
  896. RW+ = pingou
  897. RW+ = foo
  898. repo test2
  899. R = @all
  900. RW+ = pingou
  901. repo docs/test2
  902. R = @all
  903. RW+ = pingou
  904. repo tickets/test2
  905. RW+ = pingou
  906. repo requests/test2
  907. RW+ = pingou
  908. repo somenamespace/test3
  909. R = @all
  910. RW+ = pingou
  911. repo docs/somenamespace/test3
  912. R = @all
  913. RW+ = pingou
  914. repo tickets/somenamespace/test3
  915. RW+ = pingou
  916. repo requests/somenamespace/test3
  917. RW+ = pingou
  918. repo forks/pingou/test2
  919. R = @all
  920. RW+ = pingou
  921. repo docs/forks/pingou/test2
  922. R = @all
  923. RW+ = pingou
  924. repo tickets/forks/pingou/test2
  925. RW+ = pingou
  926. repo requests/forks/pingou/test2
  927. RW+ = pingou
  928. # end of body
  929. """
  930. #print data
  931. self.assertEqual(data.split('\n'), exp.split('\n'))
  932. os.unlink(outputconf)
  933. self.assertFalse(os.path.exists(outputconf))
  934. def test_write_gitolite_project_pr_only(self):
  935. """ Test the write_gitolite_acls function of pagure.lib.git.
  936. when the project enforces the PR approach.
  937. """
  938. tests.create_projects(self.session)
  939. repo = pagure.lib._get_project(self.session, 'test')
  940. # Make the project enforce the PR workflow
  941. settings = repo.settings
  942. settings['pull_request_access_only'] = True
  943. repo.settings = settings
  944. self.session.add(repo)
  945. self.session.commit()
  946. # Add an user to a project
  947. # The user will be an admin of the project
  948. msg = pagure.lib.add_user_to_project(
  949. session=self.session,
  950. project=repo,
  951. new_user='foo',
  952. user='pingou',
  953. )
  954. self.session.commit()
  955. self.assertEqual(msg, 'User added')
  956. # Add a forked project
  957. item = pagure.lib.model.Project(
  958. user_id=1, # pingou
  959. name='test3',
  960. description='test project #2',
  961. is_fork=True,
  962. parent_id=1,
  963. hook_token='aaabbbvvv',
  964. )
  965. self.session.add(item)
  966. self.session.commit()
  967. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  968. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  969. helper.write_gitolite_acls(self.session, outputconf, project=-1)
  970. self.assertTrue(os.path.exists(outputconf))
  971. with open(outputconf) as stream:
  972. data = stream.read()
  973. exp = """repo docs/test
  974. R = @all
  975. RW+ = pingou
  976. RW+ = foo
  977. repo tickets/test
  978. RW+ = pingou
  979. RW+ = foo
  980. repo requests/test
  981. RW+ = pingou
  982. RW+ = foo
  983. repo test2
  984. R = @all
  985. RW+ = pingou
  986. repo docs/test2
  987. R = @all
  988. RW+ = pingou
  989. repo tickets/test2
  990. RW+ = pingou
  991. repo requests/test2
  992. RW+ = pingou
  993. repo somenamespace/test3
  994. R = @all
  995. RW+ = pingou
  996. repo docs/somenamespace/test3
  997. R = @all
  998. RW+ = pingou
  999. repo tickets/somenamespace/test3
  1000. RW+ = pingou
  1001. repo requests/somenamespace/test3
  1002. RW+ = pingou
  1003. repo forks/pingou/test3
  1004. R = @all
  1005. RW+ = pingou
  1006. repo docs/forks/pingou/test3
  1007. R = @all
  1008. RW+ = pingou
  1009. repo tickets/forks/pingou/test3
  1010. RW+ = pingou
  1011. repo requests/forks/pingou/test3
  1012. RW+ = pingou
  1013. # end of body
  1014. """
  1015. #print data
  1016. self.assertEqual(data, exp)
  1017. os.unlink(outputconf)
  1018. self.assertFalse(os.path.exists(outputconf))
  1019. @patch.dict('pagure.config.config', {'PR_ONLY': True})
  1020. def test_write_gitolite_global_pr_only(self):
  1021. """ Test the write_gitolite_acls function of pagure.lib.git.
  1022. when the pagure instance enforces the PR approach.
  1023. """
  1024. tests.create_projects(self.session)
  1025. repo = pagure.lib._get_project(self.session, 'test')
  1026. self.assertFalse(repo.settings['pull_request_access_only'])
  1027. # Add an user to a project
  1028. # The user will be an admin of the project
  1029. msg = pagure.lib.add_user_to_project(
  1030. session=self.session,
  1031. project=repo,
  1032. new_user='foo',
  1033. user='pingou',
  1034. )
  1035. self.session.commit()
  1036. self.assertEqual(msg, 'User added')
  1037. # Add a forked project
  1038. item = pagure.lib.model.Project(
  1039. user_id=1, # pingou
  1040. name='test3',
  1041. description='test project #2',
  1042. is_fork=True,
  1043. parent_id=1,
  1044. hook_token='aaabbbvvv',
  1045. )
  1046. self.session.add(item)
  1047. self.session.commit()
  1048. outputconf = os.path.join(self.path, 'test_gitolite.conf')
  1049. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  1050. helper.write_gitolite_acls(self.session, outputconf, project=-1)
  1051. self.assertTrue(os.path.exists(outputconf))
  1052. with open(outputconf) as stream:
  1053. data = stream.read()
  1054. exp = """repo docs/test
  1055. R = @all
  1056. RW+ = pingou
  1057. RW+ = foo
  1058. repo tickets/test
  1059. RW+ = pingou
  1060. RW+ = foo
  1061. repo requests/test
  1062. RW+ = pingou
  1063. RW+ = foo
  1064. repo docs/test2
  1065. R = @all
  1066. RW+ = pingou
  1067. repo tickets/test2
  1068. RW+ = pingou
  1069. repo requests/test2
  1070. RW+ = pingou
  1071. repo docs/somenamespace/test3
  1072. R = @all
  1073. RW+ = pingou
  1074. repo tickets/somenamespace/test3
  1075. RW+ = pingou
  1076. repo requests/somenamespace/test3
  1077. RW+ = pingou
  1078. repo forks/pingou/test3
  1079. R = @all
  1080. RW+ = pingou
  1081. repo docs/forks/pingou/test3
  1082. R = @all
  1083. RW+ = pingou
  1084. repo tickets/forks/pingou/test3
  1085. RW+ = pingou
  1086. repo requests/forks/pingou/test3
  1087. RW+ = pingou
  1088. # end of body
  1089. """
  1090. #print data
  1091. self.assertEqual(data, exp)
  1092. os.unlink(outputconf)
  1093. self.assertFalse(os.path.exists(outputconf))
  1094. def test_commit_to_patch(self):
  1095. """ Test the commit_to_patch function of pagure.lib.git. """
  1096. # Create a git repo to play with
  1097. self.gitrepo = os.path.join(self.path, 'repos', 'test_repo.git')
  1098. os.makedirs(self.gitrepo)
  1099. repo = pygit2.init_repository(self.gitrepo)
  1100. # Create a file in that git repo
  1101. with open(os.path.join(self.gitrepo, 'sources'), 'w') as stream:
  1102. stream.write('foo\n bar')
  1103. repo.index.add('sources')
  1104. repo.index.write()
  1105. # Commits the files added
  1106. tree = repo.index.write_tree()
  1107. author = pygit2.Signature(
  1108. 'Alice Author', 'alice@authors.tld')
  1109. committer = pygit2.Signature(
  1110. 'Cecil Committer', 'cecil@committers.tld')
  1111. repo.create_commit(
  1112. 'refs/heads/master', # the name of the reference to update
  1113. author,
  1114. committer,
  1115. 'Add sources file for testing',
  1116. # binary string representing the tree object ID
  1117. tree,
  1118. # list of binary strings representing parents of the new commit
  1119. []
  1120. )
  1121. first_commit = repo.revparse_single('HEAD')
  1122. # Edit the sources file again
  1123. with open(os.path.join(self.gitrepo, 'sources'), 'w') as stream:
  1124. stream.write('foo\n bar\nbaz\n boose')
  1125. repo.index.add('sources')
  1126. repo.index.write()
  1127. # Commits the files added
  1128. tree = repo.index.write_tree()
  1129. author = pygit2.Signature(
  1130. 'Alice Author', 'alice@authors.tld')
  1131. committer = pygit2.Signature(
  1132. 'Cecil Committer', 'cecil@committers.tld')
  1133. repo.create_commit(
  1134. 'refs/heads/master', # the name of the reference to update
  1135. author,
  1136. committer,
  1137. 'Add baz and boose to the sources\n\n There are more objects to '
  1138. 'consider',
  1139. # binary string representing the tree object ID
  1140. tree,
  1141. # list of binary strings representing parents of the new commit
  1142. [first_commit.oid.hex]
  1143. )
  1144. second_commit = repo.revparse_single('HEAD')
  1145. # Generate a patch for 2 commits
  1146. patch = pagure.lib.git.commit_to_patch(
  1147. repo, [first_commit, second_commit])
  1148. exp = """Mon Sep 17 00:00:00 2001
  1149. From: Alice Author <alice@authors.tld>
  1150. Subject: [PATCH 1/2] Add sources file for testing
  1151. ---
  1152. diff --git a/sources b/sources
  1153. new file mode 100644
  1154. index 0000000..9f44358
  1155. --- /dev/null
  1156. +++ b/sources
  1157. @@ -0,0 +1,2 @@
  1158. +foo
  1159. + bar
  1160. \ No newline at end of file
  1161. Mon Sep 17 00:00:00 2001
  1162. From: Alice Author <alice@authors.tld>
  1163. Subject: [PATCH 2/2] Add baz and boose to the sources
  1164. There are more objects to consider
  1165. ---
  1166. diff --git a/sources b/sources
  1167. index 9f44358..2a552bb 100644
  1168. --- a/sources
  1169. +++ b/sources
  1170. @@ -1,2 +1,4 @@
  1171. foo
  1172. - bar
  1173. \ No newline at end of file
  1174. + bar
  1175. +baz
  1176. + boose
  1177. \ No newline at end of file
  1178. """
  1179. npatch = []
  1180. for row in patch.split('\n'):
  1181. if row.startswith('Date:'):
  1182. continue
  1183. if row.startswith('From '):
  1184. row = row.split(' ', 2)[2]
  1185. npatch.append(row)
  1186. patch = '\n'.join(npatch)
  1187. self.assertEqual(patch, exp)
  1188. # Generate a patch for a single commit
  1189. patch = pagure.lib.git.commit_to_patch(repo, second_commit)
  1190. exp = """Mon Sep 17 00:00:00 2001
  1191. From: Alice Author <alice@authors.tld>
  1192. Subject: Add baz and boose to the sources
  1193. There are more objects to consider
  1194. ---
  1195. diff --git a/sources b/sources
  1196. index 9f44358..2a552bb 100644
  1197. --- a/sources
  1198. +++ b/sources
  1199. @@ -1,2 +1,4 @@
  1200. foo
  1201. - bar
  1202. \ No newline at end of file
  1203. + bar
  1204. +baz
  1205. + boose
  1206. \ No newline at end of file
  1207. """
  1208. npatch = []
  1209. for row in patch.split('\n'):
  1210. if row.startswith('Date:'):
  1211. continue
  1212. if row.startswith('From '):
  1213. row = row.split(' ', 2)[2]
  1214. npatch.append(row)
  1215. patch = '\n'.join(npatch)
  1216. self.assertEqual(patch, exp)
  1217. @patch('pagure.lib.notify.send_email')
  1218. def test_update_git(self, email_f):
  1219. """ Test the update_git of pagure.lib.git. """
  1220. email_f.return_value = True
  1221. # Create project
  1222. item = pagure.lib.model.Project(
  1223. user_id=1, # pingou
  1224. name='test_ticket_repo',
  1225. description='test project for ticket',
  1226. hook_token='aaabbbwww',
  1227. )
  1228. self.session.add(item)
  1229. self.session.commit()
  1230. # Create repo
  1231. self.gitrepo = os.path.join(self.path, 'repos', 'tickets',
  1232. 'test_ticket_repo.git')
  1233. pygit2.init_repository(self.gitrepo, bare=True)
  1234. repo = pagure.lib.get_authorized_project(self.session, 'test_ticket_repo')
  1235. # Create an issue to play with
  1236. msg = pagure.lib.new_issue(
  1237. session=self.session,
  1238. repo=repo,
  1239. title='Test issue',
  1240. content='We should work on this',
  1241. user='pingou',
  1242. ticketfolder=os.path.join(self.path, 'repos', 'tickets')
  1243. )
  1244. self.assertEqual(msg.title, 'Test issue')
  1245. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  1246. pagure.lib.git.update_git(issue, repo, os.path.join(self.path,
  1247. 'repos', 'tickets')).get()
  1248. repo = pygit2.Repository(self.gitrepo)
  1249. commit = repo.revparse_single('HEAD')
  1250. # Use patch to validate the repo
  1251. commit_patch = pagure.lib.git.commit_to_patch(repo, commit)
  1252. exp = """Mon Sep 17 00:00:00 2001
  1253. From: pagure <pagure>
  1254. Subject: Updated issue <hash>: Test issue
  1255. ---
  1256. diff --git a/123 b/456
  1257. new file mode 100644
  1258. index 0000000..60f7480
  1259. --- /dev/null
  1260. +++ b/456
  1261. @@ -0,0 +1,28 @@
  1262. +{
  1263. + "assignee": null,
  1264. + "blocks": [],
  1265. + "close_status": null,
  1266. + "closed_at": null,
  1267. + "comments": [],
  1268. + "content": "We should work on this",
  1269. + "custom_fields": [],
  1270. + "date_created": null,
  1271. + "depends": [],
  1272. + "id": 1,
  1273. + "last_updated": null,
  1274. + "milestone": null,
  1275. + "priority": null,
  1276. + "private": false,
  1277. + "status": "Open",
  1278. + "tags": [],
  1279. + "title": "Test issue",
  1280. + "user": {
  1281. + "default_email": "bar@pingou.com",
  1282. + "emails": [
  1283. + "bar@pingou.com",
  1284. + "foo@pingou.com"
  1285. + ],
  1286. + "fullname": "PY C",
  1287. + "name": "pingou"
  1288. + }
  1289. +}
  1290. \ No newline at end of file
  1291. """
  1292. npatch = []
  1293. for row in commit_patch.split('\n'):
  1294. if row.startswith('Date:'):
  1295. continue
  1296. elif row.startswith('From '):
  1297. row = row.split(' ', 2)[2]
  1298. elif row.startswith('diff --git '):
  1299. row = row.split(' ')
  1300. row[2] = 'a/123'
  1301. row[3] = 'b/456'
  1302. row = ' '.join(row)
  1303. elif 'Updated issue' in row:
  1304. row = row.split()
  1305. row[3] = '<hash>:'
  1306. row = ' '.join(row)
  1307. elif 'date_created' in row:
  1308. t = row.split(': ')[0]
  1309. row = '%s: null,' % t
  1310. elif 'last_updated' in row:
  1311. t = row.split(': ')[0]
  1312. row = '%s: null,' % t
  1313. elif 'closed_at' in row:
  1314. t = row.split(': ')[0]
  1315. row = '%s: null,' % t
  1316. elif row.startswith('index 00'):
  1317. row = 'index 0000000..60f7480'
  1318. elif row.startswith('+++ b/'):
  1319. row = '+++ b/456'
  1320. npatch.append(row)
  1321. commit_patch = '\n'.join(npatch)
  1322. #print commit_patch
  1323. self.assertEqual(commit_patch, exp)
  1324. # Enforce having a different last_updated field
  1325. # This is required as the test run fine and fast with sqlite but is
  1326. # much slower with postgresql so we end-up with an updated
  1327. # last_updated in postgresql but not with sqlite
  1328. time.sleep(1)
  1329. # Test again after adding a comment
  1330. # We need to make sure we wait for worker to commit the comment
  1331. def _definitely_wait(result):
  1332. result.wait()
  1333. with patch('pagure.lib.git._maybe_wait', _definitely_wait):
  1334. msg = pagure.lib.add_issue_comment(
  1335. session=self.session,
  1336. issue=issue,
  1337. comment='Hey look a comment!',
  1338. user='foo',
  1339. ticketfolder=os.path.join(self.path, 'repos', 'tickets')
  1340. )
  1341. self.session.commit()
  1342. self.assertEqual(msg, 'Comment added')
  1343. # Use patch to validate the repo
  1344. repo = pygit2.Repository(self.gitrepo)
  1345. commit = repo.revparse_single('HEAD')
  1346. commit_patch = pagure.lib.git.commit_to_patch(repo, commit)
  1347. exp = """Mon Sep 17 00:00:00 2001
  1348. From: pagure <pagure>
  1349. Subject: Updated issue <hash>: Test issue
  1350. ---
  1351. diff --git a/123 b/456
  1352. index 458821a..77674a8
  1353. --- a/123
  1354. +++ b/456
  1355. @@ -3,13 +3,31 @@
  1356. "blocks": [],
  1357. "close_status": null,
  1358. "closed_at": null,
  1359. - "comments": [],
  1360. + "comments": [
  1361. + {
  1362. + "comment": "Hey look a comment!",
  1363. + "date_created": null,
  1364. + "edited_on": null,
  1365. + "editor": null,
  1366. + "id": 1,
  1367. + "notification": false,
  1368. + "parent": null,
  1369. + "user": {
  1370. + "default_email": "foo@bar.com",
  1371. + "emails": [
  1372. + "foo@bar.com"
  1373. + ],
  1374. + "fullname": "foo bar",
  1375. + "name": "foo"
  1376. + }
  1377. + }
  1378. + ],
  1379. "content": "We should work on this",
  1380. "custom_fields": [],
  1381. "date_created": null,
  1382. "depends": [],
  1383. "id": 1,
  1384. - "last_updated": "<date>",
  1385. + "last_updated": "<date>",
  1386. "milestone": null,
  1387. "priority": null,
  1388. "private": false,
  1389. """
  1390. npatch = []
  1391. for row in commit_patch.split('\n'):
  1392. if row.startswith('Date:'):
  1393. continue
  1394. elif row.startswith('From '):
  1395. row = row.split(' ', 2)[2]
  1396. elif row.startswith('diff --git '):
  1397. row = row.split(' ')
  1398. row[2] = 'a/123'
  1399. row[3] = 'b/456'
  1400. row = ' '.join(row)
  1401. elif 'Updated issue' in row:
  1402. row = row.split()
  1403. row[3] = '<hash>:'
  1404. row = ' '.join(row)
  1405. elif 'date_created' in row:
  1406. t = row.split(': ')[0]
  1407. row = '%s: null,' % t
  1408. elif 'closed_at' in row:
  1409. t = row.split(': ')[0]
  1410. row = '%s: null,' % t
  1411. elif row.startswith('index'):
  1412. row = 'index 458821a..77674a8'
  1413. elif row.startswith('--- a/'):
  1414. row = '--- a/123'
  1415. elif row.startswith('+++ b/'):
  1416. row = '+++ b/456'
  1417. elif 'last_updated' in row:
  1418. t = row.split(': ')[0]
  1419. row = '%s: "<date>",' % t
  1420. npatch.append(row)
  1421. commit_patch = '\n'.join(npatch)
  1422. # print commit_patch
  1423. self.assertEqual(commit_patch, exp)
  1424. def test_clean_git(self):
  1425. """ Test the clean_git method of pagure.lib.git. """
  1426. pagure.lib.git.clean_git(None, None, None)
  1427. self.test_update_git()
  1428. gitpath = os.path.join(self.path, 'repos', 'tickets',
  1429. 'test_ticket_repo.git')
  1430. gitrepo = pygit2.init_repository(gitpath, bare=True)
  1431. # Get the uid of the ticket created
  1432. commit = gitrepo.revparse_single('HEAD')
  1433. patch = pagure.lib.git.commit_to_patch(gitrepo, commit)
  1434. hash_file = None
  1435. for row in patch.split('\n'):
  1436. if row.startswith('+++ b/'):
  1437. hash_file = row.split('+++ b/')[-1]
  1438. break
  1439. # The only file in git is the one of that ticket
  1440. files = [entry.name for entry in commit.tree]
  1441. self.assertEqual(files, [hash_file])
  1442. repo = pagure.lib.get_authorized_project(self.session, 'test_ticket_repo')
  1443. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  1444. pagure.lib.git.clean_git(issue, repo,
  1445. os.path.join(self.path, 'tickets')).get()
  1446. # No more files in the git repo
  1447. commit = gitrepo.revparse_single('HEAD')
  1448. files = [entry.name for entry in commit.tree]
  1449. self.assertEqual(files, [])
  1450. @patch('pagure.lib.notify.send_email')
  1451. def test_update_git_requests(self, email_f):
  1452. """ Test the update_git of pagure.lib.git for pull-requests. """
  1453. email_f.return_value = True
  1454. # Create project
  1455. item = pagure.lib.model.Project(
  1456. user_id=1, # pingou
  1457. name='test_ticket_repo',
  1458. description='test project for ticket',
  1459. hook_token='aaabbbxxx',
  1460. )
  1461. self.session.add(item)
  1462. self.session.commit()
  1463. # Create repo
  1464. self.gitrepo = os.path.join(self.path, 'repos', 'requests',
  1465. 'test_ticket_repo.git')
  1466. pygit2.init_repository(self.gitrepo, bare=True)
  1467. # Create a PR to play with
  1468. repo = pagure.lib.get_authorized_project(self.session, 'test_ticket_repo')
  1469. # Create an issue to play with
  1470. req = pagure.lib.new_pull_request(
  1471. session=self.session,
  1472. repo_from=repo,
  1473. branch_from='feature',
  1474. repo_to=repo,
  1475. branch_to='master',
  1476. title='test PR',
  1477. user='pingou',
  1478. requestfolder=os.path.join(self.path, 'requests'),
  1479. requestuid='foobar',
  1480. requestid=None,
  1481. status='Open',
  1482. notify=True
  1483. )
  1484. self.assertEqual(req.id, 1)
  1485. self.assertEqual(req.title, 'test PR')
  1486. request = repo.requests[0]
  1487. self.assertEqual(request.title, 'test PR')
  1488. pagure.lib.git.update_git(request, request.project,
  1489. os.path.join(self.path, 'requests')).get()
  1490. repo = pygit2.Repository(self.gitrepo)
  1491. commit = repo.revparse_single('HEAD')
  1492. # Use patch to validate the repo
  1493. patch = pagure.lib.git.commit_to_patch(repo, commit)
  1494. exp = """Mon Sep 17 00:00:00 2001
  1495. From: pagure <pagure>
  1496. Subject: Updated pull-request <hash>: test PR
  1497. ---
  1498. diff --git a/123 b/456
  1499. new file mode 100644
  1500. index 0000000..60f7480
  1501. --- /dev/null
  1502. +++ b/456
  1503. @@ -0,0 +1,139 @@
  1504. +{
  1505. + "assignee": null,
  1506. + "branch": "master",
  1507. + "branch_from": "feature",
  1508. + "cached_merge_status": "unknown",
  1509. + "closed_at": null,
  1510. + "closed_by": null,
  1511. + "comments": [],
  1512. + "commit_start": null,
  1513. + "commit_stop": null,
  1514. + "date_created": null,
  1515. + "id": 1,
  1516. + "initial_comment": null,
  1517. + "last_updated": null,
  1518. + "project": {
  1519. + "access_groups": {
  1520. + "admin": [],
  1521. + "commit": [],
  1522. + "ticket": []
  1523. + },
  1524. + "access_users": {
  1525. + "admin": [],
  1526. + "commit": [],
  1527. + "owner": [
  1528. + "pingou"
  1529. + ],
  1530. + "ticket": []
  1531. + },
  1532. + "close_status": [],
  1533. + "custom_keys": [],
  1534. + "date_created": null,
  1535. + "date_modified": null,
  1536. + "description": "test project for ticket",
  1537. + "fullname": "test_ticket_repo",
  1538. + "id": 1,
  1539. + "milestones": {},
  1540. + "name": "test_ticket_repo",
  1541. + "namespace": null,
  1542. + "parent": null,
  1543. + "priorities": {},
  1544. + "settings": {
  1545. + "Enforce_signed-off_commits_in_pull-request": false,
  1546. + "Minimum_score_to_merge_pull-request": -1,
  1547. + "Only_assignee_can_merge_pull-request": false,
  1548. + "Web-hooks": null,
  1549. + "always_merge": false,
  1550. + "fedmsg_notifications": true,
  1551. + "issue_tracker": true,
  1552. + "issues_default_to_private": false,
  1553. + "notify_on_commit_flag": false,
  1554. + "notify_on_pull-request_flag": false,
  1555. + "project_documentation": false,
  1556. + "pull_request_access_only": false,
  1557. + "pull_requests": true,
  1558. + "roadmap_on_issues_page": false,
  1559. + "stomp_notifications": true
  1560. + },
  1561. + "tags": [],
  1562. + "url_path": "test_ticket_repo",
  1563. + "user": {
  1564. + "default_email": "bar@pingou.com",
  1565. + "emails": [
  1566. + "bar@pingou.com",
  1567. + "foo@pingou.com"
  1568. + ],
  1569. + "fullname": "PY C",
  1570. + "name": "pingou"
  1571. + }
  1572. + },
  1573. + "remote_git": null,
  1574. + "repo_from": {
  1575. + "access_groups": {
  1576. + "admin": [],
  1577. + "commit": [],
  1578. + "ticket": []
  1579. + },
  1580. + "access_users": {
  1581. + "admin": [],
  1582. + "commit": [],
  1583. + "owner": [
  1584. + "pingou"
  1585. + ],
  1586. + "ticket": []
  1587. + },
  1588. + "close_status": [],
  1589. + "custom_keys": [],
  1590. + "date_created": null,
  1591. + "date_modified": null,
  1592. + "description": "test project for ticket",
  1593. + "fullname": "test_ticket_repo",
  1594. + "id": 1,
  1595. + "milestones": {},
  1596. + "name": "test_ticket_repo",
  1597. + "namespace": null,
  1598. + "parent": null,
  1599. + "priorities": {},
  1600. + "settings": {
  1601. + "Enforce_signed-off_commits_in_pull-request": false,
  1602. + "Minimum_score_to_merge_pull-request": -1,
  1603. + "Only_assignee_can_merge_pull-request": false,
  1604. + "Web-hooks": null,
  1605. + "always_merge": false,
  1606. + "fedmsg_notifications": true,
  1607. + "issue_tracker": true,
  1608. + "issues_default_to_private": false,
  1609. + "notify_on_commit_flag": false,
  1610. + "notify_on_pull-request_flag": false,
  1611. + "project_documentation": false,
  1612. + "pull_request_access_only": false,
  1613. + "pull_requests": true,
  1614. + "roadmap_on_issues_page": false,
  1615. + "stomp_notifications": true
  1616. + },
  1617. + "tags": [],
  1618. + "url_path": "test_ticket_repo",
  1619. + "user": {
  1620. + "default_email": "bar@pingou.com",
  1621. + "emails": [
  1622. + "bar@pingou.com",
  1623. + "foo@pingou.com"
  1624. + ],
  1625. + "fullname": "PY C",
  1626. + "name": "pingou"
  1627. + }
  1628. + },
  1629. + "status": "Open",
  1630. + "title": "test PR",
  1631. + "uid": "foobar",
  1632. + "updated_on": null,
  1633. + "user": {
  1634. + "default_email": "bar@pingou.com",
  1635. + "emails": [
  1636. + "bar@pingou.com",
  1637. + "foo@pingou.com"
  1638. + ],
  1639. + "fullname": "PY C",
  1640. + "name": "pingou"
  1641. + }
  1642. +}
  1643. \ No newline at end of file
  1644. """
  1645. npatch = []
  1646. for row in patch.split('\n'):
  1647. if row.startswith('Date:'):
  1648. continue
  1649. elif row.startswith('From '):
  1650. row = row.split(' ', 2)[2]
  1651. elif row.startswith('diff --git '):
  1652. row = row.split(' ')
  1653. row[2] = 'a/123'
  1654. row[3] = 'b/456'
  1655. row = ' '.join(row)
  1656. elif 'Updated pull-request' in row:
  1657. row = row.split()
  1658. row[3] = '<hash>:'
  1659. row = ' '.join(row)
  1660. elif 'date_created' in row:
  1661. t = row.split(': ')[0]
  1662. row = '%s: null,' % t
  1663. elif 'date_modified' in row:
  1664. t = row.split(': ')[0]
  1665. row = '%s: null,' % t
  1666. elif 'last_updated' in row:
  1667. t = row.split(': ')[0]
  1668. row = '%s: null,' % t
  1669. elif 'updated_on' in row:
  1670. t = row.split(': ')[0]
  1671. row = '%s: null,' % t
  1672. elif row.startswith('index 00'):
  1673. row = 'index 0000000..60f7480'
  1674. elif row.startswith('+++ b/'):
  1675. row = '+++ b/456'
  1676. npatch.append(row)
  1677. patch = '\n'.join(npatch)
  1678. print(patch)
  1679. self.assertEqual(patch, exp)
  1680. def test_update_ticket_from_git_no_priority(self):
  1681. """ Test the update_ticket_from_git method from pagure.lib.git. """
  1682. tests.create_projects(self.session)
  1683. repo = pagure.lib.get_authorized_project(self.session, 'test')
  1684. # Before
  1685. self.assertEqual(len(repo.issues), 0)
  1686. self.assertEqual(repo.issues, [])
  1687. data = {
  1688. "status": "Open", "title": "foo", "comments": [],
  1689. "content": "bar", "date_created": "1426500263",
  1690. "user": {
  1691. "name": "pingou", "emails": ["pingou@fedoraproject.org"]},
  1692. "milestone": "Next Release",
  1693. "priority": 1,
  1694. }
  1695. # Invalid project
  1696. self.assertRaises(
  1697. pagure.exceptions.PagureException,
  1698. pagure.lib.git.update_ticket_from_git,
  1699. self.session,
  1700. reponame='foobar',
  1701. namespace=None,
  1702. username=None,
  1703. issue_uid='foobar',
  1704. json_data=data,
  1705. agent='pingou',
  1706. )
  1707. # Create the issue
  1708. data = {
  1709. "status": "Open", "title": "foo", "comments": [],
  1710. "content": "bar", "date_created": "1426500263",
  1711. "user": {
  1712. "name": "pingou", "emails": ["pingou@fedoraproject.org"]},
  1713. "milestone": "Next Release",
  1714. }
  1715. pagure.lib.git.update_ticket_from_git(
  1716. self.session, reponame='test', namespace=None, username=None,
  1717. issue_uid='foobar', json_data=data, agent='pingou',
  1718. )
  1719. self.session.commit()
  1720. # Edit the issue
  1721. data = {
  1722. "status": "Open", "title": "foo", "comments": [],
  1723. "content": "bar", "date_created": "1426500263",
  1724. "user": {
  1725. "name": "pingou", "emails": ["pingou@fedoraproject.org"]},
  1726. "milestone": "Next Release",
  1727. "priority": 1,
  1728. }
  1729. pagure.lib.git.update_ticket_from_git(
  1730. self.session, reponame='test', namespace=None, username=None,
  1731. issue_uid='foobar', json_data=data, agent='pingou',
  1732. )
  1733. self.session.commit()
  1734. # Data contained a priority but not the project, so bailing
  1735. self.assertEqual(len(repo.issues), 1)
  1736. self.assertEqual(repo.issues[0].id, 1)
  1737. self.assertEqual(repo.issues[0].uid, 'foobar')
  1738. self.assertEqual(repo.issues[0].title, 'foo')
  1739. self.assertEqual(repo.issues[0].depending_text, [])
  1740. self.assertEqual(repo.issues[0].blocking_text, [])
  1741. self.assertEqual(repo.issues[0].milestone, 'Next Release')
  1742. self.assertEqual(repo.issues[0].priority, None)
  1743. self.assertEqual(
  1744. repo.milestones,
  1745. {'Next Release': {'active': True, 'date': None}})
  1746. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  1747. def test_update_ticket_from_git_close_ticket(self):
  1748. """ Test the update_ticket_from_git method from pagure.lib.git. """
  1749. tests.create_projects(self.session)
  1750. repo = pagure.lib.get_authorized_project(self.session, 'test')
  1751. # Before
  1752. self.assertEqual(len(repo.issues), 0)
  1753. self.assertEqual(repo.issues, [])
  1754. # Create the issue
  1755. data = {
  1756. "status": "Open",
  1757. "title": "foo",
  1758. "comments": [],
  1759. "content": "bar",
  1760. "date_created": "1426500263",
  1761. "user": {
  1762. "name": "foo",
  1763. "emails": ["foo@fedoraproject.org"]
  1764. },
  1765. "milestone": "Next Release",
  1766. }
  1767. pagure.lib.git.update_ticket_from_git(
  1768. self.session, reponame='test', namespace=None, username=None,
  1769. issue_uid='foobar', json_data=data, agent='pingou',
  1770. )
  1771. self.session.commit()
  1772. # Edit the issue
  1773. data = {
  1774. "status": "Closed",
  1775. "close_status": "Fixed",
  1776. "title": "foo",
  1777. "comments": [],
  1778. "content": "bar",
  1779. "date_created": "1426500263",
  1780. "user": {
  1781. "name": "foo",
  1782. "emails": ["foo@fedoraproject.org"]
  1783. },
  1784. "milestone": "Next Release",
  1785. }
  1786. pagure.lib.git.update_ticket_from_git(
  1787. self.session, reponame='test', namespace=None, username=None,
  1788. issue_uid='foobar', json_data=data, agent='pingou',
  1789. )
  1790. self.session.commit()
  1791. self.assertEqual(len(repo.issues), 1)
  1792. self.assertEqual(repo.issues[0].id, 1)
  1793. self.assertEqual(repo.issues[0].uid, 'foobar')
  1794. self.assertEqual(repo.issues[0].title, 'foo')
  1795. self.assertEqual(repo.issues[0].depending_text, [])
  1796. self.assertEqual(repo.issues[0].blocking_text, [])
  1797. self.assertEqual(repo.issues[0].milestone, 'Next Release')
  1798. self.assertEqual(repo.issues[0].priority, None)
  1799. self.assertEqual(
  1800. repo.milestones,
  1801. {'Next Release': {'active': True, 'date': None}})
  1802. self.assertEqual(repo.issues[0].status, 'Closed')
  1803. self.assertEqual(repo.issues[0].close_status, 'Fixed')
  1804. self.assertEqual(
  1805. repo.issues[0].comments[-1].comment,
  1806. '**Metadata Update from @pingou**:\n'
  1807. '- Issue close_status updated to: Fixed\n'
  1808. '- Issue status updated to: Closed (was: Open)'
  1809. )
  1810. def test_update_ticket_from_git(self):
  1811. """ Test the update_ticket_from_git method from pagure.lib.git. """
  1812. tests.create_projects(self.session)
  1813. repo = pagure.lib.get_authorized_project(self.session, 'test')
  1814. # Set some priorities to the project
  1815. repo.priorities = {'1': 'High', '2': 'Normal'}
  1816. self.session.add(repo)
  1817. self.session.commit()
  1818. # Before
  1819. self.assertEqual(len(repo.issues), 0)
  1820. self.assertEqual(repo.issues, [])
  1821. data = {
  1822. "status": "Open", "title": "foo", "comments": [],
  1823. "content": "bar", "date_created": "1426500263",
  1824. "user": {
  1825. "name": "pingou", "emails": ["pingou@fedoraproject.org"]},
  1826. "milestone": "Next Release",
  1827. "priority": 1,
  1828. }
  1829. self.assertRaises(
  1830. pagure.exceptions.PagureException,
  1831. pagure.lib.git.update_ticket_from_git,
  1832. self.session,
  1833. reponame='foobar',
  1834. namespace=None,
  1835. username=None,
  1836. issue_uid='foobar',
  1837. json_data=data,
  1838. agent='pingou',
  1839. )
  1840. pagure.lib.git.update_ticket_from_git(
  1841. self.session, reponame='test', namespace=None, username=None,
  1842. issue_uid='foobar', json_data=data, agent='pingou',
  1843. )
  1844. self.session.commit()
  1845. # After 1 insertion
  1846. self.assertEqual(len(repo.issues), 1)
  1847. self.assertEqual(repo.issues[0].id, 1)
  1848. self.assertEqual(repo.issues[0].uid, 'foobar')
  1849. self.assertEqual(repo.issues[0].title, 'foo')
  1850. self.assertEqual(repo.issues[0].depending_text, [])
  1851. self.assertEqual(repo.issues[0].blocking_text, [])
  1852. self.assertEqual(repo.issues[0].milestone, 'Next Release')
  1853. self.assertEqual(repo.issues[0].priority, 1)
  1854. self.assertEqual(
  1855. repo.milestones,
  1856. {'Next Release': {'active': True, 'date': None}})
  1857. data["title"] = "fake issue for tests"
  1858. pagure.lib.git.update_ticket_from_git(
  1859. self.session, reponame='test', namespace=None, username=None,
  1860. issue_uid='foobar', json_data=data, agent='pingou',
  1861. )
  1862. self.session.commit()
  1863. # After edit
  1864. self.assertEqual(len(repo.issues), 1)
  1865. self.assertEqual(repo.issues[0].id, 1)
  1866. self.assertEqual(repo.issues[0].uid, 'foobar')
  1867. self.assertEqual(repo.issues[0].title, 'fake issue for tests')
  1868. self.assertEqual(repo.issues[0].depending_text, [])
  1869. self.assertEqual(repo.issues[0].blocking_text, [])
  1870. self.assertEqual(repo.issues[0].priority, 1)
  1871. data = {
  1872. "status": "Open", "title": "Rename pagure", "private": False,
  1873. "content": "This is too much of a conflict with the book",
  1874. "user": {
  1875. "fullname": "Pierre-YvesChibon",
  1876. "name": "pingou",
  1877. "default_email": "pingou@fedoraproject.org",
  1878. "emails": ["pingou@fedoraproject.org"]
  1879. },
  1880. "id": 20,
  1881. "blocks": [1],
  1882. "depends": [3, 4],
  1883. "date_created": "1426595224",
  1884. "milestone": "Future",
  1885. "priority": 1,
  1886. "comments": [
  1887. {
  1888. "comment": "Nirik:\r\n\r\n- sourceforge++ \r\n- "
  1889. "gitmaker\r\n- mastergit \r\n- hostomatic\r\n- "
  1890. "gitcorp\r\n- git-keiretsu \r\n- gitbuffet\r\n- "
  1891. "cogitator\r\n- cogitate\r\n\r\nrandomuser:\r\n\r\n- "
  1892. "COLLABORATRON5000\r\n- git-sm\\u00f6rg\\u00e5sbord\r\n- "
  1893. "thislittlegittywenttomarket\r\n- git-o-rama\r\n- "
  1894. "gitsundheit",
  1895. "date_created": "1426595224", "id": 250, "parent": None,
  1896. "user": {
  1897. "fullname": "Pierre-YvesChibon",
  1898. "name": "pingou",
  1899. "default_email": "pingou@fedoraproject.org",
  1900. "emails": ["pingou@fedoraproject.org"]
  1901. }
  1902. },
  1903. {
  1904. "comment": "Nirik:\r\n\r\n- sourceforge++ \r\n- "
  1905. "gitmaker\r\n- mastergit \r\n- hostomatic\r\n- "
  1906. "gitcorp\r\n- git-keiretsu \r\n- gitbuffet\r\n- "
  1907. "cogitator\r\n- cogitate\r\n\r\nrandomuser:\r\n\r\n- "
  1908. "COLLABORATRON5000\r\n- git-sm\\u00f6rg\\u00e5sbord\r\n- "
  1909. "thislittlegittywenttomarket\r\n- git-o-rama\r\n- "
  1910. "gitsundheit",
  1911. "date_created": "1426595340", "id": 324, "parent": None,
  1912. "user": {
  1913. "fullname": "Ralph Bean",
  1914. "name": "ralph",
  1915. "default_email": "ralph@fedoraproject.org",
  1916. "emails": ["ralph@fedoraproject.org"]
  1917. }
  1918. }
  1919. ]
  1920. }
  1921. pagure.lib.git.update_ticket_from_git(
  1922. self.session, reponame='test', namespace=None, username=None,
  1923. issue_uid='foobar2', json_data=data, agent='pingou',
  1924. )
  1925. # After second insertion
  1926. self.assertEqual(len(repo.issues), 2)
  1927. self.assertEqual(repo.issues[0].uid, 'foobar')
  1928. self.assertEqual(repo.issues[0].title, 'fake issue for tests')
  1929. self.assertEqual(repo.issues[0].depending_text, [20])
  1930. self.assertEqual(repo.issues[0].blocking_text, [])
  1931. # New one
  1932. self.assertEqual(repo.issues[1].uid, 'foobar2')
  1933. self.assertEqual(repo.issues[1].title, 'Rename pagure')
  1934. self.assertEqual(repo.issues[1].depending_text, [])
  1935. self.assertEqual(repo.issues[1].blocking_text, [1])
  1936. self.assertEqual(repo.issues[1].milestone, 'Future')
  1937. self.assertDictEqual(
  1938. repo.milestones,
  1939. {
  1940. 'Future': {'active': True, 'date': None},
  1941. 'Next Release': {'active': True, 'date': None}
  1942. }
  1943. )
  1944. def test_update_request_from_git(self):
  1945. """ Test the update_request_from_git method from pagure.lib.git. """
  1946. tests.create_projects(self.session)
  1947. tests.create_projects_git(os.path.join(self.path, 'repos'))
  1948. repo = pagure.lib._get_project(self.session, 'test')
  1949. namespaced_repo = pagure.lib._get_project(self.session, 'test3', namespace='somenamespace')
  1950. # Before
  1951. self.assertEqual(len(repo.requests), 0)
  1952. self.assertEqual(repo.requests, [])
  1953. self.assertEqual(len(namespaced_repo.requests), 0)
  1954. self.assertEqual(namespaced_repo.requests, [])
  1955. data = {
  1956. "status": True,
  1957. "uid": "d4182a2ac2d541d884742d3037c26e56",
  1958. "project": {
  1959. "custom_keys": [],
  1960. "parent": None,
  1961. "settings": {
  1962. "issue_tracker": True,
  1963. "project_documentation": True,
  1964. "pull_requests": True,
  1965. },
  1966. "name": "test",
  1967. "date_created": "1426500194",
  1968. "tags": [],
  1969. "user": {
  1970. "fullname": "Pierre-YvesChibon",
  1971. "name": "pingou",
  1972. "default_email": "pingou@fedoraproject.org",
  1973. "emails": [
  1974. "pingou@fedoraproject.org"
  1975. ]
  1976. },
  1977. "id": 1,
  1978. "description": "test project"
  1979. },
  1980. "commit_stop": "eface8e13bc2a08a3fb22af9a72a8c90e36b8b89",
  1981. "user": {
  1982. "fullname": "Pierre-YvesChibon",
  1983. "name": "pingou",
  1984. "default_email": "pingou@fedoraproject.org",
  1985. "emails": ["pingou@fedoraproject.org"]
  1986. },
  1987. "id": 7,
  1988. "comments": [
  1989. {
  1990. "comment": "really?",
  1991. "user": {
  1992. "fullname": "Pierre-YvesChibon",
  1993. "name": "pingou",
  1994. "default_email": "pingou@fedoraproject.org",
  1995. "emails": ["pingou@fedoraproject.org"]
  1996. },
  1997. "parent": None,
  1998. "date_created": "1426843778",
  1999. "commit": "fa72f315373ec5f98f2b08c8ffae3645c97aaad2",
  2000. "line": 5,
  2001. "id": 1,
  2002. "filename": "test"
  2003. },
  2004. {
  2005. "comment": "Again ?",
  2006. "user": {
  2007. "fullname": "Pierre-YvesChibon",
  2008. "name": "pingou",
  2009. "default_email": "pingou@fedoraproject.org",
  2010. "emails": [
  2011. "pingou@fedoraproject.org"
  2012. ]
  2013. },
  2014. "parent": None,
  2015. "date_created": "1426866781",
  2016. "commit": "94ebaf900161394059478fd88aec30e59092a1d7",
  2017. "line": 5,
  2018. "id": 2,
  2019. "filename": "test2"
  2020. },
  2021. {
  2022. "comment": "Should be fine in fact",
  2023. "user": {
  2024. "fullname": "Pierre-YvesChibon",
  2025. "name": "pingou",
  2026. "default_email": "pingou@fedoraproject.org",
  2027. "emails": [
  2028. "pingou@fedoraproject.org"
  2029. ]
  2030. },
  2031. "parent": None,
  2032. "date_created": "1426866950",
  2033. "commit": "94ebaf900161394059478fd88aec30e59092a1d7",
  2034. "line": 5,
  2035. "id": 3,
  2036. "filename": "test2"
  2037. }
  2038. ],
  2039. "branch_from": "master",
  2040. "title": "test request",
  2041. "commit_start": "788efeaaf86bde8618f594a8181abb402e1dd904",
  2042. "repo_from": {
  2043. "parent": {
  2044. "custom_keys": [],
  2045. "parent": None,
  2046. "name": "test",
  2047. "date_created": "1426500194",
  2048. "tags": [],
  2049. "user": {
  2050. "fullname": "Pierre-YvesChibon",
  2051. "name": "pingou",
  2052. "default_email": "pingou@fedoraproject.org",
  2053. "emails": [
  2054. "pingou@fedoraproject.org"
  2055. ]
  2056. },
  2057. "settings": {
  2058. "issue_tracker": True,
  2059. "project_documentation": True,
  2060. "pull_requests": True,
  2061. },
  2062. "id": 1,
  2063. "description": "test project"
  2064. },
  2065. "settings": {
  2066. "issue_tracker": True,
  2067. "project_documentation": True,
  2068. "pull_requests": True,
  2069. },
  2070. "name": "test",
  2071. "date_created": "1426843440",
  2072. "custom_keys": [],
  2073. "tags": [],
  2074. "user": {
  2075. "fullname": "fake user",
  2076. "name": "fake",
  2077. "default_email": "fake@fedoraproject.org",
  2078. "emails": [
  2079. "fake@fedoraproject.org"
  2080. ]
  2081. },
  2082. "id": 6,
  2083. "description": "test project"
  2084. },
  2085. "branch": "master",
  2086. "date_created": "1426843732"
  2087. }
  2088. self.assertRaises(
  2089. pagure.exceptions.PagureException,
  2090. pagure.lib.git.update_request_from_git,
  2091. self.session,
  2092. reponame='foobar',
  2093. namespace=None,
  2094. username=None,
  2095. request_uid='d4182a2ac2d541d884742d3037c26e56',
  2096. json_data=data,
  2097. )
  2098. pagure.lib.git.update_request_from_git(
  2099. self.session,
  2100. reponame='test',
  2101. namespace=None,
  2102. username=None,
  2103. request_uid='d4182a2ac2d541d884742d3037c26e56',
  2104. json_data=data,
  2105. )
  2106. self.session.commit()
  2107. # After 1 st insertion
  2108. self.assertEqual(len(repo.requests), 1)
  2109. self.assertEqual(repo.requests[0].id, 7)
  2110. self.assertEqual(
  2111. repo.requests[0].uid, 'd4182a2ac2d541d884742d3037c26e56')
  2112. self.assertEqual(repo.requests[0].title, 'test request')
  2113. self.assertEqual(len(repo.requests[0].comments), 3)
  2114. data = {
  2115. "status": True,
  2116. "uid": "d4182a2ac2d541d884742d3037c26e57",
  2117. "project": {
  2118. "parent": None,
  2119. "name": "test",
  2120. "custom_keys": [],
  2121. "date_created": "1426500194",
  2122. "tags": [],
  2123. "user": {
  2124. "fullname": "Pierre-YvesChibon",
  2125. "name": "pingou",
  2126. "default_email": "pingou@fedoraproject.org",
  2127. "emails": [
  2128. "pingou@fedoraproject.org"
  2129. ]
  2130. },
  2131. "settings": {
  2132. "issue_tracker": True,
  2133. "project_documentation": True,
  2134. "pull_requests": True,
  2135. },
  2136. "id": 1,
  2137. "description": "test project"
  2138. },
  2139. "commit_stop": "eface8e13bc2a08a3fb22af9a72a8c90e36b8b89",
  2140. "user": {
  2141. "fullname": "Pierre-YvesChibon",
  2142. "name": "pingou",
  2143. "default_email": "pingou@fedoraproject.org",
  2144. "emails": ["pingou@fedoraproject.org"]
  2145. },
  2146. "id": 4,
  2147. "comments": [],
  2148. "branch_from": "master",
  2149. "title": "test request #2",
  2150. "commit_start": "788efeaaf86bde8618f594a8181abb402e1dd904",
  2151. "repo_from": {
  2152. "parent": {
  2153. "parent": None,
  2154. "name": "test",
  2155. "custom_keys": [],
  2156. "date_created": "1426500194",
  2157. "tags": [],
  2158. "user": {
  2159. "fullname": "Pierre-YvesChibon",
  2160. "name": "pingou",
  2161. "default_email": "pingou@fedoraproject.org",
  2162. "emails": [
  2163. "pingou@fedoraproject.org"
  2164. ]
  2165. },
  2166. "settings": {
  2167. "issue_tracker": True,
  2168. "project_documentation": True,
  2169. "pull_requests": True,
  2170. },
  2171. "id": 1,
  2172. "description": "test project"
  2173. },
  2174. "settings": {
  2175. "issue_tracker": True,
  2176. "project_documentation": True,
  2177. "pull_requests": True,
  2178. },
  2179. "name": "test",
  2180. "date_created": "1426843440",
  2181. "custom_keys": [],
  2182. "tags": [],
  2183. "user": {
  2184. "fullname": "fake user",
  2185. "name": "fake",
  2186. "default_email": "fake@fedoraproject.org",
  2187. "emails": [
  2188. "fake@fedoraproject.org"
  2189. ]
  2190. },
  2191. "project_docs": True,
  2192. "id": 6,
  2193. "description": "test project"
  2194. },
  2195. "branch": "master",
  2196. "date_created": "1426843745"
  2197. }
  2198. pagure.lib.git.update_request_from_git(
  2199. self.session,
  2200. reponame='test',
  2201. namespace=None,
  2202. username=None,
  2203. request_uid='d4182a2ac2d541d884742d3037c26e57',
  2204. json_data=data,
  2205. )
  2206. self.session.commit()
  2207. # After 2 nd insertion
  2208. self.assertEqual(len(repo.requests), 2)
  2209. self.assertEqual(repo.requests[0].id, 7)
  2210. self.assertEqual(
  2211. repo.requests[0].uid, 'd4182a2ac2d541d884742d3037c26e56')
  2212. self.assertEqual(repo.requests[0].title, 'test request')
  2213. self.assertEqual(len(repo.requests[0].comments), 3)
  2214. # 2 entry
  2215. self.assertEqual(repo.requests[1].id, 4)
  2216. self.assertEqual(
  2217. repo.requests[1].uid, 'd4182a2ac2d541d884742d3037c26e57')
  2218. self.assertEqual(repo.requests[1].title, 'test request #2')
  2219. self.assertEqual(len(repo.requests[1].comments), 0)
  2220. data = {
  2221. "status": True,
  2222. "uid": "d4182a2ac2d541d884742d3037c26e58",
  2223. "project": {
  2224. "parent": None,
  2225. "name": "test3",
  2226. "custom_keys": [],
  2227. "namespace": "somenamespace",
  2228. "date_created": "1426500194",
  2229. "tags": [],
  2230. "user": {
  2231. "fullname": "Pierre-YvesChibon",
  2232. "name": "pingou",
  2233. "default_email": "pingou@fedoraproject.org",
  2234. "emails": [
  2235. "pingou@fedoraproject.org"
  2236. ]
  2237. },
  2238. "settings": {
  2239. "issue_tracker": True,
  2240. "project_documentation": True,
  2241. "pull_requests": True,
  2242. },
  2243. "id": 3,
  2244. "description": "namespaced test project"
  2245. },
  2246. "commit_stop": "eface8e13bc2a08a3fb22af9a72a8c90e36b8b89",
  2247. "user": {
  2248. "fullname": "Pierre-YvesChibon",
  2249. "name": "pingou",
  2250. "default_email": "pingou@fedoraproject.org",
  2251. "emails": ["pingou@fedoraproject.org"]
  2252. },
  2253. "id": 5,
  2254. "comments": [],
  2255. "branch_from": "master",
  2256. "title": "test request to namespaced repo",
  2257. "commit_start": "788efeaaf86bde8618f594a8181abb402e1dd904",
  2258. "repo_from": {
  2259. "parent": {
  2260. "parent": None,
  2261. "name": "test",
  2262. "custom_keys": [],
  2263. "date_created": "1426500194",
  2264. "tags": [],
  2265. "user": {
  2266. "fullname": "Pierre-YvesChibon",
  2267. "name": "pingou",
  2268. "default_email": "pingou@fedoraproject.org",
  2269. "emails": [
  2270. "pingou@fedoraproject.org"
  2271. ]
  2272. },
  2273. "settings": {
  2274. "issue_tracker": True,
  2275. "project_documentation": True,
  2276. "pull_requests": True,
  2277. },
  2278. "id": 1,
  2279. "description": "test project"
  2280. },
  2281. "settings": {
  2282. "issue_tracker": True,
  2283. "project_documentation": True,
  2284. "pull_requests": True,
  2285. },
  2286. "name": "test",
  2287. "date_created": "1426843440",
  2288. "custom_keys": [],
  2289. "tags": [],
  2290. "user": {
  2291. "fullname": "fake user",
  2292. "name": "fake",
  2293. "default_email": "fake@fedoraproject.org",
  2294. "emails": [
  2295. "fake@fedoraproject.org"
  2296. ]
  2297. },
  2298. "project_docs": True,
  2299. "id": 6,
  2300. "description": "test project"
  2301. },
  2302. "branch": "master",
  2303. "date_created": "1426843745"
  2304. }
  2305. pagure.lib.git.update_request_from_git(
  2306. self.session,
  2307. reponame='test3',
  2308. namespace='somenamespace',
  2309. username=None,
  2310. request_uid='d4182a2ac2d541d884742d3037c26e58',
  2311. json_data=data,
  2312. )
  2313. self.session.commit()
  2314. self.assertEqual(len(namespaced_repo.requests), 1)
  2315. self.assertEqual(namespaced_repo.requests[0].id, 5)
  2316. self.assertEqual(
  2317. namespaced_repo.requests[0].uid,
  2318. 'd4182a2ac2d541d884742d3037c26e58'
  2319. )
  2320. self.assertEqual(
  2321. namespaced_repo.requests[0].title,
  2322. 'test request to namespaced repo'
  2323. )
  2324. def test_read_git_lines(self):
  2325. """ Test the read_git_lines method of pagure.lib.git. """
  2326. self.test_update_git()
  2327. gitrepo = os.path.join(self.path, 'repos', 'tickets', 'test_ticket_repo.git')
  2328. output = pagure.lib.git.read_git_lines(
  2329. ['log', '-1', "--pretty='%s'"], gitrepo)
  2330. self.assertEqual(len(output), 1)
  2331. self.assertTrue(
  2332. output[0].startswith("'Updated issue ")
  2333. )
  2334. self.assertTrue(
  2335. output[0].endswith(": Test issue'")
  2336. )
  2337. # Keeping the new line symbol
  2338. output = pagure.lib.git.read_git_lines(
  2339. ['log', '-1', "--pretty='%s'"], gitrepo, keepends=True)
  2340. self.assertEqual(len(output), 1)
  2341. self.assertTrue(
  2342. output[0].endswith(": Test issue'\n")
  2343. )
  2344. def test_get_revs_between(self):
  2345. """ Test the get_revs_between method of pagure.lib.git. """
  2346. self.test_update_git()
  2347. gitrepo = os.path.join(self.path, 'repos', 'tickets', 'test_ticket_repo.git')
  2348. output = pagure.lib.git.read_git_lines(
  2349. ['log', '-3', "--pretty='%H'"], gitrepo)
  2350. self.assertEqual(len(output), 2)
  2351. from_hash = output[1].replace("'", '')
  2352. # Case 1, repo BASE is null and HEAD is equal to from_hash
  2353. to_hash = '0'
  2354. output1 = pagure.lib.git.get_revs_between(
  2355. to_hash, from_hash, gitrepo, 'refs/heads/master')
  2356. self.assertEqual(output1, [from_hash])
  2357. # Case 2, get revs between two commits (to_hash, from_hash)
  2358. to_hash = output[0].replace("'", '')
  2359. output2 = pagure.lib.git.get_revs_between(
  2360. to_hash, from_hash, gitrepo, 'refs/heads/master')
  2361. self.assertEqual(output2, [to_hash])
  2362. # Case 3, get revs between two commits (from_hash, to_hash)
  2363. output3 = pagure.lib.git.get_revs_between(
  2364. from_hash, to_hash, gitrepo, 'refs/heads/master')
  2365. self.assertEqual(output3, [to_hash])
  2366. # Case 4, get revs between two commits on two different branches
  2367. newgitrepo = tempfile.mkdtemp(prefix='pagure-')
  2368. newrepo = pygit2.clone_repository(gitrepo, newgitrepo)
  2369. newrepo.create_branch('feature', newrepo.head.get_object())
  2370. with open(os.path.join(newgitrepo, 'sources'), 'w') as stream:
  2371. stream.write('foo\n bar')
  2372. newrepo.index.add('sources')
  2373. newrepo.index.write()
  2374. # Commits the files added
  2375. tree = newrepo.index.write_tree()
  2376. author = pygit2.Signature(
  2377. 'Alice Author', 'alice@authors.tld')
  2378. committer = pygit2.Signature(
  2379. 'Cecil Committer', 'cecil@committers.tld')
  2380. newrepo.create_commit(
  2381. 'refs/heads/feature', # the name of the reference to update
  2382. author,
  2383. committer,
  2384. 'Add sources file for testing',
  2385. # binary string representing the tree object ID
  2386. tree,
  2387. # list of binary strings representing parents of the new commit
  2388. [to_hash]
  2389. )
  2390. branch_commit = newrepo.revparse_single('refs/heads/feature')
  2391. # Push to origin
  2392. ori_remote = newrepo.remotes[0]
  2393. PagureRepo.push(ori_remote, 'refs/heads/feature')
  2394. # Remove the clone
  2395. shutil.rmtree(newgitrepo)
  2396. output4 = pagure.lib.git.get_revs_between(
  2397. '0', branch_commit.oid.hex, gitrepo, 'refs/heads/feature')
  2398. self.assertEqual(output4, [branch_commit.oid.hex])
  2399. def test_get_author(self):
  2400. """ Test the get_author method of pagure.lib.git. """
  2401. self.test_update_git()
  2402. gitrepo = os.path.join(self.path, 'repos', 'tickets', 'test_ticket_repo.git')
  2403. output = pagure.lib.git.read_git_lines(
  2404. ['log', '-3', "--pretty='%H'"], gitrepo)
  2405. self.assertEqual(len(output), 2)
  2406. for githash in output:
  2407. githash = githash.replace("'", '')
  2408. output = pagure.lib.git.get_author(githash, gitrepo)
  2409. self.assertEqual(output, 'pagure')
  2410. def get_author_email(self):
  2411. """ Test the get_author_email method of pagure.lib.git. """
  2412. self.test_update_git()
  2413. gitrepo = os.path.join(self.path, 'tickets', 'test_ticket_repo.git')
  2414. output = pagure.lib.git.read_git_lines(
  2415. ['log', '-3', "--pretty='%H'"], gitrepo)
  2416. self.assertEqual(len(output), 2)
  2417. for githash in output:
  2418. githash = githash.replace("'", '')
  2419. output = pagure.lib.git.get_author_email(githash, gitrepo)
  2420. self.assertEqual(output, 'pagure')
  2421. def test_get_repo_name(self):
  2422. """ Test the get_repo_name method of pagure.lib.git. """
  2423. gitrepo = os.path.join(self.path, 'tickets', 'test_ticket_repo.git')
  2424. repo_name = pagure.lib.git.get_repo_name(gitrepo)
  2425. self.assertEqual(repo_name, 'test_ticket_repo')
  2426. repo_name = pagure.lib.git.get_repo_name('foo/bar/baz/test.git')
  2427. self.assertEqual(repo_name, 'test')
  2428. repo_name = pagure.lib.git.get_repo_name('foo.test.git')
  2429. self.assertEqual(repo_name, 'foo.test')
  2430. def test_get_username(self):
  2431. """ Test the get_username method of pagure.lib.git. """
  2432. gitrepo = os.path.join(self.path, 'tickets', 'test_ticket_repo.git')
  2433. repo_name = pagure.lib.git.get_username(gitrepo)
  2434. self.assertEqual(repo_name, None)
  2435. repo_name = pagure.lib.git.get_username('foo/bar/baz/test.git')
  2436. self.assertEqual(repo_name, None)
  2437. repo_name = pagure.lib.git.get_username('foo.test.git')
  2438. self.assertEqual(repo_name, None)
  2439. repo_name = pagure.lib.git.get_username(
  2440. os.path.join(self.path, 'repos', 'forks', 'pingou', 'foo.test.git'))
  2441. self.assertEqual(repo_name, 'pingou')
  2442. repo_name = pagure.lib.git.get_username(
  2443. os.path.join(self.path, 'repos', 'forks', 'pingou', 'bar/foo.test.git'))
  2444. self.assertEqual(repo_name, 'pingou')
  2445. repo_name = pagure.lib.git.get_username(os.path.join(
  2446. self.path, 'repos', 'forks', 'pingou', 'fooo/bar/foo.test.git'))
  2447. self.assertEqual(repo_name, 'pingou')
  2448. def test_get_repo_namespace(self):
  2449. """ Test the get_repo_namespace method of pagure.lib.git. """
  2450. repo_name = pagure.lib.git.get_repo_namespace(
  2451. os.path.join(self.path, 'repos', 'test_ticket_repo.git'))
  2452. self.assertEqual(repo_name, None)
  2453. repo_name = pagure.lib.git.get_repo_namespace(
  2454. os.path.join(self.path, 'repos', 'foo/bar/baz/test.git'))
  2455. self.assertEqual(repo_name, 'foo/bar/baz')
  2456. repo_name = pagure.lib.git.get_repo_namespace(
  2457. os.path.join(self.path, 'repos', 'foo.test.git'))
  2458. self.assertEqual(repo_name, None)
  2459. repo_name = pagure.lib.git.get_repo_namespace(os.path.join(
  2460. self.path, 'repos', 'forks', 'user', 'foo.test.git'))
  2461. self.assertEqual(repo_name, None)
  2462. repo_name = pagure.lib.git.get_repo_namespace(os.path.join(
  2463. self.path, 'repos', 'forks', 'user', 'bar/foo.test.git'))
  2464. self.assertEqual(repo_name, 'bar')
  2465. repo_name = pagure.lib.git.get_repo_namespace(os.path.join(
  2466. self.path, 'repos', 'forks', 'user', 'ns/bar/foo.test.git'))
  2467. self.assertEqual(repo_name, 'ns/bar')
  2468. repo_name = pagure.lib.git.get_repo_namespace(os.path.join(
  2469. self.path, 'repos', 'forks', 'user', '/bar/foo.test.git'))
  2470. self.assertEqual(repo_name, 'bar')
  2471. def test_update_custom_fields_from_json(self):
  2472. """ Test the update_custom_fields_from_json method of lib.git """
  2473. tests.create_projects(self.session)
  2474. repo = pagure.lib._get_project(self.session, 'test')
  2475. # Create issues to play with
  2476. pagure.lib.new_issue(
  2477. session=self.session,
  2478. repo=repo,
  2479. title='Test issue',
  2480. content='We should work on this',
  2481. user='pingou',
  2482. ticketfolder=None,
  2483. issue_uid='someuid'
  2484. )
  2485. self.session.commit()
  2486. issue = pagure.lib.get_issue_by_uid(self.session, 'someuid')
  2487. # Fake json data, currently without custom_fields
  2488. # This should bring no new custom_fields to the issue
  2489. json_data = {
  2490. "status": "Open",
  2491. "title": "Test issue",
  2492. "private": False,
  2493. "content": "We should work on this",
  2494. "user": {
  2495. "fullname": "PY C",
  2496. "name": "pingou",
  2497. "default_email": "bar@pingou.com",
  2498. "emails": ["bar@pingou.com"]
  2499. },
  2500. "id": 1,
  2501. "blocks": [],
  2502. "depends": [],
  2503. "date_created": "1234567",
  2504. "comments": [],
  2505. }
  2506. pagure.lib.git.update_custom_field_from_json(
  2507. self.session, repo, issue, json_data)
  2508. updated_issue = pagure.lib.get_issue_by_uid(self.session, 'someuid')
  2509. self.assertEqual(updated_issue.to_json().get('custom_fields'), [])
  2510. custom_fields = [
  2511. {
  2512. "name": "custom1",
  2513. "key_type": "text",
  2514. "value": "value1",
  2515. "key_data": None,
  2516. },
  2517. {
  2518. "name": "custom2",
  2519. "key_type": "text",
  2520. "value": "value2",
  2521. "key_data": None,
  2522. }
  2523. ]
  2524. # Again, Fake the json data but, with custom_fields in it
  2525. # The updated issue should have the custom_fields as
  2526. # was in the json_data
  2527. json_data = {
  2528. "status": "Open",
  2529. "title": "Test issue",
  2530. "private": False,
  2531. "content": "We should work on this",
  2532. "user": {
  2533. "fullname": "PY C",
  2534. "name": "pingou",
  2535. "default_email": "bar@pingou.com",
  2536. "emails": ["bar@pingou.com"]
  2537. },
  2538. "id": 1,
  2539. "blocks": [],
  2540. "depends": [],
  2541. "date_created": "1234567",
  2542. "comments": [],
  2543. "custom_fields": custom_fields,
  2544. }
  2545. pagure.lib.git.update_custom_field_from_json(
  2546. self.session, repo, issue, json_data)
  2547. updated_issue = pagure.lib.get_issue_by_uid(self.session, 'someuid')
  2548. custom_fields_of_issue = updated_issue.to_json().get('custom_fields')
  2549. self.assertEqual(custom_fields_of_issue, custom_fields)
  2550. @patch('pagure.lib.notify.send_email')
  2551. @patch('pagure.lib.git.update_git')
  2552. def test_merge_pull_request_no_master(self, email_f, up_git):
  2553. """ Test the merge_pull_request function when there are no master
  2554. branch in the repo. """
  2555. email_f.return_value = True
  2556. up_git.return_value = True
  2557. gitfolder = os.path.join(self.path, 'repos')
  2558. docfolder = os.path.join(self.path, 'docs')
  2559. ticketfolder = os.path.join(self.path, 'tickets')
  2560. requestfolder = os.path.join(self.path, 'requests')
  2561. # Create project
  2562. item = pagure.lib.model.Project(
  2563. user_id=1, # pingou
  2564. name='test',
  2565. description='test project',
  2566. hook_token='aaabbbwww',
  2567. )
  2568. self.session.add(item)
  2569. self.session.commit()
  2570. repo = pagure.lib.get_authorized_project(self.session, 'test')
  2571. gitrepo = os.path.join(gitfolder, repo.path)
  2572. docrepo = os.path.join(docfolder, repo.path)
  2573. ticketrepo = os.path.join(ticketfolder, repo.path)
  2574. requestrepo = os.path.join(requestfolder, repo.path)
  2575. os.makedirs(os.path.join(self.path, 'repos', 'forks', 'foo'))
  2576. self.gitrepo = os.path.join(self.path, 'repos', 'test.git')
  2577. os.makedirs(self.gitrepo)
  2578. repo_obj = pygit2.init_repository(self.gitrepo, bare=True)
  2579. # Fork the project
  2580. task = pagure.lib.fork_project(
  2581. session=self.session,
  2582. user='foo',
  2583. repo=repo,
  2584. gitfolder=gitfolder,
  2585. docfolder=docfolder,
  2586. ticketfolder=ticketfolder,
  2587. requestfolder=requestfolder,
  2588. )
  2589. self.session.commit()
  2590. self.assertEqual(task.get(),
  2591. {'endpoint': 'ui_ns.view_repo',
  2592. 'repo': 'test',
  2593. 'username': 'foo',
  2594. 'namespace': None})
  2595. # Create repo, with some content
  2596. self.gitrepo = os.path.join(
  2597. self.path, 'repos', 'forks', 'foo', 'test.git')
  2598. tests.add_content_git_repo(self.gitrepo, branch='feature')
  2599. fork_repo = pagure.lib.get_authorized_project(self.session, 'test', user='foo')
  2600. # Create a PR to play with
  2601. req = pagure.lib.new_pull_request(
  2602. session=self.session,
  2603. repo_from=fork_repo,
  2604. branch_from='feature',
  2605. repo_to=repo,
  2606. branch_to='master',
  2607. title='test PR',
  2608. user='pingou',
  2609. requestfolder=os.path.join(self.path, 'requests'),
  2610. requestuid='foobar',
  2611. requestid=None,
  2612. status='Open',
  2613. notify=True
  2614. )
  2615. self.assertEqual(req.id, 1)
  2616. self.assertEqual(req.title, 'test PR')
  2617. # `master` branch not found
  2618. self.assertRaises(
  2619. pagure.exceptions.PagureException,
  2620. pagure.lib.git.merge_pull_request,
  2621. self.session,
  2622. request=req,
  2623. username='pingou',
  2624. request_folder=os.path.join(self.path, 'requests'),
  2625. domerge=False
  2626. )
  2627. @patch('pagure.lib.notify.send_email')
  2628. @patch('pagure.lib.git.update_git')
  2629. def test_merge_pull_request_closed(self, email_f, up_git):
  2630. """ Test the merge_pull_request function when the PR was already
  2631. closed/merged. """
  2632. email_f.return_value = True
  2633. up_git.return_value = True
  2634. gitfolder = os.path.join(self.path, 'repos')
  2635. docfolder = os.path.join(self.path, 'docs')
  2636. ticketfolder = os.path.join(self.path, 'tickets')
  2637. requestfolder = os.path.join(self.path, 'requests')
  2638. # Create project
  2639. item = pagure.lib.model.Project(
  2640. user_id=1, # pingou
  2641. name='test',
  2642. description='test project',
  2643. hook_token='aaabbbwww',
  2644. )
  2645. self.session.add(item)
  2646. self.session.commit()
  2647. repo = pagure.lib.get_authorized_project(self.session, 'test')
  2648. gitrepo = os.path.join(gitfolder, repo.path)
  2649. docrepo = os.path.join(docfolder, repo.path)
  2650. ticketrepo = os.path.join(ticketfolder, repo.path)
  2651. requestrepo = os.path.join(requestfolder, repo.path)
  2652. os.makedirs(os.path.join(self.path, 'repos', 'forks', 'foo'))
  2653. self.gitrepo = os.path.join(self.path, 'repos', 'test.git')
  2654. os.makedirs(self.gitrepo)
  2655. repo_obj = pygit2.init_repository(self.gitrepo, bare=True)
  2656. tests.add_content_git_repo(self.gitrepo, branch='master')
  2657. # Fork the project
  2658. task = pagure.lib.fork_project(
  2659. session=self.session,
  2660. user='foo',
  2661. repo=repo,
  2662. gitfolder=gitfolder,
  2663. docfolder=docfolder,
  2664. ticketfolder=ticketfolder,
  2665. requestfolder=requestfolder,
  2666. )
  2667. self.session.commit()
  2668. self.assertEqual(task.get(),
  2669. {'endpoint': 'ui_ns.view_repo',
  2670. 'repo': 'test',
  2671. 'username': 'foo',
  2672. 'namespace': None})
  2673. # Create repo, with some content
  2674. self.gitrepo = os.path.join(
  2675. self.path, 'repos', 'forks', 'foo', 'test.git')
  2676. tests.add_content_git_repo(self.gitrepo, branch='feature')
  2677. fork_repo = pagure.lib.get_authorized_project(self.session, 'test', user='foo')
  2678. # Create a PR to play with
  2679. req = pagure.lib.new_pull_request(
  2680. session=self.session,
  2681. repo_from=fork_repo,
  2682. branch_from='feature',
  2683. repo_to=repo,
  2684. branch_to='master',
  2685. title='test PR',
  2686. user='pingou',
  2687. requestfolder=os.path.join(self.path, 'requests'),
  2688. requestuid='foobar',
  2689. requestid=None,
  2690. status='Open',
  2691. notify=True
  2692. )
  2693. self.assertEqual(req.id, 1)
  2694. self.assertEqual(req.title, 'test PR')
  2695. # Close the PR before we ask to merge it
  2696. req.status = 'Closed'
  2697. req.closed_by_id = 2 # id:2 == foo
  2698. req.closed_at = datetime.datetime(2017, 10, 20, 12, 32, 10)
  2699. self.session.add(req)
  2700. self.session.commit()
  2701. # PR already closed
  2702. six.assertRaisesRegex(
  2703. self,
  2704. pagure.exceptions.PagureException,
  2705. 'This pull-request was merged or closed by foo',
  2706. pagure.lib.git.merge_pull_request,
  2707. self.session,
  2708. request=req,
  2709. username='pingou',
  2710. request_folder=os.path.join(self.path, 'requests'),
  2711. domerge=False
  2712. )
  2713. @patch('subprocess.Popen')
  2714. def test_generate_gitolite_acls(self, popen):
  2715. """ Test calling generate_gitolite_acls. """
  2716. pagure.SESSION = self.session
  2717. pagure.lib.git.SESSION = self.session
  2718. pagure.config.config['GITOLITE_HOME'] = '/tmp'
  2719. proc = MagicMock()
  2720. proc.communicate.return_value = (1, 2)
  2721. proc.returncode = 0
  2722. popen.return_value = proc
  2723. helper = pagure.lib.git_auth.get_git_auth_helper('gitolite3')
  2724. helper.generate_acls(project=None)
  2725. popen.assert_called_with(
  2726. 'HOME=/tmp gitolite compile && '
  2727. 'HOME=/tmp gitolite trigger POST_COMPILE',
  2728. cwd='/tmp', shell=True, stderr=-1, stdout=-1
  2729. )
  2730. if __name__ == '__main__':
  2731. unittest.main(verbosity=2)