test_pdiffs.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  1. import contextlib
  2. import os
  3. import shutil
  4. import tempfile
  5. import unittest
  6. from daklib.pdiff import PDiffIndex
  7. try:
  8. from unittest import IsolatedAsyncioTestCase
  9. except ImportError:
  10. IsolatedAsyncioTestCase = None
  11. def generate_orig(content_dir, initial_content):
  12. current_file = os.path.join(content_dir, "data-current")
  13. with open(current_file, "wt") as fd:
  14. if isinstance(initial_content, list):
  15. fd.writelines("{}\n".format(line) for line in initial_content)
  16. else:
  17. fd.write(initial_content)
  18. async def generate_patch(index, patch_name, content_dir, new_content):
  19. new_file = os.path.join(content_dir, "data-current")
  20. orig_file = os.path.join(content_dir, "data-previous")
  21. if os.path.isfile(new_file):
  22. os.rename(new_file, orig_file)
  23. elif not os.path.isfile(orig_file):
  24. # Ensure there is an empty orig file
  25. with open(orig_file, "w"):
  26. pass
  27. generate_orig(content_dir, new_content)
  28. await index.generate_and_add_patch_file(orig_file, new_file, patch_name)
  29. def prune_history(
  30. index,
  31. known_patch_count_before=None,
  32. known_patch_count_after=None,
  33. detected_obsolete_patches=None,
  34. ):
  35. if known_patch_count_before is not None:
  36. assert len(index._history) == known_patch_count_before
  37. index.prune_patch_history()
  38. if known_patch_count_after is not None:
  39. assert len(index._history) == known_patch_count_after
  40. if detected_obsolete_patches is not None:
  41. assert (
  42. sorted(os.path.basename(p) for p in index.find_obsolete_patches())
  43. == detected_obsolete_patches
  44. )
  45. def delete_obsolete_patches(index):
  46. for patch_file in index.find_obsolete_patches():
  47. os.unlink(patch_file)
  48. def reload_and_compare_pdiff_indices(index):
  49. reloaded_index = PDiffIndex(index.patches_dir, index.max, index.wants_merged_pdiffs)
  50. assert index._history_order == reloaded_index._history_order
  51. assert index._history == reloaded_index._history
  52. assert index._old_merged_patches_prefix == reloaded_index._old_merged_patches_prefix
  53. assert index._unmerged_history_order == reloaded_index._unmerged_history_order
  54. # Only part of the history is carried over. Ignore the missing bits.
  55. assert [index._history[x][0] for x in index._history_order] == [
  56. reloaded_index._history[x][0] for x in reloaded_index._history_order
  57. ]
  58. assert [index._history[x][2].size for x in index._history_order] == [
  59. reloaded_index._history[x][2].size for x in reloaded_index._history_order
  60. ]
  61. assert [index._history[x][2].sha256 for x in index._history_order] == [
  62. reloaded_index._history[x][2].sha256 for x in reloaded_index._history_order
  63. ]
  64. if index.wants_merged_pdiffs:
  65. assert [
  66. index._unmerged_history[x][0] for x in index._unmerged_history_order
  67. ] == [
  68. reloaded_index._unmerged_history[x][0]
  69. for x in reloaded_index._unmerged_history_order
  70. ]
  71. assert [
  72. index._unmerged_history[x][2].size for x in index._unmerged_history_order
  73. ] == [
  74. reloaded_index._unmerged_history[x][2].size
  75. for x in reloaded_index._unmerged_history_order
  76. ]
  77. assert [
  78. index._unmerged_history[x][2].sha256 for x in index._unmerged_history_order
  79. ] == [
  80. reloaded_index._unmerged_history[x][2].sha256
  81. for x in reloaded_index._unmerged_history_order
  82. ]
  83. assert len(index._history_order) == len(reloaded_index._unmerged_history_order)
  84. for unmerged_patch in index._unmerged_history_order:
  85. assert unmerged_patch.startswith("patch")
  86. for merged_patch in index._history_order:
  87. assert merged_patch.startswith("T-patch")
  88. assert index.filesizehashes == reloaded_index.filesizehashes
  89. assert index.can_path == reloaded_index.can_path
  90. assert index.has_merged_pdiffs == reloaded_index.has_merged_pdiffs
  91. return reloaded_index
  92. @contextlib.contextmanager
  93. def tempdir():
  94. tmpdir = tempfile.mkdtemp()
  95. try:
  96. yield tmpdir
  97. finally:
  98. shutil.rmtree(tmpdir)
  99. MISALIGNED_HISTORY_RESTORABLE = """
  100. SHA1-Current: 2f846350bf5855230190ef1588e9ee5ddc45b7c7 13499355
  101. SHA256-Current: 17f0429f6116d47a75ac05e5598cac50b9ba511386e849628ef3b6dad0247d17 13499355
  102. SHA1-History:
  103. 05e82a87ced6a0827d38bdcc84b0a795512d48e8 13992555 T-2020-12-12-0800.11-F-2020-11-25-0812.03
  104. 7f5c4a7946dd2fb52e51ef7103ab1ee26c210d3a 13985915 T-2020-12-12-0800.11-F-2020-11-25-2013.43
  105. 6d2356c893e6c37a1957f3ae751af7da389ba37e 13981903 T-2020-12-12-0800.11-F-2020-11-26-0212.42
  106. 1935ed98c30fa9eef8d4a22a70614e969a1ec7b0 13761106 T-2020-12-12-0800.11-F-2020-11-26-0822.42
  107. e791a3eed4b51744d91d7fd3100adddab2439655 13565058 T-2020-12-12-0800.11-F-2020-12-12-0800.11
  108. SHA256-History:
  109. 82d074d6437e4bf20d1e5e99641f2576c42257bde8acf6310cf2ea1d208c189b 13992555 T-2020-12-12-0800.11-F-2020-11-25-0812.03
  110. beed2758c3f93c8f27d83de51e37f6686861648c2ceeae8efb0f1701340e279c 13985915 TOTALLY_WRONG
  111. 668c0bb52edec49d27b0d0e673ae955798bfbe031edb779573903be9d20c1116 13981903 T-2020-12-12-0800.11-F-2020-11-26-0212.42
  112. c7f2ff9bd51b42cb965f7cac2691ede8029422a14f6727ad255ebcc02b7db2f8 13761106 T-2020-12-12-0800.11-F-2020-11-26-0822.42
  113. 33ac90a88d12023ce762772c8422e65ad62528b1de8b579780729978fdf9f437 13565058 T-2020-12-12-0800.11-F-2020-12-12-0800.11
  114. SHA1-Patches:
  115. a1799e3fa0d47f6745a90b3e10e1eae442892f02 6093771 T-2020-12-12-0800.11-F-2020-11-25-0812.03
  116. 45a0e17714357501c0251fc2f30ac3dad98bad85 6093711 T-2020-12-12-0800.11-F-2020-11-25-2013.43
  117. 5d8ef7b8288024666148d89d2bb4a973bc41a682 6093597 T-2020-12-12-0800.11-F-2020-11-26-0212.42
  118. 9f4ff66bc61c67070af0b8925a8c1889eab47ebd 6093251 T-2020-12-12-0800.11-F-2020-11-26-0822.42
  119. 3a7650a9c9656872653a8c990ac802e547eff394 584 T-2020-12-12-0800.11-F-2020-12-12-0800.11
  120. SHA256-Patches:
  121. 52cb3df2e78f012b7eb8ee4bad8bb2cdc185ce96dc1ff449222d49f454618b76 6093771 T-2020-12-12-0800.11-F-2020-11-25-0812.03
  122. b8e607100e642b1e3127ac4751528d8fc9ffe413953a9afcedb0473cac135cd9 6093711 T-2020-12-12-0800.11-F-2020-11-25-2013.43
  123. eabd2eaf70c6cfcb5108f1496bf971eee18b6848f9bca77bf3599c92a21993da 6093597 T-2020-12-12-0800.11-F-2020-11-26-0212.42
  124. 70b95b9c4dd14e34706cc9063094621b04cb187f9f29f7057dff90183b11b21b 6093251 T-2020-12-12-0800.11-F-2020-11-26-0822.42
  125. 26ceafe212bdfb45394ebbeb0d8980af01efdd6a07a78424d6cda268c797e344 584 T-2020-12-12-0800.11-F-2020-12-12-0800.11
  126. SHA1-Download:
  127. 4ca7db18342fca28d2b9e59fec463776fd14931e 387469 GONE_WITH_THE_WIND
  128. 3d8aeb4b658fab36ae43198102a113922ef6ad21 387406 T-2020-12-12-0800.11-F-2020-11-26-0822.42.gz
  129. 11db8148e26030f65b7d29041f805b6534329f9a 271 T-2020-12-12-0800.11-F-2020-12-12-0800.11.gz
  130. SHA256-Download:
  131. dbf9a732491fe685d209a3da8d03609b874079b6b50dd1db8990854817e168be 387492 T-2020-12-12-0800.11-F-2020-11-25-0812.03.gz
  132. 3aea0a0443f624be3b3664e037634ff74b7f59631dad797d075464b8733f4cf4 387500 T-2020-12-12-0800.11-F-2020-11-25-2013.43.gz
  133. 1b96280550272f576e22b1901b100e9b7062ae9b9957fe26088b516f73611ee3 387469 T-2020-12-12-0800.11-F-2020-11-26-0212.42.gz
  134. 05ea55afd7e30cd9556d96ab211714fec51a6c71c486ca20514e9c04d091ef30 387406 T-2020-12-12-0800.11-F-2020-11-26-0822.42.gz
  135. acf2997c8ddc7e9e935154ee9807f8777d25c81fa3eb35c53ec0d94d8fb0f21d 271 T-2020-12-12-0800.11-F-2020-12-12-0800.11.gz
  136. X-Unmerged-SHA1-History:
  137. e791a3eed4b51744d91d7fd3100adddab2439655 13565058 2020-12-12-0800.11
  138. X-Unmerged-SHA256-History:
  139. 33ac90a88d12023ce762772c8422e65ad62528b1de8b579780729978fdf9f437 13565058 2020-12-12-0800.11
  140. X-Unmerged-SHA1-Patches:
  141. a4628688d21d3cfe21a560b614f9c0909b66c98f 7158486 T-2020-12-09-0202.31-F-2020-11-22-0214.58
  142. 7c652dc66607ad7f568414fb0fe6386cbf8979f3 7103094 T-2020-12-09-0202.31-F-2020-11-22-0816.18
  143. 29b8e86a32ea4493608b45efb7a7e453fb07bc64 7102980 T-2020-12-09-0202.31-F-2020-11-22-1420.12
  144. ab93e3c10d0d557dfb097b8ff0eb0b6b7029f700 7019210 T-2020-12-09-0202.31-F-2020-11-22-2016.07
  145. 3a7650a9c9656872653a8c990ac802e547eff394 584 2020-12-12-0800.11
  146. X-Unmerged-SHA256-Patches:
  147. 3ac4c2cb60dce35ee059263ddf063379737a84b5dd7459d5b95471afa3b86a00 7158486 T-2020-12-09-0202.31-F-2020-11-22-0214.58
  148. 47949559026c2253b18cc769cac858d5ccababf9236ac26ec75cb68c90d226cd 7103094 T-2020-12-09-0202.31-F-2020-11-22-0816.18
  149. f791e377a6b3cb80c9c2b6c0cdc88c59b337f0443bfb5c4116d17126dbb8ca14 7102980 T-2020-12-09-0202.31-F-2020-11-22-1420.12
  150. 1a8045dabd177304ca32350d40cb16d1e0e1ec1998f69f20a139685c978fa263 7019210 T-2020-12-09-0202.31-F-2020-11-22-2016.07
  151. 043e62ea9c798aab6f2cfe5fa50d091ed44048396f2130272bb25f08b11351ff 6963749 T-2020-12-09-0202.31-F-2020-11-23-0221.04
  152. 26ceafe212bdfb45394ebbeb0d8980af01efdd6a07a78424d6cda268c797e344 584 2020-12-12-0800.11
  153. X-Unmerged-SHA1-Download:
  154. 11db8148e26030f65b7d29041f805b6534329f9a 271 2020-12-12-0800.11.gz
  155. X-Unmerged-SHA256-Download:
  156. acf2997c8ddc7e9e935154ee9807f8777d25c81fa3eb35c53ec0d94d8fb0f21d 271 2020-12-12-0800.11.gz
  157. X-Patch-Precedence: merged
  158. X-DAK-Older-Patches: 2020-12-11-2002.18 2020-12-12-0200.49 2020-12-12-0800.11
  159. """
  160. MISALIGNED_HISTORY_BROKEN = """
  161. SHA1-Current: 2f846350bf5855230190ef1588e9ee5ddc45b7c7 13499355
  162. SHA256-Current: 17f0429f6116d47a75ac05e5598cac50b9ba511386e849628ef3b6dad0247d17 13499355
  163. SHA1-History:
  164. 05e82a87ced6a0827d38bdcc84b0a795512d48e8 13992555 T-2020-12-12-0800.11-F-2020-11-25-0812.03
  165. 7f5c4a7946dd2fb52e51ef7103ab1ee26c210d3a 13985915 T-2020-12-12-0800.11-F-2020-11-25-2013.43
  166. 6d2356c893e6c37a1957f3ae751af7da389ba37e 13981903 T-2020-12-12-0800.11-F-2020-11-26-0212.42
  167. 1935ed98c30fa9eef8d4a22a70614e969a1ec7b0 13761106 T-2020-12-12-0800.11-F-2020-11-26-0822.42
  168. e791a3eed4b51744d91d7fd3100adddab2439655 13565058 T-2020-12-12-0800.11-F-2020-12-12-0800.11
  169. SHA256-History:
  170. 82d074d6437e4bf20d1e5e99641f2576c42257bde8acf6310cf2ea1d208c189b 13992555 T-2020-12-12-0800.11-F-2020-11-25-0812.03
  171. beed2758c3f93c8f27d83de51e37f6686861648c2ceeae8efb0f1701340e279c 13985915 TOTALLY_WRONG
  172. 668c0bb52edec49d27b0d0e673ae955798bfbe031edb779573903be9d20c1116 13981903 T-2020-12-12-0800.11-F-2020-11-26-0212.42
  173. c7f2ff9bd51b42cb965f7cac2691ede8029422a14f6727ad255ebcc02b7db2f8 13761106 T-2020-12-12-0800.11-F-2020-11-26-0822.42
  174. 33ac90a88d12023ce762772c8422e65ad62528b1de8b579780729978fdf9f437 13565058 T-2020-12-12-0800.11-F-2020-12-12-0800.11
  175. SHA1-Patches:
  176. a1799e3fa0d47f6745a90b3e10e1eae442892f02 6093771 T-2020-12-12-0800.11-F-2020-11-25-0812.03
  177. 45a0e17714357501c0251fc2f30ac3dad98bad85 6093711 T-2020-12-12-0800.11-F-2020-11-25-2013.43
  178. 5d8ef7b8288024666148d89d2bb4a973bc41a682 6093597 T-2020-12-12-0800.11-F-2020-11-26-0212.42
  179. 9f4ff66bc61c67070af0b8925a8c1889eab47ebd 6093251 T-2020-12-12-0800.11-F-2020-11-26-0822.42
  180. 3a7650a9c9656872653a8c990ac802e547eff394 584 T-2020-12-12-0800.11-F-2020-12-12-0800.11
  181. SHA256-Patches:
  182. 52cb3df2e78f012b7eb8ee4bad8bb2cdc185ce96dc1ff449222d49f454618b76 6093771 T-2020-12-12-0800.11-F-2020-11-25-0812.03
  183. b8e607100e642b1e3127ac4751528d8fc9ffe413953a9afcedb0473cac135cd9 6093711 T-2020-12-12-0800.11-F-2020-11-25-2013.43
  184. eabd2eaf70c6cfcb5108f1496bf971eee18b6848f9bca77bf3599c92a21993da 6093597 T-2020-12-12-0800.11-F-2020-11-26-0212.42
  185. 70b95b9c4dd14e34706cc9063094621b04cb187f9f29f7057dff90183b11b21b 6093251 T-2020-12-12-0800.11-F-2020-11-26-0822.42
  186. 26ceafe212bdfb45394ebbeb0d8980af01efdd6a07a78424d6cda268c797e344 584 T_T
  187. SHA1-Download:
  188. 4ca7db18342fca28d2b9e59fec463776fd14931e 387469 GONE_WITH_THE_WIND
  189. 3d8aeb4b658fab36ae43198102a113922ef6ad21 387406 T-2020-12-12-0800.11-F-2020-11-26-0822.42.gz
  190. 11db8148e26030f65b7d29041f805b6534329f9a 271 T-2020-12-12-0800.11-F-2020-12-12-0800.11.gz
  191. SHA256-Download:
  192. dbf9a732491fe685d209a3da8d03609b874079b6b50dd1db8990854817e168be 387492 T-2020-12-12-0800.11-F-2020-11-25-0812.03.gz
  193. 3aea0a0443f624be3b3664e037634ff74b7f59631dad797d075464b8733f4cf4 387500 T-2020-12-12-0800.11-F-2020-11-25-2013.43.gz
  194. 1b96280550272f576e22b1901b100e9b7062ae9b9957fe26088b516f73611ee3 387469 T-2020-12-12-0800.11-F-2020-11-26-0212.42.gz
  195. 05ea55afd7e30cd9556d96ab211714fec51a6c71c486ca20514e9c04d091ef30 387406 O_O.gz
  196. acf2997c8ddc7e9e935154ee9807f8777d25c81fa3eb35c53ec0d94d8fb0f21d 271 T-2020-12-12-0800.11-F-2020-12-12-0800.11.gz
  197. """
  198. if IsolatedAsyncioTestCase is not None:
  199. class TestPDiffs(IsolatedAsyncioTestCase):
  200. async def test_corrupt_pdiff_index(self):
  201. with tempdir() as tmpdir:
  202. pdiff_dir = os.path.join(tmpdir, "pdiffs")
  203. index_file = os.path.join(pdiff_dir, "Index")
  204. os.mkdir(pdiff_dir)
  205. with open(index_file, "w") as fd:
  206. fd.write(MISALIGNED_HISTORY_RESTORABLE)
  207. index = PDiffIndex(pdiff_dir, 3, False)
  208. assert index._history_order == [
  209. "T-2020-12-12-0800.11-F-2020-11-26-0822.42",
  210. "T-2020-12-12-0800.11-F-2020-12-12-0800.11",
  211. ]
  212. assert index._unmerged_history_order == ["2020-12-12-0800.11"]
  213. with open(index_file, "w") as fd:
  214. fd.write(MISALIGNED_HISTORY_BROKEN)
  215. index = PDiffIndex(pdiff_dir, 3, False)
  216. assert index._history_order == []
  217. assert index._unmerged_history_order == []
  218. async def test_pdiff_index_unmerged(self):
  219. with tempdir() as tmpdir:
  220. pdiff_dir = os.path.join(tmpdir, "pdiffs")
  221. index_file = os.path.join(pdiff_dir, "Index")
  222. index = PDiffIndex(pdiff_dir, 3, False)
  223. data = [
  224. "Version 0",
  225. "Some",
  226. "data",
  227. "across",
  228. "6",
  229. "lines",
  230. ]
  231. # The pdiff system assumes we start from a non-empty file
  232. generate_orig(tmpdir, data)
  233. data[0] = "Version 1"
  234. # Non-existing directory => empty history
  235. prune_history(
  236. index,
  237. known_patch_count_before=0,
  238. known_patch_count_after=0,
  239. detected_obsolete_patches=[],
  240. )
  241. # Update should be possible but do nothing
  242. # (dak generate-index-diffs relies on this behaviour)
  243. index.update_index()
  244. # It should not create the directory
  245. assert not os.path.isdir(pdiff_dir)
  246. # Adding a patch should "just work(tm)"
  247. await generate_patch(index, "patch-1", tmpdir, data)
  248. assert os.path.isdir(pdiff_dir)
  249. assert index.filesizehashes is not None
  250. assert index.filesizehashes.size > 0
  251. prune_history(
  252. index,
  253. known_patch_count_before=1,
  254. known_patch_count_after=1,
  255. detected_obsolete_patches=[],
  256. )
  257. assert not os.path.isfile(index_file)
  258. index.update_index()
  259. assert os.path.isfile(index_file)
  260. reload_and_compare_pdiff_indices(index)
  261. index.can_path = "/some/where"
  262. # We should detect obsolete files that are not part of the
  263. # history.
  264. with open(os.path.join(pdiff_dir, "random-patch"), "w"):
  265. pass
  266. prune_history(
  267. index,
  268. known_patch_count_before=1,
  269. known_patch_count_after=1,
  270. detected_obsolete_patches=["random-patch"],
  271. )
  272. delete_obsolete_patches(index)
  273. data[0] = "Version 2"
  274. data[3] = "over"
  275. await generate_patch(index, "patch-2", tmpdir, data)
  276. prune_history(
  277. index,
  278. known_patch_count_before=2,
  279. known_patch_count_after=2,
  280. detected_obsolete_patches=[],
  281. )
  282. data[2] = "Text"
  283. await generate_patch(index, "patch-3", tmpdir, data)
  284. prune_history(
  285. index,
  286. known_patch_count_before=3,
  287. known_patch_count_after=3,
  288. detected_obsolete_patches=[],
  289. )
  290. data[0] = "Version 3"
  291. await generate_patch(index, "patch-4", tmpdir, data)
  292. prune_history(
  293. index,
  294. known_patch_count_before=4,
  295. known_patch_count_after=3,
  296. detected_obsolete_patches=["patch-1.gz"],
  297. )
  298. data[0] = "Version 4"
  299. data[-1] = "lines."
  300. await generate_patch(index, "patch-5", tmpdir, data)
  301. prune_history(
  302. index,
  303. known_patch_count_before=4,
  304. known_patch_count_after=3,
  305. detected_obsolete_patches=["patch-1.gz", "patch-2.gz"],
  306. )
  307. index.update_index()
  308. reload_and_compare_pdiff_indices(index)
  309. delete_obsolete_patches(index)
  310. async def test_pdiff_index_merged(self):
  311. with tempdir() as tmpdir:
  312. pdiff_dir = os.path.join(tmpdir, "pdiffs")
  313. index_file = os.path.join(pdiff_dir, "Index")
  314. index = PDiffIndex(pdiff_dir, 3, True)
  315. data = [
  316. "Version 0",
  317. "Some",
  318. "data",
  319. "across",
  320. "6",
  321. "lines",
  322. ]
  323. # The pdiff system assumes we start from a non-empty file
  324. generate_orig(tmpdir, data)
  325. data[0] = "Version 1"
  326. # Non-existing directory => empty history
  327. prune_history(
  328. index,
  329. known_patch_count_before=0,
  330. known_patch_count_after=0,
  331. detected_obsolete_patches=[],
  332. )
  333. # Update should be possible but do nothing
  334. # (dak generate-index-diffs relies on this behaviour)
  335. index.update_index()
  336. # It should not create the directory
  337. assert not os.path.isdir(pdiff_dir)
  338. # Adding a patch should "just work(tm)"
  339. await generate_patch(index, "patch-1", tmpdir, data)
  340. assert os.path.isdir(pdiff_dir)
  341. assert index.filesizehashes is not None
  342. assert index.filesizehashes.size > 0
  343. prune_history(
  344. index,
  345. known_patch_count_before=1,
  346. known_patch_count_after=1,
  347. detected_obsolete_patches=[],
  348. )
  349. assert not os.path.isfile(index_file)
  350. index.update_index()
  351. assert os.path.isfile(index_file)
  352. reload_and_compare_pdiff_indices(index)
  353. index.can_path = "/some/where"
  354. data[0] = "Version 2"
  355. data[3] = "over"
  356. await generate_patch(index, "patch-2", tmpdir, data)
  357. prune_history(
  358. index,
  359. known_patch_count_before=2,
  360. known_patch_count_after=2,
  361. detected_obsolete_patches=[],
  362. )
  363. data[2] = "Text"
  364. await generate_patch(index, "patch-3", tmpdir, data)
  365. prune_history(
  366. index,
  367. known_patch_count_before=3,
  368. known_patch_count_after=3,
  369. detected_obsolete_patches=[],
  370. )
  371. data[0] = "Version 3"
  372. await generate_patch(index, "patch-4", tmpdir, data)
  373. prune_history(
  374. index,
  375. known_patch_count_before=4,
  376. known_patch_count_after=3,
  377. detected_obsolete_patches=["T-patch-1-F-patch-1.gz", "patch-1.gz"],
  378. )
  379. data[0] = "Version 4"
  380. data[-1] = "lines."
  381. await generate_patch(index, "patch-5", tmpdir, data)
  382. prune_history(
  383. index,
  384. known_patch_count_before=4,
  385. known_patch_count_after=3,
  386. detected_obsolete_patches=[
  387. "T-patch-1-F-patch-1.gz",
  388. "T-patch-2-F-patch-1.gz",
  389. "T-patch-2-F-patch-2.gz",
  390. "patch-1.gz",
  391. "patch-2.gz",
  392. ],
  393. )
  394. index.update_index()
  395. # Swap to the reloaded index. Assuming everything works as intended
  396. # this should not matter.
  397. reload_and_compare_pdiff_indices(index)
  398. data[0] = "Version 5"
  399. await generate_patch(index, "patch-6", tmpdir, data)
  400. prune_history(
  401. index,
  402. known_patch_count_before=4,
  403. known_patch_count_after=3,
  404. detected_obsolete_patches=[
  405. "T-patch-1-F-patch-1.gz",
  406. "T-patch-2-F-patch-1.gz",
  407. "T-patch-2-F-patch-2.gz",
  408. "T-patch-3-F-patch-1.gz",
  409. "T-patch-3-F-patch-2.gz",
  410. "T-patch-3-F-patch-3.gz",
  411. "patch-1.gz",
  412. "patch-2.gz",
  413. "patch-3.gz",
  414. ],
  415. )
  416. delete_obsolete_patches(index)
  417. data[0] = "Version 6"
  418. await generate_patch(index, "patch-7", tmpdir, data)
  419. prune_history(
  420. index,
  421. known_patch_count_before=4,
  422. known_patch_count_after=3,
  423. detected_obsolete_patches=[
  424. "T-patch-4-F-patch-1.gz",
  425. "T-patch-4-F-patch-2.gz",
  426. "T-patch-4-F-patch-3.gz",
  427. "T-patch-4-F-patch-4.gz",
  428. "patch-4.gz",
  429. ],
  430. )
  431. delete_obsolete_patches(index)
  432. index.update_index()
  433. reload_and_compare_pdiff_indices(index)
  434. # CHANGING TO NON-MERGED INDEX
  435. index = PDiffIndex(pdiff_dir, 3, False)
  436. data[0] = "Version 7"
  437. # We need to add a patch to trigger the conversion
  438. await generate_patch(index, "patch-8", tmpdir, data)
  439. prune_history(
  440. index,
  441. known_patch_count_before=4,
  442. known_patch_count_after=3,
  443. detected_obsolete_patches=[
  444. "T-patch-5-F-patch-2.gz",
  445. "T-patch-5-F-patch-3.gz",
  446. "T-patch-5-F-patch-4.gz",
  447. "T-patch-5-F-patch-5.gz",
  448. "T-patch-6-F-patch-3.gz",
  449. "T-patch-6-F-patch-4.gz",
  450. "T-patch-6-F-patch-5.gz",
  451. "T-patch-6-F-patch-6.gz",
  452. "T-patch-7-F-patch-4.gz",
  453. "T-patch-7-F-patch-5.gz",
  454. "T-patch-7-F-patch-6.gz",
  455. "T-patch-7-F-patch-7.gz",
  456. "patch-5.gz",
  457. ],
  458. )
  459. delete_obsolete_patches(index)
  460. index.update_index()
  461. # CHANGING BACK TO MERGED
  462. index = PDiffIndex(pdiff_dir, 3, True)
  463. data[0] = "Version 8"
  464. # We need to add a patch to trigger the conversion
  465. await generate_patch(index, "patch-9", tmpdir, data)
  466. prune_history(
  467. index,
  468. known_patch_count_before=4,
  469. known_patch_count_after=3,
  470. detected_obsolete_patches=["patch-6.gz"],
  471. )
  472. delete_obsolete_patches(index)
  473. index.update_index()
  474. # CHANGING TO NON-MERGED INDEX (AGAIN)
  475. # This will trip the removal of all the merged patches, proving they
  476. # were generated in the first place.
  477. index = PDiffIndex(pdiff_dir, 3, False)
  478. data[0] = "Version 9"
  479. # We need to add a patch to trigger the conversion
  480. await generate_patch(index, "patch-A", tmpdir, data)
  481. prune_history(
  482. index,
  483. known_patch_count_before=4,
  484. known_patch_count_after=3,
  485. detected_obsolete_patches=[
  486. "T-patch-9-F-patch-6.gz",
  487. "T-patch-9-F-patch-7.gz",
  488. "T-patch-9-F-patch-8.gz",
  489. "T-patch-9-F-patch-9.gz",
  490. "patch-7.gz",
  491. ],
  492. )
  493. delete_obsolete_patches(index)
  494. index.update_index()
  495. else:
  496. @unittest.skip("Needs IsolatedAsyncioTestCase (python3 >= 3.8)")
  497. class TestPDiffs(unittest.TestCase):
  498. pass