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,1286 @@
1
+ use std::ops::RangeBounds;
2
+
3
+ use crate::automerge::SaveOptions;
4
+ use crate::clock::Clock;
5
+ use crate::cursor::{CursorPosition, MoveCursor};
6
+ use crate::exid::ExId;
7
+ use crate::iter::{DiffIter, DocIter, Keys, ListRange, MapRange, Span, Spans, Values};
8
+ use crate::marks::UpdateSpansConfig;
9
+ use crate::marks::{ExpandMark, Mark, MarkSet};
10
+ use crate::op_set2::{ChangeMetadata, Parents};
11
+ use crate::patches::PatchLog;
12
+ use crate::sync::SyncDoc;
13
+ use crate::transaction::{CommitOptions, Transactable};
14
+ use crate::types::{ObjId, ObjMeta};
15
+ use crate::{hydrate, Bundle, OnPartialLoad, TextEncoding};
16
+ use crate::{sync, ObjType, Patch, ReadDoc, ScalarValue, ROOT};
17
+ use crate::{
18
+ transaction::TransactionInner, ActorId, Automerge, AutomergeError, Change, ChangeHash, Cursor,
19
+ Prop, Value,
20
+ };
21
+ use crate::{LoadOptions, VerificationMode};
22
+
23
+ /// An automerge document that automatically manages transactions.
24
+ ///
25
+ /// ## Creating, loading, merging and forking documents
26
+ ///
27
+ /// A new document can be created with [`Self::new()`], which will create a document with a random
28
+ /// [`ActorId`]. Existing documents can be loaded with [`Self::load()`].
29
+ ///
30
+ /// If you have two documents and you want to merge the changes from one into the other you can use
31
+ /// [`Self::merge()`].
32
+ ///
33
+ /// If you have a document you want to split into two concurrent threads of execution you can use
34
+ /// [`Self::fork()`]. If you want to split a document from ealier in its history you can use
35
+ /// [`Self::fork_at()`].
36
+ ///
37
+ /// ## Reading values
38
+ ///
39
+ /// [`Self`] implements [`ReadDoc`], which provides methods for reading values from the document.
40
+ ///
41
+ /// ## Modifying a document
42
+ ///
43
+ /// This type implements [`Transactable`] directly, so you can modify it using methods from [`Transactable`].
44
+ ///
45
+ /// ## Synchronization
46
+ ///
47
+ /// To synchronise call [`Self::sync()`] which returns an implementation of [`SyncDoc`]
48
+ ///
49
+ /// ## Patches, maintaining materialized views
50
+ ///
51
+ /// [`AutoCommit`] allows you to generate [`Patch`]es representing changes to the current state of
52
+ /// the document which you can use to maintain a materialized view of the current state. There are
53
+ /// several ways to use this. See the documentation on [`Self::diff()`] for more details, but the key
54
+ /// point to remember is that [`AutoCommit`] manages an internal "diff cursor" for you. This is a
55
+ /// representation of the heads of the document last time you called [`Self::diff_incremental()`]
56
+ /// but you can also manage it directly using [`Self::update_diff_cursor()`] and
57
+ /// [`Self::reset_diff_cursor()`].
58
+ #[derive(Debug, Clone)]
59
+ pub struct AutoCommit {
60
+ pub(crate) doc: Automerge,
61
+ transaction: Option<(PatchLog, TransactionInner)>,
62
+ patch_log: PatchLog,
63
+ diff_cursor: Vec<ChangeHash>,
64
+ diff_cache: Option<(OpRange, ObjId, bool, Vec<Patch>)>,
65
+ save_cursor: Vec<ChangeHash>,
66
+ isolation: Option<Vec<ChangeHash>>,
67
+ }
68
+
69
+ /// An autocommit document with an inactive [`PatchLog`]
70
+ ///
71
+ /// See [`AutoCommit`]
72
+ impl Default for AutoCommit {
73
+ fn default() -> Self {
74
+ AutoCommit {
75
+ doc: Automerge::new(),
76
+ transaction: None,
77
+ patch_log: PatchLog::inactive(),
78
+ diff_cursor: Vec::new(),
79
+ diff_cache: None,
80
+ save_cursor: Vec::new(),
81
+ isolation: None,
82
+ }
83
+ }
84
+ }
85
+
86
+ impl AutoCommit {
87
+ pub fn new() -> AutoCommit {
88
+ AutoCommit::default()
89
+ }
90
+
91
+ pub fn diff_opset(&self, other: &AutoCommit) -> Result<(), AutomergeError> {
92
+ self.doc.diff_opset(&other.doc)
93
+ }
94
+
95
+ pub fn new_with_encoding(encoding: TextEncoding) -> AutoCommit {
96
+ let doc = Automerge::new_with_encoding(encoding);
97
+ AutoCommit {
98
+ doc,
99
+ transaction: None,
100
+ patch_log: PatchLog::inactive(),
101
+ diff_cursor: Vec::new(),
102
+ diff_cache: None,
103
+ save_cursor: Vec::new(),
104
+ isolation: None,
105
+ }
106
+ }
107
+
108
+ pub fn load(data: &[u8]) -> Result<Self, AutomergeError> {
109
+ let doc = Automerge::load(data)?;
110
+ Ok(Self {
111
+ doc,
112
+ transaction: None,
113
+ patch_log: PatchLog::inactive(),
114
+ diff_cursor: Vec::new(),
115
+ diff_cache: None,
116
+ save_cursor: Vec::new(),
117
+ isolation: None,
118
+ })
119
+ }
120
+
121
+ pub fn load_unverified_heads(data: &[u8]) -> Result<Self, AutomergeError> {
122
+ let doc = Automerge::load_unverified_heads(data)?;
123
+ Ok(Self {
124
+ doc,
125
+ transaction: None,
126
+ patch_log: PatchLog::inactive(),
127
+ diff_cursor: Vec::new(),
128
+ diff_cache: None,
129
+ save_cursor: Vec::new(),
130
+ isolation: None,
131
+ })
132
+ }
133
+
134
+ #[deprecated(since = "0.5.2", note = "use `load_with_options` instead")]
135
+ pub fn load_with(
136
+ data: &[u8],
137
+ on_error: OnPartialLoad,
138
+ mode: VerificationMode,
139
+ ) -> Result<Self, AutomergeError> {
140
+ Self::load_with_options(
141
+ data,
142
+ LoadOptions::new()
143
+ .on_partial_load(on_error)
144
+ .verification_mode(mode),
145
+ )
146
+ }
147
+
148
+ pub fn load_with_options(
149
+ data: &[u8],
150
+ options: LoadOptions<'_>,
151
+ ) -> Result<Self, AutomergeError> {
152
+ let doc = Automerge::load_with_options(data, options)?;
153
+ Ok(Self {
154
+ doc,
155
+ transaction: None,
156
+ patch_log: PatchLog::inactive(),
157
+ diff_cursor: Vec::new(),
158
+ diff_cache: None,
159
+ save_cursor: Vec::new(),
160
+ isolation: None,
161
+ })
162
+ }
163
+
164
+ /// Erases the diff cursor created by [`Self::update_diff_cursor()`] and no
165
+ /// longer indexes changes to the document.
166
+ pub fn reset_diff_cursor(&mut self) {
167
+ self.ensure_transaction_closed();
168
+ self.patch_log = PatchLog::inactive();
169
+ self.diff_cursor = Vec::new();
170
+ }
171
+
172
+ /// Sets the [`Self::diff_cursor()`] to current heads of the document and will begin
173
+ /// building an index with every change moving forward.
174
+ ///
175
+ /// If [`Self::diff()`] is called with [`Self::diff_cursor()`] as `before` and
176
+ /// [`Self::get_heads`()] as `after` - the index will be used
177
+ ///
178
+ /// If the cursor is no longer needed it can be reset with
179
+ /// [`Self::reset_diff_cursor()`]
180
+ pub fn update_diff_cursor(&mut self) {
181
+ self.ensure_transaction_closed();
182
+ let heads = self.doc.get_heads();
183
+ if !heads.is_empty() {
184
+ self.patch_log.set_active(true);
185
+ self.patch_log.truncate();
186
+ self.diff_cursor = heads;
187
+ }
188
+ }
189
+
190
+ /// Returns the cursor set by [`Self::update_diff_cursor()`]
191
+ pub fn diff_cursor(&self) -> Vec<ChangeHash> {
192
+ self.diff_cursor.clone()
193
+ }
194
+
195
+ /// Generate the patches recorded in `patch_log`
196
+ pub fn make_patches(&self, patch_log: &mut PatchLog) -> Vec<Patch> {
197
+ self.doc.make_patches(patch_log)
198
+ }
199
+
200
+ /// Generates a diff from `before` to `after`
201
+ ///
202
+ /// By default the diff requires a sequental scan of all the ops in the doc.
203
+ ///
204
+ /// To do a fast indexed diff `before` must equal [`Self::diff_cursor()`] and
205
+ /// `after` must equal [`Self::get_heads()`]. The diff cursor is managed with
206
+ /// [`Self::update_diff_cursor()`] and [`Self::reset_diff_cursor()`]
207
+ ///
208
+ /// Managing the diff index has a small but non-zero overhead. It should be
209
+ /// disabled if no longer needed. If a signifigantly large change is applied
210
+ /// to the document it may be faster to reset the index before applying it,
211
+ /// doing an unindxed diff afterwards and then reenable the index.
212
+ ///
213
+ /// # Arguments
214
+ ///
215
+ /// * `before` - heads from [`Self::get_heads()`] at beginning point in the documents history
216
+ /// * `after` - heads from [`Self::get_heads()`] at ending point in the documents history.
217
+ ///
218
+ /// Note: `before` and `after` do not have to be chronological. Document state can move backward.
219
+ /// Normal use might look like:
220
+ ///
221
+ /// # Example
222
+ ///
223
+ /// ```
224
+ /// use automerge::{ AutoCommit };
225
+ ///
226
+ /// let mut doc = AutoCommit::new(); // or AutoCommit::load(data)
227
+ /// // make some changes - use and update the index
228
+ /// let heads = doc.get_heads();
229
+ /// let diff_cursor = doc.diff_cursor();
230
+ /// let patches = doc.diff(&diff_cursor, &heads);
231
+ /// doc.update_diff_cursor();
232
+ /// ```
233
+ ///
234
+ /// See [`Self::diff_incremental()`] for encapsulating this pattern.
235
+ pub fn diff(&mut self, before: &[ChangeHash], after: &[ChangeHash]) -> Vec<Patch> {
236
+ self.diff_inner(&ExId::Root, ObjMeta::root(), before, after, true)
237
+ }
238
+
239
+ fn diff_inner(
240
+ &mut self,
241
+ exid: &ExId,
242
+ obj: ObjMeta,
243
+ before: &[ChangeHash],
244
+ after: &[ChangeHash],
245
+ recursive: bool,
246
+ ) -> Vec<Patch> {
247
+ self.ensure_transaction_closed();
248
+ let range = OpRange::new(before, after);
249
+ if let Some((r, id, rec, patches)) = &self.diff_cache {
250
+ if r == &range && id == &obj.id && *rec == recursive {
251
+ // we could skip this clone and return &[Patch]
252
+ return patches.clone();
253
+ }
254
+ }
255
+ let heads = self.doc.get_heads();
256
+ let patches = if range.after() == heads
257
+ && range.before() == self.diff_cursor
258
+ && self.patch_log.is_active()
259
+ {
260
+ if obj.id.is_root() && recursive {
261
+ self.patch_log.make_patches(&self.doc)
262
+ } else {
263
+ self.patch_log
264
+ .make_patches(&self.doc)
265
+ .into_iter()
266
+ .filter(|p| p.has(exid, recursive))
267
+ .collect()
268
+ }
269
+ } else if range.before().is_empty() && range.after() == heads {
270
+ let mut patch_log = PatchLog::active();
271
+ // This if statement is only active if the current heads are the same as `after`
272
+ // so we don't need to tell the patch log to target a specific heads and consequently
273
+ // it wll be able to generate patches very fast as it doesn't need to make any clocks
274
+ patch_log.heads = None;
275
+ self.doc.log_current_state(obj, &mut patch_log, recursive);
276
+ patch_log.make_patches(&self.doc)
277
+ } else {
278
+ let clock = self.doc.clock_range(range.before(), range.after());
279
+ let mut patch_log = PatchLog::active();
280
+ patch_log.heads = Some(range.after().to_vec());
281
+ DiffIter::log(&self.doc, obj, clock, &mut patch_log, recursive);
282
+ patch_log.make_patches(&self.doc)
283
+ };
284
+ self.diff_cache = Some((range, obj.id, recursive, patches.clone()));
285
+ patches
286
+ }
287
+
288
+ /// Generates a diff from `before` to `after` for a given `object`
289
+ ///
290
+ /// By default the diff requires a sequental scan of all the ops in the doc.
291
+ ///
292
+ /// [Self::diff()] is the equivelent to [Self::diff_obj(&ROOT, before, after)]
293
+ ///
294
+ /// Managing the diff index has a small but non-zero overhead. It should be
295
+ /// disabled if no longer needed. If a signifigantly large change is applied
296
+ /// to the document it may be faster to reset the index before applying it,
297
+ /// doing an unindxed diff afterwards and then reenable the index.
298
+ ///
299
+ /// # Arguments
300
+ ///
301
+ /// * `obj` - The object to start the diff at.
302
+ /// * `before` - heads from [`Self::get_heads()`] at beginning point in the documents history
303
+ /// * `after` - heads from [`Self::get_heads()`] at ending point in the documents history.
304
+ /// * `recursive` - if false, do not also diff child objects
305
+ ///
306
+ /// Note: `before` and `after` do not have to be chronological. Document state can move backward.
307
+ pub fn diff_obj(
308
+ &mut self,
309
+ obj: &ExId,
310
+ before: &[ChangeHash],
311
+ after: &[ChangeHash],
312
+ recursive: bool,
313
+ ) -> Result<Vec<Patch>, AutomergeError> {
314
+ let meta = self.doc.exid_to_obj(obj)?;
315
+ Ok(self.diff_inner(obj, meta, before, after, recursive))
316
+ }
317
+
318
+ /// This is a convience function that encapsulates the following common pattern
319
+ /// ```
320
+ /// use automerge::AutoCommit;
321
+ /// let mut doc = AutoCommit::new();
322
+ /// // make some changes
323
+ /// let heads = doc.get_heads();
324
+ /// let diff_cursor = doc.diff_cursor();
325
+ /// let patches = doc.diff(&diff_cursor, &heads);
326
+ /// doc.update_diff_cursor();
327
+ /// ```
328
+ pub fn diff_incremental(&mut self) -> Vec<Patch> {
329
+ self.ensure_transaction_closed();
330
+ let heads = self.doc.get_heads();
331
+ let diff_cursor = self.diff_cursor();
332
+ let patches = self.diff(&diff_cursor, &heads);
333
+ self.update_diff_cursor();
334
+ patches
335
+ }
336
+
337
+ pub fn fork(&mut self) -> Self {
338
+ self.ensure_transaction_closed();
339
+ Self {
340
+ doc: self.doc.fork(),
341
+ transaction: self.transaction.clone(),
342
+ patch_log: PatchLog::inactive(),
343
+ diff_cursor: vec![],
344
+ diff_cache: None,
345
+ save_cursor: vec![],
346
+ isolation: None,
347
+ }
348
+ }
349
+
350
+ pub fn fork_at(&mut self, heads: &[ChangeHash]) -> Result<Self, AutomergeError> {
351
+ self.ensure_transaction_closed();
352
+ Ok(Self {
353
+ doc: self.doc.fork_at(heads)?,
354
+ transaction: self.transaction.clone(),
355
+ patch_log: PatchLog::inactive(),
356
+ diff_cursor: vec![],
357
+ diff_cache: None,
358
+ save_cursor: vec![],
359
+ isolation: None,
360
+ })
361
+ }
362
+
363
+ /// Get the inner document.
364
+ #[doc(hidden)]
365
+ pub fn document(&mut self) -> &Automerge {
366
+ self.ensure_transaction_closed();
367
+ &self.doc
368
+ }
369
+
370
+ pub fn with_actor(mut self, actor: ActorId) -> Self {
371
+ self.ensure_transaction_closed();
372
+ self.doc.set_actor(actor);
373
+ self
374
+ }
375
+
376
+ pub fn set_actor(&mut self, actor: ActorId) -> &mut Self {
377
+ self.ensure_transaction_closed();
378
+ self.doc.set_actor(actor);
379
+ self
380
+ }
381
+
382
+ pub fn get_actor(&self) -> &ActorId {
383
+ self.doc.get_actor()
384
+ }
385
+
386
+ pub fn isolate(&mut self, heads: &[ChangeHash]) {
387
+ self.ensure_transaction_closed();
388
+ self.patch_to(heads);
389
+ self.isolation = Some(heads.to_vec());
390
+ }
391
+
392
+ pub fn integrate(&mut self) {
393
+ self.ensure_transaction_closed();
394
+ self.patch_to(self.doc.get_heads().as_slice());
395
+ self.isolation = None;
396
+ }
397
+
398
+ pub(crate) fn ensure_transaction_open(&mut self) {
399
+ if self.transaction.is_none() {
400
+ let args = self.doc.transaction_args(self.isolation.as_deref());
401
+ self.patch_log
402
+ .migrate_actors(&self.doc.ops().actors)
403
+ // This is AutoCommit's internal patch log, so unlike caller-supplied PatchLogs it
404
+ // should always belong to this document.
405
+ .unwrap();
406
+ let inner = TransactionInner::new(args);
407
+ let branch = self.patch_log.branch();
408
+ self.transaction = Some((branch, inner));
409
+ }
410
+ }
411
+
412
+ pub(crate) fn ensure_transaction_closed(&mut self) {
413
+ if let Some((patch_log, tx)) = self.transaction.take() {
414
+ self.patch_log.merge(patch_log);
415
+ let hash = tx.commit(&mut self.doc, None, None);
416
+ if self.isolation.is_some() && hash.is_some() {
417
+ self.isolation = hash.map(|h| vec![h])
418
+ }
419
+ }
420
+ }
421
+
422
+ /// Load an incremental save of a document.
423
+ ///
424
+ /// Unlike [`Self::load()`] this imports changes into an existing document. It will work with both
425
+ /// the output of [`Self::save()`] and [`Self::save_incremental()`]
426
+ ///
427
+ /// The return value is the number of ops which were applied, this is not useful and will
428
+ /// change in future.
429
+ pub fn load_incremental(&mut self, data: &[u8]) -> Result<usize, AutomergeError> {
430
+ self.ensure_transaction_closed();
431
+ if self.isolation.is_some() {
432
+ self.doc
433
+ .load_incremental_log_patches(data, &mut PatchLog::null())
434
+ } else {
435
+ self.doc
436
+ .load_incremental_log_patches(data, &mut self.patch_log)
437
+ }
438
+ }
439
+
440
+ pub fn apply_changes(
441
+ &mut self,
442
+ changes: impl IntoIterator<Item = Change> + Clone,
443
+ ) -> Result<(), AutomergeError> {
444
+ self.ensure_transaction_closed();
445
+ if self.isolation.is_some() {
446
+ self.doc
447
+ .apply_changes_log_patches(changes, &mut PatchLog::null())
448
+ } else {
449
+ self.doc
450
+ .apply_changes_log_patches(changes, &mut self.patch_log)
451
+ }
452
+ }
453
+
454
+ pub fn apply_changes_batch(
455
+ &mut self,
456
+ changes: impl IntoIterator<Item = Change> + Clone,
457
+ ) -> Result<(), AutomergeError> {
458
+ self.ensure_transaction_closed();
459
+ if self.isolation.is_some() {
460
+ self.doc
461
+ .apply_changes_batch_log_patches(changes, &mut PatchLog::null())
462
+ } else {
463
+ self.doc
464
+ .apply_changes_batch_log_patches(changes, &mut self.patch_log)
465
+ }
466
+ }
467
+
468
+ /// Takes all the changes in `other` which are not in `self` and applies them
469
+ pub fn merge(&mut self, other: &mut AutoCommit) -> Result<Vec<ChangeHash>, AutomergeError> {
470
+ self.ensure_transaction_closed();
471
+ other.ensure_transaction_closed();
472
+ if self.isolation.is_some() {
473
+ self.doc
474
+ .merge_and_log_patches(&mut other.doc, &mut PatchLog::null())
475
+ } else {
476
+ self.doc
477
+ .merge_and_log_patches(&mut other.doc, &mut self.patch_log)
478
+ }
479
+ }
480
+
481
+ /// Save the entirety of this document in a compact form.
482
+ pub fn save(&mut self) -> Vec<u8> {
483
+ self.save_with_options(SaveOptions::default())
484
+ }
485
+
486
+ pub fn save_with_options(&mut self, options: SaveOptions) -> Vec<u8> {
487
+ self.ensure_transaction_closed();
488
+ self.doc.remove_unused_actors(true);
489
+ let bytes = self.doc.save_with_options(options);
490
+ if !bytes.is_empty() {
491
+ self.save_cursor = self.doc.get_heads()
492
+ }
493
+ bytes
494
+ }
495
+
496
+ /// Save the document and attempt to load it before returning - slow!
497
+ pub fn save_and_verify(&mut self) -> Result<Vec<u8>, AutomergeError> {
498
+ let bytes = self.save();
499
+ Self::load(&bytes)?;
500
+ Ok(bytes)
501
+ }
502
+
503
+ /// EXPERIMENTAL: Write the set of changes in `hashes` to a "bundle"
504
+ ///
505
+ /// A "bundle" is a compact representation of a set of changes which uses
506
+ /// the same compression tricks as the document encoding we use in
507
+ /// [`Automerge::save`].
508
+ ///
509
+ /// This is an experimental API, the bundle format is still subject to change
510
+ /// and so should not be used in production just yet.
511
+ pub fn bundle<I>(&self, hashes: I) -> Result<Bundle, AutomergeError>
512
+ where
513
+ I: IntoIterator<Item = ChangeHash>,
514
+ {
515
+ self.doc.bundle(hashes)
516
+ }
517
+
518
+ #[cfg(test)]
519
+ pub fn debug_cmp(&self, other: &Self) {
520
+ self.doc.debug_cmp(&other.doc);
521
+ }
522
+
523
+ #[cfg(test)]
524
+ pub(crate) fn validate_top_index(&self) -> bool {
525
+ self.doc.ops.validate_top_index()
526
+ }
527
+
528
+ /// Save this document, but don't run it through DEFLATE afterwards
529
+ pub fn save_nocompress(&mut self) -> Vec<u8> {
530
+ self.save_with_options(SaveOptions {
531
+ deflate: false,
532
+ ..Default::default()
533
+ })
534
+ }
535
+
536
+ /// Save the changes since the last call to [`Self::save()`]
537
+ ///
538
+ /// The output of this will not be a compressed document format, but a series of individual
539
+ /// changes. This is useful if you know you have only made a small change since the last [`Self::save()`]
540
+ /// and you want to immediately send it somewhere (e.g. you've inserted a single character in a
541
+ /// text object).
542
+ pub fn save_incremental(&mut self) -> Vec<u8> {
543
+ self.ensure_transaction_closed();
544
+ let bytes = self.doc.save_after(&self.save_cursor);
545
+ if !bytes.is_empty() {
546
+ self.save_cursor = self.doc.get_heads()
547
+ }
548
+ bytes
549
+ }
550
+
551
+ pub fn is_empty(&self) -> bool {
552
+ self.doc.is_empty()
553
+ }
554
+
555
+ /// Save everything which is not a (transitive) dependency of `heads`
556
+ pub fn save_after(&mut self, heads: &[ChangeHash]) -> Vec<u8> {
557
+ self.ensure_transaction_closed();
558
+ self.doc.save_after(heads)
559
+ }
560
+
561
+ pub fn get_missing_deps(&mut self, heads: &[ChangeHash]) -> Vec<ChangeHash> {
562
+ self.ensure_transaction_closed();
563
+ self.doc.get_missing_deps(heads)
564
+ }
565
+
566
+ /// Get the last change made by this documents actor ID
567
+ pub fn get_last_local_change(&mut self) -> Option<Change> {
568
+ self.ensure_transaction_closed();
569
+ self.doc.get_last_local_change()
570
+ }
571
+
572
+ pub fn get_changes(&mut self, have_deps: &[ChangeHash]) -> Vec<Change> {
573
+ self.ensure_transaction_closed();
574
+ self.doc.get_changes(have_deps)
575
+ }
576
+
577
+ pub fn get_changes_meta(&mut self, have_deps: &[ChangeHash]) -> Vec<ChangeMetadata<'_>> {
578
+ self.ensure_transaction_closed();
579
+ self.doc.get_changes_meta(have_deps)
580
+ }
581
+
582
+ pub fn get_change_by_hash(&mut self, hash: &ChangeHash) -> Option<Change> {
583
+ self.ensure_transaction_closed();
584
+ self.doc.get_change_by_hash(hash)
585
+ }
586
+
587
+ pub fn get_change_meta_by_hash(&mut self, hash: &ChangeHash) -> Option<ChangeMetadata<'_>> {
588
+ self.ensure_transaction_closed();
589
+ self.doc.get_change_meta_by_hash(hash)
590
+ }
591
+
592
+ /// Get changes in `other` that are not in `self`
593
+ pub fn get_changes_added(&mut self, other: &mut Self) -> Vec<Change> {
594
+ self.ensure_transaction_closed();
595
+ other.ensure_transaction_closed();
596
+ self.doc.get_changes_added(&other.doc)
597
+ }
598
+
599
+ #[doc(hidden)]
600
+ pub fn import(&self, s: &str) -> Result<(ExId, ObjType), AutomergeError> {
601
+ self.doc.import(s)
602
+ }
603
+
604
+ #[doc(hidden)]
605
+ pub fn import_obj(&self, s: &str) -> Result<ExId, AutomergeError> {
606
+ self.doc.import_obj(s)
607
+ }
608
+
609
+ #[doc(hidden)]
610
+ pub fn dump(&mut self) {
611
+ self.ensure_transaction_closed();
612
+ self.doc.dump()
613
+ }
614
+
615
+ /// Get the current heads of the document.
616
+ ///
617
+ /// This closes the transaction first, if one is in progress.
618
+ pub fn get_heads(&mut self) -> Vec<ChangeHash> {
619
+ self.ensure_transaction_closed();
620
+ if let Some(i) = &self.isolation {
621
+ i.clone()
622
+ } else {
623
+ self.doc.get_heads()
624
+ }
625
+ }
626
+
627
+ /// Commit any uncommitted changes
628
+ ///
629
+ /// Returns [`None`] if there were no operations to commit
630
+ pub fn commit(&mut self) -> Option<ChangeHash> {
631
+ self.commit_with(CommitOptions::default())
632
+ }
633
+
634
+ /// Commit the current operations with some options.
635
+ ///
636
+ /// Returns [`None`] if there were no operations to commit
637
+ ///
638
+ /// ```
639
+ /// # use automerge::transaction::CommitOptions;
640
+ /// # use automerge::transaction::Transactable;
641
+ /// # use automerge::ROOT;
642
+ /// # use automerge::AutoCommit;
643
+ /// # use automerge::ObjType;
644
+ /// # use std::time::SystemTime;
645
+ /// let mut doc = AutoCommit::new();
646
+ /// doc.put_object(&ROOT, "todos", ObjType::List).unwrap();
647
+ /// let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs() as
648
+ /// i64;
649
+ /// doc.commit_with(CommitOptions::default().with_message("Create todos list").with_time(now));
650
+ /// ```
651
+ pub fn commit_with(&mut self, options: CommitOptions) -> Option<ChangeHash> {
652
+ // ensure that even no changes triggers a change
653
+ self.ensure_transaction_open();
654
+ let (patch_log, tx) = self.transaction.take().unwrap();
655
+ self.patch_log.merge(patch_log);
656
+ let hash = tx.commit(&mut self.doc, options.message, options.time);
657
+ if self.isolation.is_some() && hash.is_some() {
658
+ self.isolation = hash.map(|h| vec![h])
659
+ }
660
+ hash
661
+ }
662
+
663
+ /// Remove any changes that have been made in the current transaction from the document
664
+ pub fn rollback(&mut self) -> usize {
665
+ self.transaction
666
+ .take()
667
+ .map(|(_, tx)| tx.rollback(&mut self.doc))
668
+ .unwrap_or(0)
669
+ }
670
+
671
+ /// Generate an empty change
672
+ ///
673
+ /// The main reason to do this is if you wish to create a "merge commit" which has all the
674
+ /// current heads of the documents as dependencies but you have no new operations to create.
675
+ ///
676
+ /// Because this structure is an "autocommit" there may actually be outstanding operations to
677
+ /// submit. If this is the case this function will create two changes, one with the outstanding
678
+ /// operations and a new one with no operations. The returned [`ChangeHash`] will always be the
679
+ /// hash of the empty change.
680
+ pub fn empty_change(&mut self, options: CommitOptions) -> ChangeHash {
681
+ self.ensure_transaction_closed();
682
+ let args = self.doc.transaction_args(None);
683
+ TransactionInner::empty(&mut self.doc, args, options.message, options.time)
684
+ }
685
+
686
+ /// An implementation of [`crate::sync::SyncDoc`] for this autocommit
687
+ ///
688
+ /// This ensures that any outstanding transactions for this document are committed before
689
+ /// taking part in the sync protocol
690
+ pub fn sync(&mut self) -> impl SyncDoc + '_ {
691
+ self.ensure_transaction_closed();
692
+ SyncWrapper { inner: self }
693
+ }
694
+
695
+ /// Get the hash of the change that contains the given `opid`.
696
+ ///
697
+ /// Returns [`None`] if the `opid`:
698
+ /// - Is the root object id
699
+ /// - Does not exist in this document
700
+ /// - Is for an operation in a transaction
701
+ pub fn hash_for_opid(&self, opid: &ExId) -> Option<ChangeHash> {
702
+ self.doc.hash_for_opid(opid)
703
+ }
704
+
705
+ fn get_scope(&self, heads: Option<&[ChangeHash]>) -> Option<Clock> {
706
+ // heads arg takes priority
707
+ if let Some(h) = heads {
708
+ return Some(self.doc.clock_at(h));
709
+ }
710
+ match (&self.isolation, &self.transaction) {
711
+ // then look at in progress isolated transaction
712
+ (Some(_), Some((_, t))) => t.get_scope().clone(),
713
+ // then look at clock for isolation
714
+ (Some(i), None) => Some(self.doc.clock_at(i)),
715
+ _ => None,
716
+ }
717
+ }
718
+
719
+ fn patch_to(&mut self, after: &[ChangeHash]) {
720
+ // we may be isolated so we dont use self.doc.get_heads()
721
+ let before = self.get_heads();
722
+ if before.as_slice() != after {
723
+ let clock = self.doc.clock_range(&before, after);
724
+ DiffIter::log(&self.doc, ObjMeta::root(), clock, &mut self.patch_log, true);
725
+ }
726
+ }
727
+
728
+ /// Whether the peer represented by `other` has all the changes we have
729
+ pub fn has_our_changes(&mut self, state: &crate::sync::State) -> bool {
730
+ self.ensure_transaction_closed();
731
+ self.doc.has_our_changes(state)
732
+ }
733
+ }
734
+
735
+ impl ReadDoc for AutoCommit {
736
+ fn parents<O: AsRef<ExId>>(&self, obj: O) -> Result<Parents<'_>, AutomergeError> {
737
+ self.doc.parents_for(obj.as_ref(), self.get_scope(None))
738
+ }
739
+
740
+ fn parents_at<O: AsRef<ExId>>(
741
+ &self,
742
+ obj: O,
743
+ heads: &[ChangeHash],
744
+ ) -> Result<Parents<'_>, AutomergeError> {
745
+ self.doc
746
+ .parents_for(obj.as_ref(), self.get_scope(Some(heads)))
747
+ }
748
+
749
+ fn keys<O: AsRef<ExId>>(&self, obj: O) -> Keys<'_> {
750
+ self.doc.keys_for(obj.as_ref(), self.get_scope(None))
751
+ }
752
+
753
+ fn keys_at<O: AsRef<ExId>>(&self, obj: O, heads: &[ChangeHash]) -> Keys<'_> {
754
+ self.doc.keys_for(obj.as_ref(), self.get_scope(Some(heads)))
755
+ }
756
+
757
+ fn iter_at<O: AsRef<ExId>>(&self, obj: O, heads: Option<&[ChangeHash]>) -> DocIter<'_> {
758
+ self.doc.iter_for(obj.as_ref(), self.get_scope(heads))
759
+ }
760
+
761
+ fn iter(&self) -> DocIter<'_> {
762
+ self.doc.iter_for(&ROOT, self.get_scope(None))
763
+ }
764
+
765
+ fn map_range<'a, O: AsRef<ExId>, R: RangeBounds<String> + 'a>(
766
+ &'a self,
767
+ obj: O,
768
+ range: R,
769
+ ) -> MapRange<'a> {
770
+ self.doc
771
+ .map_range_for(obj.as_ref(), range, self.get_scope(None))
772
+ }
773
+
774
+ fn map_range_at<'a, O: AsRef<ExId>, R: RangeBounds<String> + 'a>(
775
+ &'a self,
776
+ obj: O,
777
+ range: R,
778
+ heads: &[ChangeHash],
779
+ ) -> MapRange<'a> {
780
+ self.doc
781
+ .map_range_for(obj.as_ref(), range, self.get_scope(Some(heads)))
782
+ }
783
+
784
+ fn list_range<O: AsRef<ExId>, R: RangeBounds<usize>>(&self, obj: O, range: R) -> ListRange<'_> {
785
+ self.doc
786
+ .list_range_for(obj.as_ref(), range, self.get_scope(None))
787
+ }
788
+
789
+ fn list_range_at<O: AsRef<ExId>, R: RangeBounds<usize>>(
790
+ &self,
791
+ obj: O,
792
+ range: R,
793
+ heads: &[ChangeHash],
794
+ ) -> ListRange<'_> {
795
+ self.doc
796
+ .list_range_for(obj.as_ref(), range, self.get_scope(Some(heads)))
797
+ }
798
+
799
+ fn values<O: AsRef<ExId>>(&self, obj: O) -> Values<'_> {
800
+ self.doc.values_for(obj.as_ref(), self.get_scope(None))
801
+ }
802
+
803
+ fn values_at<O: AsRef<ExId>>(&self, obj: O, heads: &[ChangeHash]) -> Values<'_> {
804
+ self.doc
805
+ .values_for(obj.as_ref(), self.get_scope(Some(heads)))
806
+ }
807
+
808
+ fn length<O: AsRef<ExId>>(&self, obj: O) -> usize {
809
+ self.doc.length_for(obj.as_ref(), self.get_scope(None))
810
+ }
811
+
812
+ fn length_at<O: AsRef<ExId>>(&self, obj: O, heads: &[ChangeHash]) -> usize {
813
+ self.doc
814
+ .length_for(obj.as_ref(), self.get_scope(Some(heads)))
815
+ }
816
+
817
+ fn object_type<O: AsRef<ExId>>(&self, obj: O) -> Result<ObjType, AutomergeError> {
818
+ self.doc.object_type(obj)
819
+ }
820
+
821
+ fn marks<O: AsRef<ExId>>(&self, obj: O) -> Result<Vec<Mark>, AutomergeError> {
822
+ self.doc.marks_for(obj.as_ref(), self.get_scope(None))
823
+ }
824
+
825
+ fn marks_at<O: AsRef<ExId>>(
826
+ &self,
827
+ obj: O,
828
+ heads: &[ChangeHash],
829
+ ) -> Result<Vec<Mark>, AutomergeError> {
830
+ self.doc
831
+ .marks_for(obj.as_ref(), self.get_scope(Some(heads)))
832
+ }
833
+
834
+ fn get_marks<O: AsRef<ExId>>(
835
+ &self,
836
+ obj: O,
837
+ index: usize,
838
+ heads: Option<&[ChangeHash]>,
839
+ ) -> Result<MarkSet, AutomergeError> {
840
+ self.doc
841
+ .get_marks_for(obj.as_ref(), index, self.get_scope(heads))
842
+ }
843
+
844
+ fn text<O: AsRef<ExId>>(&self, obj: O) -> Result<String, AutomergeError> {
845
+ self.doc.text_for(obj.as_ref(), self.get_scope(None))
846
+ }
847
+
848
+ fn text_at<O: AsRef<ExId>>(
849
+ &self,
850
+ obj: O,
851
+ heads: &[ChangeHash],
852
+ ) -> Result<String, AutomergeError> {
853
+ self.doc.text_for(obj.as_ref(), self.get_scope(Some(heads)))
854
+ }
855
+
856
+ fn spans<O: AsRef<ExId>>(&self, obj: O) -> Result<Spans<'_>, AutomergeError> {
857
+ self.doc.spans_for(obj.as_ref(), self.get_scope(None))
858
+ }
859
+
860
+ fn spans_at<O: AsRef<ExId>>(
861
+ &self,
862
+ obj: O,
863
+ heads: &[ChangeHash],
864
+ ) -> Result<Spans<'_>, AutomergeError> {
865
+ self.doc
866
+ .spans_for(obj.as_ref(), self.get_scope(Some(heads)))
867
+ }
868
+
869
+ fn get_cursor<O: AsRef<ExId>, I: Into<CursorPosition>>(
870
+ &self,
871
+ obj: O,
872
+ position: I,
873
+ at: Option<&[ChangeHash]>,
874
+ ) -> Result<Cursor, AutomergeError> {
875
+ self.doc.get_cursor_for(
876
+ obj.as_ref(),
877
+ position.into(),
878
+ self.get_scope(at),
879
+ MoveCursor::After,
880
+ )
881
+ }
882
+
883
+ fn get_cursor_moving<O: AsRef<ExId>, I: Into<CursorPosition>>(
884
+ &self,
885
+ obj: O,
886
+ position: I,
887
+ at: Option<&[ChangeHash]>,
888
+ move_cursor: MoveCursor,
889
+ ) -> Result<Cursor, AutomergeError> {
890
+ self.doc.get_cursor_for(
891
+ obj.as_ref(),
892
+ position.into(),
893
+ self.get_scope(at),
894
+ move_cursor,
895
+ )
896
+ }
897
+
898
+ fn get_cursor_position<O: AsRef<ExId>>(
899
+ &self,
900
+ obj: O,
901
+ cursor: &Cursor,
902
+ at: Option<&[ChangeHash]>,
903
+ ) -> Result<usize, AutomergeError> {
904
+ self.doc
905
+ .get_cursor_position_for(obj.as_ref(), cursor, self.get_scope(at))
906
+ }
907
+
908
+ fn hydrate<O: AsRef<ExId>>(
909
+ &self,
910
+ obj: O,
911
+ heads: Option<&[ChangeHash]>,
912
+ ) -> Result<hydrate::Value, AutomergeError> {
913
+ self.doc.hydrate_obj(obj.as_ref(), heads)
914
+ }
915
+
916
+ fn get<O: AsRef<ExId>, P: Into<Prop>>(
917
+ &self,
918
+ obj: O,
919
+ prop: P,
920
+ ) -> Result<Option<(Value<'_>, ExId)>, AutomergeError> {
921
+ self.doc
922
+ .get_for(obj.as_ref(), prop.into(), self.get_scope(None))
923
+ }
924
+
925
+ fn get_at<O: AsRef<ExId>, P: Into<Prop>>(
926
+ &self,
927
+ obj: O,
928
+ prop: P,
929
+ heads: &[ChangeHash],
930
+ ) -> Result<Option<(Value<'_>, ExId)>, AutomergeError> {
931
+ self.doc
932
+ .get_for(obj.as_ref(), prop.into(), self.get_scope(Some(heads)))
933
+ }
934
+
935
+ fn get_all<O: AsRef<ExId>, P: Into<Prop>>(
936
+ &self,
937
+ obj: O,
938
+ prop: P,
939
+ ) -> Result<Vec<(Value<'_>, ExId)>, AutomergeError> {
940
+ self.doc
941
+ .get_all_for(obj.as_ref(), prop.into(), self.get_scope(None))
942
+ }
943
+
944
+ fn get_all_at<O: AsRef<ExId>, P: Into<Prop>>(
945
+ &self,
946
+ obj: O,
947
+ prop: P,
948
+ heads: &[ChangeHash],
949
+ ) -> Result<Vec<(Value<'_>, ExId)>, AutomergeError> {
950
+ self.doc
951
+ .get_all_for(obj.as_ref(), prop.into(), self.get_scope(Some(heads)))
952
+ }
953
+
954
+ fn get_missing_deps(&self, heads: &[ChangeHash]) -> Vec<ChangeHash> {
955
+ self.doc.get_missing_deps(heads)
956
+ }
957
+
958
+ fn get_change_by_hash(&self, hash: &ChangeHash) -> Option<Change> {
959
+ self.doc.get_change_by_hash(hash)
960
+ }
961
+
962
+ fn stats(&self) -> crate::read::Stats {
963
+ self.doc.stats()
964
+ }
965
+
966
+ fn text_encoding(&self) -> crate::TextEncoding {
967
+ self.doc.text_encoding()
968
+ }
969
+ }
970
+
971
+ impl Transactable for AutoCommit {
972
+ fn pending_ops(&self) -> usize {
973
+ self.transaction
974
+ .as_ref()
975
+ .map(|(_, t)| t.pending_ops())
976
+ .unwrap_or(0)
977
+ }
978
+
979
+ fn put<O: AsRef<ExId>, P: Into<Prop>, V: Into<ScalarValue>>(
980
+ &mut self,
981
+ obj: O,
982
+ prop: P,
983
+ value: V,
984
+ ) -> Result<(), AutomergeError> {
985
+ self.ensure_transaction_open();
986
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
987
+ tx.put(&mut self.doc, patch_log, obj.as_ref(), prop, value)
988
+ }
989
+
990
+ fn put_object<O: AsRef<ExId>, P: Into<Prop>>(
991
+ &mut self,
992
+ obj: O,
993
+ prop: P,
994
+ value: ObjType,
995
+ ) -> Result<ExId, AutomergeError> {
996
+ self.ensure_transaction_open();
997
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
998
+ tx.put_object(&mut self.doc, patch_log, obj.as_ref(), prop, value)
999
+ }
1000
+
1001
+ fn insert<O: AsRef<ExId>, V: Into<ScalarValue>>(
1002
+ &mut self,
1003
+ obj: O,
1004
+ index: usize,
1005
+ value: V,
1006
+ ) -> Result<(), AutomergeError> {
1007
+ self.ensure_transaction_open();
1008
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1009
+ tx.insert(&mut self.doc, patch_log, obj.as_ref(), index, value)
1010
+ }
1011
+
1012
+ fn insert_object<O: AsRef<ExId>>(
1013
+ &mut self,
1014
+ obj: O,
1015
+ index: usize,
1016
+ value: ObjType,
1017
+ ) -> Result<ExId, AutomergeError> {
1018
+ self.ensure_transaction_open();
1019
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1020
+ tx.insert_object(&mut self.doc, patch_log, obj.as_ref(), index, value)
1021
+ }
1022
+
1023
+ fn increment<O: AsRef<ExId>, P: Into<Prop>>(
1024
+ &mut self,
1025
+ obj: O,
1026
+ prop: P,
1027
+ value: i64,
1028
+ ) -> Result<(), AutomergeError> {
1029
+ self.ensure_transaction_open();
1030
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1031
+ tx.increment(&mut self.doc, patch_log, obj.as_ref(), prop, value)
1032
+ }
1033
+
1034
+ fn delete<O: AsRef<ExId>, P: Into<Prop>>(
1035
+ &mut self,
1036
+ obj: O,
1037
+ prop: P,
1038
+ ) -> Result<(), AutomergeError> {
1039
+ self.ensure_transaction_open();
1040
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1041
+ tx.delete(&mut self.doc, patch_log, obj.as_ref(), prop)
1042
+ }
1043
+
1044
+ /// Splice new elements into the given sequence
1045
+ fn splice<O: AsRef<ExId>, V: Into<crate::hydrate::Value>, I: IntoIterator<Item = V>>(
1046
+ &mut self,
1047
+ obj: O,
1048
+ pos: usize,
1049
+ del: isize,
1050
+ vals: I,
1051
+ ) -> Result<(), AutomergeError> {
1052
+ self.ensure_transaction_open();
1053
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1054
+ tx.splice(&mut self.doc, patch_log, obj.as_ref(), pos, del, vals)
1055
+ }
1056
+
1057
+ fn splice_text<O: AsRef<ExId>>(
1058
+ &mut self,
1059
+ obj: O,
1060
+ pos: usize,
1061
+ del: isize,
1062
+ text: &str,
1063
+ ) -> Result<(), AutomergeError> {
1064
+ self.ensure_transaction_open();
1065
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1066
+ tx.splice_text(&mut self.doc, patch_log, obj.as_ref(), pos, del, text)?;
1067
+ Ok(())
1068
+ }
1069
+
1070
+ fn mark<O: AsRef<ExId>>(
1071
+ &mut self,
1072
+ obj: O,
1073
+ mark: Mark,
1074
+ expand: ExpandMark,
1075
+ ) -> Result<(), AutomergeError> {
1076
+ self.ensure_transaction_open();
1077
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1078
+ tx.mark(&mut self.doc, patch_log, obj.as_ref(), mark, expand)
1079
+ }
1080
+
1081
+ fn unmark<O: AsRef<ExId>>(
1082
+ &mut self,
1083
+ obj: O,
1084
+ key: &str,
1085
+ start: usize,
1086
+ end: usize,
1087
+ expand: ExpandMark,
1088
+ ) -> Result<(), AutomergeError> {
1089
+ self.ensure_transaction_open();
1090
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1091
+ tx.unmark(
1092
+ &mut self.doc,
1093
+ patch_log,
1094
+ obj.as_ref(),
1095
+ key,
1096
+ start,
1097
+ end,
1098
+ expand,
1099
+ )
1100
+ }
1101
+
1102
+ fn split_block<'p, O>(&mut self, obj: O, index: usize) -> Result<ExId, AutomergeError>
1103
+ where
1104
+ O: AsRef<ExId>,
1105
+ {
1106
+ self.ensure_transaction_open();
1107
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1108
+ tx.split_block(&mut self.doc, patch_log, obj.as_ref(), index)
1109
+ }
1110
+
1111
+ fn join_block<O: AsRef<ExId>>(&mut self, text: O, index: usize) -> Result<(), AutomergeError> {
1112
+ self.ensure_transaction_open();
1113
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1114
+ tx.join_block(&mut self.doc, patch_log, text.as_ref(), index)
1115
+ }
1116
+
1117
+ fn replace_block<'p, O>(&mut self, text: O, index: usize) -> Result<ExId, AutomergeError>
1118
+ where
1119
+ O: AsRef<ExId>,
1120
+ {
1121
+ self.ensure_transaction_open();
1122
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1123
+ tx.replace_block(&mut self.doc, patch_log, text.as_ref(), index)
1124
+ }
1125
+
1126
+ fn base_heads(&self) -> Vec<ChangeHash> {
1127
+ if let Some(i) = &self.isolation {
1128
+ i.clone()
1129
+ } else {
1130
+ self.doc.get_heads()
1131
+ }
1132
+ }
1133
+
1134
+ fn update_text<S: AsRef<str>>(
1135
+ &mut self,
1136
+ obj: &ExId,
1137
+ new_text: S,
1138
+ ) -> Result<(), AutomergeError> {
1139
+ self.ensure_transaction_open();
1140
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1141
+ crate::text_diff::myers_diff(&mut self.doc, tx, patch_log, obj, new_text)
1142
+ }
1143
+
1144
+ fn update_spans<O: AsRef<ExId>, I: IntoIterator<Item = Span>>(
1145
+ &mut self,
1146
+ text: O,
1147
+ config: UpdateSpansConfig,
1148
+ new_text: I,
1149
+ ) -> Result<(), AutomergeError> {
1150
+ self.ensure_transaction_open();
1151
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1152
+ crate::text_diff::myers_block_diff(
1153
+ &mut self.doc,
1154
+ tx,
1155
+ patch_log,
1156
+ text.as_ref(),
1157
+ new_text,
1158
+ &config,
1159
+ )
1160
+ }
1161
+
1162
+ fn update_object<O: AsRef<ExId>>(
1163
+ &mut self,
1164
+ obj: O,
1165
+ new_value: &crate::hydrate::Value,
1166
+ ) -> Result<(), crate::error::UpdateObjectError> {
1167
+ self.ensure_transaction_open();
1168
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1169
+ tx.update_object(&mut self.doc, patch_log, obj.as_ref(), new_value)
1170
+ }
1171
+
1172
+ fn batch_create_object<O: AsRef<ExId>, P: Into<Prop>>(
1173
+ &mut self,
1174
+ obj: O,
1175
+ prop: P,
1176
+ value: &crate::hydrate::Value,
1177
+ insert: bool,
1178
+ ) -> Result<ExId, AutomergeError> {
1179
+ self.ensure_transaction_open();
1180
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1181
+ tx.batch_create_object(
1182
+ &mut self.doc,
1183
+ patch_log,
1184
+ obj.as_ref(),
1185
+ prop.into(),
1186
+ value,
1187
+ insert,
1188
+ )
1189
+ }
1190
+
1191
+ fn init_root_from_hydrate(
1192
+ &mut self,
1193
+ value: &crate::hydrate::Map,
1194
+ ) -> Result<(), AutomergeError> {
1195
+ self.ensure_transaction_open();
1196
+ let (patch_log, tx) = self.transaction.as_mut().unwrap();
1197
+ tx.batch_init_root_map(&mut self.doc, patch_log, value)?;
1198
+ Ok(())
1199
+ }
1200
+ }
1201
+
1202
+ // A wrapper we return from [`AutoCommit::sync()`] to ensure that transactions are closed before we
1203
+ // start syncing
1204
+ struct SyncWrapper<'a> {
1205
+ inner: &'a mut AutoCommit,
1206
+ }
1207
+
1208
+ impl SyncDoc for SyncWrapper<'_> {
1209
+ fn generate_sync_message(&self, sync_state: &mut sync::State) -> Option<sync::Message> {
1210
+ self.inner.doc.generate_sync_message(sync_state)
1211
+ }
1212
+
1213
+ fn receive_sync_message(
1214
+ &mut self,
1215
+ sync_state: &mut sync::State,
1216
+ message: sync::Message,
1217
+ ) -> Result<(), AutomergeError> {
1218
+ self.inner.ensure_transaction_closed();
1219
+ if self.inner.isolation.is_some() {
1220
+ self.inner.doc.receive_sync_message_log_patches(
1221
+ sync_state,
1222
+ message,
1223
+ &mut PatchLog::null(),
1224
+ )
1225
+ } else {
1226
+ self.inner.doc.receive_sync_message_log_patches(
1227
+ sync_state,
1228
+ message,
1229
+ &mut self.inner.patch_log,
1230
+ )
1231
+ }
1232
+ }
1233
+
1234
+ // I dont like this function - it makes sense on automerge but not autocommit
1235
+ // FIXME
1236
+ fn receive_sync_message_log_patches(
1237
+ &mut self,
1238
+ sync_state: &mut sync::State,
1239
+ message: sync::Message,
1240
+ patch_log: &mut PatchLog,
1241
+ ) -> Result<(), AutomergeError> {
1242
+ self.inner
1243
+ .doc
1244
+ .receive_sync_message_log_patches(sync_state, message, patch_log)
1245
+ }
1246
+ }
1247
+
1248
+ #[derive(Debug, Clone, PartialEq)]
1249
+ struct OpRange {
1250
+ before_len: usize,
1251
+ hashes: Vec<ChangeHash>,
1252
+ }
1253
+
1254
+ impl OpRange {
1255
+ fn new(before: &[ChangeHash], after: &[ChangeHash]) -> Self {
1256
+ let mut hashes = Vec::with_capacity(before.len() + after.len());
1257
+ hashes.extend(before);
1258
+ hashes.extend(after);
1259
+ let range = Self {
1260
+ before_len: before.len(),
1261
+ hashes,
1262
+ };
1263
+ assert_eq!(before, range.before());
1264
+ assert_eq!(after, range.after());
1265
+ range
1266
+ }
1267
+
1268
+ fn before(&self) -> &[ChangeHash] {
1269
+ &self.hashes[0..self.before_len]
1270
+ }
1271
+
1272
+ fn after(&self) -> &[ChangeHash] {
1273
+ &self.hashes[self.before_len..]
1274
+ }
1275
+ }
1276
+
1277
+ #[cfg(test)]
1278
+ mod tests {
1279
+
1280
+ fn is_send<S: Send>() {}
1281
+
1282
+ #[test]
1283
+ fn test_autocommit_is_send() {
1284
+ is_send::<super::AutoCommit>();
1285
+ }
1286
+ }