omdev 0.0.36__tar.gz → 0.0.38__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. omdev-0.0.38/MANIFEST.in +1 -0
  2. {omdev-0.0.36/omdev.egg-info → omdev-0.0.38}/PKG-INFO +6 -6
  3. {omdev-0.0.36 → omdev-0.0.38}/omdev/.om-manifests.json +1 -1
  4. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/cmake.py +86 -11
  5. omdev-0.0.38/omdev/cexts/configs.py +64 -0
  6. {omdev-0.0.36 → omdev-0.0.38}/omdev/cmake.py +3 -0
  7. omdev-0.0.38/omdev/git/vendor/aborting.py +72 -0
  8. omdev-0.0.38/omdev/git/vendor/diffing.py +64 -0
  9. omdev-0.0.38/omdev/git/vendor/errors.py +40 -0
  10. omdev-0.0.38/omdev/git/vendor/journals.py +124 -0
  11. omdev-0.0.38/omdev/git/vendor/merging.py +70 -0
  12. omdev-0.0.38/omdev/git/vendor/paths.py +5 -0
  13. omdev-0.0.38/omdev/git/vendor/pulling.py +309 -0
  14. omdev-0.0.38/omdev/git/vendor/runners.py +83 -0
  15. omdev-0.0.38/omdev/git/vendor/specs.py +47 -0
  16. omdev-0.0.38/omdev/git/vendor/upstreams.py +34 -0
  17. omdev-0.0.38/omdev/js/quickjs/LICENSE +24 -0
  18. omdev-0.0.38/omdev/js/quickjs/TODO.md +86 -0
  19. omdev-0.0.38/omdev/js/quickjs/__init__.py +13 -0
  20. omdev-0.0.38/omdev/js/quickjs/_pyqjsng.c +1901 -0
  21. omdev-0.0.38/omdev/js/quickjs/_pyqjsng.pyi +96 -0
  22. omdev-0.0.38/omdev/js/quickjs/_quickjs/LICENSE +24 -0
  23. omdev-0.0.38/omdev/js/quickjs/_quickjs/builtin-array-fromasync.h +120 -0
  24. omdev-0.0.38/omdev/js/quickjs/_quickjs/builtin-iterator-zip-keyed.h +332 -0
  25. omdev-0.0.38/omdev/js/quickjs/_quickjs/builtin-iterator-zip.h +337 -0
  26. omdev-0.0.38/omdev/js/quickjs/_quickjs/cutils.h +1998 -0
  27. omdev-0.0.38/omdev/js/quickjs/_quickjs/dtoa.c +1619 -0
  28. omdev-0.0.38/omdev/js/quickjs/_quickjs/dtoa.h +87 -0
  29. omdev-0.0.38/omdev/js/quickjs/_quickjs/libregexp-opcode.h +73 -0
  30. omdev-0.0.38/omdev/js/quickjs/_quickjs/libregexp.c +3505 -0
  31. omdev-0.0.38/omdev/js/quickjs/_quickjs/libregexp.h +101 -0
  32. omdev-0.0.38/omdev/js/quickjs/_quickjs/libunicode-table.h +5160 -0
  33. omdev-0.0.38/omdev/js/quickjs/_quickjs/libunicode.c +2069 -0
  34. omdev-0.0.38/omdev/js/quickjs/_quickjs/libunicode.h +172 -0
  35. omdev-0.0.38/omdev/js/quickjs/_quickjs/list.h +107 -0
  36. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs-atom.h +280 -0
  37. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs-c-atomics.h +54 -0
  38. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs-libc.c +5038 -0
  39. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs-libc.h +87 -0
  40. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs-opcode.h +377 -0
  41. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs.c +64849 -0
  42. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs.h +1464 -0
  43. omdev-0.0.38/omdev/js/quickjs/snapshots.py +135 -0
  44. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/pkg.py +113 -6
  45. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/ci.py +541 -108
  46. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/lib/io/pipelines.py +54 -25
  47. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/pyproject.py +171 -7
  48. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/git/cli.py +176 -0
  49. omdev-0.0.38/omdev/tui/apps/markdown/__init__.py +0 -0
  50. omdev-0.0.38/omdev/tui/textual/altdevtools/tools/__init__.py +0 -0
  51. {omdev-0.0.36 → omdev-0.0.38/omdev.egg-info}/PKG-INFO +6 -6
  52. {omdev-0.0.36 → omdev-0.0.38}/omdev.egg-info/SOURCES.txt +40 -0
  53. {omdev-0.0.36 → omdev-0.0.38}/omdev.egg-info/requires.txt +5 -5
  54. {omdev-0.0.36 → omdev-0.0.38}/pyproject.toml +6 -6
  55. omdev-0.0.36/MANIFEST.in +0 -1
  56. {omdev-0.0.36 → omdev-0.0.38}/LICENSE +0 -0
  57. {omdev-0.0.36 → omdev-0.0.38}/README.md +0 -0
  58. {omdev-0.0.36 → omdev-0.0.38}/omdev/README.md +0 -0
  59. {omdev-0.0.36 → omdev-0.0.38}/omdev/__about__.py +0 -0
  60. {omdev-0.0.36 → omdev-0.0.38}/omdev/__init__.py +0 -0
  61. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/__init__.py +0 -0
  62. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/__main__.py +0 -0
  63. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/cli/__init__.py +0 -0
  64. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/cli/main.py +0 -0
  65. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/gen/__init__.py +0 -0
  66. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/gen/gen.py +0 -0
  67. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/gen/imports.py +0 -0
  68. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/gen/manifests.py +0 -0
  69. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/gen/resources.py +0 -0
  70. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/gen/srcfiles.py +0 -0
  71. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/gen/strip.py +0 -0
  72. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/gen/types.py +0 -0
  73. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/gen/typing.py +0 -0
  74. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/info.py +0 -0
  75. {omdev-0.0.36 → omdev-0.0.38}/omdev/amalg/sources.py +0 -0
  76. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/__init__.py +0 -0
  77. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/compute/__init__.py +0 -0
  78. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/compute/cache.py +0 -0
  79. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/compute/contexts.py +0 -0
  80. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/compute/currents.py +0 -0
  81. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/compute/fns.py +0 -0
  82. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/compute/resolvers.py +0 -0
  83. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/compute/storage.py +0 -0
  84. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/compute/types.py +0 -0
  85. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/data/__init__.py +0 -0
  86. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/data/actions.py +0 -0
  87. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/data/cache.py +0 -0
  88. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/data/consts.py +0 -0
  89. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/data/defaults.py +0 -0
  90. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/data/manifests.py +0 -0
  91. {omdev-0.0.36 → omdev-0.0.38}/omdev/cache/data/specs.py +0 -0
  92. {omdev-0.0.36 → omdev-0.0.38}/omdev/capi/__init__.py +0 -0
  93. {omdev-0.0.36 → omdev-0.0.38}/omdev/capi/darwin/__init__.py +0 -0
  94. {omdev-0.0.36 → omdev-0.0.38}/omdev/capi/darwin/aps.py +0 -0
  95. {omdev-0.0.36 → omdev-0.0.38}/omdev/capi/darwin/ax.py +0 -0
  96. {omdev-0.0.36 → omdev-0.0.38}/omdev/capi/darwin/cf.py +0 -0
  97. {omdev-0.0.36 → omdev-0.0.38}/omdev/capi/darwin/cg.py +0 -0
  98. {omdev-0.0.36 → omdev-0.0.38}/omdev/capi/linux/__init__.py +0 -0
  99. {omdev-0.0.36 → omdev-0.0.38}/omdev/capi/linux/x11.py +0 -0
  100. {omdev-0.0.36 → omdev-0.0.38}/omdev/cc/__init__.py +0 -0
  101. {omdev-0.0.36 → omdev-0.0.38}/omdev/cc/__main__.py +0 -0
  102. {omdev-0.0.36 → omdev-0.0.38}/omdev/cc/cdeps.py +0 -0
  103. {omdev-0.0.36 → omdev-0.0.38}/omdev/cc/cdeps.toml +0 -0
  104. {omdev-0.0.36 → omdev-0.0.38}/omdev/cc/cli.py +0 -0
  105. {omdev-0.0.36 → omdev-0.0.38}/omdev/cc/srclangs.py +0 -0
  106. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/__init__.py +0 -0
  107. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_boilerplate.cc +0 -0
  108. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/LICENSE +0 -0
  109. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/__init__.py +0 -0
  110. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/build_ext.py +0 -0
  111. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  112. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  113. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/compilers/options.py +0 -0
  114. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  115. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/dir_util.py +0 -0
  116. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/errors.py +0 -0
  117. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/extension.py +0 -0
  118. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/file_util.py +0 -0
  119. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/modified.py +0 -0
  120. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/spawn.py +0 -0
  121. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/sysconfig.py +0 -0
  122. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/util.py +0 -0
  123. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/_distutils/version.py +0 -0
  124. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/build.py +0 -0
  125. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/importhook.py +0 -0
  126. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/magic.py +0 -0
  127. {omdev-0.0.36 → omdev-0.0.38}/omdev/cexts/scan.py +0 -0
  128. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/__init__.py +0 -0
  129. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/__main__.py +0 -0
  130. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/cache.py +0 -0
  131. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/ci.py +0 -0
  132. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/cli.py +0 -0
  133. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/compose.py +0 -0
  134. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/consts.py +0 -0
  135. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/__init__.py +0 -0
  136. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/buildcaching.py +0 -0
  137. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/cache.py +0 -0
  138. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  139. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/cacheserved/cache.py +0 -0
  140. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  141. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/cmds.py +0 -0
  142. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/dataserver.py +0 -0
  143. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/imagepulling.py +0 -0
  144. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/inject.py +0 -0
  145. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/packing.py +0 -0
  146. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/repositories.py +0 -0
  147. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/docker/utils.py +0 -0
  148. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/__init__.py +0 -0
  149. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/api/__init__.py +0 -0
  150. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/api/clients.py +0 -0
  151. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/api/v1/__init__.py +0 -0
  152. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/api/v1/api.py +0 -0
  153. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/api/v1/client.py +0 -0
  154. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/api/v2/__init__.py +0 -0
  155. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/api/v2/api.py +0 -0
  156. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/api/v2/azure.py +0 -0
  157. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/api/v2/client.py +0 -0
  158. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/bootstrap.py +0 -0
  159. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/cache.py +0 -0
  160. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/cli.py +0 -0
  161. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/env.py +0 -0
  162. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/github/inject.py +0 -0
  163. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/inject.py +0 -0
  164. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/requirements.py +0 -0
  165. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/shell.py +0 -0
  166. {omdev-0.0.36 → omdev-0.0.38}/omdev/ci/utils.py +0 -0
  167. {omdev-0.0.36 → omdev-0.0.38}/omdev/cli/__init__.py +0 -0
  168. {omdev-0.0.36 → omdev-0.0.38}/omdev/cli/__main__.py +0 -0
  169. {omdev-0.0.36 → omdev-0.0.38}/omdev/cli/_pathhack.py +0 -0
  170. {omdev-0.0.36 → omdev-0.0.38}/omdev/cli/clicli.py +0 -0
  171. {omdev-0.0.36 → omdev-0.0.38}/omdev/cli/install.py +0 -0
  172. {omdev-0.0.36 → omdev-0.0.38}/omdev/cli/main.py +0 -0
  173. {omdev-0.0.36 → omdev-0.0.38}/omdev/cli/managers.py +0 -0
  174. {omdev-0.0.36 → omdev-0.0.38}/omdev/cli/types.py +0 -0
  175. {omdev-0.0.36 → omdev-0.0.38}/omdev/clipboard/__init__.py +0 -0
  176. {omdev-0.0.36 → omdev-0.0.38}/omdev/clipboard/capi/__init__.py +0 -0
  177. {omdev-0.0.36 → omdev-0.0.38}/omdev/clipboard/capi/darwin_cf.py +0 -0
  178. {omdev-0.0.36 → omdev-0.0.38}/omdev/clipboard/capi/linux_x11.py +0 -0
  179. {omdev-0.0.36 → omdev-0.0.38}/omdev/clipboard/commands.py +0 -0
  180. {omdev-0.0.36 → omdev-0.0.38}/omdev/clipboard/platform.py +0 -0
  181. {omdev-0.0.36 → omdev-0.0.38}/omdev/clipboard/types.py +0 -0
  182. {omdev-0.0.36 → omdev-0.0.38}/omdev/cmdlog/__init__.py +0 -0
  183. {omdev-0.0.36 → omdev-0.0.38}/omdev/cmdlog/__main__.py +0 -0
  184. {omdev-0.0.36 → omdev-0.0.38}/omdev/cmdlog/_cmdlog.py +0 -0
  185. {omdev-0.0.36 → omdev-0.0.38}/omdev/cmdlog/cli.py +0 -0
  186. {omdev-0.0.36 → omdev-0.0.38}/omdev/cmdlog/cmdlog.py +0 -0
  187. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataclasses/__init__.py +0 -0
  188. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataclasses/__main__.py +0 -0
  189. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataclasses/_dumping.py +0 -0
  190. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataclasses/_template.py +0 -0
  191. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataclasses/cli.py +0 -0
  192. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataclasses/codegen.py +0 -0
  193. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataclasses/dumping.py +0 -0
  194. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataserver/__init__.py +0 -0
  195. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataserver/handlers.py +0 -0
  196. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataserver/http.py +0 -0
  197. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataserver/routes.py +0 -0
  198. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataserver/server.py +0 -0
  199. {omdev-0.0.36 → omdev-0.0.38}/omdev/dataserver/targets.py +0 -0
  200. {omdev-0.0.36 → omdev-0.0.38}/omdev/diffs/__init__.py +0 -0
  201. {omdev-0.0.36 → omdev-0.0.38}/omdev/diffs/__main__.py +0 -0
  202. {omdev-0.0.36 → omdev-0.0.38}/omdev/diffs/cli.py +0 -0
  203. {omdev-0.0.36 → omdev-0.0.38}/omdev/diffs/parsing.py +0 -0
  204. {omdev-0.0.36 → omdev-0.0.38}/omdev/diffs/rendering.py +0 -0
  205. {omdev-0.0.36 → omdev-0.0.38}/omdev/diffs/types.py +0 -0
  206. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/__init__.py +0 -0
  207. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/__main__.py +0 -0
  208. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/build.py +0 -0
  209. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/cli.py +0 -0
  210. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/config.py +0 -0
  211. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/config.toml +0 -0
  212. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/content.py +0 -0
  213. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/gen.py +0 -0
  214. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/helpers.py +0 -0
  215. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/ops.py +0 -0
  216. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/rendering.py +0 -0
  217. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/.python-versions.json +0 -0
  218. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/configs/.gdbinit +0 -0
  219. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/configs/.sqliterc +0 -0
  220. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/configs/.tmux.conf +0 -0
  221. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/configs/.vimrc +0 -0
  222. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/depsets/python.toml +0 -0
  223. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/depsets/system.toml +0 -0
  224. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/depsets/x11.toml +0 -0
  225. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/apt.sh +0 -0
  226. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/chgrp.sh +0 -0
  227. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/docker.sh +0 -0
  228. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/firefox.sh +0 -0
  229. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/go.sh +0 -0
  230. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/jdk.sh +0 -0
  231. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/man.sh +0 -0
  232. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/nvm.sh +0 -0
  233. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/pyenv.sh +0 -0
  234. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/rbenv.sh +0 -0
  235. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/rust.sh +0 -0
  236. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/sshd.sh +0 -0
  237. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/user.sh +0 -0
  238. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/uv.sh +0 -0
  239. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/vcpkg.sh +0 -0
  240. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/workdir.sh +0 -0
  241. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/zig.sh +0 -0
  242. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/scripts/install-claude +0 -0
  243. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/scripts/install-codex +0 -0
  244. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/scripts/install-pi +0 -0
  245. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/scripts/run-dbus +0 -0
  246. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/resources/shift-uid.sh +0 -0
  247. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/run.py +0 -0
  248. {omdev-0.0.36 → omdev-0.0.38}/omdev/dockerdev/utils.py +0 -0
  249. {omdev-0.0.36 → omdev-0.0.38}/omdev/git/__init__.py +0 -0
  250. {omdev-0.0.36 → omdev-0.0.38}/omdev/git/magic.py +0 -0
  251. {omdev-0.0.36 → omdev-0.0.38}/omdev/git/revisions.py +0 -0
  252. {omdev-0.0.36 → omdev-0.0.38}/omdev/git/shallow.py +0 -0
  253. {omdev-0.0.36 → omdev-0.0.38}/omdev/git/status.py +0 -0
  254. {omdev-0.0.36/omdev/home → omdev-0.0.38/omdev/git/vendor}/__init__.py +0 -0
  255. {omdev-0.0.36/omdev/interp/providers → omdev-0.0.38/omdev/home}/__init__.py +0 -0
  256. {omdev-0.0.36 → omdev-0.0.38}/omdev/home/__main__.py +0 -0
  257. {omdev-0.0.36 → omdev-0.0.38}/omdev/home/cli.py +0 -0
  258. {omdev-0.0.36 → omdev-0.0.38}/omdev/home/paths.py +0 -0
  259. {omdev-0.0.36 → omdev-0.0.38}/omdev/home/secrets.py +0 -0
  260. {omdev-0.0.36 → omdev-0.0.38}/omdev/home/shadow.py +0 -0
  261. {omdev-0.0.36 → omdev-0.0.38}/omdev/imgur.py +0 -0
  262. {omdev-0.0.36 → omdev-0.0.38}/omdev/intellij/__init__.py +0 -0
  263. {omdev-0.0.36 → omdev-0.0.38}/omdev/intellij/cli.py +0 -0
  264. {omdev-0.0.36 → omdev-0.0.38}/omdev/intellij/ides.py +0 -0
  265. {omdev-0.0.36 → omdev-0.0.38}/omdev/intellij/open.py +0 -0
  266. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/__init__.py +0 -0
  267. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/__main__.py +0 -0
  268. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/cli.py +0 -0
  269. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/default.py +0 -0
  270. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/inject.py +0 -0
  271. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/inspect.py +0 -0
  272. {omdev-0.0.36/omdev/interp/pyenv → omdev-0.0.38/omdev/interp/providers}/__init__.py +0 -0
  273. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/providers/base.py +0 -0
  274. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/providers/inject.py +0 -0
  275. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/providers/running.py +0 -0
  276. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/providers/standalone.py +0 -0
  277. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/providers/system.py +0 -0
  278. {omdev-0.0.36/omdev/interp/uv → omdev-0.0.38/omdev/interp/pyenv}/__init__.py +0 -0
  279. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/pyenv/inject.py +0 -0
  280. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/pyenv/install.py +0 -0
  281. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/pyenv/provider.py +0 -0
  282. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/pyenv/pyenv.py +0 -0
  283. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/resolvers.py +0 -0
  284. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/types.py +0 -0
  285. {omdev-0.0.36/omdev/java → omdev-0.0.38/omdev/interp/uv}/__init__.py +0 -0
  286. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/uv/inject.py +0 -0
  287. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/uv/provider.py +0 -0
  288. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/uv/uv.py +0 -0
  289. {omdev-0.0.36 → omdev-0.0.38}/omdev/interp/venvs.py +0 -0
  290. {omdev-0.0.36/omdev/manifests → omdev-0.0.38/omdev/java}/__init__.py +0 -0
  291. {omdev-0.0.36 → omdev-0.0.38}/omdev/java/__main__.py +0 -0
  292. {omdev-0.0.36 → omdev-0.0.38}/omdev/java/cli.py +0 -0
  293. {omdev-0.0.36 → omdev-0.0.38}/omdev/java/pomgen.py +0 -0
  294. {omdev-0.0.36 → omdev-0.0.38}/omdev/java/utils.py +0 -0
  295. {omdev-0.0.36 → omdev-0.0.38}/omdev/java/xml.py +0 -0
  296. {omdev-0.0.36/omdev/markdown → omdev-0.0.38/omdev/js}/__init__.py +0 -0
  297. {omdev-0.0.36 → omdev-0.0.38}/omdev/magic/__init__.py +0 -0
  298. {omdev-0.0.36 → omdev-0.0.38}/omdev/magic/__main__.py +0 -0
  299. {omdev-0.0.36 → omdev-0.0.38}/omdev/magic/cli.py +0 -0
  300. {omdev-0.0.36 → omdev-0.0.38}/omdev/magic/find.py +0 -0
  301. {omdev-0.0.36 → omdev-0.0.38}/omdev/magic/magic.py +0 -0
  302. {omdev-0.0.36 → omdev-0.0.38}/omdev/magic/prepare.py +0 -0
  303. {omdev-0.0.36 → omdev-0.0.38}/omdev/magic/styles.py +0 -0
  304. {omdev-0.0.36/omdev/mypy → omdev-0.0.38/omdev/manifests}/__init__.py +0 -0
  305. {omdev-0.0.36 → omdev-0.0.38}/omdev/manifests/__main__.py +0 -0
  306. {omdev-0.0.36 → omdev-0.0.38}/omdev/manifests/_dumping.py +0 -0
  307. {omdev-0.0.36 → omdev-0.0.38}/omdev/manifests/building.py +0 -0
  308. {omdev-0.0.36 → omdev-0.0.38}/omdev/manifests/dumping.py +0 -0
  309. {omdev-0.0.36 → omdev-0.0.38}/omdev/manifests/main.py +0 -0
  310. {omdev-0.0.36/omdev/packaging → omdev-0.0.38/omdev/markdown}/__init__.py +0 -0
  311. {omdev-0.0.36 → omdev-0.0.38}/omdev/markdown/incparse.py +0 -0
  312. {omdev-0.0.36 → omdev-0.0.38}/omdev/markdown/tokens.py +0 -0
  313. {omdev-0.0.36/omdev/precheck → omdev-0.0.38/omdev/mypy}/__init__.py +0 -0
  314. {omdev-0.0.36 → omdev-0.0.38}/omdev/mypy/debug.py +0 -0
  315. {omdev-0.0.36 → omdev-0.0.38}/omdev/mypy/report.py +0 -0
  316. {omdev-0.0.36/omdev/py/asts → omdev-0.0.38/omdev/packaging}/__init__.py +0 -0
  317. {omdev-0.0.36 → omdev-0.0.38}/omdev/packaging/marshal.py +0 -0
  318. {omdev-0.0.36 → omdev-0.0.38}/omdev/packaging/names.py +0 -0
  319. {omdev-0.0.36 → omdev-0.0.38}/omdev/packaging/requirements.py +0 -0
  320. {omdev-0.0.36 → omdev-0.0.38}/omdev/packaging/revisions.py +0 -0
  321. {omdev-0.0.36 → omdev-0.0.38}/omdev/packaging/specifiers.py +0 -0
  322. {omdev-0.0.36 → omdev-0.0.38}/omdev/packaging/versions.py +0 -0
  323. {omdev-0.0.36 → omdev-0.0.38}/omdev/packaging/wheelfile.py +0 -0
  324. {omdev-0.0.36 → omdev-0.0.38}/omdev/pip.py +0 -0
  325. {omdev-0.0.36/omdev/py/scripts → omdev-0.0.38/omdev/precheck}/__init__.py +0 -0
  326. {omdev-0.0.36 → omdev-0.0.38}/omdev/precheck/__main__.py +0 -0
  327. {omdev-0.0.36 → omdev-0.0.38}/omdev/precheck/base.py +0 -0
  328. {omdev-0.0.36 → omdev-0.0.38}/omdev/precheck/blanklines.py +0 -0
  329. {omdev-0.0.36 → omdev-0.0.38}/omdev/precheck/caches.py +0 -0
  330. {omdev-0.0.36 → omdev-0.0.38}/omdev/precheck/git.py +0 -0
  331. {omdev-0.0.36 → omdev-0.0.38}/omdev/precheck/imports.py +0 -0
  332. {omdev-0.0.36 → omdev-0.0.38}/omdev/precheck/lite.py +0 -0
  333. {omdev-0.0.36 → omdev-0.0.38}/omdev/precheck/main.py +0 -0
  334. {omdev-0.0.36 → omdev-0.0.38}/omdev/precheck/manifests.py +0 -0
  335. {omdev-0.0.36 → omdev-0.0.38}/omdev/precheck/scripts.py +0 -0
  336. {omdev-0.0.36 → omdev-0.0.38}/omdev/precheck/unicode.py +0 -0
  337. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/__init__.py +0 -0
  338. {omdev-0.0.36/omdev/py/tokens → omdev-0.0.38/omdev/py/asts}/__init__.py +0 -0
  339. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/asts/parents.py +0 -0
  340. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/asts/toplevel.py +0 -0
  341. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/asts/visitors.py +0 -0
  342. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/attrdocs.py +0 -0
  343. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/bracepy.py +0 -0
  344. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/classdot.py +0 -0
  345. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/docstrings/LICENSE +0 -0
  346. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/docstrings/__init__.py +0 -0
  347. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/docstrings/attrdoc.py +0 -0
  348. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/docstrings/common.py +0 -0
  349. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/docstrings/epydoc.py +0 -0
  350. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/docstrings/google.py +0 -0
  351. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/docstrings/numpydoc.py +0 -0
  352. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/docstrings/parser.py +0 -0
  353. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/docstrings/rest.py +0 -0
  354. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/findimports.py +0 -0
  355. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/reprs.py +0 -0
  356. {omdev-0.0.36/omdev/py/tools → omdev-0.0.38/omdev/py/scripts}/__init__.py +0 -0
  357. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/scripts/bumpversion.py +0 -0
  358. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/scripts/importtrace.py +0 -0
  359. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/srcheaders.py +0 -0
  360. {omdev-0.0.36/omdev/pyproject/tools → omdev-0.0.38/omdev/py/tokens}/__init__.py +0 -0
  361. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/tokens/all.py +0 -0
  362. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/tokens/tokenizert.py +0 -0
  363. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/tokens/utils.py +0 -0
  364. {omdev-0.0.36/omdev/rs → omdev-0.0.38/omdev/py/tools}/__init__.py +0 -0
  365. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/tools/fixdocstrings.py +0 -0
  366. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/tools/importscan.py +0 -0
  367. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/tools/mkrelimp.py +0 -0
  368. {omdev-0.0.36 → omdev-0.0.38}/omdev/py/tools/pipdepup.py +0 -0
  369. {omdev-0.0.36 → omdev-0.0.38}/omdev/py.typed +0 -0
  370. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/__init__.py +0 -0
  371. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/__main__.py +0 -0
  372. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/cli.py +0 -0
  373. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/configs.py +0 -0
  374. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/inject.py +0 -0
  375. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/reqs.py +0 -0
  376. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/resources/dockerdev.sh +0 -0
  377. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/resources/python.sh +0 -0
  378. {omdev-0.0.36/omdev/scripts/lib → omdev-0.0.38/omdev/pyproject/tools}/__init__.py +0 -0
  379. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/tools/aboutdeps.py +0 -0
  380. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/tools/buildrs.py +0 -0
  381. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/tools/pyversions.py +0 -0
  382. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/venvs.py +0 -0
  383. {omdev-0.0.36 → omdev-0.0.38}/omdev/pyproject/versions.py +0 -0
  384. {omdev-0.0.36/omdev/scripts/lib/formats → omdev-0.0.38/omdev/rs}/__init__.py +0 -0
  385. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/__init__.py +0 -0
  386. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/interp.py +0 -0
  387. {omdev-0.0.36/omdev/scripts/lib/io → omdev-0.0.38/omdev/scripts/lib}/__init__.py +0 -0
  388. {omdev-0.0.36/omdev/specs → omdev-0.0.38/omdev/scripts/lib/formats}/__init__.py +0 -0
  389. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/lib/formats/goyaml.py +0 -0
  390. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/lib/inject.py +0 -0
  391. {omdev-0.0.36/omdev/specs/irc → omdev-0.0.38/omdev/scripts/lib/io}/__init__.py +0 -0
  392. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/lib/io/streambufs.py +0 -0
  393. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/lib/logs.py +0 -0
  394. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/lib/marshal.py +0 -0
  395. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/pidfiles.py +0 -0
  396. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/slowcat.py +0 -0
  397. {omdev-0.0.36 → omdev-0.0.38}/omdev/scripts/tmpexec.py +0 -0
  398. {omdev-0.0.36/omdev/specs/irc/messages → omdev-0.0.38/omdev/specs}/__init__.py +0 -0
  399. {omdev-0.0.36/omdev/specs/irc/numerics → omdev-0.0.38/omdev/specs/irc}/__init__.py +0 -0
  400. {omdev-0.0.36/omdev/specs/jsonschema → omdev-0.0.38/omdev/specs/irc/messages}/__init__.py +0 -0
  401. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/messages/base.py +0 -0
  402. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/messages/formats.py +0 -0
  403. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/messages/messages.py +0 -0
  404. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/messages/parsing.py +0 -0
  405. {omdev-0.0.36/omdev/specs/oci → omdev-0.0.38/omdev/specs/irc/numerics}/__init__.py +0 -0
  406. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/numerics/formats.py +0 -0
  407. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/numerics/numerics.py +0 -0
  408. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/numerics/types.py +0 -0
  409. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/protocol/LICENSE +0 -0
  410. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/protocol/__init__.py +0 -0
  411. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/protocol/consts.py +0 -0
  412. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/protocol/errors.py +0 -0
  413. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/protocol/message.py +0 -0
  414. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/protocol/nuh.py +0 -0
  415. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/protocol/parsing.py +0 -0
  416. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/protocol/rendering.py +0 -0
  417. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/protocol/tags.py +0 -0
  418. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/irc/protocol/utils.py +0 -0
  419. {omdev-0.0.36/omdev/specs/oci/pack → omdev-0.0.38/omdev/specs/jsonschema}/__init__.py +0 -0
  420. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/__init__.py +0 -0
  421. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/__main__.py +0 -0
  422. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/analysis.py +0 -0
  423. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/cli.py +0 -0
  424. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/config.py +0 -0
  425. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/errors.py +0 -0
  426. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/generator.py +0 -0
  427. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/ir.py +0 -0
  428. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/names.py +0 -0
  429. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/rendering.py +0 -0
  430. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/transforms.py +0 -0
  431. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/typing.py +0 -0
  432. {omdev-0.0.36/omdev/tools/git → omdev-0.0.38/omdev/specs/oci}/__init__.py +0 -0
  433. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/building.py +0 -0
  434. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/compression.py +0 -0
  435. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/data.py +0 -0
  436. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/datarefs.py +0 -0
  437. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/dataserver.py +0 -0
  438. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/loading.py +0 -0
  439. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/media.py +0 -0
  440. {omdev-0.0.36/omdev/tools/json → omdev-0.0.38/omdev/specs/oci/pack}/__init__.py +0 -0
  441. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/pack/packing.py +0 -0
  442. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/pack/repositories.py +0 -0
  443. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/pack/unpacking.py +0 -0
  444. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/repositories.py +0 -0
  445. {omdev-0.0.36 → omdev-0.0.38}/omdev/specs/oci/tars.py +0 -0
  446. {omdev-0.0.36 → omdev-0.0.38}/omdev/tagstrings.py +0 -0
  447. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/__init__.py +0 -0
  448. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/cloc.py +0 -0
  449. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/diff.py +0 -0
  450. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/doc.py +0 -0
  451. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/docker.py +0 -0
  452. {omdev-0.0.36/omdev/tools/jsonview → omdev-0.0.38/omdev/tools/git}/__init__.py +0 -0
  453. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/git/__main__.py +0 -0
  454. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/git/cloning.py +0 -0
  455. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/git/consts.py +0 -0
  456. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/git/messages.py +0 -0
  457. {omdev-0.0.36/omdev/tools/pawk → omdev-0.0.38/omdev/tools/json}/__init__.py +0 -0
  458. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/json/__main__.py +0 -0
  459. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/json/cli.py +0 -0
  460. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/json/formats.py +0 -0
  461. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/json/io.py +0 -0
  462. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/json/parsing.py +0 -0
  463. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/json/processing.py +0 -0
  464. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/json/rendering.py +0 -0
  465. {omdev-0.0.36/omdev/tui → omdev-0.0.38/omdev/tools/jsonview}/__init__.py +0 -0
  466. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/jsonview/__main__.py +0 -0
  467. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/jsonview/cli.py +0 -0
  468. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  469. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/jsonview/resources/jsonview.html.j2 +0 -0
  470. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  471. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/linehisto.py +0 -0
  472. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/mkenv.py +0 -0
  473. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/notebook.py +0 -0
  474. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/ocr.py +0 -0
  475. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/pawk/README.md +0 -0
  476. {omdev-0.0.36/omdev/tui/apps → omdev-0.0.38/omdev/tools/pawk}/__init__.py +0 -0
  477. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/pawk/__main__.py +0 -0
  478. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/pawk/pawk.py +0 -0
  479. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/pip.py +0 -0
  480. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/prof.py +0 -0
  481. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/qr.py +0 -0
  482. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/shadow.py +0 -0
  483. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/shell.py +0 -0
  484. {omdev-0.0.36 → omdev-0.0.38}/omdev/tools/sqlrepl.py +0 -0
  485. {omdev-0.0.36/omdev/tui/apps/edit → omdev-0.0.38/omdev/tui}/__init__.py +0 -0
  486. {omdev-0.0.36/omdev/tui/apps/irc → omdev-0.0.38/omdev/tui/apps}/__init__.py +0 -0
  487. {omdev-0.0.36/omdev/tui/apps/jtree → omdev-0.0.38/omdev/tui/apps/edit}/__init__.py +0 -0
  488. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/edit/main.py +0 -0
  489. {omdev-0.0.36/omdev/tui/apps/markdown → omdev-0.0.38/omdev/tui/apps/irc}/__init__.py +0 -0
  490. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/irc/__main__.py +0 -0
  491. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/irc/app.py +0 -0
  492. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/irc/client.py +0 -0
  493. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/irc/commands.py +0 -0
  494. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/irc/main.py +0 -0
  495. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/jtree/LICENSE +0 -0
  496. {omdev-0.0.36/omdev/tui/textual/altdevtools/tools → omdev-0.0.38/omdev/tui/apps/jtree}/__init__.py +0 -0
  497. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/jtree/__main__.py +0 -0
  498. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/jtree/app.py +0 -0
  499. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/jtree/cli.py +0 -0
  500. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/jtree/styles/layout.tcss +0 -0
  501. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/jtree/utils.py +0 -0
  502. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/jtree/widgets.py +0 -0
  503. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/markdown/__main__.py +0 -0
  504. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/apps/markdown/cli.py +0 -0
  505. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/__init__.py +0 -0
  506. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/console2.py +0 -0
  507. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/diff/LICENSE +0 -0
  508. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/diff/__init__.py +0 -0
  509. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/diff/__main__.py +0 -0
  510. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/diff/_compat.py +0 -0
  511. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/diff/cli.py +0 -0
  512. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/diff/renderables.py +0 -0
  513. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/diff/rendering.py +0 -0
  514. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/diff/underlinebar.py +0 -0
  515. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/markdown2.py +0 -0
  516. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/textual/__init__.py +0 -0
  517. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/textual/dark.py +0 -0
  518. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/textual/dump.py +0 -0
  519. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/textual/themes.py +0 -0
  520. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/rich/trirule.py +0 -0
  521. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/__init__.py +0 -0
  522. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/actionmenu.py +0 -0
  523. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/LICENSE +0 -0
  524. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/__init__.py +0 -0
  525. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/client.py +0 -0
  526. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/__init__.py +0 -0
  527. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/borders.py +0 -0
  528. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/colors.py +0 -0
  529. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/colors.tcss +0 -0
  530. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/easing.py +0 -0
  531. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/easing.tcss +0 -0
  532. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/keys.py +0 -0
  533. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/protocol.py +0 -0
  534. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/redirect_output.py +0 -0
  535. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/renderables.py +0 -0
  536. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/server.py +0 -0
  537. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/service.py +0 -0
  538. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/altdevtools/tools/diagnose.py +0 -0
  539. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/app2.py +0 -0
  540. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/autocomplete/LICENSE +0 -0
  541. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/autocomplete/__init__.py +0 -0
  542. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/autocomplete/matching.py +0 -0
  543. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/autocomplete/paths.py +0 -0
  544. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/autocomplete/widget.py +0 -0
  545. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/binding2.py +0 -0
  546. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/clipboard.py +0 -0
  547. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/debug/__init__.py +0 -0
  548. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/debug/dominfo.py +0 -0
  549. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/debug/screen.py +0 -0
  550. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/devtools.py +0 -0
  551. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/dom2.py +0 -0
  552. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/drivers2.py +0 -0
  553. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/logging2.py +0 -0
  554. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/render2.py +0 -0
  555. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/screen2.py +0 -0
  556. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/types.py +0 -0
  557. {omdev-0.0.36 → omdev-0.0.38}/omdev/tui/textual/widgets2.py +0 -0
  558. {omdev-0.0.36 → omdev-0.0.38}/omdev.egg-info/dependency_links.txt +0 -0
  559. {omdev-0.0.36 → omdev-0.0.38}/omdev.egg-info/entry_points.txt +0 -0
  560. {omdev-0.0.36 → omdev-0.0.38}/omdev.egg-info/top_level.txt +0 -0
  561. {omdev-0.0.36 → omdev-0.0.38}/setup.cfg +0 -0
