11_test_dch_main.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. # vim: set fileencoding=utf-8 :
  2. """Test L{gbp.scripts.dch} main"""
  3. from . import context
  4. from .testutils import (DebianGitTestRepo, OsReleaseFile,
  5. get_dch_default_urgency, capture_stderr)
  6. from gbp.scripts import dch
  7. import unittest
  8. import os
  9. import re
  10. # Older dch compatibility
  11. default_urgency = get_dch_default_urgency()
  12. # For Ubuntu compatibility
  13. os_release = OsReleaseFile('/etc/lsb-release')
  14. # OS release codename and snapshot of version 0.9-2~1
  15. if os_release['DISTRIB_ID'] == 'Ubuntu':
  16. os_codename = os_release['DISTRIB_CODENAME']
  17. snap_header_0_9 = r'^test-package\s\(0.9-1ubuntu1~1\.gbp([0-9a-f]{6})\)\sUNRELEASED;\surgency=%s' % default_urgency
  18. new_version_0_9 = '0.9-1ubuntu1'
  19. else:
  20. os_codename = 'unstable'
  21. snap_header_0_9 = r'^test-package\s\(0.9-2~1\.gbp([0-9a-f]{6})\)\sUNRELEASED;\surgency=%s' % default_urgency
  22. new_version_0_9 = '0.9-2'
  23. # Snapshot of version 1.0-1~1
  24. snap_header_1 = r'^test-package\s\(1.0-1~1\.gbp([0-9a-f]{6})\)\sUNRELEASED;\surgency=%s' % default_urgency
  25. # Snapshot of version 1.0-1~2
  26. snap_header_1_2 = r'^test-package\s\(1.0-1~2\.gbp([0-9a-f]{6})\)\sUNRELEASED;\surgency=%s' % default_urgency
  27. snap_mark = r'\s{2}\*{2}\sSNAPSHOT\sbuild\s@'
  28. deb_tag = "debian/0.9-1"
  29. deb_tag_msg = "Pre stable release version 0.9-1"
  30. cl_debian = """test-package (0.9-1) unstable; urgency=%s
  31. [ Debian Maintainer ]
  32. * New pre stable upstream release
  33. -- Debian Maintainer <maint@debian.org> Mon, 17 Oct 2011 10:15:22 +0200
  34. """ % default_urgency
  35. @unittest.skipIf(not os.path.exists('/usr/bin/debchange'), "Dch not found")
  36. class TestScriptDch(DebianGitTestRepo):
  37. """Test git-dch"""
  38. def setUp(self):
  39. DebianGitTestRepo.setUp(self)
  40. self.add_file("foo", "bar")
  41. self.repo.create_tag("upstream/0.9", msg="upstream version 0.9")
  42. self.add_file("bar", "foo")
  43. self.repo.create_tag("upstream/1.0", msg="upstream version 1.0")
  44. self.repo.create_branch("upstream")
  45. self.repo.create_branch("debian")
  46. self.repo.set_branch("debian")
  47. self.upstream_tag = "upstream/%(version)s"
  48. self.top = os.path.abspath(os.path.curdir)
  49. os.mkdir(os.path.join(self.repo.path, "debian"))
  50. context.chdir(self.repo.path)
  51. self.add_file("debian/changelog", cl_debian)
  52. self.add_file("debian/control", """Source: test-package\nSection: test\n""")
  53. self.options = ["--upstream-tag=%s" % self.upstream_tag, "--debian-branch=debian",
  54. "--upstream-branch=upstream", "--id-length=0", "--spawn-editor=/bin/true"]
  55. self.repo.create_tag(deb_tag, msg=deb_tag_msg, commit="HEAD~1")
  56. def tearDown(self):
  57. DebianGitTestRepo.tearDown(self)
  58. def run_dch(self, dch_options=None):
  59. # Take care to copy the list
  60. options = self.options[:]
  61. if dch_options is not None:
  62. options.extend(dch_options)
  63. ret = dch.main(options)
  64. self.assertEqual(ret, 0)
  65. return open("debian/changelog").readlines()
  66. def test_dch_main_new_upstream_version(self):
  67. """Test dch.py like gbp dch script does: new upstream version"""
  68. lines = self.run_dch()
  69. self.assertEqual("test-package (1.0-1) UNRELEASED; urgency=%s\n" % default_urgency, lines[0])
  70. self.assertIn(""" * added debian/control\n""", lines)
  71. def test_dch_main_new_upstream_version_with_release(self):
  72. """Test dch.py like gbp dch script does: new upstream version - release"""
  73. options = ["--release"]
  74. lines = self.run_dch(options)
  75. self.assertEqual("test-package (1.0-1) %s; urgency=%s\n" % (os_codename, default_urgency), lines[0])
  76. self.assertIn(""" * added debian/control\n""", lines)
  77. def test_dch_main_new_upstream_version_with_auto(self):
  78. """Test dch.py like gbp dch script does: new upstream version - guess last commit"""
  79. options = ["--auto"]
  80. lines = self.run_dch(options)
  81. self.assertEqual("test-package (1.0-1) UNRELEASED; urgency=%s\n" % default_urgency, lines[0])
  82. self.assertIn(""" * added debian/control\n""", lines)
  83. def test_dch_main_new_upstream_version_with_snapshot(self):
  84. """Test dch.py like gbp dch script does: new upstream version - snapshot mode"""
  85. options = ["--snapshot"]
  86. lines = self.run_dch(options)
  87. header = re.search(snap_header_1, lines[0])
  88. self.assertIsNotNone(header)
  89. self.assertEqual(header.lastindex, 1)
  90. self.assertIsNotNone(re.search(snap_mark + header.group(1), lines[2]))
  91. self.assertIn(""" * added debian/control\n""", lines)
  92. def test_dch_main_new_upstream_version_with_2_snapshots_auto(self):
  93. """Test dch.py like gbp dch script does: new upstream version - two snapshots - auto"""
  94. options = ["--snapshot"]
  95. lines = self.run_dch(options)
  96. header1 = re.search(snap_header_1, lines[0])
  97. self.assertIsNotNone(header1)
  98. self.assertEqual(header1.lastindex, 1)
  99. self.assertIsNotNone(re.search(snap_mark + header1.group(1), lines[2]))
  100. self.assertIn(""" * added debian/control\n""", lines)
  101. # New snapshot, use auto to guess last one
  102. self.add_file("debian/compat", "9")
  103. options.append("--auto")
  104. lines = self.run_dch(options)
  105. header2 = re.search(snap_header_1_2, lines[0])
  106. self.assertIsNotNone(header2)
  107. self.assertEqual(header2.lastindex, 1)
  108. self.assertIsNotNone(re.search(snap_mark + header2.group(1), lines[2]))
  109. # First snapshot entry must be concatenated with the last one
  110. self.assertNotIn(header1.group(0) + "\n", lines)
  111. self.assertIn(""" * added debian/control\n""", lines)
  112. self.assertIn(""" * added debian/compat\n""", lines)
  113. def test_dch_main_new_upstream_version_with_2_snapshots_commit_auto(self):
  114. """Test dch.py like gbp dch script does: new upstream version - two committed snapshots - auto"""
  115. options = ["--commit"]
  116. options.append("--commit-msg=TEST-COMMITTED-SNAPSHOT")
  117. options.append("--snapshot")
  118. lines = self.run_dch(options)
  119. header1 = re.search(snap_header_1, lines[0])
  120. self.assertIsNotNone(header1)
  121. self.assertEqual(header1.lastindex, 1)
  122. self.assertIsNotNone(re.search(snap_mark + header1.group(1), lines[2]))
  123. self.assertIn(""" * added debian/control\n""", lines)
  124. # New snapshot, use auto to guess last one
  125. self.add_file("debian/compat", "9")
  126. options.append("--auto")
  127. lines = self.run_dch(options)
  128. header2 = re.search(snap_header_1_2, lines[0])
  129. self.assertIsNotNone(header2)
  130. self.assertEqual(header2.lastindex, 1)
  131. self.assertIsNotNone(re.search(snap_mark + header2.group(1), lines[2]))
  132. self.assertIn(""" * added debian/control\n""", lines)
  133. self.assertIn(""" * added debian/compat\n""", lines)
  134. # First snapshot entry must have disapear
  135. self.assertNotIn(header1.group(0) + "\n", lines)
  136. # But its changelog must be included in the new one
  137. self.assertIn(""" * TEST-COMMITTED-SNAPSHOT\n""", lines)
  138. def test_dch_main_new_upstream_version_with_auto_release(self):
  139. """Test dch.py like gbp dch script does: new upstream version - auto - release"""
  140. options = ["--auto", "--release"]
  141. lines = self.run_dch(options)
  142. self.assertEqual("test-package (1.0-1) %s; urgency=%s\n" % (os_codename, default_urgency), lines[0])
  143. self.assertIn(""" * added debian/control\n""", lines)
  144. def test_dch_main_new_upstream_version_with_auto_snapshot(self):
  145. """Test dch.py like gbp dch script does: new upstream version - auto - snapshot mode"""
  146. options = [ "--auto", "--snapshot" ]
  147. options.append("--snapshot")
  148. lines = self.run_dch(options)
  149. header = re.search(snap_header_1, lines[0])
  150. self.assertIsNotNone(header)
  151. self.assertEqual(header.lastindex, 1)
  152. self.assertIsNotNone(re.search(snap_mark + header.group(1), lines[2]))
  153. self.assertIn(""" * added debian/control\n""", lines)
  154. def test_dch_main_new_upstream_version_with_snapshot_release(self):
  155. """Test dch.py like gbp dch script does: new upstream version - snapshot - release"""
  156. options = ["--snapshot", "--release"]
  157. with capture_stderr() as c:
  158. self.assertRaises(SystemExit, self.run_dch, options)
  159. self.assertTrue("'--snapshot' and '--release' are incompatible options" in c.output())
  160. def test_dch_main_new_upstream_version_with_distribution(self):
  161. """Test dch.py like gbp dch script does: new upstream version - set distribution"""
  162. options = ["--distribution=testing", "--force-distribution"]
  163. lines = self.run_dch(options)
  164. self.assertEqual("test-package (1.0-1) testing; urgency=%s\n" % default_urgency, lines[0])
  165. self.assertIn(""" * added debian/control\n""", lines)
  166. def test_dch_main_new_upstream_version_with_release_distribution(self):
  167. """Test dch.py like gbp dch script does: new upstream version - release - set distribution"""
  168. options = ["--release", "--distribution=testing", "--force-distribution"]
  169. lines = self.run_dch(options)
  170. self.assertEqual("test-package (1.0-1) testing; urgency=%s\n" % default_urgency, lines[0])
  171. self.assertIn(""" * added debian/control\n""", lines)
  172. def test_dch_main_new_upstream_version_with_snapshot_distribution(self):
  173. """Test dch.py like gbp dch script does: new upstream version - snapshot mode - do not set distribution"""
  174. options = ["--snapshot", "--distribution=testing"]
  175. lines = self.run_dch(options)
  176. header = re.search(snap_header_1, lines[0])
  177. self.assertIsNotNone(header)
  178. self.assertEqual(header.lastindex, 1)
  179. self.assertIsNotNone(re.search(snap_mark + header.group(1), lines[2]))
  180. self.assertIn(""" * added debian/control\n""", lines)
  181. def test_dch_main_new_upstream_version_with_2_snapshots_auto_distribution(self):
  182. """Test dch.py like gbp dch script does: new upstream version - two snapshots - do not set distribution"""
  183. options = ["--snapshot", "--distribution=testing"]
  184. lines = self.run_dch(options)
  185. header1 = re.search(snap_header_1, lines[0])
  186. self.assertIsNotNone(header1)
  187. self.assertEqual(header1.lastindex, 1)
  188. self.assertIsNotNone(re.search(snap_mark + header1.group(1), lines[2]))
  189. self.assertIn(""" * added debian/control\n""", lines)
  190. # New snapshot, use auto to guess last one
  191. self.add_file("debian/compat", "9")
  192. options.append("--auto")
  193. lines = self.run_dch(options)
  194. header2 = re.search(snap_header_1_2, lines[0])
  195. self.assertIsNotNone(header2)
  196. self.assertEqual(header2.lastindex, 1)
  197. self.assertIsNotNone(re.search(snap_mark + header2.group(1), lines[2]))
  198. # First snapshot entry must be concatenated with the last one
  199. self.assertNotIn(header1.group(0) + "\n", lines)
  200. self.assertIn(""" * added debian/control\n""", lines)
  201. self.assertIn(""" * added debian/compat\n""", lines)
  202. # But its changelog must not be included in the new one since
  203. # we do not commit
  204. self.assertNotIn(""" * TEST-COMMITTED-SNAPSHOT\n""", lines)
  205. def test_dch_main_new_upstream_version_with_2_snapshots_commit_auto_distribution(self):
  206. """Test dch.py like gbp dch script does: new upstream version - two committed snapshots - do not set distribution"""
  207. options = ["--commit"]
  208. options.append("--commit-msg=TEST-COMMITTED-SNAPSHOT")
  209. options.append("--snapshot")
  210. options.append("--distribution=testing")
  211. lines = self.run_dch(options)
  212. header1 = re.search(snap_header_1, lines[0])
  213. self.assertIsNotNone(header1)
  214. self.assertEqual(header1.lastindex, 1)
  215. self.assertIsNotNone(re.search(snap_mark + header1.group(1), lines[2]))
  216. self.assertIn(""" * added debian/control\n""", lines)
  217. # New snapshot, use auto to guess last one
  218. self.add_file("debian/compat", "9")
  219. options.append("--auto")
  220. lines = self.run_dch(options)
  221. header2 = re.search(snap_header_1_2, lines[0])
  222. self.assertIsNotNone(header2)
  223. self.assertEqual(header2.lastindex, 1)
  224. self.assertIsNotNone(re.search(snap_mark + header2.group(1), lines[2]))
  225. self.assertIn(""" * added debian/control\n""", lines)
  226. self.assertIn(""" * added debian/compat\n""", lines)
  227. # First snapshot entry must have disapear
  228. self.assertNotIn(header1.group(0) + "\n", lines)
  229. # But its changelog must be included in the new one
  230. self.assertIn(""" * TEST-COMMITTED-SNAPSHOT\n""", lines)
  231. def test_dch_main_new_upstream_version_with_urgency(self):
  232. """Test dch.py like gbp dch script does: new upstream version - set urgency"""
  233. options = ["--urgency=emergency"]
  234. lines = self.run_dch(options)
  235. self.assertEqual("test-package (1.0-1) UNRELEASED; urgency=emergency\n", lines[0])
  236. self.assertIn(""" * added debian/control\n""", lines)
  237. def test_dch_main_new_upstream_version_with_release_urgency(self):
  238. """Test dch.py like gbp dch script does: new upstream version - release - set urgency"""
  239. options = ["--release", "--urgency=emergency"]
  240. lines = self.run_dch(options)
  241. self.assertEqual("test-package (1.0-1) %s; urgency=emergency\n" % os_codename, lines[0])
  242. self.assertIn(""" * added debian/control\n""", lines)
  243. def test_dch_main_new_upstream_version_with_snapshot_urgency(self):
  244. """Test dch.py like gbp dch script does: new upstream version - snapshot mode - set urgency"""
  245. options = ["--snapshot", "--urgency=emergency"]
  246. lines = self.run_dch(options)
  247. header = re.search(snap_header_1, lines[0])
  248. self.assertIsNotNone(header)
  249. self.assertEqual(header.lastindex, 1)
  250. self.assertIsNotNone(re.search(snap_mark + header.group(1), lines[2]))
  251. self.assertIn(""" * added debian/control\n""", lines)
  252. def test_dch_main_increment_debian_version(self):
  253. """Test dch.py like gbp dch script does: increment debian version"""
  254. self.repo.delete_tag("debian/0.9-1")
  255. self.repo.create_tag("debian/0.9-1", msg="Pre stable release version 0.9-1", commit="HEAD~2")
  256. self.repo.delete_tag("upstream/1.0")
  257. lines = self.run_dch()
  258. self.assertEqual("test-package (%s) UNRELEASED; urgency=%s\n" % (new_version_0_9, default_urgency), lines[0])
  259. self.assertIn(""" * added debian/control\n""", lines)
  260. def test_dch_main_increment_debian_version_with_release(self):
  261. """Test dch.py like gbp dch script does: increment debian version - release"""
  262. self.repo.delete_tag("upstream/1.0")
  263. options = ["--release"]
  264. lines = self.run_dch(options)
  265. self.assertEqual("test-package (%s) %s; urgency=%s\n" % (new_version_0_9, os_codename, default_urgency), lines[0])
  266. self.assertIn(""" * added debian/control\n""", lines)
  267. def test_dch_main_increment_debian_version_with_auto(self):
  268. """Test dch.py like gbp dch script does: increment debian version - guess last commit"""
  269. self.repo.delete_tag("upstream/1.0")
  270. options = ["--auto"]
  271. lines = self.run_dch(options)
  272. self.assertEqual("test-package (%s) UNRELEASED; urgency=%s\n" % (new_version_0_9, default_urgency), lines[0])
  273. self.assertIn(""" * added debian/control\n""", lines)
  274. def test_dch_main_increment_debian_version_with_snapshot(self):
  275. """Test dch.py like gbp dch script does: increment debian version - snapshot mode"""
  276. self.repo.delete_tag("upstream/1.0")
  277. options = ["--snapshot"]
  278. lines = self.run_dch(options)
  279. header = re.search(snap_header_0_9, lines[0])
  280. self.assertIsNotNone(header)
  281. self.assertEqual(header.lastindex, 1)
  282. self.assertIsNotNone(re.search(snap_mark + header.group(1), lines[2]))
  283. self.assertIn(""" * added debian/control\n""", lines)
  284. def test_dch_main_increment_debian_version_with_auto_release(self):
  285. """Test dch.py like gbp dch script does: increment debian version - auto - release"""
  286. self.repo.delete_tag("upstream/1.0")
  287. options = ["--auto", "--release"]
  288. lines = self.run_dch(options)
  289. self.assertEqual("test-package (%s) %s; urgency=%s\n" % (new_version_0_9, os_codename, default_urgency), lines[0])
  290. self.assertIn(""" * added debian/control\n""", lines)
  291. def test_dch_main_increment_debian_version_with_auto_snapshot(self):
  292. """Test dch.py like gbp dch script does: increment debian version - auto - snapshot mode"""
  293. self.repo.delete_tag("upstream/1.0")
  294. options = ["--auto", "--snapshot"]
  295. lines = self.run_dch(options)
  296. header = re.search(snap_header_0_9, lines[0])
  297. self.assertIsNotNone(header)
  298. self.assertEqual(header.lastindex, 1)
  299. self.assertIsNotNone(re.search(snap_mark + header.group(1), lines[2]))
  300. self.assertIn(""" * added debian/control\n""", lines)
  301. def test_dch_main_closes_default(self):
  302. options = ["--meta"]
  303. self.add_file("closes", "test file",
  304. msg="""test debian closes commit\n\nCloses: #123456""")
  305. lines = self.run_dch(options)
  306. self.assertIn(""" * test debian closes commit (Closes: #123456)\n""",
  307. lines)
  308. def test_dch_main_closes_non_debian_bug_numbers(self):
  309. self.add_file("closes", "test file",
  310. msg="""test non-debian closes 1\n\nCloses: EX-123""")
  311. self.add_file("closes1", "test file",
  312. msg="""test non-debian closes 2\n\nCloses: EX-5678""")
  313. options = ["--meta", '--meta-closes-bugnum=ex-\d+']
  314. lines = self.run_dch(options)
  315. self.assertIn(""" * test non-debian closes 1 (Closes: EX-123)\n""",
  316. lines)
  317. self.assertIn(""" * test non-debian closes 2 (Closes: EX-5678)\n""",
  318. lines)
  319. def test_dch_main_meta_closes_and_bug_numbers(self):
  320. self.add_file("closes", "test file",
  321. msg="""test non-debian closes 1\n\nExample: EX-123""")
  322. self.add_file("closes1", "test file",
  323. msg="""test non-debian closes 2\n\nExample: EX-5678""")
  324. options = ["--meta", '--meta-closes-bugnum=ex-\d+',
  325. '--meta-closes=Example']
  326. lines = self.run_dch(options)
  327. self.assertIn(""" * test non-debian closes 1 (Example: EX-123)\n""",
  328. lines)
  329. self.assertIn(""" * test non-debian closes 2 (Example: EX-5678)\n""",
  330. lines)