automerge-rb 0.1.1

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 (481) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +175 -0
  4. data/ext/automerge_ext/automerge_ext.c +1805 -0
  5. data/ext/automerge_ext/extconf.rb +132 -0
  6. data/lib/automerge/version.rb +6 -0
  7. data/lib/automerge.rb +110 -0
  8. data/rust-toolchain.toml +4 -0
  9. data/vendor/automerge-rust/Cargo.lock +1909 -0
  10. data/vendor/automerge-rust/Cargo.toml +15 -0
  11. data/vendor/automerge-rust/automerge/Cargo.toml +78 -0
  12. data/vendor/automerge-rust/automerge/README.md +5 -0
  13. data/vendor/automerge-rust/automerge/benches/load_save.rs +102 -0
  14. data/vendor/automerge-rust/automerge/benches/map.rs +260 -0
  15. data/vendor/automerge-rust/automerge/benches/range.rs +37 -0
  16. data/vendor/automerge-rust/automerge/benches/sync.rs +95 -0
  17. data/vendor/automerge-rust/automerge/examples/README.md +7 -0
  18. data/vendor/automerge-rust/automerge/examples/quickstart.rs +57 -0
  19. data/vendor/automerge-rust/automerge/examples/watch.rs +94 -0
  20. data/vendor/automerge-rust/automerge/fuzz/Cargo.toml +29 -0
  21. data/vendor/automerge-rust/automerge/fuzz/fuzz_targets/load.rs +37 -0
  22. data/vendor/automerge-rust/automerge/src/autocommit.rs +1286 -0
  23. data/vendor/automerge-rust/automerge/src/automerge/current_state.rs +546 -0
  24. data/vendor/automerge-rust/automerge/src/automerge/tests.rs +2023 -0
  25. data/vendor/automerge-rust/automerge/src/automerge.rs +2071 -0
  26. data/vendor/automerge-rust/automerge/src/autoserde.rs +128 -0
  27. data/vendor/automerge-rust/automerge/src/change.rs +357 -0
  28. data/vendor/automerge-rust/automerge/src/change_graph.rs +1215 -0
  29. data/vendor/automerge-rust/automerge/src/change_queue.rs +46 -0
  30. data/vendor/automerge-rust/automerge/src/clock.rs +206 -0
  31. data/vendor/automerge-rust/automerge/src/columnar/column_range/boolean.rs +83 -0
  32. data/vendor/automerge-rust/automerge/src/columnar/column_range/delta.rs +148 -0
  33. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic/group.rs +138 -0
  34. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic/simple.rs +76 -0
  35. data/vendor/automerge-rust/automerge/src/columnar/column_range/generic.rs +93 -0
  36. data/vendor/automerge-rust/automerge/src/columnar/column_range/key.rs +272 -0
  37. data/vendor/automerge-rust/automerge/src/columnar/column_range/obj_id.rs +202 -0
  38. data/vendor/automerge-rust/automerge/src/columnar/column_range/opid_list.rs +329 -0
  39. data/vendor/automerge-rust/automerge/src/columnar/column_range/raw.rs +38 -0
  40. data/vendor/automerge-rust/automerge/src/columnar/column_range/rle.rs +216 -0
  41. data/vendor/automerge-rust/automerge/src/columnar/column_range/value.rs +547 -0
  42. data/vendor/automerge-rust/automerge/src/columnar/column_range.rs +17 -0
  43. data/vendor/automerge-rust/automerge/src/columnar/encoding/boolean.rs +197 -0
  44. data/vendor/automerge-rust/automerge/src/columnar/encoding/col_error.rs +88 -0
  45. data/vendor/automerge-rust/automerge/src/columnar/encoding/column_decoder.rs +133 -0
  46. data/vendor/automerge-rust/automerge/src/columnar/encoding/decodable_impls.rs +175 -0
  47. data/vendor/automerge-rust/automerge/src/columnar/encoding/delta.rs +96 -0
  48. data/vendor/automerge-rust/automerge/src/columnar/encoding/encodable_impls.rs +200 -0
  49. data/vendor/automerge-rust/automerge/src/columnar/encoding/leb128.rs +82 -0
  50. data/vendor/automerge-rust/automerge/src/columnar/encoding/properties.rs +178 -0
  51. data/vendor/automerge-rust/automerge/src/columnar/encoding/raw.rs +101 -0
  52. data/vendor/automerge-rust/automerge/src/columnar/encoding/rle.rs +239 -0
  53. data/vendor/automerge-rust/automerge/src/columnar/encoding.rs +67 -0
  54. data/vendor/automerge-rust/automerge/src/columnar/splice_error.rs +47 -0
  55. data/vendor/automerge-rust/automerge/src/columnar.rs +14 -0
  56. data/vendor/automerge-rust/automerge/src/convert.rs +112 -0
  57. data/vendor/automerge-rust/automerge/src/cursor.rs +296 -0
  58. data/vendor/automerge-rust/automerge/src/decoding.rs +475 -0
  59. data/vendor/automerge-rust/automerge/src/error.rs +159 -0
  60. data/vendor/automerge-rust/automerge/src/exid.rs +238 -0
  61. data/vendor/automerge-rust/automerge/src/hydrate/list.rs +140 -0
  62. data/vendor/automerge-rust/automerge/src/hydrate/map.rs +132 -0
  63. data/vendor/automerge-rust/automerge/src/hydrate/tests.rs +40 -0
  64. data/vendor/automerge-rust/automerge/src/hydrate/text.rs +89 -0
  65. data/vendor/automerge-rust/automerge/src/hydrate.rs +368 -0
  66. data/vendor/automerge-rust/automerge/src/indexed_cache.rs +113 -0
  67. data/vendor/automerge-rust/automerge/src/iter/doc.rs +603 -0
  68. data/vendor/automerge-rust/automerge/src/iter/keys.rs +93 -0
  69. data/vendor/automerge-rust/automerge/src/iter/list_range.rs +433 -0
  70. data/vendor/automerge-rust/automerge/src/iter/map_range.rs +316 -0
  71. data/vendor/automerge-rust/automerge/src/iter/spans.rs +601 -0
  72. data/vendor/automerge-rust/automerge/src/iter/tools.rs +427 -0
  73. data/vendor/automerge-rust/automerge/src/iter/values.rs +36 -0
  74. data/vendor/automerge-rust/automerge/src/iter.rs +25 -0
  75. data/vendor/automerge-rust/automerge/src/legacy/mod.rs +364 -0
  76. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/actor_id.rs +25 -0
  77. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/change_hash.rs +29 -0
  78. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/element_id.rs +27 -0
  79. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/mod.rs +31 -0
  80. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/object_id.rs +36 -0
  81. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/op.rs +668 -0
  82. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/op_type.rs +26 -0
  83. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/opid.rs +25 -0
  84. data/vendor/automerge-rust/automerge/src/legacy/serde_impls/scalar_value.rs +63 -0
  85. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/element_id.rs +66 -0
  86. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/key.rs +49 -0
  87. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/mod.rs +4 -0
  88. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/object_id.rs +74 -0
  89. data/vendor/automerge-rust/automerge/src/legacy/utility_impls/opid.rs +68 -0
  90. data/vendor/automerge-rust/automerge/src/lib.rs +315 -0
  91. data/vendor/automerge-rust/automerge/src/marks.rs +478 -0
  92. data/vendor/automerge-rust/automerge/src/op_set2/change/batch.rs +2002 -0
  93. data/vendor/automerge-rust/automerge/src/op_set2/change/collector.rs +974 -0
  94. data/vendor/automerge-rust/automerge/src/op_set2/change.rs +332 -0
  95. data/vendor/automerge-rust/automerge/src/op_set2/columns.rs +714 -0
  96. data/vendor/automerge-rust/automerge/src/op_set2/meta.rs +174 -0
  97. data/vendor/automerge-rust/automerge/src/op_set2/op.rs +1363 -0
  98. data/vendor/automerge-rust/automerge/src/op_set2/op_set/elems.rs +43 -0
  99. data/vendor/automerge-rust/automerge/src/op_set2/op_set/found_op.rs +60 -0
  100. data/vendor/automerge-rust/automerge/src/op_set2/op_set/index.rs +197 -0
  101. data/vendor/automerge-rust/automerge/src/op_set2/op_set/insert.rs +179 -0
  102. data/vendor/automerge-rust/automerge/src/op_set2/op_set/mark_index.rs +292 -0
  103. data/vendor/automerge-rust/automerge/src/op_set2/op_set/marks.rs +86 -0
  104. data/vendor/automerge-rust/automerge/src/op_set2/op_set/op_iter.rs +1295 -0
  105. data/vendor/automerge-rust/automerge/src/op_set2/op_set/op_query.rs +82 -0
  106. data/vendor/automerge-rust/automerge/src/op_set2/op_set/top_op.rs +50 -0
  107. data/vendor/automerge-rust/automerge/src/op_set2/op_set/visible.rs +290 -0
  108. data/vendor/automerge-rust/automerge/src/op_set2/op_set.rs +1793 -0
  109. data/vendor/automerge-rust/automerge/src/op_set2/parents.rs +133 -0
  110. data/vendor/automerge-rust/automerge/src/op_set2/skip_list.rs +714 -0
  111. data/vendor/automerge-rust/automerge/src/op_set2/types.rs +769 -0
  112. data/vendor/automerge-rust/automerge/src/op_set2.rs +18 -0
  113. data/vendor/automerge-rust/automerge/src/patches/patch.rs +95 -0
  114. data/vendor/automerge-rust/automerge/src/patches/patch_builder.rs +382 -0
  115. data/vendor/automerge-rust/automerge/src/patches/patch_log.rs +584 -0
  116. data/vendor/automerge-rust/automerge/src/patches.rs +7 -0
  117. data/vendor/automerge-rust/automerge/src/query/list_state.rs +230 -0
  118. data/vendor/automerge-rust/automerge/src/query/seek_mark.rs +142 -0
  119. data/vendor/automerge-rust/automerge/src/read.rs +326 -0
  120. data/vendor/automerge-rust/automerge/src/sequence_tree.rs +662 -0
  121. data/vendor/automerge-rust/automerge/src/storage/bundle/builder.rs +942 -0
  122. data/vendor/automerge-rust/automerge/src/storage/bundle/error.rs +42 -0
  123. data/vendor/automerge-rust/automerge/src/storage/bundle/meta.rs +23 -0
  124. data/vendor/automerge-rust/automerge/src/storage/bundle/storage.rs +146 -0
  125. data/vendor/automerge-rust/automerge/src/storage/bundle.rs +210 -0
  126. data/vendor/automerge-rust/automerge/src/storage/change/change_actors.rs +311 -0
  127. data/vendor/automerge-rust/automerge/src/storage/change/change_op_columns.rs +621 -0
  128. data/vendor/automerge-rust/automerge/src/storage/change/compressed.rs +51 -0
  129. data/vendor/automerge-rust/automerge/src/storage/change/op_with_change_actors.rs +1 -0
  130. data/vendor/automerge-rust/automerge/src/storage/change.rs +523 -0
  131. data/vendor/automerge-rust/automerge/src/storage/chunk.rs +312 -0
  132. data/vendor/automerge-rust/automerge/src/storage/columns/column.rs +42 -0
  133. data/vendor/automerge-rust/automerge/src/storage/columns/column_builder.rs +199 -0
  134. data/vendor/automerge-rust/automerge/src/storage/columns/column_specification.rs +340 -0
  135. data/vendor/automerge-rust/automerge/src/storage/columns/raw_column.rs +286 -0
  136. data/vendor/automerge-rust/automerge/src/storage/columns.rs +355 -0
  137. data/vendor/automerge-rust/automerge/src/storage/document/compression.rs +362 -0
  138. data/vendor/automerge-rust/automerge/src/storage/document.rs +411 -0
  139. data/vendor/automerge-rust/automerge/src/storage/load/change_collector.rs +15 -0
  140. data/vendor/automerge-rust/automerge/src/storage/load.rs +136 -0
  141. data/vendor/automerge-rust/automerge/src/storage/parse/leb128.rs +302 -0
  142. data/vendor/automerge-rust/automerge/src/storage/parse.rs +619 -0
  143. data/vendor/automerge-rust/automerge/src/storage/save/document.rs +27 -0
  144. data/vendor/automerge-rust/automerge/src/storage.rs +26 -0
  145. data/vendor/automerge-rust/automerge/src/sync/bloom.rs +161 -0
  146. data/vendor/automerge-rust/automerge/src/sync/message_builder.rs +118 -0
  147. data/vendor/automerge-rust/automerge/src/sync/state.rs +214 -0
  148. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/bloom.rs +162 -0
  149. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/mod.rs +625 -0
  150. data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/state.rs +120 -0
  151. data/vendor/automerge-rust/automerge/src/sync.rs +2482 -0
  152. data/vendor/automerge-rust/automerge/src/text_diff/LICENSE +201 -0
  153. data/vendor/automerge-rust/automerge/src/text_diff/myers.rs +332 -0
  154. data/vendor/automerge-rust/automerge/src/text_diff/replace.rs +139 -0
  155. data/vendor/automerge-rust/automerge/src/text_diff/utils.rs +119 -0
  156. data/vendor/automerge-rust/automerge/src/text_diff.rs +515 -0
  157. data/vendor/automerge-rust/automerge/src/text_value.rs +276 -0
  158. data/vendor/automerge-rust/automerge/src/transaction/commit.rs +34 -0
  159. data/vendor/automerge-rust/automerge/src/transaction/inner.rs +1403 -0
  160. data/vendor/automerge-rust/automerge/src/transaction/manual_transaction.rs +147 -0
  161. data/vendor/automerge-rust/automerge/src/transaction/owned_transaction.rs +266 -0
  162. data/vendor/automerge-rust/automerge/src/transaction/result.rs +21 -0
  163. data/vendor/automerge-rust/automerge/src/transaction/transactable.rs +203 -0
  164. data/vendor/automerge-rust/automerge/src/transaction.rs +513 -0
  165. data/vendor/automerge-rust/automerge/src/types.rs +749 -0
  166. data/vendor/automerge-rust/automerge/src/validation.rs +29 -0
  167. data/vendor/automerge-rust/automerge/src/value.rs +763 -0
  168. data/vendor/automerge-rust/automerge/tests/batch_insert.rs +1034 -0
  169. data/vendor/automerge-rust/automerge/tests/block_tests.rs +887 -0
  170. data/vendor/automerge-rust/automerge/tests/convert_string_to_text.rs +72 -0
  171. data/vendor/automerge-rust/automerge/tests/diff_marks.rs +1508 -0
  172. data/vendor/automerge-rust/automerge/tests/fixtures/64bit_obj_id_change.automerge +0 -0
  173. data/vendor/automerge-rust/automerge/tests/fixtures/64bit_obj_id_doc.automerge +0 -0
  174. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_has_incorrect_meta.automerge +0 -0
  175. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_is_ok.automerge +0 -0
  176. data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_is_overlong.automerge +0 -0
  177. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks.automerge +0 -0
  178. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks_compressed.automerge +0 -0
  179. data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks_out_of_order.automerge +0 -0
  180. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/action-is-48.automerge +0 -0
  181. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 +0 -0
  182. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/incorrect_max_op.automerge +0 -0
  183. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/invalid_deflate_stream.automerge +0 -0
  184. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/missing_actor.automerge +0 -0
  185. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/overflow_in_length.automerge +0 -0
  186. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/too_many_deps.automerge +0 -0
  187. data/vendor/automerge-rust/automerge/tests/fuzz-crashers/too_many_ops.automerge +0 -0
  188. data/vendor/automerge-rust/automerge/tests/test.rs +2668 -0
  189. data/vendor/automerge-rust/automerge/tests/test_mark_patches.rs +41 -0
  190. data/vendor/automerge-rust/automerge/tests/test_save_load_orphans.rs +84 -0
  191. data/vendor/automerge-rust/automerge/tests/text.rs +1098 -0
  192. data/vendor/automerge-rust/automerge/tests/text_encoding.rs +640 -0
  193. data/vendor/automerge-rust/automerge-c/CMakeLists.txt +439 -0
  194. data/vendor/automerge-rust/automerge-c/Cargo.toml +22 -0
  195. data/vendor/automerge-rust/automerge-c/README.md +233 -0
  196. data/vendor/automerge-rust/automerge-c/build.rs +21 -0
  197. data/vendor/automerge-rust/automerge-c/cbindgen.toml +48 -0
  198. data/vendor/automerge-rust/automerge-c/cmake/Cargo.toml.in +22 -0
  199. data/vendor/automerge-rust/automerge-c/cmake/automerge-c-config.cmake.in +99 -0
  200. data/vendor/automerge-rust/automerge-c/cmake/cbindgen.toml.in +48 -0
  201. data/vendor/automerge-rust/automerge-c/cmake/config.h.in +58 -0
  202. data/vendor/automerge-rust/automerge-c/cmake/enum-string-functions-gen.cmake +183 -0
  203. data/vendor/automerge-rust/automerge-c/cmake/file-regex-replace.cmake +33 -0
  204. data/vendor/automerge-rust/automerge-c/cmake/file-touch.cmake +35 -0
  205. data/vendor/automerge-rust/automerge-c/docs/CMakeLists.txt +39 -0
  206. data/vendor/automerge-rust/automerge-c/docs/img/brandmark.png +0 -0
  207. data/vendor/automerge-rust/automerge-c/examples/CMakeLists.txt +42 -0
  208. data/vendor/automerge-rust/automerge-c/examples/README.md +9 -0
  209. data/vendor/automerge-rust/automerge-c/examples/quickstart.c +131 -0
  210. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/result.h +30 -0
  211. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/stack.h +130 -0
  212. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/stack_callback_data.h +53 -0
  213. data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/string.h +29 -0
  214. data/vendor/automerge-rust/automerge-c/src/actor_id.rs +193 -0
  215. data/vendor/automerge-rust/automerge-c/src/byte_span.rs +227 -0
  216. data/vendor/automerge-rust/automerge-c/src/change.rs +356 -0
  217. data/vendor/automerge-rust/automerge-c/src/cursor.rs +168 -0
  218. data/vendor/automerge-rust/automerge-c/src/doc/list.rs +636 -0
  219. data/vendor/automerge-rust/automerge-c/src/doc/map.rs +556 -0
  220. data/vendor/automerge-rust/automerge-c/src/doc/mark.rs +296 -0
  221. data/vendor/automerge-rust/automerge-c/src/doc/utils.rs +46 -0
  222. data/vendor/automerge-rust/automerge-c/src/doc.rs +1009 -0
  223. data/vendor/automerge-rust/automerge-c/src/index.rs +84 -0
  224. data/vendor/automerge-rust/automerge-c/src/item.rs +2177 -0
  225. data/vendor/automerge-rust/automerge-c/src/items.rs +401 -0
  226. data/vendor/automerge-rust/automerge-c/src/lib.rs +11 -0
  227. data/vendor/automerge-rust/automerge-c/src/obj.rs +216 -0
  228. data/vendor/automerge-rust/automerge-c/src/result.rs +653 -0
  229. data/vendor/automerge-rust/automerge-c/src/sync/have.rs +42 -0
  230. data/vendor/automerge-rust/automerge-c/src/sync/message.rs +146 -0
  231. data/vendor/automerge-rust/automerge-c/src/sync/state.rs +262 -0
  232. data/vendor/automerge-rust/automerge-c/src/sync.rs +7 -0
  233. data/vendor/automerge-rust/automerge-c/src/utils/result.c +33 -0
  234. data/vendor/automerge-rust/automerge-c/src/utils/stack.c +106 -0
  235. data/vendor/automerge-rust/automerge-c/src/utils/stack_callback_data.c +9 -0
  236. data/vendor/automerge-rust/automerge-c/src/utils/string.c +46 -0
  237. data/vendor/automerge-rust/automerge-c/test/CMakeLists.txt +67 -0
  238. data/vendor/automerge-rust/automerge-c/test/actor_id_tests.c +140 -0
  239. data/vendor/automerge-rust/automerge-c/test/base_state.c +17 -0
  240. data/vendor/automerge-rust/automerge-c/test/base_state.h +39 -0
  241. data/vendor/automerge-rust/automerge-c/test/byte_span_tests.c +119 -0
  242. data/vendor/automerge-rust/automerge-c/test/cmocka_utils.c +91 -0
  243. data/vendor/automerge-rust/automerge-c/test/cmocka_utils.h +42 -0
  244. data/vendor/automerge-rust/automerge-c/test/cursor_tests.c +263 -0
  245. data/vendor/automerge-rust/automerge-c/test/doc_state.c +27 -0
  246. data/vendor/automerge-rust/automerge-c/test/doc_state.h +17 -0
  247. data/vendor/automerge-rust/automerge-c/test/doc_tests.c +335 -0
  248. data/vendor/automerge-rust/automerge-c/test/enum_string_tests.c +148 -0
  249. data/vendor/automerge-rust/automerge-c/test/files/brave-ape-49.automerge +0 -0
  250. data/vendor/automerge-rust/automerge-c/test/item_tests.c +313 -0
  251. data/vendor/automerge-rust/automerge-c/test/list_tests.c +544 -0
  252. data/vendor/automerge-rust/automerge-c/test/macro_utils.c +38 -0
  253. data/vendor/automerge-rust/automerge-c/test/macro_utils.h +23 -0
  254. data/vendor/automerge-rust/automerge-c/test/main.c +33 -0
  255. data/vendor/automerge-rust/automerge-c/test/map_tests.c +1610 -0
  256. data/vendor/automerge-rust/automerge-c/test/mark_tests.c +124 -0
  257. data/vendor/automerge-rust/automerge-c/test/ported_wasm/basic_tests.c +1642 -0
  258. data/vendor/automerge-rust/automerge-c/test/ported_wasm/cursor_tests.c +108 -0
  259. data/vendor/automerge-rust/automerge-c/test/ported_wasm/suite.c +17 -0
  260. data/vendor/automerge-rust/automerge-c/test/ported_wasm/sync_tests.c +1280 -0
  261. data/vendor/automerge-rust/automerge-c/test/str_utils.c +15 -0
  262. data/vendor/automerge-rust/automerge-c/test/str_utils.h +17 -0
  263. data/vendor/automerge-rust/automerge-test/Cargo.toml +17 -0
  264. data/vendor/automerge-rust/automerge-test/README.md +3 -0
  265. data/vendor/automerge-rust/automerge-test/src/lib.rs +487 -0
  266. data/vendor/automerge-rust/hexane/CHANGELOG.md +34 -0
  267. data/vendor/automerge-rust/hexane/Cargo.toml +47 -0
  268. data/vendor/automerge-rust/hexane/README.md +292 -0
  269. data/vendor/automerge-rust/hexane/RESULTS.txt +20 -0
  270. data/vendor/automerge-rust/hexane/TODO +18 -0
  271. data/vendor/automerge-rust/hexane/benches/insert.rs +82 -0
  272. data/vendor/automerge-rust/hexane/benches/seek.rs +77 -0
  273. data/vendor/automerge-rust/hexane/benches/splice.rs +82 -0
  274. data/vendor/automerge-rust/hexane/src/aggregate.rs +288 -0
  275. data/vendor/automerge-rust/hexane/src/boolean.rs +478 -0
  276. data/vendor/automerge-rust/hexane/src/columndata.rs +2540 -0
  277. data/vendor/automerge-rust/hexane/src/cursor.rs +756 -0
  278. data/vendor/automerge-rust/hexane/src/delta.rs +793 -0
  279. data/vendor/automerge-rust/hexane/src/encoder.rs +639 -0
  280. data/vendor/automerge-rust/hexane/src/leb128.rs +82 -0
  281. data/vendor/automerge-rust/hexane/src/lib.rs +95 -0
  282. data/vendor/automerge-rust/hexane/src/pack.rs +325 -0
  283. data/vendor/automerge-rust/hexane/src/raw.rs +314 -0
  284. data/vendor/automerge-rust/hexane/src/rle.rs +928 -0
  285. data/vendor/automerge-rust/hexane/src/slab/tree.rs +1373 -0
  286. data/vendor/automerge-rust/hexane/src/slab/writer.rs +535 -0
  287. data/vendor/automerge-rust/hexane/src/slab.rs +224 -0
  288. data/vendor/automerge-rust/hexane/src/test.rs +108 -0
  289. data/vendor/bundle/ruby/3.3.0/bin/rake +29 -0
  290. data/vendor/bundle/ruby/3.3.0/bin/rake-compiler +29 -0
  291. data/vendor/bundle/ruby/3.3.0/bin/rake-compiler-dock +29 -0
  292. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/History.rdoc +1732 -0
  293. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/Manifest.txt +32 -0
  294. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/README.rdoc +845 -0
  295. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/Rakefile +97 -0
  296. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/design_rationale.rb +54 -0
  297. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/hoe/minitest.rb +30 -0
  298. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/assertions.rb +850 -0
  299. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/autorun.rb +6 -0
  300. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/benchmark.rb +452 -0
  301. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/compress.rb +94 -0
  302. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/error_on_warning.rb +11 -0
  303. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/expectations.rb +321 -0
  304. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/hell.rb +11 -0
  305. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/manual_plugins.rb +16 -0
  306. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/mock.rb +327 -0
  307. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/parallel.rb +72 -0
  308. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/pride.rb +4 -0
  309. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/pride_plugin.rb +135 -0
  310. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/spec.rb +353 -0
  311. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/test.rb +238 -0
  312. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/test_task.rb +324 -0
  313. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/unit.rb +42 -0
  314. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest.rb +1250 -0
  315. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/metametameta.rb +150 -0
  316. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_assertions.rb +1677 -0
  317. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_benchmark.rb +137 -0
  318. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_mock.rb +1213 -0
  319. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_reporter.rb +437 -0
  320. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_spec.rb +1159 -0
  321. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_test.rb +1374 -0
  322. data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_test_task.rb +57 -0
  323. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/History.rdoc +2454 -0
  324. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/MIT-LICENSE +21 -0
  325. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/README.rdoc +155 -0
  326. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/command_line_usage.rdoc +171 -0
  327. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/Rakefile1 +38 -0
  328. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/Rakefile2 +35 -0
  329. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/a.c +6 -0
  330. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/b.c +6 -0
  331. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/main.c +11 -0
  332. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/glossary.rdoc +42 -0
  333. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/jamis.rb +592 -0
  334. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/proto_rake.rdoc +127 -0
  335. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rake.1 +156 -0
  336. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rakefile.rdoc +635 -0
  337. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rational.rdoc +151 -0
  338. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/exe/rake +27 -0
  339. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/application.rb +847 -0
  340. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/backtrace.rb +25 -0
  341. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/clean.rb +78 -0
  342. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/cloneable.rb +17 -0
  343. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/cpu_counter.rb +122 -0
  344. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/default_loader.rb +15 -0
  345. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/dsl_definition.rb +196 -0
  346. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/early_time.rb +22 -0
  347. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/ext/core.rb +26 -0
  348. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/ext/string.rb +176 -0
  349. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_creation_task.rb +25 -0
  350. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_list.rb +435 -0
  351. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_task.rb +58 -0
  352. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_utils.rb +137 -0
  353. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_utils_ext.rb +135 -0
  354. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/invocation_chain.rb +57 -0
  355. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/invocation_exception_mixin.rb +17 -0
  356. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/late_time.rb +18 -0
  357. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/linked_list.rb +112 -0
  358. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/loaders/makefile.rb +54 -0
  359. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/multi_task.rb +14 -0
  360. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/name_space.rb +38 -0
  361. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/options.rb +31 -0
  362. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/packagetask.rb +222 -0
  363. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/phony.rb +16 -0
  364. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/private_reader.rb +21 -0
  365. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/promise.rb +100 -0
  366. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/pseudo_status.rb +30 -0
  367. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rake_module.rb +67 -0
  368. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rake_test_loader.rb +27 -0
  369. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
  370. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/scope.rb +43 -0
  371. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task.rb +434 -0
  372. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_argument_error.rb +8 -0
  373. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_arguments.rb +113 -0
  374. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_manager.rb +333 -0
  375. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/tasklib.rb +12 -0
  376. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/testtask.rb +192 -0
  377. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/thread_history_display.rb +49 -0
  378. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/thread_pool.rb +157 -0
  379. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/trace_output.rb +23 -0
  380. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/version.rb +10 -0
  381. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/win32.rb +17 -0
  382. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake.rb +69 -0
  383. data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/rake.gemspec +102 -0
  384. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/Gemfile +8 -0
  385. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/History.md +695 -0
  386. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/LICENSE.txt +20 -0
  387. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/README.md +476 -0
  388. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/Rakefile +15 -0
  389. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/appveyor.yml +22 -0
  390. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/bin/rake-compiler +24 -0
  391. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/cucumber.yml +4 -0
  392. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/compile.feature +79 -0
  393. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-compile.feature +23 -0
  394. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-package-multi.feature +15 -0
  395. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-package.feature +14 -0
  396. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-compile.feature +22 -0
  397. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-no-native-compile.feature +33 -0
  398. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-package.feature +24 -0
  399. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/package.feature +40 -0
  400. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/compilation.rb +70 -0
  401. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/cross_compilation.rb +27 -0
  402. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/execution.rb +52 -0
  403. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/folders.rb +32 -0
  404. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/gem.rb +46 -0
  405. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/java_compilation.rb +7 -0
  406. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/env.rb +10 -0
  407. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/file_template_helpers.rb +137 -0
  408. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/generator_helpers.rb +123 -0
  409. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/platform_extension_helpers.rb +27 -0
  410. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/baseextensiontask.rb +90 -0
  411. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/compiler_config.rb +38 -0
  412. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/extensioncompiler.rb +51 -0
  413. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/extensiontask.rb +589 -0
  414. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/javaextensiontask.rb +321 -0
  415. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/bin/cross-ruby.rake +189 -0
  416. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/bootstrap.rake +11 -0
  417. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/common.rake +10 -0
  418. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/cucumber.rake +23 -0
  419. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/gem.rake +15 -0
  420. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/rspec.rake +9 -0
  421. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/CHANGELOG.md +446 -0
  422. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/CONTRIBUTING.md +109 -0
  423. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Dockerfile.jruby +79 -0
  424. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Dockerfile.mri.erb +282 -0
  425. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Gemfile +8 -0
  426. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/LICENSE.txt +22 -0
  427. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/README.md +447 -0
  428. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Rakefile +246 -0
  429. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/bin/rake-compiler-dock +18 -0
  430. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/buildkitd.toml +2 -0
  431. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/gem_helper.rb +54 -0
  432. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_i686.rb +18 -0
  433. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_musl_cross.sh +37 -0
  434. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_osxcross.sh +45 -0
  435. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_pkg_config.sh +24 -0
  436. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/parallel_docker_build.rb +169 -0
  437. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0004-Enable-build-of-static-libruby.patch +38 -0
  438. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0005-build-miniruby-first.patch +16 -0
  439. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0006-ruby-4-rubyspec-capiext.patch +16 -0
  440. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/rcd-env.sh +6 -0
  441. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/runas +7 -0
  442. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/sigfw.c +45 -0
  443. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_codesign +17 -0
  444. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_vbox +30 -0
  445. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/sudoers +1 -0
  446. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/colors.rb +43 -0
  447. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/docker_check.rb +356 -0
  448. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/predefined_user_group.rb +5 -0
  449. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/starter.rb +206 -0
  450. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/version.rb +4 -0
  451. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock.rb +151 -0
  452. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/Dockerfile +66 -0
  453. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/README.md +14 -0
  454. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/binutils-mingw-w64-ignore-check-errors.patch +13 -0
  455. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/gcc-mingw-w64-only-c-c++.patch +13 -0
  456. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/mingw-w64-enable-ucrt.patch +22 -0
  457. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/rake-compiler-dock.gemspec +34 -0
  458. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.alpine +17 -0
  459. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.debian +24 -0
  460. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/fixtures/mig_test_rpc.defs +8 -0
  461. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Gemfile +11 -0
  462. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Rakefile +97 -0
  463. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RcdTestExtService.java +19 -0
  464. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RubyRcdTest.java +16 -0
  465. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/extconf.rb +111 -0
  466. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.c +65 -0
  467. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.h +11 -0
  468. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/lib/rcd_test.rb +6 -0
  469. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/rcd_test.gemspec +28 -0
  470. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/test/test_basic.rb +49 -0
  471. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_environment_variables.rb +108 -0
  472. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_mig.rb +18 -0
  473. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_parallel_docker_build.rb +95 -0
  474. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_rubygems_plugins.rb +12 -0
  475. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_starter.rb +158 -0
  476. data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_versions.rb +82 -0
  477. data/vendor/bundle/ruby/3.3.0/specifications/minitest-5.27.0.gemspec +32 -0
  478. data/vendor/bundle/ruby/3.3.0/specifications/rake-13.4.2.gemspec +26 -0
  479. data/vendor/bundle/ruby/3.3.0/specifications/rake-compiler-1.3.1.gemspec +33 -0
  480. data/vendor/bundle/ruby/3.3.0/specifications/rake-compiler-dock-1.12.0.gemspec +28 -0
  481. metadata +584 -0