@@ -0,0 +1 @@
1
+ global-exclude **/conftest.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omdev
3
- Version: 0.0.36
3
+ Version: 0.0.38
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License-Expression: BSD-3-Clause
@@ -13,10 +13,10 @@ Classifier: Programming Language :: Python :: 3.14
13
13
  Requires-Python: >=3.14
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
- Requires-Dist: omcore==0.0.36
16
+ Requires-Dist: omcore==0.0.38
17
17
  Provides-Extra: all
18
- Requires-Dist: ominfra==0.0.36; extra == "all"
19
- Requires-Dist: omllm==0.0.36; extra == "all"
18
+ Requires-Dist: ominfra==0.0.38; extra == "all"
19
+ Requires-Dist: omllm==0.0.38; extra == "all"
20
20
  Requires-Dist: black~=26.5; extra == "all"
21
21
  Requires-Dist: pycparser~=3.0; extra == "all"
22
22
  Requires-Dist: pcpp~=1.30; extra == "all"
@@ -35,9 +35,9 @@ Requires-Dist: textual~=8.2; extra == "all"
35
35
  Requires-Dist: textual-dev~=1.8; extra == "all"
36
36
  Requires-Dist: textual-speedups~=0.2; extra == "all"
37
37
  Provides-Extra: ominfra
