omdev 0.0.37__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 (562) hide show
  1. omdev-0.0.38/MANIFEST.in +1 -0
  2. {omdev-0.0.37/omdev.egg-info → omdev-0.0.38}/PKG-INFO +6 -6
  3. {omdev-0.0.37 → omdev-0.0.38}/omdev/.om-manifests.json +1 -1
  4. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/cmake.py +21 -14
  5. omdev-0.0.38/omdev/cexts/configs.py +64 -0
  6. omdev-0.0.38/omdev/git/vendor/aborting.py +72 -0
  7. omdev-0.0.38/omdev/git/vendor/diffing.py +64 -0
  8. omdev-0.0.38/omdev/git/vendor/errors.py +40 -0
  9. omdev-0.0.38/omdev/git/vendor/journals.py +124 -0
  10. omdev-0.0.38/omdev/git/vendor/merging.py +70 -0
  11. omdev-0.0.38/omdev/git/vendor/paths.py +5 -0
  12. omdev-0.0.38/omdev/git/vendor/pulling.py +309 -0
  13. omdev-0.0.38/omdev/git/vendor/runners.py +83 -0
  14. omdev-0.0.38/omdev/git/vendor/specs.py +47 -0
  15. omdev-0.0.38/omdev/git/vendor/upstreams.py +34 -0
  16. omdev-0.0.38/omdev/js/quickjs/LICENSE +24 -0
  17. omdev-0.0.38/omdev/js/quickjs/TODO.md +86 -0
  18. omdev-0.0.38/omdev/js/quickjs/__init__.py +13 -0
  19. omdev-0.0.38/omdev/js/quickjs/_pyqjsng.c +1901 -0
  20. omdev-0.0.38/omdev/js/quickjs/_pyqjsng.pyi +96 -0
  21. omdev-0.0.38/omdev/js/quickjs/_quickjs/LICENSE +24 -0
  22. omdev-0.0.38/omdev/js/quickjs/_quickjs/builtin-array-fromasync.h +120 -0
  23. omdev-0.0.38/omdev/js/quickjs/_quickjs/builtin-iterator-zip-keyed.h +332 -0
  24. omdev-0.0.38/omdev/js/quickjs/_quickjs/builtin-iterator-zip.h +337 -0
  25. omdev-0.0.38/omdev/js/quickjs/_quickjs/cutils.h +1998 -0
  26. omdev-0.0.38/omdev/js/quickjs/_quickjs/dtoa.c +1619 -0
  27. omdev-0.0.38/omdev/js/quickjs/_quickjs/dtoa.h +87 -0
  28. omdev-0.0.38/omdev/js/quickjs/_quickjs/libregexp-opcode.h +73 -0
  29. omdev-0.0.38/omdev/js/quickjs/_quickjs/libregexp.c +3505 -0
  30. omdev-0.0.38/omdev/js/quickjs/_quickjs/libregexp.h +101 -0
  31. omdev-0.0.38/omdev/js/quickjs/_quickjs/libunicode-table.h +5160 -0
  32. omdev-0.0.38/omdev/js/quickjs/_quickjs/libunicode.c +2069 -0
  33. omdev-0.0.38/omdev/js/quickjs/_quickjs/libunicode.h +172 -0
  34. omdev-0.0.38/omdev/js/quickjs/_quickjs/list.h +107 -0
  35. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs-atom.h +280 -0
  36. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs-c-atomics.h +54 -0
  37. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs-libc.c +5038 -0
  38. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs-libc.h +87 -0
  39. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs-opcode.h +377 -0
  40. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs.c +64849 -0
  41. omdev-0.0.38/omdev/js/quickjs/_quickjs/quickjs.h +1464 -0
  42. omdev-0.0.38/omdev/js/quickjs/snapshots.py +135 -0
  43. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/pkg.py +13 -10
  44. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/pyproject.py +43 -11
  45. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/git/cli.py +176 -0
  46. omdev-0.0.38/omdev/tui/apps/markdown/__init__.py +0 -0
  47. omdev-0.0.38/omdev/tui/textual/altdevtools/tools/__init__.py +0 -0
  48. {omdev-0.0.37 → omdev-0.0.38/omdev.egg-info}/PKG-INFO +6 -6
  49. {omdev-0.0.37 → omdev-0.0.38}/omdev.egg-info/SOURCES.txt +39 -0
  50. {omdev-0.0.37 → omdev-0.0.38}/omdev.egg-info/requires.txt +5 -5
  51. {omdev-0.0.37 → omdev-0.0.38}/pyproject.toml +6 -6
  52. omdev-0.0.37/MANIFEST.in +0 -1
  53. omdev-0.0.37/omdev/cexts/configs.py +0 -34
  54. {omdev-0.0.37 → omdev-0.0.38}/LICENSE +0 -0
  55. {omdev-0.0.37 → omdev-0.0.38}/README.md +0 -0
  56. {omdev-0.0.37 → omdev-0.0.38}/omdev/README.md +0 -0
  57. {omdev-0.0.37 → omdev-0.0.38}/omdev/__about__.py +0 -0
  58. {omdev-0.0.37 → omdev-0.0.38}/omdev/__init__.py +0 -0
  59. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/__init__.py +0 -0
  60. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/__main__.py +0 -0
  61. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/cli/__init__.py +0 -0
  62. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/cli/main.py +0 -0
  63. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/gen/__init__.py +0 -0
  64. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/gen/gen.py +0 -0
  65. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/gen/imports.py +0 -0
  66. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/gen/manifests.py +0 -0
  67. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/gen/resources.py +0 -0
  68. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/gen/srcfiles.py +0 -0
  69. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/gen/strip.py +0 -0
  70. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/gen/types.py +0 -0
  71. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/gen/typing.py +0 -0
  72. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/info.py +0 -0
  73. {omdev-0.0.37 → omdev-0.0.38}/omdev/amalg/sources.py +0 -0
  74. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/__init__.py +0 -0
  75. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/compute/__init__.py +0 -0
  76. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/compute/cache.py +0 -0
  77. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/compute/contexts.py +0 -0
  78. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/compute/currents.py +0 -0
  79. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/compute/fns.py +0 -0
  80. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/compute/resolvers.py +0 -0
  81. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/compute/storage.py +0 -0
  82. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/compute/types.py +0 -0
  83. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/data/__init__.py +0 -0
  84. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/data/actions.py +0 -0
  85. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/data/cache.py +0 -0
  86. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/data/consts.py +0 -0
  87. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/data/defaults.py +0 -0
  88. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/data/manifests.py +0 -0
  89. {omdev-0.0.37 → omdev-0.0.38}/omdev/cache/data/specs.py +0 -0
  90. {omdev-0.0.37 → omdev-0.0.38}/omdev/capi/__init__.py +0 -0
  91. {omdev-0.0.37 → omdev-0.0.38}/omdev/capi/darwin/__init__.py +0 -0
  92. {omdev-0.0.37 → omdev-0.0.38}/omdev/capi/darwin/aps.py +0 -0
  93. {omdev-0.0.37 → omdev-0.0.38}/omdev/capi/darwin/ax.py +0 -0
  94. {omdev-0.0.37 → omdev-0.0.38}/omdev/capi/darwin/cf.py +0 -0
  95. {omdev-0.0.37 → omdev-0.0.38}/omdev/capi/darwin/cg.py +0 -0
  96. {omdev-0.0.37 → omdev-0.0.38}/omdev/capi/linux/__init__.py +0 -0
  97. {omdev-0.0.37 → omdev-0.0.38}/omdev/capi/linux/x11.py +0 -0
  98. {omdev-0.0.37 → omdev-0.0.38}/omdev/cc/__init__.py +0 -0
  99. {omdev-0.0.37 → omdev-0.0.38}/omdev/cc/__main__.py +0 -0
  100. {omdev-0.0.37 → omdev-0.0.38}/omdev/cc/cdeps.py +0 -0
  101. {omdev-0.0.37 → omdev-0.0.38}/omdev/cc/cdeps.toml +0 -0
  102. {omdev-0.0.37 → omdev-0.0.38}/omdev/cc/cli.py +0 -0
  103. {omdev-0.0.37 → omdev-0.0.38}/omdev/cc/srclangs.py +0 -0
  104. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/__init__.py +0 -0
  105. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_boilerplate.cc +0 -0
  106. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/LICENSE +0 -0
  107. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/__init__.py +0 -0
  108. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/build_ext.py +0 -0
  109. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  110. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  111. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/compilers/options.py +0 -0
  112. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  113. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/dir_util.py +0 -0
  114. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/errors.py +0 -0
  115. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/extension.py +0 -0
  116. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/file_util.py +0 -0
  117. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/modified.py +0 -0
  118. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/spawn.py +0 -0
  119. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/sysconfig.py +0 -0
  120. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/util.py +0 -0
  121. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/_distutils/version.py +0 -0
  122. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/build.py +0 -0
  123. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/importhook.py +0 -0
  124. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/magic.py +0 -0
  125. {omdev-0.0.37 → omdev-0.0.38}/omdev/cexts/scan.py +0 -0
  126. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/__init__.py +0 -0
  127. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/__main__.py +0 -0
  128. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/cache.py +0 -0
  129. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/ci.py +0 -0
  130. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/cli.py +0 -0
  131. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/compose.py +0 -0
  132. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/consts.py +0 -0
  133. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/__init__.py +0 -0
  134. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/buildcaching.py +0 -0
  135. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/cache.py +0 -0
  136. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/cacheserved/__init__.py +0 -0
  137. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/cacheserved/cache.py +0 -0
  138. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/cacheserved/manifests.py +0 -0
  139. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/cmds.py +0 -0
  140. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/dataserver.py +0 -0
  141. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/imagepulling.py +0 -0
  142. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/inject.py +0 -0
  143. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/packing.py +0 -0
  144. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/repositories.py +0 -0
  145. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/docker/utils.py +0 -0
  146. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/__init__.py +0 -0
  147. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/api/__init__.py +0 -0
  148. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/api/clients.py +0 -0
  149. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/api/v1/__init__.py +0 -0
  150. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/api/v1/api.py +0 -0
  151. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/api/v1/client.py +0 -0
  152. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/api/v2/__init__.py +0 -0
  153. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/api/v2/api.py +0 -0
  154. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/api/v2/azure.py +0 -0
  155. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/api/v2/client.py +0 -0
  156. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/bootstrap.py +0 -0
  157. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/cache.py +0 -0
  158. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/cli.py +0 -0
  159. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/env.py +0 -0
  160. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/github/inject.py +0 -0
  161. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/inject.py +0 -0
  162. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/requirements.py +0 -0
  163. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/shell.py +0 -0
  164. {omdev-0.0.37 → omdev-0.0.38}/omdev/ci/utils.py +0 -0
  165. {omdev-0.0.37 → omdev-0.0.38}/omdev/cli/__init__.py +0 -0
  166. {omdev-0.0.37 → omdev-0.0.38}/omdev/cli/__main__.py +0 -0
  167. {omdev-0.0.37 → omdev-0.0.38}/omdev/cli/_pathhack.py +0 -0
  168. {omdev-0.0.37 → omdev-0.0.38}/omdev/cli/clicli.py +0 -0
  169. {omdev-0.0.37 → omdev-0.0.38}/omdev/cli/install.py +0 -0
  170. {omdev-0.0.37 → omdev-0.0.38}/omdev/cli/main.py +0 -0
  171. {omdev-0.0.37 → omdev-0.0.38}/omdev/cli/managers.py +0 -0
  172. {omdev-0.0.37 → omdev-0.0.38}/omdev/cli/types.py +0 -0
  173. {omdev-0.0.37 → omdev-0.0.38}/omdev/clipboard/__init__.py +0 -0
  174. {omdev-0.0.37 → omdev-0.0.38}/omdev/clipboard/capi/__init__.py +0 -0
  175. {omdev-0.0.37 → omdev-0.0.38}/omdev/clipboard/capi/darwin_cf.py +0 -0
  176. {omdev-0.0.37 → omdev-0.0.38}/omdev/clipboard/capi/linux_x11.py +0 -0
  177. {omdev-0.0.37 → omdev-0.0.38}/omdev/clipboard/commands.py +0 -0
  178. {omdev-0.0.37 → omdev-0.0.38}/omdev/clipboard/platform.py +0 -0
  179. {omdev-0.0.37 → omdev-0.0.38}/omdev/clipboard/types.py +0 -0
  180. {omdev-0.0.37 → omdev-0.0.38}/omdev/cmake.py +0 -0
  181. {omdev-0.0.37 → omdev-0.0.38}/omdev/cmdlog/__init__.py +0 -0
  182. {omdev-0.0.37 → omdev-0.0.38}/omdev/cmdlog/__main__.py +0 -0
  183. {omdev-0.0.37 → omdev-0.0.38}/omdev/cmdlog/_cmdlog.py +0 -0
  184. {omdev-0.0.37 → omdev-0.0.38}/omdev/cmdlog/cli.py +0 -0
  185. {omdev-0.0.37 → omdev-0.0.38}/omdev/cmdlog/cmdlog.py +0 -0
  186. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataclasses/__init__.py +0 -0
  187. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataclasses/__main__.py +0 -0
  188. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataclasses/_dumping.py +0 -0
  189. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataclasses/_template.py +0 -0
  190. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataclasses/cli.py +0 -0
  191. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataclasses/codegen.py +0 -0
  192. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataclasses/dumping.py +0 -0
  193. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataserver/__init__.py +0 -0
  194. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataserver/handlers.py +0 -0
  195. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataserver/http.py +0 -0
  196. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataserver/routes.py +0 -0
  197. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataserver/server.py +0 -0
  198. {omdev-0.0.37 → omdev-0.0.38}/omdev/dataserver/targets.py +0 -0
  199. {omdev-0.0.37 → omdev-0.0.38}/omdev/diffs/__init__.py +0 -0
  200. {omdev-0.0.37 → omdev-0.0.38}/omdev/diffs/__main__.py +0 -0
  201. {omdev-0.0.37 → omdev-0.0.38}/omdev/diffs/cli.py +0 -0
  202. {omdev-0.0.37 → omdev-0.0.38}/omdev/diffs/parsing.py +0 -0
  203. {omdev-0.0.37 → omdev-0.0.38}/omdev/diffs/rendering.py +0 -0
  204. {omdev-0.0.37 → omdev-0.0.38}/omdev/diffs/types.py +0 -0
  205. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/__init__.py +0 -0
  206. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/__main__.py +0 -0
  207. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/build.py +0 -0
  208. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/cli.py +0 -0
  209. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/config.py +0 -0
  210. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/config.toml +0 -0
  211. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/content.py +0 -0
  212. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/gen.py +0 -0
  213. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/helpers.py +0 -0
  214. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/ops.py +0 -0
  215. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/rendering.py +0 -0
  216. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/.python-versions.json +0 -0
  217. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/configs/.gdbinit +0 -0
  218. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/configs/.sqliterc +0 -0
  219. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/configs/.tmux.conf +0 -0
  220. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/configs/.vimrc +0 -0
  221. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/depsets/python.toml +0 -0
  222. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/depsets/system.toml +0 -0
  223. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/depsets/x11.toml +0 -0
  224. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/apt.sh +0 -0
  225. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/chgrp.sh +0 -0
  226. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/docker.sh +0 -0
  227. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/firefox.sh +0 -0
  228. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/go.sh +0 -0
  229. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/jdk.sh +0 -0
  230. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/man.sh +0 -0
  231. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/nvm.sh +0 -0
  232. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/pyenv.sh +0 -0
  233. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/rbenv.sh +0 -0
  234. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/rust.sh +0 -0
  235. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/sshd.sh +0 -0
  236. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/user.sh +0 -0
  237. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/uv.sh +0 -0
  238. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/vcpkg.sh +0 -0
  239. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/workdir.sh +0 -0
  240. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/fragments/zig.sh +0 -0
  241. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/scripts/install-claude +0 -0
  242. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/scripts/install-codex +0 -0
  243. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/scripts/install-pi +0 -0
  244. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/scripts/run-dbus +0 -0
  245. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/resources/shift-uid.sh +0 -0
  246. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/run.py +0 -0
  247. {omdev-0.0.37 → omdev-0.0.38}/omdev/dockerdev/utils.py +0 -0
  248. {omdev-0.0.37 → omdev-0.0.38}/omdev/git/__init__.py +0 -0
  249. {omdev-0.0.37 → omdev-0.0.38}/omdev/git/magic.py +0 -0
  250. {omdev-0.0.37 → omdev-0.0.38}/omdev/git/revisions.py +0 -0
  251. {omdev-0.0.37 → omdev-0.0.38}/omdev/git/shallow.py +0 -0
  252. {omdev-0.0.37 → omdev-0.0.38}/omdev/git/status.py +0 -0
  253. {omdev-0.0.37/omdev/home → omdev-0.0.38/omdev/git/vendor}/__init__.py +0 -0
  254. {omdev-0.0.37/omdev/interp/providers → omdev-0.0.38/omdev/home}/__init__.py +0 -0
  255. {omdev-0.0.37 → omdev-0.0.38}/omdev/home/__main__.py +0 -0
  256. {omdev-0.0.37 → omdev-0.0.38}/omdev/home/cli.py +0 -0
  257. {omdev-0.0.37 → omdev-0.0.38}/omdev/home/paths.py +0 -0
  258. {omdev-0.0.37 → omdev-0.0.38}/omdev/home/secrets.py +0 -0
  259. {omdev-0.0.37 → omdev-0.0.38}/omdev/home/shadow.py +0 -0
  260. {omdev-0.0.37 → omdev-0.0.38}/omdev/imgur.py +0 -0
  261. {omdev-0.0.37 → omdev-0.0.38}/omdev/intellij/__init__.py +0 -0
  262. {omdev-0.0.37 → omdev-0.0.38}/omdev/intellij/cli.py +0 -0
  263. {omdev-0.0.37 → omdev-0.0.38}/omdev/intellij/ides.py +0 -0
  264. {omdev-0.0.37 → omdev-0.0.38}/omdev/intellij/open.py +0 -0
  265. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/__init__.py +0 -0
  266. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/__main__.py +0 -0
  267. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/cli.py +0 -0
  268. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/default.py +0 -0
  269. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/inject.py +0 -0
  270. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/inspect.py +0 -0
  271. {omdev-0.0.37/omdev/interp/pyenv → omdev-0.0.38/omdev/interp/providers}/__init__.py +0 -0
  272. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/providers/base.py +0 -0
  273. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/providers/inject.py +0 -0
  274. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/providers/running.py +0 -0
  275. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/providers/standalone.py +0 -0
  276. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/providers/system.py +0 -0
  277. {omdev-0.0.37/omdev/interp/uv → omdev-0.0.38/omdev/interp/pyenv}/__init__.py +0 -0
  278. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/pyenv/inject.py +0 -0
  279. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/pyenv/install.py +0 -0
  280. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/pyenv/provider.py +0 -0
  281. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/pyenv/pyenv.py +0 -0
  282. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/resolvers.py +0 -0
  283. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/types.py +0 -0
  284. {omdev-0.0.37/omdev/java → omdev-0.0.38/omdev/interp/uv}/__init__.py +0 -0
  285. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/uv/inject.py +0 -0
  286. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/uv/provider.py +0 -0
  287. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/uv/uv.py +0 -0
  288. {omdev-0.0.37 → omdev-0.0.38}/omdev/interp/venvs.py +0 -0
  289. {omdev-0.0.37/omdev/manifests → omdev-0.0.38/omdev/java}/__init__.py +0 -0
  290. {omdev-0.0.37 → omdev-0.0.38}/omdev/java/__main__.py +0 -0
  291. {omdev-0.0.37 → omdev-0.0.38}/omdev/java/cli.py +0 -0
  292. {omdev-0.0.37 → omdev-0.0.38}/omdev/java/pomgen.py +0 -0
  293. {omdev-0.0.37 → omdev-0.0.38}/omdev/java/utils.py +0 -0
  294. {omdev-0.0.37 → omdev-0.0.38}/omdev/java/xml.py +0 -0
  295. {omdev-0.0.37/omdev/markdown → omdev-0.0.38/omdev/js}/__init__.py +0 -0
  296. {omdev-0.0.37 → omdev-0.0.38}/omdev/magic/__init__.py +0 -0
  297. {omdev-0.0.37 → omdev-0.0.38}/omdev/magic/__main__.py +0 -0
  298. {omdev-0.0.37 → omdev-0.0.38}/omdev/magic/cli.py +0 -0
  299. {omdev-0.0.37 → omdev-0.0.38}/omdev/magic/find.py +0 -0
  300. {omdev-0.0.37 → omdev-0.0.38}/omdev/magic/magic.py +0 -0
  301. {omdev-0.0.37 → omdev-0.0.38}/omdev/magic/prepare.py +0 -0
  302. {omdev-0.0.37 → omdev-0.0.38}/omdev/magic/styles.py +0 -0
  303. {omdev-0.0.37/omdev/mypy → omdev-0.0.38/omdev/manifests}/__init__.py +0 -0
  304. {omdev-0.0.37 → omdev-0.0.38}/omdev/manifests/__main__.py +0 -0
  305. {omdev-0.0.37 → omdev-0.0.38}/omdev/manifests/_dumping.py +0 -0
  306. {omdev-0.0.37 → omdev-0.0.38}/omdev/manifests/building.py +0 -0
  307. {omdev-0.0.37 → omdev-0.0.38}/omdev/manifests/dumping.py +0 -0
  308. {omdev-0.0.37 → omdev-0.0.38}/omdev/manifests/main.py +0 -0
  309. {omdev-0.0.37/omdev/packaging → omdev-0.0.38/omdev/markdown}/__init__.py +0 -0
  310. {omdev-0.0.37 → omdev-0.0.38}/omdev/markdown/incparse.py +0 -0
  311. {omdev-0.0.37 → omdev-0.0.38}/omdev/markdown/tokens.py +0 -0
  312. {omdev-0.0.37/omdev/precheck → omdev-0.0.38/omdev/mypy}/__init__.py +0 -0
  313. {omdev-0.0.37 → omdev-0.0.38}/omdev/mypy/debug.py +0 -0
  314. {omdev-0.0.37 → omdev-0.0.38}/omdev/mypy/report.py +0 -0
  315. {omdev-0.0.37/omdev/py/asts → omdev-0.0.38/omdev/packaging}/__init__.py +0 -0
  316. {omdev-0.0.37 → omdev-0.0.38}/omdev/packaging/marshal.py +0 -0
  317. {omdev-0.0.37 → omdev-0.0.38}/omdev/packaging/names.py +0 -0
  318. {omdev-0.0.37 → omdev-0.0.38}/omdev/packaging/requirements.py +0 -0
  319. {omdev-0.0.37 → omdev-0.0.38}/omdev/packaging/revisions.py +0 -0
  320. {omdev-0.0.37 → omdev-0.0.38}/omdev/packaging/specifiers.py +0 -0
  321. {omdev-0.0.37 → omdev-0.0.38}/omdev/packaging/versions.py +0 -0
  322. {omdev-0.0.37 → omdev-0.0.38}/omdev/packaging/wheelfile.py +0 -0
  323. {omdev-0.0.37 → omdev-0.0.38}/omdev/pip.py +0 -0
  324. {omdev-0.0.37/omdev/py/scripts → omdev-0.0.38/omdev/precheck}/__init__.py +0 -0
  325. {omdev-0.0.37 → omdev-0.0.38}/omdev/precheck/__main__.py +0 -0
  326. {omdev-0.0.37 → omdev-0.0.38}/omdev/precheck/base.py +0 -0
  327. {omdev-0.0.37 → omdev-0.0.38}/omdev/precheck/blanklines.py +0 -0
  328. {omdev-0.0.37 → omdev-0.0.38}/omdev/precheck/caches.py +0 -0
  329. {omdev-0.0.37 → omdev-0.0.38}/omdev/precheck/git.py +0 -0
  330. {omdev-0.0.37 → omdev-0.0.38}/omdev/precheck/imports.py +0 -0
  331. {omdev-0.0.37 → omdev-0.0.38}/omdev/precheck/lite.py +0 -0
  332. {omdev-0.0.37 → omdev-0.0.38}/omdev/precheck/main.py +0 -0
  333. {omdev-0.0.37 → omdev-0.0.38}/omdev/precheck/manifests.py +0 -0
  334. {omdev-0.0.37 → omdev-0.0.38}/omdev/precheck/scripts.py +0 -0
  335. {omdev-0.0.37 → omdev-0.0.38}/omdev/precheck/unicode.py +0 -0
  336. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/__init__.py +0 -0
  337. {omdev-0.0.37/omdev/py/tokens → omdev-0.0.38/omdev/py/asts}/__init__.py +0 -0
  338. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/asts/parents.py +0 -0
  339. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/asts/toplevel.py +0 -0
  340. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/asts/visitors.py +0 -0
  341. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/attrdocs.py +0 -0
  342. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/bracepy.py +0 -0
  343. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/classdot.py +0 -0
  344. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/docstrings/LICENSE +0 -0
  345. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/docstrings/__init__.py +0 -0
  346. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/docstrings/attrdoc.py +0 -0
  347. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/docstrings/common.py +0 -0
  348. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/docstrings/epydoc.py +0 -0
  349. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/docstrings/google.py +0 -0
  350. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/docstrings/numpydoc.py +0 -0
  351. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/docstrings/parser.py +0 -0
  352. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/docstrings/rest.py +0 -0
  353. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/findimports.py +0 -0
  354. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/reprs.py +0 -0
  355. {omdev-0.0.37/omdev/py/tools → omdev-0.0.38/omdev/py/scripts}/__init__.py +0 -0
  356. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/scripts/bumpversion.py +0 -0
  357. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/scripts/importtrace.py +0 -0
  358. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/srcheaders.py +0 -0
  359. {omdev-0.0.37/omdev/pyproject/tools → omdev-0.0.38/omdev/py/tokens}/__init__.py +0 -0
  360. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/tokens/all.py +0 -0
  361. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/tokens/tokenizert.py +0 -0
  362. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/tokens/utils.py +0 -0
  363. {omdev-0.0.37/omdev/rs → omdev-0.0.38/omdev/py/tools}/__init__.py +0 -0
  364. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/tools/fixdocstrings.py +0 -0
  365. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/tools/importscan.py +0 -0
  366. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/tools/mkrelimp.py +0 -0
  367. {omdev-0.0.37 → omdev-0.0.38}/omdev/py/tools/pipdepup.py +0 -0
  368. {omdev-0.0.37 → omdev-0.0.38}/omdev/py.typed +0 -0
  369. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/__init__.py +0 -0
  370. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/__main__.py +0 -0
  371. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/cli.py +0 -0
  372. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/configs.py +0 -0
  373. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/inject.py +0 -0
  374. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/reqs.py +0 -0
  375. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/resources/dockerdev.sh +0 -0
  376. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/resources/python.sh +0 -0
  377. {omdev-0.0.37/omdev/scripts/lib → omdev-0.0.38/omdev/pyproject/tools}/__init__.py +0 -0
  378. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/tools/aboutdeps.py +0 -0
  379. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/tools/buildrs.py +0 -0
  380. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/tools/pyversions.py +0 -0
  381. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/venvs.py +0 -0
  382. {omdev-0.0.37 → omdev-0.0.38}/omdev/pyproject/versions.py +0 -0
  383. {omdev-0.0.37/omdev/scripts/lib/formats → omdev-0.0.38/omdev/rs}/__init__.py +0 -0
  384. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/__init__.py +0 -0
  385. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/ci.py +0 -0
  386. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/interp.py +0 -0
  387. {omdev-0.0.37/omdev/scripts/lib/io → omdev-0.0.38/omdev/scripts/lib}/__init__.py +0 -0
  388. {omdev-0.0.37/omdev/specs → omdev-0.0.38/omdev/scripts/lib/formats}/__init__.py +0 -0
  389. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/lib/formats/goyaml.py +0 -0
  390. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/lib/inject.py +0 -0
  391. {omdev-0.0.37/omdev/specs/irc → omdev-0.0.38/omdev/scripts/lib/io}/__init__.py +0 -0
  392. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/lib/io/pipelines.py +0 -0
  393. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/lib/io/streambufs.py +0 -0
  394. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/lib/logs.py +0 -0
  395. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/lib/marshal.py +0 -0
  396. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/pidfiles.py +0 -0
  397. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/slowcat.py +0 -0
  398. {omdev-0.0.37 → omdev-0.0.38}/omdev/scripts/tmpexec.py +0 -0
  399. {omdev-0.0.37/omdev/specs/irc/messages → omdev-0.0.38/omdev/specs}/__init__.py +0 -0
  400. {omdev-0.0.37/omdev/specs/irc/numerics → omdev-0.0.38/omdev/specs/irc}/__init__.py +0 -0
  401. {omdev-0.0.37/omdev/specs/jsonschema → omdev-0.0.38/omdev/specs/irc/messages}/__init__.py +0 -0
  402. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/messages/base.py +0 -0
  403. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/messages/formats.py +0 -0
  404. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/messages/messages.py +0 -0
  405. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/messages/parsing.py +0 -0
  406. {omdev-0.0.37/omdev/specs/oci → omdev-0.0.38/omdev/specs/irc/numerics}/__init__.py +0 -0
  407. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/numerics/formats.py +0 -0
  408. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/numerics/numerics.py +0 -0
  409. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/numerics/types.py +0 -0
  410. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/protocol/LICENSE +0 -0
  411. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/protocol/__init__.py +0 -0
  412. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/protocol/consts.py +0 -0
  413. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/protocol/errors.py +0 -0
  414. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/protocol/message.py +0 -0
  415. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/protocol/nuh.py +0 -0
  416. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/protocol/parsing.py +0 -0
  417. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/protocol/rendering.py +0 -0
  418. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/protocol/tags.py +0 -0
  419. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/irc/protocol/utils.py +0 -0
  420. {omdev-0.0.37/omdev/specs/oci/pack → omdev-0.0.38/omdev/specs/jsonschema}/__init__.py +0 -0
  421. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/__init__.py +0 -0
  422. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/__main__.py +0 -0
  423. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/analysis.py +0 -0
  424. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/cli.py +0 -0
  425. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/config.py +0 -0
  426. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/errors.py +0 -0
  427. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/generator.py +0 -0
  428. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/ir.py +0 -0
  429. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/names.py +0 -0
  430. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/rendering.py +0 -0
  431. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/transforms.py +0 -0
  432. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/jsonschema/codegen/typing.py +0 -0
  433. {omdev-0.0.37/omdev/tools/git → omdev-0.0.38/omdev/specs/oci}/__init__.py +0 -0
  434. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/building.py +0 -0
  435. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/compression.py +0 -0
  436. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/data.py +0 -0
  437. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/datarefs.py +0 -0
  438. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/dataserver.py +0 -0
  439. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/loading.py +0 -0
  440. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/media.py +0 -0
  441. {omdev-0.0.37/omdev/tools/json → omdev-0.0.38/omdev/specs/oci/pack}/__init__.py +0 -0
  442. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/pack/packing.py +0 -0
  443. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/pack/repositories.py +0 -0
  444. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/pack/unpacking.py +0 -0
  445. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/repositories.py +0 -0
  446. {omdev-0.0.37 → omdev-0.0.38}/omdev/specs/oci/tars.py +0 -0
  447. {omdev-0.0.37 → omdev-0.0.38}/omdev/tagstrings.py +0 -0
  448. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/__init__.py +0 -0
  449. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/cloc.py +0 -0
  450. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/diff.py +0 -0
  451. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/doc.py +0 -0
  452. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/docker.py +0 -0
  453. {omdev-0.0.37/omdev/tools/jsonview → omdev-0.0.38/omdev/tools/git}/__init__.py +0 -0
  454. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/git/__main__.py +0 -0
  455. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/git/cloning.py +0 -0
  456. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/git/consts.py +0 -0
  457. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/git/messages.py +0 -0
  458. {omdev-0.0.37/omdev/tools/pawk → omdev-0.0.38/omdev/tools/json}/__init__.py +0 -0
  459. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/json/__main__.py +0 -0
  460. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/json/cli.py +0 -0
  461. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/json/formats.py +0 -0
  462. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/json/io.py +0 -0
  463. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/json/parsing.py +0 -0
  464. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/json/processing.py +0 -0
  465. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/json/rendering.py +0 -0
  466. {omdev-0.0.37/omdev/tui → omdev-0.0.38/omdev/tools/jsonview}/__init__.py +0 -0
  467. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/jsonview/__main__.py +0 -0
  468. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/jsonview/cli.py +0 -0
  469. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/jsonview/resources/jsonview.css +0 -0
  470. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/jsonview/resources/jsonview.html.j2 +0 -0
  471. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/jsonview/resources/jsonview.js +0 -0
  472. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/linehisto.py +0 -0
  473. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/mkenv.py +0 -0
  474. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/notebook.py +0 -0
  475. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/ocr.py +0 -0
  476. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/pawk/README.md +0 -0
  477. {omdev-0.0.37/omdev/tui/apps → omdev-0.0.38/omdev/tools/pawk}/__init__.py +0 -0
  478. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/pawk/__main__.py +0 -0
  479. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/pawk/pawk.py +0 -0
  480. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/pip.py +0 -0
  481. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/prof.py +0 -0
  482. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/qr.py +0 -0
  483. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/shadow.py +0 -0
  484. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/shell.py +0 -0
  485. {omdev-0.0.37 → omdev-0.0.38}/omdev/tools/sqlrepl.py +0 -0
  486. {omdev-0.0.37/omdev/tui/apps/edit → omdev-0.0.38/omdev/tui}/__init__.py +0 -0
  487. {omdev-0.0.37/omdev/tui/apps/irc → omdev-0.0.38/omdev/tui/apps}/__init__.py +0 -0
  488. {omdev-0.0.37/omdev/tui/apps/jtree → omdev-0.0.38/omdev/tui/apps/edit}/__init__.py +0 -0
  489. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/edit/main.py +0 -0
  490. {omdev-0.0.37/omdev/tui/apps/markdown → omdev-0.0.38/omdev/tui/apps/irc}/__init__.py +0 -0
  491. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/irc/__main__.py +0 -0
  492. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/irc/app.py +0 -0
  493. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/irc/client.py +0 -0
  494. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/irc/commands.py +0 -0
  495. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/irc/main.py +0 -0
  496. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/jtree/LICENSE +0 -0
  497. {omdev-0.0.37/omdev/tui/textual/altdevtools/tools → omdev-0.0.38/omdev/tui/apps/jtree}/__init__.py +0 -0
  498. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/jtree/__main__.py +0 -0
  499. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/jtree/app.py +0 -0
  500. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/jtree/cli.py +0 -0
  501. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/jtree/styles/layout.tcss +0 -0
  502. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/jtree/utils.py +0 -0
  503. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/jtree/widgets.py +0 -0
  504. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/markdown/__main__.py +0 -0
  505. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/apps/markdown/cli.py +0 -0
  506. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/__init__.py +0 -0
  507. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/console2.py +0 -0
  508. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/diff/LICENSE +0 -0
  509. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/diff/__init__.py +0 -0
  510. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/diff/__main__.py +0 -0
  511. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/diff/_compat.py +0 -0
  512. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/diff/cli.py +0 -0
  513. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/diff/renderables.py +0 -0
  514. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/diff/rendering.py +0 -0
  515. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/diff/underlinebar.py +0 -0
  516. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/markdown2.py +0 -0
  517. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/textual/__init__.py +0 -0
  518. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/textual/dark.py +0 -0
  519. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/textual/dump.py +0 -0
  520. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/textual/themes.py +0 -0
  521. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/rich/trirule.py +0 -0
  522. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/__init__.py +0 -0
  523. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/actionmenu.py +0 -0
  524. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/LICENSE +0 -0
  525. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/__init__.py +0 -0
  526. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/client.py +0 -0
  527. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/__init__.py +0 -0
  528. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/borders.py +0 -0
  529. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/colors.py +0 -0
  530. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/colors.tcss +0 -0
  531. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/easing.py +0 -0
  532. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/easing.tcss +0 -0
  533. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/previews/keys.py +0 -0
  534. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/protocol.py +0 -0
  535. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/redirect_output.py +0 -0
  536. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/renderables.py +0 -0
  537. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/server.py +0 -0
  538. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/service.py +0 -0
  539. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/altdevtools/tools/diagnose.py +0 -0
  540. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/app2.py +0 -0
  541. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/autocomplete/LICENSE +0 -0
  542. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/autocomplete/__init__.py +0 -0
  543. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/autocomplete/matching.py +0 -0
  544. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/autocomplete/paths.py +0 -0
  545. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/autocomplete/widget.py +0 -0
  546. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/binding2.py +0 -0
  547. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/clipboard.py +0 -0
  548. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/debug/__init__.py +0 -0
  549. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/debug/dominfo.py +0 -0
  550. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/debug/screen.py +0 -0
  551. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/devtools.py +0 -0
  552. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/dom2.py +0 -0
  553. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/drivers2.py +0 -0
  554. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/logging2.py +0 -0
  555. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/render2.py +0 -0
  556. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/screen2.py +0 -0
  557. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/types.py +0 -0
  558. {omdev-0.0.37 → omdev-0.0.38}/omdev/tui/textual/widgets2.py +0 -0
  559. {omdev-0.0.37 → omdev-0.0.38}/omdev.egg-info/dependency_links.txt +0 -0
  560. {omdev-0.0.37 → omdev-0.0.38}/omdev.egg-info/entry_points.txt +0 -0
  561. {omdev-0.0.37 → omdev-0.0.38}/omdev.egg-info/top_level.txt +0 -0
  562. {omdev-0.0.37 → 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.37
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.37
16
+ Requires-Dist: omcore==0.0.38
17
17
  Provides-Extra: all
18
- Requires-Dist: ominfra==0.0.37; extra == "all"
19
- Requires-Dist: omllm==0.0.37; 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.37; extra == "ominfra"
38
+ Requires-Dist: ominfra==0.0.38; extra == "ominfra"
39
39
  Provides-Extra: omllm
40
- Requires-Dist: omllm==0.0.37; 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": 442,
30
+ "line": 449,
31
31
  "value": {
32
32
  "!.cli.types.CliModule": {
33
33
  "name": "cmake",
@@ -1,7 +1,6 @@
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
6
  - point / copy output to dst dirs
@@ -46,7 +45,7 @@ from .. import cmake
46
45
  from .. import magic
47
46
  from ..cli import CliModule
48
47
  from .configs import CextConfig
49
- from .configs import resolve_cext_config_file
48
+ from .configs import expand_cext_config_files
50
49
  from .magic import CextMagic
51
50
 
52
51
 
@@ -232,9 +231,19 @@ class CmakeProjectGen:
232
231
 
233
232
  return unmarshal_obj(cext_magic.prepared, CextConfig)
234
233
 
235
- @staticmethod
236
- def _resolve_ext_config_file(ext_src: str, config_file: str) -> str:
237
- return resolve_cext_config_file(ext_src, config_file)
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
+ )
238
247
 
239
248
  def _symlink_source_file(self, src_file: str) -> str:
240
249
  source_file = os.path.abspath(os.path.join(self.p.prj_root, src_file))
@@ -251,7 +260,7 @@ class CmakeProjectGen:
251
260
  else:
252
261
  os.symlink(os.path.relpath(source_file, link_dir), link_file)
253
262
 
254
- return link_file
263
+ return src_file
255
264
 
256
265
  @staticmethod
257
266
  def _get_ext_libraries(ext_cfg: CextConfig) -> list[str]:
@@ -279,14 +288,12 @@ class CmakeProjectGen:
279
288
  sysconfig.get_config_var('SHLIB_SUFFIX'),
280
289
  ])
281
290
 
282
- extra_sources = [
283
- self._resolve_ext_config_file(ext_src, src_file)
284
- for src_file in ext_cfg.extra_sources or ()
285
- ]
286
- extra_headers = [
287
- self._resolve_ext_config_file(ext_src, header_file)
288
- for header_file in ext_cfg.extra_headers or ()
289
- ]
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 ())
290
297
 
291
298
  src_files = [
292
299
  self._symlink_source_file(src_file)
@@ -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)
@@ -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 + '/')