@@ -0,0 +1,1403 @@
1
+ use std::borrow::Cow;
2
+ use std::collections::{HashSet, VecDeque};
3
+ use std::num::NonZeroU64;
4
+ use std::ops::Range;
5
+ use std::sync::Arc;
6
+
7
+ use crate::change_graph::ChangeGraph;
8
+ use crate::op_set2::op_set::ResolvedAction;
9
+ use unicode_segmentation::UnicodeSegmentation;
10
+
11
+ use crate::exid::ExId;
12
+ use crate::marks::{ExpandMark, Mark, MarkSet};
13
+ use crate::op_set2::change::build_change;
14
+ use crate::op_set2::{Op, OpSet, OpSetCheckpoint, PropRef, SuccInsert, TxOp};
15
+ use crate::patches::PatchLog;
16
+ use crate::types::{Clock, ElemId, ObjMeta, OpId, ScalarValue, SequenceType, TextEncoding, HEAD};
17
+ use crate::Automerge;
18
+ use crate::{hydrate, AutomergeError, ObjType, OpType, ReadDoc};
19
+ use crate::{Change, ChangeHash, Prop};
20
+
21
+ #[derive(Debug, Clone)]
22
+ pub(crate) struct TransactionInner {
23
+ actor: usize,
24
+ seq: u64,
25
+ start_op: NonZeroU64,
26
+ time: i64,
27
+ message: Option<String>,
28
+ deps: Vec<ChangeHash>,
29
+ scope: Option<Clock>,
30
+ checkpoint: OpSetCheckpoint,
31
+ pending: Vec<TxOp>,
32
+ }
33
+
34
+ /// Arguments required to create a new transaction
35
+ pub(crate) struct TransactionArgs {
36
+ /// The index of the actor ID this transaction will create ops for in the
37
+ /// [`OpSet::actors`]
38
+ pub(crate) actor_index: usize,
39
+ /// The sequence number of the change this transaction will create
40
+ pub(crate) seq: u64,
41
+ /// checkpoint of the op_set state needed for rollback
42
+ pub(crate) checkpoint: OpSetCheckpoint,
43
+ /// The start op of the change this transaction will create
44
+ pub(crate) start_op: NonZeroU64,
45
+ /// The dependencies of the change this transaction will create
46
+ pub(crate) deps: Vec<ChangeHash>,
47
+ /// The scope that should be visible to the transaction
48
+ pub(crate) scope: Option<Clock>,
49
+ }
50
+
51
+ impl TransactionInner {
52
+ pub(crate) fn new(
53
+ TransactionArgs {
54
+ actor_index: actor,
55
+ seq,
56
+ start_op,
57
+ checkpoint,
58
+ deps,
59
+ scope,
60
+ }: TransactionArgs,
61
+ ) -> Self {
62
+ TransactionInner {
63
+ actor,
64
+ seq,
65
+ start_op,
66
+ time: 0,
67
+ message: None,
68
+ checkpoint,
69
+ deps,
70
+ pending: vec![],
71
+ scope,
72
+ }
73
+ }
74
+
75
+ /// Create an empty change
76
+ pub(crate) fn empty(
77
+ doc: &mut Automerge,
78
+ args: TransactionArgs,
79
+ message: Option<String>,
80
+ time: Option<i64>,
81
+ ) -> ChangeHash {
82
+ Self::new(args).commit_impl(doc, message, time)
83
+ }
84
+
85
+ pub(crate) fn pending_ops(&self) -> usize {
86
+ self.pending.len()
87
+ }
88
+
89
+ /// Commit the operations performed in this transaction, returning the hashes corresponding to
90
+ /// the new heads.
91
+ ///
92
+ /// Returns `None` if there were no operations to commit
93
+ #[tracing::instrument(skip(self, doc))]
94
+ pub(crate) fn commit(
95
+ self,
96
+ doc: &mut Automerge,
97
+ message: Option<String>,
98
+ time: Option<i64>,
99
+ ) -> Option<ChangeHash> {
100
+ if self.pending_ops() == 0 {
101
+ if self.seq == 1 {
102
+ // we added an actor for this tx - now roll it back
103
+ doc.remove_actor(self.actor);
104
+ }
105
+ doc.remove_unused_actors(true);
106
+ return None;
107
+ }
108
+ Some(self.commit_impl(doc, message, time))
109
+ }
110
+
111
+ pub(crate) fn commit_impl(
112
+ mut self,
113
+ doc: &mut Automerge,
114
+ message: Option<String>,
115
+ time: Option<i64>,
116
+ ) -> ChangeHash {
117
+ if message.is_some() {
118
+ self.message = message;
119
+ }
120
+
121
+ if let Some(t) = time {
122
+ self.time = t;
123
+ }
124
+
125
+ let change = self.export(doc.ops(), doc.changes());
126
+ let hash = change.hash();
127
+ #[cfg(not(feature = "slow_path_assertions"))]
128
+ tracing::trace!(commit=?hash, deps=?change.deps(), "committing transaction");
129
+ #[cfg(feature = "slow_path_assertions")]
130
+ {
131
+ let ops = change.iter_ops().collect::<Vec<_>>();
132
+ tracing::trace!(commit=?hash, ?ops, deps=?change.deps(), "committing transaction");
133
+ }
134
+ doc.update_history(&change);
135
+ doc.remove_unused_actors(true);
136
+ hash
137
+ }
138
+
139
+ pub(crate) fn change_meta<'a>(
140
+ &self,
141
+ deps: Vec<u64>,
142
+ ) -> crate::op_set2::change::BuildChangeMetadata<'a> {
143
+ crate::op_set2::change::BuildChangeMetadata {
144
+ actor: self.actor,
145
+ seq: self.seq,
146
+ start_op: self.start_op.get(),
147
+ max_op: self.start_op.get() + self.pending.len() as u64 - 1,
148
+ timestamp: self.time,
149
+ message: self.message.as_ref().map(|s| Cow::Owned(s.to_string())),
150
+ extra: Cow::Borrowed(&[]),
151
+ builder: 0,
152
+ deps,
153
+ }
154
+ }
155
+
156
+ pub(crate) fn export(mut self, op_set: &OpSet, change_graph: &ChangeGraph) -> Change {
157
+ self.deps.sort_unstable();
158
+ let deps_index = self
159
+ .deps
160
+ .iter()
161
+ .filter_map(|hash| Some(change_graph.hash_to_index(hash)? as u64))
162
+ .collect();
163
+ let meta = self.change_meta(deps_index);
164
+ let stored = build_change(&self.pending, &meta, change_graph, &op_set.actors);
165
+ Change::new(stored)
166
+ }
167
+
168
+ /// Undo the operations added in this transaction, returning the number of cancelled
169
+ /// operations.
170
+ pub(crate) fn rollback(self, doc: &mut Automerge) -> usize {
171
+ let num = self.pending.len();
172
+ doc.ops_mut().load_checkpoint(self.checkpoint);
173
+ if self.seq == 1 {
174
+ doc.remove_actor(self.actor);
175
+ }
176
+ doc.remove_unused_actors(true);
177
+ num
178
+ }
179
+
180
+ /// Set the value of property `P` to value `V` in object `obj`.
181
+ ///
182
+ /// # Returns
183
+ ///
184
+ /// The opid of the operation which was created, or None if this operation doesn't change the
185
+ /// document
186
+ ///
187
+ /// # Errors
188
+ ///
189
+ /// This will return an error if
190
+ /// - The object does not exist
191
+ /// - The key is the wrong type for the object
192
+ /// - The key does not exist in the object
193
+ pub(crate) fn put<P: Into<Prop>, V: Into<ScalarValue>>(
194
+ &mut self,
195
+ doc: &mut Automerge,
196
+ patch_log: &mut PatchLog,
197
+ ex_obj: &ExId,
198
+ prop: P,
199
+ value: V,
200
+ ) -> Result<(), AutomergeError> {
201
+ let obj = doc.exid_to_obj(ex_obj)?;
202
+ let value = value.into();
203
+ let prop = prop.into();
204
+ match (&prop, obj.typ) {
205
+ (Prop::Map(_), ObjType::Map) => Ok(()),
206
+ (Prop::Seq(_), ObjType::List) => Ok(()),
207
+ (Prop::Seq(_), ObjType::Text) => Ok(()),
208
+ _ => Err(AutomergeError::InvalidOp(obj.typ)),
209
+ }?;
210
+ self.local_op(doc, patch_log, &obj, prop, value.into())?;
211
+ Ok(())
212
+ }
213
+
214
+ /// Set the value of property `P` to value `V` in object `obj`.
215
+ ///
216
+ /// # Returns
217
+ ///
218
+ /// The opid of the operation which was created, or None if this operation doesn't change the
219
+ /// document
220
+ ///
221
+ /// # Errors
222
+ ///
223
+ /// This will return an error if
224
+ /// - The object does not exist
225
+ /// - The key is the wrong type for the object
226
+ /// - The key does not exist in the object
227
+ pub(crate) fn put_object<P: Into<Prop>>(
228
+ &mut self,
229
+ doc: &mut Automerge,
230
+ patch_log: &mut PatchLog,
231
+ ex_obj: &ExId,
232
+ prop: P,
233
+ value: ObjType,
234
+ ) -> Result<ExId, AutomergeError> {
235
+ let obj = doc.exid_to_obj(ex_obj)?;
236
+ let prop = prop.into();
237
+ match (&prop, obj.typ) {
238
+ (Prop::Map(_), ObjType::Map) => Ok(()),
239
+ (Prop::Seq(_), ObjType::List) => Ok(()),
240
+ _ => Err(AutomergeError::InvalidOp(obj.typ)),
241
+ }?;
242
+ self.local_op(doc, patch_log, &obj, prop, value.into())
243
+ .map(|opid| doc.id_to_exid(opid.unwrap()))
244
+ }
245
+
246
+ pub(super) fn next_id(&self) -> OpId {
247
+ OpId::new(self.start_op.get() + self.pending_ops() as u64, self.actor)
248
+ }
249
+
250
+ fn next_delete(&mut self, obj: ObjMeta, index: usize, elemid: ElemId, ops: &[Op<'_>]) -> TxOp {
251
+ TxOp::list_del(
252
+ self.next_id(),
253
+ obj,
254
+ index,
255
+ elemid,
256
+ ops.iter().map(|op| op.id),
257
+ )
258
+ }
259
+
260
+ fn insert_local_op(
261
+ &mut self,
262
+ doc: &mut Automerge,
263
+ patch_log: &mut PatchLog,
264
+ op: TxOp,
265
+ succ: &[SuccInsert],
266
+ range: Range<usize>,
267
+ ) {
268
+ let added = doc.ops_mut().splice(op.pos, &[&op]);
269
+
270
+ doc.ops_mut().add_succ(succ);
271
+
272
+ if self.scope.is_some() {
273
+ doc.ops_mut().reset_top(range.start..(range.end + added));
274
+ }
275
+
276
+ self.finalize_op(doc.text_encoding(), patch_log, &op, None);
277
+
278
+ self.pending.push(op);
279
+ }
280
+
281
+ pub(crate) fn insert<V: Into<ScalarValue>>(
282
+ &mut self,
283
+ doc: &mut Automerge,
284
+ patch_log: &mut PatchLog,
285
+ ex_obj: &ExId,
286
+ index: usize,
287
+ value: V,
288
+ ) -> Result<(), AutomergeError> {
289
+ let obj = doc.exid_to_obj(ex_obj)?;
290
+ let Some(seq_type) = obj.typ.as_sequence_type() else {
291
+ return Err(AutomergeError::InvalidOp(obj.typ));
292
+ };
293
+ let value = value.into();
294
+ tracing::trace!(obj=?obj, value=?value, "inserting value");
295
+ self.do_insert(doc, patch_log, &obj, seq_type, index, value.into())?;
296
+ Ok(())
297
+ }
298
+
299
+ pub(crate) fn insert_object(
300
+ &mut self,
301
+ doc: &mut Automerge,
302
+ patch_log: &mut PatchLog,
303
+ ex_obj: &ExId,
304
+ index: usize,
305
+ value: ObjType,
306
+ ) -> Result<ExId, AutomergeError> {
307
+ let obj = doc.exid_to_obj(ex_obj)?;
308
+ let Some(seq_type) = obj.typ.as_sequence_type() else {
309
+ return Err(AutomergeError::InvalidOp(obj.typ));
310
+ };
311
+ let id = self.do_insert(doc, patch_log, &obj, seq_type, index, value.into())?;
312
+ Ok(doc.ops().id_to_exid(id))
313
+ }
314
+
315
+ fn do_insert(
316
+ &mut self,
317
+ doc: &mut Automerge,
318
+ patch_log: &mut PatchLog,
319
+ obj: &ObjMeta,
320
+ seq_type: SequenceType,
321
+ index: usize,
322
+ action: OpType,
323
+ ) -> Result<OpId, AutomergeError> {
324
+ let id = self.next_id();
325
+
326
+ let query = doc
327
+ .ops()
328
+ .query_insert_at(&obj.id, index, seq_type, self.scope.clone())?;
329
+
330
+ let marks = query.marks;
331
+ let pos = query.pos;
332
+
333
+ //let key = query.elemid.into();
334
+
335
+ let op = TxOp::insert(id, *obj, pos, index, action, query.elemid);
336
+
337
+ doc.ops_mut().splice(op.pos, &[&op]);
338
+ self.finalize_op(doc.text_encoding(), patch_log, &op, marks);
339
+ self.pending.push(op);
340
+
341
+ Ok(id)
342
+ }
343
+
344
+ pub(crate) fn local_op(
345
+ &mut self,
346
+ doc: &mut Automerge,
347
+ patch_log: &mut PatchLog,
348
+ obj: &ObjMeta,
349
+ prop: Prop,
350
+ action: OpType,
351
+ ) -> Result<Option<OpId>, AutomergeError> {
352
+ match prop {
353
+ Prop::Map(s) => self.local_map_op(doc, patch_log, obj, s, action),
354
+ Prop::Seq(n) => self.local_list_op(doc, patch_log, obj, n, action),
355
+ }
356
+ }
357
+
358
+ fn local_map_op(
359
+ &mut self,
360
+ doc: &mut Automerge,
361
+ patch_log: &mut PatchLog,
362
+ obj: &ObjMeta,
363
+ prop: String,
364
+ action: OpType,
365
+ ) -> Result<Option<OpId>, AutomergeError> {
366
+ let id = self.next_id();
367
+
368
+ let mut query = doc
369
+ .ops()
370
+ .seek_ops_by_map_key(&obj.id, &prop, self.scope.as_ref());
371
+
372
+ let Some(resolved_action) = query.resolve_action(action) else {
373
+ return Ok(None);
374
+ };
375
+
376
+ // increment operations are only valid against counter values.
377
+ // if there are multiple values (from conflicts) then we just need one of them to be a counter.
378
+ if resolved_action.is_increment() && query.ops.iter().all(|op| !op.is_counter()) {
379
+ return Err(AutomergeError::MissingCounter);
380
+ }
381
+
382
+ let pred = query.ops.iter().map(|op| op.id).collect();
383
+ let op = TxOp::map(id, *obj, query.end_pos, resolved_action, prop, pred);
384
+
385
+ let inc_value = op.get_increment_value();
386
+
387
+ let succ: Vec<_> = query
388
+ .ops
389
+ .iter()
390
+ .map(|op| op.add_succ(id, inc_value))
391
+ .collect();
392
+
393
+ self.insert_local_op(doc, patch_log, op, &succ, query.range);
394
+
395
+ Ok(Some(id))
396
+ }
397
+
398
+ fn local_list_op(
399
+ &mut self,
400
+ doc: &mut Automerge,
401
+ patch_log: &mut PatchLog,
402
+ obj: &ObjMeta,
403
+ index: usize,
404
+ action: OpType,
405
+ ) -> Result<Option<OpId>, AutomergeError> {
406
+ let Some(seq_type) = obj.typ.as_sequence_type() else {
407
+ return Err(AutomergeError::InvalidOp(obj.typ));
408
+ };
409
+ let mut query = doc
410
+ .ops()
411
+ .seek_ops_by_index(&obj.id, index, seq_type, self.scope.as_ref());
412
+ let id = self.next_id();
413
+ let eid = query
414
+ .ops
415
+ .first()
416
+ .and_then(|op| op.cursor().ok())
417
+ .ok_or(AutomergeError::InvalidIndex(index))?;
418
+
419
+ let Some(resolved_action) = query.resolve_action(action) else {
420
+ return Ok(None);
421
+ };
422
+
423
+ // increment operations are only valid against counter values.
424
+ // if there are multiple values (from conflicts) then we just need one of them to be a counter.
425
+
426
+ if resolved_action.is_increment() && query.ops.iter().all(|op| !op.is_counter()) {
427
+ return Err(AutomergeError::MissingCounter);
428
+ }
429
+
430
+ let pred = query.ops.iter().map(|op| op.id).collect();
431
+ let op = TxOp::list(id, *obj, query.end_pos, index, resolved_action, eid, pred);
432
+ let inc_value = op.get_increment_value();
433
+ let succ = query
434
+ .ops
435
+ .iter()
436
+ .map(|op| op.add_succ(id, inc_value))
437
+ .collect::<Vec<_>>();
438
+
439
+ self.insert_local_op(doc, patch_log, op, &succ, query.range);
440
+
441
+ // inserts can delete a conflicted value reveal a counter
442
+ if let Some((i, s)) = succ.iter().rev().enumerate().find(|(_, s)| s.inc.is_some()) {
443
+ if i > 0 {
444
+ doc.ops.expose(s.pos)
445
+ }
446
+ }
447
+
448
+ Ok(Some(id))
449
+ }
450
+
451
+ pub(crate) fn increment<P: Into<Prop>>(
452
+ &mut self,
453
+ doc: &mut Automerge,
454
+ patch_log: &mut PatchLog,
455
+ obj: &ExId,
456
+ prop: P,
457
+ value: i64,
458
+ ) -> Result<(), AutomergeError> {
459
+ let obj = doc.exid_to_obj(obj)?;
460
+ self.local_op(doc, patch_log, &obj, prop.into(), OpType::Increment(value))?;
461
+ Ok(())
462
+ }
463
+
464
+ pub(crate) fn delete<P: Into<Prop>>(
465
+ &mut self,
466
+ doc: &mut Automerge,
467
+ patch_log: &mut PatchLog,
468
+ ex_obj: &ExId,
469
+ prop: P,
470
+ ) -> Result<(), AutomergeError> {
471
+ let obj = doc.exid_to_obj(ex_obj)?;
472
+ let prop = prop.into();
473
+ if obj.typ == ObjType::Text {
474
+ let index = prop.as_index().ok_or(AutomergeError::InvalidOp(obj.typ))?;
475
+ self.inner_splice(
476
+ doc,
477
+ patch_log,
478
+ SpliceArgs {
479
+ obj,
480
+ index,
481
+ del: 1,
482
+ splice_type: SpliceType::Text(""),
483
+ },
484
+ )?;
485
+ } else {
486
+ self.local_op(doc, patch_log, &obj, prop, OpType::Delete)?;
487
+ }
488
+ Ok(())
489
+ }
490
+
491
+ /// Splice new elements into the given sequence. Returns a vector of the OpIds used to insert
492
+ /// the new elements.
493
+ ///
494
+ /// Values can be scalars or nested objects (maps, lists, text). Scalar
495
+ /// values are inserted directly, while nested objects are created using
496
+ /// batch insertion for efficiency.
497
+ pub(crate) fn splice(
498
+ &mut self,
499
+ doc: &mut Automerge,
500
+ patch_log: &mut PatchLog,
501
+ ex_obj: &ExId,
502
+ index: usize,
503
+ del: isize,
504
+ vals: impl IntoIterator<Item = impl Into<hydrate::Value>>,
505
+ ) -> Result<(), AutomergeError> {
506
+ let obj = doc.exid_to_obj(ex_obj)?;
507
+ if !matches!(obj.typ, ObjType::List | ObjType::Text) {
508
+ return Err(AutomergeError::InvalidOp(obj.typ));
509
+ }
510
+ let values: Vec<hydrate::Value> = vals.into_iter().map(Into::into).collect();
511
+ self.inner_splice(
512
+ doc,
513
+ patch_log,
514
+ SpliceArgs {
515
+ obj,
516
+ index,
517
+ del,
518
+ splice_type: SpliceType::List(values),
519
+ },
520
+ )?;
521
+ Ok(())
522
+ }
523
+
524
+ /// Splice string into a text object
525
+ pub(crate) fn splice_text(
526
+ &mut self,
527
+ doc: &mut Automerge,
528
+ patch_log: &mut PatchLog,
529
+ ex_obj: &ExId,
530
+ index: usize,
531
+ del: isize,
532
+ text: &str,
533
+ ) -> Result<(), AutomergeError> {
534
+ let obj = doc.exid_to_obj(ex_obj)?;
535
+ if obj.typ != ObjType::Text {
536
+ return Err(AutomergeError::InvalidOp(obj.typ));
537
+ }
538
+ self.inner_splice(
539
+ doc,
540
+ patch_log,
541
+ SpliceArgs {
542
+ obj,
543
+ index,
544
+ del,
545
+ splice_type: SpliceType::Text(text),
546
+ },
547
+ )
548
+ }
549
+
550
+ fn inner_splice(
551
+ &mut self,
552
+ doc: &mut Automerge,
553
+ patch_log: &mut PatchLog,
554
+ SpliceArgs {
555
+ obj,
556
+ mut index,
557
+ mut del,
558
+ splice_type,
559
+ }: SpliceArgs<'_>,
560
+ ) -> Result<(), AutomergeError> {
561
+ if del < 0 {
562
+ if let Some(n) = index.checked_add_signed(del) {
563
+ index = n;
564
+ del = del.abs();
565
+ } else {
566
+ return Err(AutomergeError::InvalidIndex(index));
567
+ }
568
+ }
569
+
570
+ let seq_type = splice_type.seq_type();
571
+
572
+ let inserted_width = if !splice_type.is_empty() {
573
+ let query = doc
574
+ .ops()
575
+ .query_insert_at(&obj.id, index, seq_type, self.scope.clone())?;
576
+
577
+ index = query.index;
578
+
579
+ let inserted_width = match splice_type {
580
+ SpliceType::Text(t) => {
581
+ let mut batch = BatchInsertion::new(self, doc, patch_log, query.pos);
582
+ let SpliceResult { inserted_width } =
583
+ batch.splice_text(obj, query.index, query.elemid, t, query.marks);
584
+ batch.finish();
585
+ inserted_width
586
+ }
587
+ SpliceType::List(values) => {
588
+ let num_values = values.len();
589
+ let mut queue: VecDeque<(ObjMeta, &hydrate::Value)> = VecDeque::new();
590
+
591
+ // Batch 1: root insert ops at query.pos
592
+ {
593
+ let mut batch = BatchInsertion::new(self, doc, patch_log, query.pos);
594
+ let mut elemid = query.elemid;
595
+
596
+ for (i, value) in values.iter().enumerate() {
597
+ let (child_obj_type, op_type) = value_to_op_type(value);
598
+
599
+ let id = batch.append(move |pos, id| {
600
+ TxOp::insert(id, obj, pos, query.index + i, op_type, elemid)
601
+ });
602
+ elemid = ElemId(id);
603
+
604
+ if let Some(obj_type) = child_obj_type {
605
+ let child_obj_meta = ObjMeta {
606
+ id: crate::types::ObjId(id),
607
+ typ: obj_type,
608
+ };
609
+ queue.push_back((child_obj_meta, value));
610
+ }
611
+ }
612
+
613
+ batch.finish();
614
+ }
615
+
616
+ // Batch 2: all descendants at end of OpSet
617
+ if !queue.is_empty() {
618
+ let desc_pos = doc.ops().len();
619
+ let mut batch = BatchInsertion::new(self, doc, patch_log, desc_pos);
620
+ batch_bfs(&mut batch, &mut queue)?;
621
+ batch.finish();
622
+ }
623
+
624
+ num_values
625
+ }
626
+ };
627
+
628
+ inserted_width
629
+ } else {
630
+ 0
631
+ };
632
+
633
+ // delete `del` items - performing the query for each one
634
+ let mut delete_index = index + inserted_width;
635
+ let mut deleted: usize = 0;
636
+ while deleted < (del as usize) {
637
+ // TODO: could do this with a single custom query
638
+
639
+ let query =
640
+ doc.ops()
641
+ .seek_ops_by_index(&obj.id, delete_index, seq_type, self.scope.as_ref());
642
+
643
+ let step = if let Some(op) = query.ops.last() {
644
+ op.width(seq_type, doc.text_encoding())
645
+ } else {
646
+ break;
647
+ };
648
+
649
+ // if we delete in the middle of a multi-character
650
+ // move cursor to the next character
651
+ if query.index < delete_index {
652
+ delete_index = query.index + step;
653
+ continue;
654
+ }
655
+
656
+ let query_elemid = query.elemid().ok_or(AutomergeError::InvalidIndex(index))?;
657
+ let op = self.next_delete(obj, delete_index, query_elemid, &query.ops);
658
+ let ops_pos = query
659
+ .ops
660
+ .iter()
661
+ .map(|o| o.add_succ(op.id(), None))
662
+ .collect::<Vec<_>>();
663
+
664
+ doc.ops_mut().add_succ(&ops_pos);
665
+
666
+ deleted += step;
667
+
668
+ self.pending.push(op);
669
+ }
670
+
671
+ if deleted > 0 && patch_log.is_active() {
672
+ patch_log.delete_seq(obj.id, delete_index, deleted);
673
+ }
674
+
675
+ Ok(())
676
+ }
677
+
678
+ pub(crate) fn mark(
679
+ &mut self,
680
+ doc: &mut Automerge,
681
+ patch_log: &mut PatchLog,
682
+ ex_obj: &ExId,
683
+ mark: Mark,
684
+ expand: ExpandMark,
685
+ ) -> Result<(), AutomergeError> {
686
+ let obj = doc.exid_to_obj(ex_obj)?;
687
+ if ObjType::Text != obj.typ {
688
+ return Err(AutomergeError::InvalidOp(obj.typ));
689
+ }
690
+ if mark.start == mark.end && expand == ExpandMark::None {
691
+ // In peritext terms this is the same as a mark which has a begin anchor before one
692
+ // character and an end anchor after the character preceding that character. E.g in the
693
+ // following sequence where the "<",">" symbols represent the mark anchor points:
694
+ //
695
+ // | | | | | |
696
+ // < a > < b > < c >
697
+ // | | | | | |
698
+ //
699
+ // A mark from 1 to 1 with expand set to none would begin at the anchor point before
700
+ // "b" and end at the anchor point after "a". This is nonsensical so we ignore it.
701
+ return Ok(());
702
+ }
703
+ let action = OpType::MarkBegin(expand.before(), mark.old_data());
704
+
705
+ self.do_insert(doc, patch_log, &obj, SequenceType::Text, mark.start, action)?;
706
+ self.do_insert(
707
+ doc,
708
+ patch_log,
709
+ &obj,
710
+ SequenceType::Text,
711
+ mark.end,
712
+ OpType::MarkEnd(expand.after()),
713
+ )?;
714
+ if patch_log.is_active() {
715
+ patch_log.mark(obj.id, mark.start, mark.len(), &mark.into_mark_set());
716
+ }
717
+ Ok(())
718
+ }
719
+
720
+ #[allow(clippy::too_many_arguments)]
721
+ pub(crate) fn unmark(
722
+ &mut self,
723
+ doc: &mut Automerge,
724
+ patch_log: &mut PatchLog,
725
+ ex_obj: &ExId,
726
+ name: &str,
727
+ start: usize,
728
+ end: usize,
729
+ expand: ExpandMark,
730
+ ) -> Result<(), AutomergeError> {
731
+ let mark = Mark::new(name.to_string(), ScalarValue::Null, start, end);
732
+ self.mark(doc, patch_log, ex_obj, mark, expand)
733
+ }
734
+
735
+ pub(crate) fn split_block(
736
+ &mut self,
737
+ doc: &mut Automerge,
738
+ patch_log: &mut PatchLog,
739
+ ex_obj: &ExId,
740
+ index: usize,
741
+ ) -> Result<ExId, AutomergeError> {
742
+ let obj = doc.exid_to_obj(ex_obj)?;
743
+ if obj.typ != ObjType::Text {
744
+ return Err(AutomergeError::InvalidOp(obj.typ));
745
+ }
746
+
747
+ let query =
748
+ doc.ops()
749
+ .query_insert_at(&obj.id, index, SequenceType::Text, self.scope.clone())?;
750
+
751
+ let pos = query.pos;
752
+
753
+ let id = self.next_id();
754
+
755
+ let op = TxOp::insert_obj(id, obj, pos, index, ObjType::Map, query.elemid);
756
+
757
+ doc.ops_mut().splice(op.pos, &[&op]);
758
+
759
+ patch_log.insert(
760
+ obj.id,
761
+ index,
762
+ crate::hydrate::Value::Map(crate::hydrate::Map::default()),
763
+ id,
764
+ false,
765
+ );
766
+
767
+ self.pending.push(op);
768
+
769
+ Ok(doc.ops().id_to_exid(id))
770
+ }
771
+
772
+ pub(crate) fn join_block(
773
+ &mut self,
774
+ doc: &mut Automerge,
775
+ patch_log: &mut PatchLog,
776
+ text: &ExId,
777
+ index: usize,
778
+ ) -> Result<(), AutomergeError> {
779
+ let text_obj = doc.exid_to_obj(text)?;
780
+
781
+ if text_obj.typ != ObjType::Text {
782
+ return Err(AutomergeError::InvalidOp(text_obj.typ));
783
+ }
784
+
785
+ // FIXME - how is this different than a normal delete?
786
+ // 1. can only happen on a text
787
+ // 2. it doesn't seem to validate that what its deleting is a block??
788
+ // --> self.local_op(doc, patch_log, &obj, Prop::Seq(index), OpType::Delete)?;
789
+
790
+ let target = doc
791
+ .ops()
792
+ .seek_ops_by_index(&text_obj.id, index, SequenceType::Text, self.scope.as_ref())
793
+ .ops
794
+ .into_iter()
795
+ .next_back()
796
+ .ok_or(AutomergeError::InvalidIndex(index))?;
797
+ let block_id = target.id;
798
+
799
+ let elemid = target.elemid_or_key().elemid().unwrap();
800
+
801
+ // FIXME - no clock?
802
+ let found = doc
803
+ .ops()
804
+ .seek_list_opid(
805
+ &text_obj.id,
806
+ block_id,
807
+ SequenceType::Text,
808
+ self.scope.as_ref(),
809
+ )
810
+ .unwrap();
811
+
812
+ let op = TxOp::list_del(self.next_id(), text_obj, index, elemid, [found.op.id]);
813
+
814
+ let succ_pos = vec![found.op.add_succ(op.id(), None)];
815
+
816
+ doc.ops_mut().add_succ(&succ_pos);
817
+
818
+ patch_log.delete_seq(text_obj.id, index, 1);
819
+
820
+ self.pending.push(op);
821
+
822
+ Ok(())
823
+ }
824
+
825
+ pub(crate) fn replace_block(
826
+ &mut self,
827
+ doc: &mut Automerge,
828
+ patch_log: &mut PatchLog,
829
+ text: &ExId,
830
+ index: usize,
831
+ ) -> Result<ExId, AutomergeError> {
832
+ self.join_block(doc, patch_log, text, index)?;
833
+ self.split_block(doc, patch_log, text, index)
834
+ }
835
+
836
+ fn finalize_op(
837
+ &mut self,
838
+ encoding: TextEncoding,
839
+ patch_log: &mut PatchLog,
840
+ op: &TxOp,
841
+ marks: Option<Arc<MarkSet>>,
842
+ ) {
843
+ let obj_typ = op.obj_type;
844
+ let obj = op.bld.obj;
845
+ if patch_log.is_active() && !op.noop {
846
+ if op.bld.insert {
847
+ if !op.is_mark() {
848
+ assert!(obj_typ.is_sequence());
849
+ match (obj_typ, op.prop()) {
850
+ (ObjType::List, PropRef::Seq(index)) => {
851
+ patch_log.insert(
852
+ obj,
853
+ index,
854
+ op.hydrate_value(encoding),
855
+ op.id(),
856
+ false,
857
+ );
858
+ }
859
+ (ObjType::Text, PropRef::Seq(index)) => {
860
+ patch_log.splice(obj, index, op.as_str(), marks);
861
+ }
862
+ _ => {}
863
+ }
864
+ }
865
+ } else if op.is_delete() {
866
+ match op.prop() {
867
+ PropRef::Seq(index) => patch_log.delete_seq(obj, index, 1),
868
+ PropRef::Map(key) => patch_log.delete_map(obj, &key),
869
+ }
870
+ } else if let Some(value) = op.get_increment_value() {
871
+ patch_log.increment(obj, op.prop(), value, op.id());
872
+ } else {
873
+ patch_log.put(
874
+ obj,
875
+ op.prop(),
876
+ op.hydrate_value(encoding),
877
+ op.id(),
878
+ false,
879
+ false,
880
+ );
881
+ }
882
+ }
883
+ }
884
+
885
+ pub(crate) fn update_object(
886
+ &mut self,
887
+ doc: &mut Automerge,
888
+ patch_log: &mut PatchLog,
889
+ obj: &ExId,
890
+ new_value: &crate::hydrate::Value,
891
+ ) -> Result<(), crate::error::UpdateObjectError> {
892
+ let obj_meta = doc.exid_to_obj(obj)?;
893
+ match (obj_meta.typ, new_value) {
894
+ (ObjType::Map, crate::hydrate::Value::Map(map)) => {
895
+ Ok(self.update_map(doc, patch_log, obj, map)?)
896
+ }
897
+ (ObjType::List, crate::hydrate::Value::List(list)) => {
898
+ Ok(self.update_list(doc, patch_log, obj, list)?)
899
+ }
900
+ (ObjType::Text, crate::hydrate::Value::Text(new_text)) => {
901
+ Ok(crate::text_diff::myers_diff(
902
+ doc,
903
+ self,
904
+ patch_log,
905
+ obj,
906
+ new_text.to_string().as_str(),
907
+ )?)
908
+ }
909
+ _ => Err(crate::error::UpdateObjectError::ChangeType),
910
+ }
911
+ }
912
+
913
+ pub(crate) fn update_map(
914
+ &mut self,
915
+ doc: &mut Automerge,
916
+ patch_log: &mut PatchLog,
917
+ map: &crate::ObjId,
918
+ new_value: &crate::hydrate::Map,
919
+ ) -> Result<(), AutomergeError> {
920
+ let mut delenda = HashSet::new();
921
+ let obj = doc.exid_to_obj(map)?;
922
+ let current_vals = doc
923
+ .ops()
924
+ .map_range(&obj.id, .., self.scope.clone())
925
+ .map(|m| (m.key.to_string(), m.value.to_value(), m.id()))
926
+ .collect::<Vec<_>>();
927
+
928
+ let mut present_keys = HashSet::new();
929
+ for (key, value, id) in current_vals {
930
+ present_keys.insert(key.clone());
931
+ match new_value.get(&key) {
932
+ Some(new_value) => self.update_value(
933
+ doc,
934
+ patch_log,
935
+ map,
936
+ key.into(),
937
+ new_value,
938
+ Some((id, value)),
939
+ )?,
940
+ None => {
941
+ delenda.insert(key.clone());
942
+ }
943
+ }
944
+ }
945
+ for (key, new_value) in new_value.iter() {
946
+ if !present_keys.contains(key) {
947
+ self.update_value(doc, patch_log, map, key.into(), &new_value.value, None)?;
948
+ }
949
+ }
950
+ for key in delenda {
951
+ self.delete(doc, patch_log, map, key)?;
952
+ }
953
+ Ok(())
954
+ }
955
+
956
+ pub(crate) fn update_list(
957
+ &mut self,
958
+ doc: &mut Automerge,
959
+ patch_log: &mut PatchLog,
960
+ list: &crate::ObjId,
961
+ new_value: &crate::hydrate::List,
962
+ ) -> Result<(), AutomergeError> {
963
+ let old_items = doc
964
+ .list_range(list, ..)
965
+ .map(|item| Some((item.value.to_value(), item.id())))
966
+ .collect::<Vec<_>>()
967
+ .into_iter()
968
+ .chain(std::iter::repeat_with(|| None));
969
+ let new_values = new_value
970
+ .iter()
971
+ .map(Some)
972
+ .chain(std::iter::repeat_with(|| None));
973
+
974
+ let mut to_delete = 0;
975
+ for (index, (old, new)) in std::iter::zip(old_items, new_values).enumerate() {
976
+ match (old, new) {
977
+ (Some((value, id)), Some(new_value)) => {
978
+ self.update_value(
979
+ doc,
980
+ patch_log,
981
+ list,
982
+ Prop::Seq(index),
983
+ &new_value.value,
984
+ Some((id, value)),
985
+ )?;
986
+ }
987
+ (Some(_), None) => {
988
+ to_delete += 1;
989
+ }
990
+ (None, Some(new_value)) => {
991
+ self.update_value(
992
+ doc,
993
+ patch_log,
994
+ list,
995
+ Prop::Seq(index),
996
+ &new_value.value,
997
+ None,
998
+ )?;
999
+ }
1000
+ (None, None) => {
1001
+ break;
1002
+ }
1003
+ }
1004
+ }
1005
+ for i in (0..to_delete).rev() {
1006
+ self.delete(doc, patch_log, list, Prop::Seq(i))?;
1007
+ }
1008
+ Ok(())
1009
+ }
1010
+
1011
+ fn update_value(
1012
+ &mut self,
1013
+ doc: &mut Automerge,
1014
+ patch_log: &mut PatchLog,
1015
+ parent: &crate::ObjId,
1016
+ key: Prop,
1017
+ new_value: &crate::hydrate::Value,
1018
+ old_value: Option<(ExId, crate::Value<'_>)>,
1019
+ ) -> Result<(), AutomergeError> {
1020
+ match (old_value, new_value) {
1021
+ (Some((id, crate::Value::Object(ObjType::Map))), crate::hydrate::Value::Map(new)) => {
1022
+ self.update_map(doc, patch_log, &id, new)
1023
+ }
1024
+ (Some((id, crate::Value::Object(ObjType::List))), crate::hydrate::Value::List(new)) => {
1025
+ self.update_list(doc, patch_log, &id, new)
1026
+ }
1027
+ (Some((id, crate::Value::Object(ObjType::Text))), crate::hydrate::Value::Text(new)) => {
1028
+ crate::text_diff::myers_diff(doc, self, patch_log, &id, new.to_string().as_str())
1029
+ }
1030
+ (old, new) => {
1031
+ // Here we are either changing the type of the existing object, or inserting an
1032
+ // entirely new object
1033
+ let mut make_obj = |typ: ObjType| match (&old, &key) {
1034
+ (None, Prop::Seq(index)) => {
1035
+ self.insert_object(doc, patch_log, parent, *index, typ)
1036
+ }
1037
+ _ => self.put_object(doc, patch_log, parent, key.clone(), typ),
1038
+ };
1039
+ match new {
1040
+ crate::hydrate::Value::Map(new) => {
1041
+ let map_id = make_obj(ObjType::Map)?;
1042
+ self.update_map(doc, patch_log, &map_id, new)
1043
+ }
1044
+
1045
+ crate::hydrate::Value::List(new) => {
1046
+ let list_id = make_obj(ObjType::List)?;
1047
+ self.update_list(doc, patch_log, &list_id, new)
1048
+ }
1049
+
1050
+ crate::hydrate::Value::Text(new) => {
1051
+ let text_id = make_obj(ObjType::Text)?;
1052
+ self.splice_text(doc, patch_log, &text_id, 0, 0, new.to_string().as_str())
1053
+ }
1054
+
1055
+ crate::hydrate::Value::Scalar(val) => match (old, &key) {
1056
+ (None, Prop::Seq(index)) => {
1057
+ self.insert(doc, patch_log, parent, *index, val.clone())
1058
+ }
1059
+ _ => self.put(doc, patch_log, parent, key.clone(), val.clone()),
1060
+ },
1061
+ }
1062
+ }
1063
+ }
1064
+ }
1065
+
1066
+ /// Put or insert a nested `hydrate::Value` into the document as a batch
1067
+ /// operation.
1068
+ ///
1069
+ /// This is much more efficient than decomposing the value into individual
1070
+ /// put/insert operations because it only requires two OpSet splices:
1071
+ /// one for the root op in the parent, and one bulk append for all descendants.
1072
+ ///
1073
+ /// When `insert` is true and `prop` is `Prop::Seq`, the value is inserted
1074
+ /// at the given index (shifting subsequent elements). When `insert` is
1075
+ /// false, the value replaces the existing element at that index. For
1076
+ /// `Prop::Map` the `insert` flag is ignored (maps always use put semantics).
1077
+ pub(crate) fn batch_create_object(
1078
+ &mut self,
1079
+ doc: &mut Automerge,
1080
+ patch_log: &mut PatchLog,
1081
+ ex_parent: &ExId,
1082
+ prop: Prop,
1083
+ value: &hydrate::Value,
1084
+ insert: bool,
1085
+ ) -> Result<ExId, AutomergeError> {
1086
+ let parent = doc.exid_to_obj(ex_parent)?;
1087
+
1088
+ // Determine the ObjType for the root of the value being inserted
1089
+ let root_obj_type = match value {
1090
+ hydrate::Value::Map(_) => ObjType::Map,
1091
+ hydrate::Value::List(_) => ObjType::List,
1092
+ hydrate::Value::Text(_) => ObjType::Text,
1093
+ hydrate::Value::Scalar(_) => return Err(AutomergeError::NotAnObject),
1094
+ };
1095
+
1096
+ // First insert the root of the new object
1097
+ let root_id = match (&prop, insert) {
1098
+ (Prop::Seq(index), true) => self.do_insert(
1099
+ doc,
1100
+ patch_log,
1101
+ &parent,
1102
+ parent
1103
+ .typ
1104
+ .as_sequence_type()
1105
+ .ok_or(AutomergeError::InvalidOp(parent.typ))?,
1106
+ *index,
1107
+ OpType::Make(root_obj_type),
1108
+ )?,
1109
+ _ => self
1110
+ .local_op(doc, patch_log, &parent, prop, OpType::Make(root_obj_type))?
1111
+ .expect("creating a new object"),
1112
+ };
1113
+
1114
+ let root_obj_id = crate::types::ObjId(root_id);
1115
+ let root_obj_meta = ObjMeta {
1116
+ id: root_obj_id,
1117
+ typ: root_obj_type,
1118
+ };
1119
+
1120
+ let mut queue: VecDeque<(ObjMeta, &hydrate::Value)> = VecDeque::new();
1121
+ queue.push_back((root_obj_meta, value));
1122
+ let insert_pos = doc.ops().len();
1123
+ let mut batch = BatchInsertion::new(self, doc, patch_log, insert_pos);
1124
+
1125
+ batch_bfs(&mut batch, &mut queue)?;
1126
+
1127
+ batch.finish();
1128
+
1129
+ Ok(doc.id_to_exid(root_id))
1130
+ }
1131
+
1132
+ /// Initialize the root object of an empty document from a `hydrate::Map`.
1133
+ pub(crate) fn batch_init_root_map(
1134
+ &mut self,
1135
+ doc: &mut Automerge,
1136
+ patch_log: &mut PatchLog,
1137
+ value: &hydrate::Map,
1138
+ ) -> Result<(), AutomergeError> {
1139
+ let root_meta = ObjMeta {
1140
+ id: crate::types::ObjId::root(),
1141
+ typ: ObjType::Map,
1142
+ };
1143
+
1144
+ let insert_pos = doc.ops().len();
1145
+ let mut batch = BatchInsertion::new(self, doc, patch_log, insert_pos);
1146
+ let mut queue: VecDeque<(ObjMeta, &hydrate::Value)> = VecDeque::new();
1147
+
1148
+ let mut keys: Vec<_> = value.iter().collect();
1149
+ keys.sort_by(|(a, _), (b, _)| a.cmp(b));
1150
+
1151
+ for (key, map_value) in keys {
1152
+ let child_value = &map_value.value;
1153
+ let (child_obj_type, op_type) = value_to_op_type(child_value);
1154
+
1155
+ let id = batch.append(|pos, id| {
1156
+ TxOp::map(
1157
+ id,
1158
+ root_meta,
1159
+ pos,
1160
+ ResolvedAction::VisibleUpdate(op_type),
1161
+ key.to_string(),
1162
+ vec![],
1163
+ )
1164
+ });
1165
+
1166
+ if let Some(obj_type) = child_obj_type {
1167
+ let child_obj_meta = ObjMeta {
1168
+ id: crate::types::ObjId(id),
1169
+ typ: obj_type,
1170
+ };
1171
+ queue.push_back((child_obj_meta, child_value));
1172
+ }
1173
+ }
1174
+
1175
+ batch_bfs(&mut batch, &mut queue)?;
1176
+
1177
+ batch.finish();
1178
+ Ok(())
1179
+ }
1180
+
1181
+ pub(crate) fn get_scope(&self) -> &Option<Clock> {
1182
+ &self.scope
1183
+ }
1184
+
1185
+ pub(crate) fn get_deps(&self) -> Vec<ChangeHash> {
1186
+ self.deps.clone()
1187
+ }
1188
+ }
1189
+
1190
+ enum SpliceType<'a> {
1191
+ List(Vec<hydrate::Value>),
1192
+ Text(&'a str),
1193
+ }
1194
+
1195
+ impl SpliceType<'_> {
1196
+ fn seq_type(&self) -> SequenceType {
1197
+ match self {
1198
+ SpliceType::List(_) => SequenceType::List,
1199
+ SpliceType::Text(_) => SequenceType::Text,
1200
+ }
1201
+ }
1202
+
1203
+ fn is_empty(&self) -> bool {
1204
+ match self {
1205
+ Self::List(v) => v.is_empty(),
1206
+ Self::Text(v) => v.is_empty(),
1207
+ }
1208
+ }
1209
+ }
1210
+
1211
+ struct SpliceArgs<'a> {
1212
+ obj: ObjMeta,
1213
+ index: usize,
1214
+ del: isize,
1215
+ splice_type: SpliceType<'a>,
1216
+ }
1217
+
1218
+ struct BatchInsertion<'a> {
1219
+ inner: &'a mut TransactionInner,
1220
+ doc: &'a mut Automerge,
1221
+ patch_log: &'a mut PatchLog,
1222
+ pending_start: usize,
1223
+ insert_pos: usize,
1224
+ }
1225
+
1226
+ impl<'a> BatchInsertion<'a> {
1227
+ fn new(
1228
+ inner: &'a mut TransactionInner,
1229
+ doc: &'a mut Automerge,
1230
+ patch_log: &'a mut PatchLog,
1231
+ start_pos: usize,
1232
+ ) -> Self {
1233
+ let pending_start = inner.pending.len();
1234
+ Self {
1235
+ inner,
1236
+ doc,
1237
+ patch_log,
1238
+ pending_start,
1239
+ insert_pos: start_pos,
1240
+ }
1241
+ }
1242
+
1243
+ fn next_pos(&self) -> usize {
1244
+ self.inner.pending[self.pending_start..].len() + self.insert_pos
1245
+ }
1246
+
1247
+ fn append<F: FnOnce(usize, OpId) -> TxOp>(&mut self, factory: F) -> OpId {
1248
+ let id = self.inner.next_id();
1249
+ let op = factory(self.next_pos(), id);
1250
+ self.inner
1251
+ .finalize_op(self.doc.text_encoding(), self.patch_log, &op, None);
1252
+ self.inner.pending.push(op);
1253
+ id
1254
+ }
1255
+
1256
+ fn splice_text(
1257
+ &mut self,
1258
+ container: ObjMeta,
1259
+ index: usize,
1260
+ after: ElemId,
1261
+ text_str: &str,
1262
+ marks: Option<Arc<MarkSet>>,
1263
+ ) -> SpliceResult {
1264
+ let char_values: Vec<ScalarValue> = match self.doc.text_encoding() {
1265
+ // Arguably we should do this for all text, rather than just the grapheme cluster encoding.
1266
+ // However, at the time which I (Alex Good) am writing this code the existing implementation
1267
+ // uses the unicode code points and the grapheme cluster text encoding is a new thing. I
1268
+ // don't want to change the existing behaviour for the existing text encodings without a
1269
+ // little more thought.
1270
+ TextEncoding::GraphemeCluster => {
1271
+ text_str.graphemes(true).map(ScalarValue::from).collect()
1272
+ }
1273
+ _ => text_str.chars().map(ScalarValue::from).collect(),
1274
+ };
1275
+ let mut inserted_width = 0;
1276
+ let mut elemid = after;
1277
+ for char in char_values {
1278
+ let op = TxOp::insert_val(
1279
+ self.inner.next_id(),
1280
+ container,
1281
+ self.next_pos(),
1282
+ char,
1283
+ elemid,
1284
+ );
1285
+ inserted_width += op.bld.width(SequenceType::Text, self.doc.text_encoding());
1286
+ elemid = ElemId(op.id());
1287
+ self.inner.pending.push(op);
1288
+ }
1289
+
1290
+ if self.patch_log.is_active() {
1291
+ self.patch_log.splice(container.id, index, text_str, marks);
1292
+ }
1293
+
1294
+ SpliceResult { inserted_width }
1295
+ }
1296
+
1297
+ fn finish(self) {
1298
+ let new_ops = &self.inner.pending[self.pending_start..];
1299
+ if !new_ops.is_empty() {
1300
+ self.doc.ops_mut().splice(self.insert_pos, new_ops);
1301
+ }
1302
+ }
1303
+ }
1304
+
1305
+ struct SpliceResult {
1306
+ inserted_width: usize,
1307
+ }
1308
+
1309
+ fn value_to_op_type(value: &hydrate::Value) -> (Option<ObjType>, OpType) {
1310
+ match value {
1311
+ hydrate::Value::Map(_) => (Some(ObjType::Map), OpType::Make(ObjType::Map)),
1312
+ hydrate::Value::List(_) => (Some(ObjType::List), OpType::Make(ObjType::List)),
1313
+ hydrate::Value::Text(_) => (Some(ObjType::Text), OpType::Make(ObjType::Text)),
1314
+ hydrate::Value::Scalar(s) => (None, OpType::Put(s.clone())),
1315
+ }
1316
+ }
1317
+
1318
+ /// BFS traversal of nested hydrate values, appending ops to a `BatchInsertion`.
1319
+ ///
1320
+ /// This is the shared logic used by `batch_create_object`, `batch_init_map`,
1321
+ /// and `inner_splice` to populate the children of container objects.
1322
+ fn batch_bfs(
1323
+ batch: &mut BatchInsertion<'_>,
1324
+ queue: &mut VecDeque<(ObjMeta, &'_ hydrate::Value)>,
1325
+ ) -> Result<(), AutomergeError> {
1326
+ while let Some((container_meta, container_value)) = queue.pop_front() {
1327
+ match (container_meta.typ, container_value) {
1328
+ (ObjType::Map, hydrate::Value::Map(map)) => {
1329
+ let mut keys: Vec<_> = map.iter().collect();
1330
+ keys.sort_by(|(a, _), (b, _)| a.cmp(b));
1331
+
1332
+ for (key, map_value) in keys {
1333
+ let child_value = &map_value.value;
1334
+ let (child_obj_type, op_type) = value_to_op_type(child_value);
1335
+
1336
+ let id = batch.append(|pos, id| {
1337
+ TxOp::map(
1338
+ id,
1339
+ container_meta,
1340
+ pos,
1341
+ ResolvedAction::VisibleUpdate(op_type),
1342
+ key.to_string(),
1343
+ vec![],
1344
+ )
1345
+ });
1346
+
1347
+ if let Some(obj_type) = child_obj_type {
1348
+ let child_obj_meta = ObjMeta {
1349
+ id: crate::types::ObjId(id),
1350
+ typ: obj_type,
1351
+ };
1352
+ queue.push_back((child_obj_meta, child_value));
1353
+ }
1354
+ }
1355
+ }
1356
+ (ObjType::List, hydrate::Value::List(list)) => {
1357
+ let mut elemid = HEAD;
1358
+ for (index, list_value) in list.iter().enumerate() {
1359
+ let child_value = &list_value.value;
1360
+ let (child_obj_type, op_type) = value_to_op_type(child_value);
1361
+
1362
+ let id = batch.append(move |pos, id| {
1363
+ TxOp::insert(id, container_meta, pos, index, op_type, elemid)
1364
+ });
1365
+ elemid = ElemId(id);
1366
+
1367
+ if let Some(obj_type) = child_obj_type {
1368
+ let child_obj_meta = ObjMeta {
1369
+ id: crate::types::ObjId(id),
1370
+ typ: obj_type,
1371
+ };
1372
+ queue.push_back((child_obj_meta, child_value));
1373
+ }
1374
+ }
1375
+ }
1376
+ (ObjType::Text, hydrate::Value::Text(text)) => {
1377
+ let text_str = text.to_string();
1378
+ batch.splice_text(container_meta, 0, ElemId::head(), &text_str, None);
1379
+ }
1380
+ _ => {
1381
+ return Err(AutomergeError::InvalidOp(container_meta.typ));
1382
+ }
1383
+ }
1384
+ }
1385
+ Ok(())
1386
+ }
1387
+
1388
+ #[cfg(test)]
1389
+ mod tests {
1390
+ use crate::{transaction::Transactable, ReadDoc, ROOT};
1391
+
1392
+ use super::*;
1393
+
1394
+ #[test]
1395
+ fn map_rollback_doesnt_panic() {
1396
+ let mut doc = Automerge::new();
1397
+ let mut tx = doc.transaction();
1398
+
1399
+ let a = tx.put_object(ROOT, "a", ObjType::Map).unwrap();
1400
+ tx.put(&a, "b", 1).unwrap();
1401
+ assert!(tx.get(&a, "b").unwrap().is_some());
1402
+ }
1403
+ }