38
- Requires-Dist: ominfra==0.0.36; extra == "ominfra"
38
+ Requires-Dist: ominfra==0.0.38; extra == "ominfra"
39
39
  Provides-Extra: omllm
40
- Requires-Dist: omllm==0.0.36; extra == "omllm"
40
+ Requires-Dist: omllm==0.0.38; extra == "omllm"
41
41
  Provides-Extra: black
42
42
  Requires-Dist: black~=26.5; extra == "black"
43
43
  Provides-Extra: c
@@ -27,7 +27,7 @@
27
27
  "module": ".cexts.cmake",
28
28
  "attr": "_CLI_MODULE",
29
29
  "file": "omdev/cexts/cmake.py",
30
- "line": 374,
30
+ "line": 449,
31
31
  "value": {
32
32
  "!.cli.types.CliModule": {
33
33
  "name": "cmake",
@@ -1,10 +1,8 @@
1
1
  """
2
2
  FIXME:
3
3
  - debug tables don't handle symlinks
4
- - use relapths in cml.txt
5
4
 
6
5
  TODO:
7
- - symlink headers, included src files (hamt_impl, ...)
8
6
  - point / copy output to dst dirs
9
7
  - libs
10
8
  - FindPackages? FetchContent? built_ext won't have that
@@ -40,11 +38,14 @@ import typing as ta
40
38
 
41
39
  from omcore import check
42
40
  from omcore import lang
41
+ from omcore.lite.marshal import unmarshal_obj
43
42
  from omcore.logs import all as logs
44
43
 
45
44
  from .. import cmake
46
45
  from .. import magic
47
46
  from ..cli import CliModule
47
+ from .configs import CextConfig
48
+ from .configs import expand_cext_config_files
48
49
  from .magic import CextMagic
49
50
 
50
51
 
@@ -211,11 +212,75 @@ class CmakeProjectGen:
211
212
  def py(self) -> CmakeProjectGen.PyInfo:
212
213
  return self.p.py_info()
213
214
 
215
+ def _get_ext_file_config(self, src_file: str) -> CextConfig:
216
+ source_file = os.path.join(self.p.prj_root, src_file)
217
+ with open(source_file) as f:
218
+ src = f.read()
219
+
220
+ src_magics = magic.find_magic(
221
+ magic.C_MAGIC_STYLE,
222
+ src.splitlines(),
223
+ file=source_file,
224
+ preparer=magic.json_magic_preparer,
225
+ )
226
+
227
+ cext_magic = check.single(m for m in src_magics if m.key == CextMagic.KEY)
228
+
229
+ if cext_magic.prepared is None:
230
+ return CextConfig()
231
+
232
+ return unmarshal_obj(cext_magic.prepared, CextConfig)
233
+
234
+ def _expand_ext_config_files(
235
+ self,
236
+ ext_src: str,
237
+ config_files: ta.Sequence[str],
238
+ *,
239
+ exclude_files: ta.Sequence[str] = (),
240
+ ) -> list[str]:
241
+ return expand_cext_config_files(
242
+ ext_src,
243
+ config_files,
244
+ exclude_files=exclude_files,
245
+ root_dir=self.p.prj_root,
246
+ )
247
+
248
+ def _symlink_source_file(self, src_file: str) -> str:
249
+ source_file = os.path.abspath(os.path.join(self.p.prj_root, src_file))
250
+ if not os.path.isfile(source_file):
251
+ raise FileNotFoundError(source_file)
252
+
253
+ link_file = os.path.join(self.p.cmake_dir(), src_file)
254
+ link_dir = os.path.dirname(link_file)
255
+ os.makedirs(link_dir, exist_ok=True)
256
+
257
+ if os.path.lexists(link_file):
258
+ if os.path.realpath(link_file) != source_file:
259
+ raise FileExistsError(link_file)
260
+ else:
261
+ os.symlink(os.path.relpath(source_file, link_dir), link_file)
262
+
263
+ return src_file
264
+
265
+ @staticmethod
266
+ def _get_ext_libraries(ext_cfg: CextConfig) -> list[str]:
267
+ out = []
268
+ for ext_lib in ext_cfg.libraries or ():
269
+ if isinstance(ext_lib, str):
270
+ out.append(ext_lib)
271
+ else:
272
+ ext_lib_name, ext_lib_platform = ext_lib
273
+ if ext_lib_platform == sys.platform:
274
+ out.append(ext_lib_name)
275
+ return out
276
+
214
277
  def _add_ext(self, ext_src: str) -> None:
215
278
  ext_name = ext_src.rpartition('.')[0].replace('/', '__')
216
279
 
217
280
  log.info('Adding cmake c extension: %s -> %s', ext_src, ext_name)
218
281
 
282
+ ext_cfg = self._get_ext_file_config(ext_src) # noqa
283
+
219
284
  so_name = ''.join([
220
285
  os.path.basename(ext_src).split('.')[0],
221
286
  '.',
@@ -223,29 +288,39 @@ class CmakeProjectGen:
223
288
  sysconfig.get_config_var('SHLIB_SUFFIX'),
224
289
  ])
225
290
 
226
- sl = os.path.join(self.p.cmake_dir(), ext_src)
227
- sal = os.path.abspath(sl)
228
- sd = os.path.dirname(sal)
229
- os.makedirs(sd, exist_ok=True)
230
- rp = os.path.relpath(os.path.abspath(ext_src), sd)
231
- os.symlink(rp, sal)
291
+ extra_sources = self._expand_ext_config_files(
292
+ ext_src,
293
+ ext_cfg.extra_sources or (),
294
+ exclude_files=[ext_src],
295
+ )
296
+ extra_headers = self._expand_ext_config_files(ext_src, ext_cfg.extra_headers or ())
297
+
298
+ src_files = [
299
+ self._symlink_source_file(src_file)
300
+ for src_file in [ext_src, *extra_sources, *extra_headers]
301
+ ]
232
302
 
233
303
  ml = cmake.ModuleLibrary(
234
304
  ext_name,
235
- src_files=[
236
- sl,
237
- ],
305
+ src_files=src_files,
238
306
  include_dirs=[
239
307
  f'${{{self.var_prefix}_INCLUDE_DIRECTORIES}}',
240
308
  ],
309
+ compile_defs=[
310
+ f'{name}={value}'
311
+ for name, value in (ext_cfg.define_macros or {}).items()
312
+ ],
241
313
  compile_opts=[
242
314
  f'${{{self.var_prefix}_COMPILE_OPTIONS}}',
315
+ *(ext_cfg.extra_compile_args or ()),
243
316
  ],
244
317
  link_dirs=[
245
318
  f'${{{self.var_prefix}_LINK_DIRECTORIES}}',
246
319
  ],
320
+ link_opts=ext_cfg.extra_link_args,
247
321
  link_libs=[
248
322
  f'${{{self.var_prefix}_LINK_LIBRARIES}}',
323
+ *self._get_ext_libraries(ext_cfg),
249
324
  ],
250
325
  extra_cmds=[
251
326
  cmake.Command(
@@ -0,0 +1,64 @@
1
+ # ruff: noqa: UP006 UP045
2
+ # @om-lite
3
+ import dataclasses as dc
4
+ import glob
5
+ import os.path
6
+ import typing as ta
7
+
8
+
9
+ ##
10
+
11
+
12
+ @dc.dataclass(frozen=True)
13
+ class CextConfig:
14
+ extra_sources: ta.Optional[ta.Sequence[str]] = None
15
+ extra_headers: ta.Optional[ta.Sequence[str]] = None
16
+
17
+ extra_compile_args: ta.Optional[ta.Sequence[str]] = None
18
+ extra_link_args: ta.Optional[ta.Sequence[str]] = None
19
+
20
+ define_macros: ta.Optional[ta.Mapping[str, str]] = None
21
+
22
+ libraries: ta.Optional[ta.Sequence[ta.Any]] = None # list[str | tuple[str, str]] | None
23
+
24
+
25
+ def resolve_cext_config_file(ext_src: str, config_file: str) -> str:
26
+ if os.path.isabs(config_file):
27
+ raise ValueError(config_file)
28
+
29
+ ext_src = os.path.normpath(ext_src)
30
+ package_dir = ext_src.partition(os.sep)[0]
31
+ resolved_file = os.path.normpath(os.path.join(os.path.dirname(ext_src), config_file))
32
+ if os.path.commonpath([package_dir, resolved_file]) != package_dir:
33
+ raise ValueError(config_file)
34
+
35
+ return resolved_file
36
+
37
+
38
+ def expand_cext_config_files(
39
+ ext_src: str,
40
+ config_files: ta.Sequence[str],
41
+ *,
42
+ exclude_files: ta.Sequence[str] = (),
43
+ root_dir: ta.Optional[str] = None,
44
+ ) -> ta.List[str]:
45
+ if root_dir is None:
46
+ root_dir = os.getcwd()
47
+ root_dir = os.path.abspath(root_dir)
48
+
49
+ out: ta.Set[str] = set()
50
+ for config_file in config_files:
51
+ resolved_pattern = resolve_cext_config_file(ext_src, config_file)
52
+ matched_files = [
53
+ matched_file
54
+ for matched_file in glob.glob(os.path.join(root_dir, resolved_pattern), recursive=True)
55
+ if os.path.isfile(matched_file)
56
+ ]
57
+ if not matched_files:
58
+ raise FileNotFoundError(resolved_pattern)
59
+
60
+ out.update(os.path.relpath(matched_file, root_dir) for matched_file in matched_files)
61
+
62
+ out.difference_update(os.path.normpath(exclude_file) for exclude_file in exclude_files)
63
+
64
+ return sorted(out)
@@ -27,6 +27,7 @@ class Target(lang.Abstract):
27
27
  src_files: ta.Sequence[str]
28
28
 
29
29
  include_dirs: ta.Sequence[str] | None = None
30
+ compile_defs: ta.Sequence[str] | None = None
30
31
  compile_opts: ta.Sequence[str] | None = None
31
32
  link_dirs: ta.Sequence[str] | None = None
32
33
  link_opts: ta.Sequence[str] | None = None
@@ -135,6 +136,8 @@ class CmakeGen:
135
136
 
136
137
  if target.include_dirs:
137
138
  self.write_cmd(Command('target_include_directories', [target.name, 'PRIVATE'], target.include_dirs))
139
+ if target.compile_defs:
140
+ self.write_cmd(Command('target_compile_definitions', [target.name, 'PRIVATE'], target.compile_defs))
138
141
  if target.compile_opts:
139
142
  self.write_cmd(Command('target_compile_options', [target.name, 'PRIVATE'], target.compile_opts))
140
143
 
@@ -0,0 +1,72 @@
1
+ import os
2
+ import os.path
3
+
4
+ from ..status import GitStatusState
5
+ from ..status import get_git_status
6
+ from .errors import GitVendorNoMergeInProgressError
7
+ from .journals import GitVendorJournal
8
+ from .journals import delete_vendor_journal
9
+ from .journals import load_live_vendor_journal
10
+ from .paths import is_path_under
11
+ from .runners import GitRunner
12
+ from .specs import vendor_spec_path
13
+
14
+
15
+ ##
16
+
17
+
18
+ class GitVendorAborter:
19
+ """
20
+ Rolls back an in-progress vendor pull, restoring the vendored directory - index and working tree - to its
21
+ pre-pull state. Only paths under the vendored directory are ever touched: edits made anywhere else in the repo,
22
+ staged or not, are preserved untouched. A pull that has already been committed is no longer in progress and cannot
23
+ be aborted - that's what `git revert` is for.
24
+ """
25
+
26
+ def __init__(
27
+ self,
28
+ repo_dir: str,
29
+ vendor_dir: str,
30
+ ) -> None:
31
+ super().__init__()
32
+
33
+ self._repo_dir = repo_dir
34
+ self._vendor_dir = vendor_dir.rstrip('/')
35
+
36
+ self._repo = GitRunner(repo_dir)
37
+
38
+ def _try_unlink(self, rel_path: str) -> None:
39
+ try:
40
+ os.unlink(os.path.join(self._repo_dir, rel_path))
41
+ except FileNotFoundError:
42
+ pass
43
+
44
+ def abort(self) -> GitVendorJournal:
45
+ git_dir = self._repo.output_str('rev-parse', '--absolute-git-dir')
46
+
47
+ journal = load_live_vendor_journal(self._repo, git_dir, self._vendor_dir)
48
+ if journal is None:
49
+ raise GitVendorNoMergeInProgressError(f'No vendor pull of {self._vendor_dir} is in progress')
50
+
51
+ rel_paths = [os.path.join(self._vendor_dir, e.path) for e in journal.entries]
52
+ rel_paths.append(vendor_spec_path(self._vendor_dir))
53
+
54
+ for rel_path in rel_paths:
55
+ if self._repo.has_object(f'{journal.pre_head}:{rel_path}'):
56
+ # Restores both index and working tree, clearing any conflict stages for the path as it goes.
57
+ self._repo.run('checkout', journal.pre_head, '--', rel_path)
58
+ else:
59
+ self._repo.run('update-index', '--force-remove', '--', rel_path)
60
+ self._try_unlink(rel_path)
61
+
62
+ # The clean-tree gate at pull time means anything untracked under the vendor dir appeared during the merge
63
+ # (mergetool backups and the like) - sweep them.
64
+ for it in get_git_status(cwd=self._repo_dir):
65
+ if it.x is GitStatusState.UNTRACKED and is_path_under(it.a, self._vendor_dir):
66
+ self._try_unlink(it.a)
67
+
68
+ self._repo.run('update-index', '--clear-resolve-undo', check_rc=False)
69
+
70
+ delete_vendor_journal(git_dir, self._vendor_dir)
71
+
72
+ return journal
@@ -0,0 +1,64 @@
1
+ import difflib
2
+ import os.path
3
+
4
+ from .errors import GitVendorUpstreamRevError
5
+ from .specs import load_vendor_spec
6
+ from .upstreams import git_upstream_source
7
+
8
+
9
+ ##
10
+
11
+
12
+ class GitVendorDiffer:
13
+ """
14
+ Renders a unified diff of the local vendored files against their pristine upstream contents at the spec's recorded
15
+ rev - that is, the accumulated local patches. Requires upstream access (a local clone via `from_path`, or a
16
+ temporary clone of the spec url) since pristine content is deliberately not stored in the repo.
17
+ """
18
+
19
+ def __init__(
20
+ self,
21
+ repo_dir: str,
22
+ vendor_dir: str,
23
+ *,
24
+ from_path: str | None = None,
25
+ ) -> None:
26
+ super().__init__()
27
+
28
+ self._repo_dir = repo_dir
29
+ self._vendor_dir = vendor_dir.rstrip('/')
30
+ self._from_path = from_path
31
+
32
+ self._abs_vendor_dir = os.path.join(repo_dir, self._vendor_dir)
33
+
34
+ def diff(self) -> str:
35
+ spec = load_vendor_spec(self._abs_vendor_dir)
36
+ if spec.rev is None:
37
+ raise GitVendorUpstreamRevError(f'{self._vendor_dir} has no recorded rev - it has never been pulled')
38
+
39
+ out: list[str] = []
40
+
41
+ with git_upstream_source(spec.url, from_path=self._from_path) as upstream:
42
+ if not upstream.has_object(spec.rev + '^{commit}'):
43
+ raise GitVendorUpstreamRevError(f'Base rev {spec.rev!r} is not present in upstream {upstream.dir}')
44
+
45
+ for path in spec.files:
46
+ base = upstream.try_read_blob(spec.rev, path)
47
+
48
+ try:
49
+ with open(os.path.join(self._abs_vendor_dir, path), 'rb') as f:
50
+ ours = f.read()
51
+ except FileNotFoundError:
52
+ ours = None
53
+
54
+ if base == ours:
55
+ continue
56
+
57
+ out.extend(difflib.unified_diff(
58
+ (base or b'').decode('utf-8', errors='replace').splitlines(keepends=True),
59
+ (ours or b'').decode('utf-8', errors='replace').splitlines(keepends=True),
60
+ fromfile=f'a/{path}',
61
+ tofile=f'b/{path}',
62
+ ))
63
+
64
+ return ''.join(out)
@@ -0,0 +1,40 @@
1
+ import typing as ta
2
+
3
+
4
+ ##
5
+
6
+
7
+ class GitVendorError(Exception):
8
+ pass
9
+
10
+
11
+ class GitVendorSubprocessError(GitVendorError):
12
+ """Raised when an underlying git invocation fails unexpectedly."""
13
+
14
+ def __init__(self, cmd: ta.Sequence[str], returncode: int, stderr: str) -> None:
15
+ super().__init__(f'git command {list(cmd)!r} failed with returncode {returncode}: {stderr}')
16
+
17
+ self.cmd = cmd
18
+ self.returncode = returncode
19
+ self.stderr = stderr
20
+
21
+
22
+ class GitVendorDirtyError(GitVendorError):
23
+ """Raised when the containing repo has changes which preclude beginning a vendor operation."""
24
+
25
+ def __init__(self, paths: ta.Sequence[str]) -> None:
26
+ super().__init__(f'Repo has blocking changes: {", ".join(paths)}')
27
+
28
+ self.paths = paths
29
+
30
+
31
+ class GitVendorMergeInProgressError(GitVendorError):
32
+ pass
33
+
34
+
35
+ class GitVendorNoMergeInProgressError(GitVendorError):
36
+ pass
37
+
38
+
39
+ class GitVendorUpstreamRevError(GitVendorError):
40
+ pass
@@ -0,0 +1,124 @@
1
+ import enum
2
+ import os
3
+ import os.path
4
+ import typing as ta
5
+ import urllib.parse
6
+
7
+ from omcore import dataclasses as dc
8
+ from omcore import lang
9
+ from omcore.formats.json import all as json
10
+
11
+ from .runners import GitRunner
12
+
13
+
14
+ with lang.auto_proxy_import(globals()):
15
+ from omcore import marshal as msh
16
+
17
+
18
+ ##
19
+
20
+
21
+ class GitVendorFileDisposition(enum.Enum):
22
+ UNCHANGED = 'unchanged'
23
+ LOCAL_ONLY = 'local-only'
24
+ ADDED = 'added'
25
+ DELETED = 'deleted'
26
+ FAST_FORWARDED = 'fast-forwarded'
27
+ AUTO_MERGED = 'auto-merged'
28
+ CONFLICTED = 'conflicted'
29
+ DELETE_CONFLICTED = 'delete-conflicted'
30
+
31
+
32
+ CHANGING_GIT_VENDOR_FILE_DISPOSITIONS: ta.AbstractSet[GitVendorFileDisposition] = frozenset([
33
+ GitVendorFileDisposition.ADDED,
34
+ GitVendorFileDisposition.DELETED,
35
+ GitVendorFileDisposition.FAST_FORWARDED,
36
+ GitVendorFileDisposition.AUTO_MERGED,
37
+ GitVendorFileDisposition.CONFLICTED,
38
+ GitVendorFileDisposition.DELETE_CONFLICTED,
39
+ ])
40
+
41
+ CONFLICTED_GIT_VENDOR_FILE_DISPOSITIONS: ta.AbstractSet[GitVendorFileDisposition] = frozenset([
42
+ GitVendorFileDisposition.CONFLICTED,
43
+ GitVendorFileDisposition.DELETE_CONFLICTED,
44
+ ])
45
+
46
+
47
+ @dc.dataclass(frozen=True, kw_only=True)
48
+ class GitVendorJournalEntry:
49
+ path: str
50
+ disposition: GitVendorFileDisposition
51
+
52
+
53
+ @dc.dataclass(frozen=True, kw_only=True)
54
+ class GitVendorJournal:
55
+ """
56
+ A record of an in-progress vendor pull, written before any repo mutation is performed.
57
+
58
+ Stored under the repo's git dir (never the worktree) so it can never be staged, committed, or pushed. `vendor_dir`
59
+ is relative to the repo root, `pre_head` is the commit HEAD pointed at when the pull began, and entry paths are
60
+ relative to the vendor dir.
61
+ """
62
+
63
+ vendor_dir: str
64
+ pre_head: str
65
+ old_rev: str | None = None
66
+ new_rev: str
67
+ new_ref: str | None = None
68
+ entries: ta.Sequence[GitVendorJournalEntry] = ()
69
+
70
+ @property
71
+ def conflicted_entries(self) -> ta.Sequence[GitVendorJournalEntry]:
72
+ return [e for e in self.entries if e.disposition in CONFLICTED_GIT_VENDOR_FILE_DISPOSITIONS]
73
+
74
+
75
+ ##
76
+
77
+
78
+ def vendor_journal_path(git_dir: str, vendor_dir: str) -> str:
79
+ return os.path.join(git_dir, 'om-vendor', urllib.parse.quote(vendor_dir, safe='') + '.json')
80
+
81
+
82
+ def load_vendor_journal(git_dir: str, vendor_dir: str) -> GitVendorJournal | None:
83
+ try:
84
+ with open(vendor_journal_path(git_dir, vendor_dir)) as f:
85
+ buf = f.read()
86
+ except FileNotFoundError:
87
+ return None
88
+
89
+ return msh.unmarshal(json.loads(buf), GitVendorJournal)
90
+
91
+
92
+ def save_vendor_journal(git_dir: str, journal: GitVendorJournal) -> None:
93
+ path = vendor_journal_path(git_dir, journal.vendor_dir)
94
+ os.makedirs(os.path.dirname(path), exist_ok=True)
95
+ with open(path, 'w') as f:
96
+ f.write(json.dumps_pretty(msh.marshal(journal)) + '\n')
97
+
98
+
99
+ def delete_vendor_journal(git_dir: str, vendor_dir: str) -> None:
100
+ try:
101
+ os.unlink(vendor_journal_path(git_dir, vendor_dir))
102
+ except FileNotFoundError:
103
+ pass
104
+
105
+
106
+ def load_live_vendor_journal(repo: GitRunner, git_dir: str, vendor_dir: str) -> GitVendorJournal | None:
107
+ """
108
+ Loads the journal for a genuinely in-progress pull, if any. A journal whose pull was subsequently committed -
109
+ detected by commits since its pre_head touching the vendor dir - is stale, and is deleted rather than returned.
110
+ """
111
+
112
+ journal = load_vendor_journal(git_dir, vendor_dir)
113
+ if journal is None:
114
+ return None
115
+
116
+ head = repo.rev_parse('HEAD')
117
+ if (
118
+ head != journal.pre_head and
119
+ bool(repo.output_str('diff', '--name-only', journal.pre_head, head, '--', vendor_dir))
120
+ ):
121
+ delete_vendor_journal(git_dir, vendor_dir)
122
+ return None
123
+
124
+ return journal
@@ -0,0 +1,70 @@
1
+ import os.path
2
+ import subprocess
3
+ import tempfile
4
+
5
+ from omcore import dataclasses as dc
6
+ from omcore.subprocesses.wrap import subprocess_maybe_shell_wrap_exec
7
+
8
+ from .errors import GitVendorSubprocessError
9
+
10
+
11
+ ##
12
+
13
+
14
+ @dc.dataclass(frozen=True, kw_only=True)
15
+ class GitMergeFileResult:
16
+ content: bytes
17
+ conflicted: bool
18
+
19
+
20
+ def run_git_merge_file(
21
+ base: bytes,
22
+ ours: bytes,
23
+ theirs: bytes,
24
+ *,
25
+ labels: tuple[str, str, str] = ('ours', 'base', 'theirs'),
26
+ timeout: float = 5. * 60.,
27
+ ) -> GitMergeFileResult:
28
+ """
29
+ Three-way merges the given file contents via `git merge-file -p`, returning the merged content - with standard
30
+ conflict markers if conflicted. An empty `base` yields a two-way whole-file conflict, matching git's 'both added'
31
+ behavior.
32
+ """
33
+
34
+ ours_label, base_label, theirs_label = labels
35
+
36
+ with tempfile.TemporaryDirectory() as tmp_dir:
37
+ names = []
38
+ for name, data in [('ours', ours), ('base', base), ('theirs', theirs)]:
39
+ file_path = os.path.join(tmp_dir, name)
40
+ with open(file_path, 'wb') as f:
41
+ f.write(data)
42
+ names.append(file_path)
43
+
44
+ proc = subprocess.run( # noqa
45
+ subprocess_maybe_shell_wrap_exec(
46
+ 'git',
47
+ 'merge-file',
48
+ '-p',
49
+ '-L', ours_label,
50
+ '-L', base_label,
51
+ '-L', theirs_label,
52
+ *names,
53
+ ),
54
+ stdout=subprocess.PIPE,
55
+ stderr=subprocess.PIPE,
56
+ timeout=timeout,
57
+ )
58
+
59
+ # merge-file's returncode is the number of conflicts, or negative (observed as >127) on error.
60
+ if proc.returncode > 127:
61
+ raise GitVendorSubprocessError(
62
+ ['git', 'merge-file'],
63
+ proc.returncode,
64
+ proc.stderr.decode(errors='replace').strip(),
65
+ )
66
+
67
+ return GitMergeFileResult(
68
+ content=proc.stdout,
69
+ conflicted=proc.returncode != 0,
70
+ )
@@ -0,0 +1,5 @@
1
+ ##
2
+
3
+
4
+ def is_path_under(path: str, dir: str) -> bool: # noqa
5
+ return path == dir or path.startswith(dir + '/')