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.
- checksums.yaml +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +175 -0
- data/ext/automerge_ext/automerge_ext.c +1805 -0
- data/ext/automerge_ext/extconf.rb +132 -0
- data/lib/automerge/version.rb +6 -0
- data/lib/automerge.rb +110 -0
- data/rust-toolchain.toml +4 -0
- data/vendor/automerge-rust/Cargo.lock +1909 -0
- data/vendor/automerge-rust/Cargo.toml +15 -0
- data/vendor/automerge-rust/automerge/Cargo.toml +78 -0
- data/vendor/automerge-rust/automerge/README.md +5 -0
- data/vendor/automerge-rust/automerge/benches/load_save.rs +102 -0
- data/vendor/automerge-rust/automerge/benches/map.rs +260 -0
- data/vendor/automerge-rust/automerge/benches/range.rs +37 -0
- data/vendor/automerge-rust/automerge/benches/sync.rs +95 -0
- data/vendor/automerge-rust/automerge/examples/README.md +7 -0
- data/vendor/automerge-rust/automerge/examples/quickstart.rs +57 -0
- data/vendor/automerge-rust/automerge/examples/watch.rs +94 -0
- data/vendor/automerge-rust/automerge/fuzz/Cargo.toml +29 -0
- data/vendor/automerge-rust/automerge/fuzz/fuzz_targets/load.rs +37 -0
- data/vendor/automerge-rust/automerge/src/autocommit.rs +1286 -0
- data/vendor/automerge-rust/automerge/src/automerge/current_state.rs +546 -0
- data/vendor/automerge-rust/automerge/src/automerge/tests.rs +2023 -0
- data/vendor/automerge-rust/automerge/src/automerge.rs +2071 -0
- data/vendor/automerge-rust/automerge/src/autoserde.rs +128 -0
- data/vendor/automerge-rust/automerge/src/change.rs +357 -0
- data/vendor/automerge-rust/automerge/src/change_graph.rs +1215 -0
- data/vendor/automerge-rust/automerge/src/change_queue.rs +46 -0
- data/vendor/automerge-rust/automerge/src/clock.rs +206 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range/boolean.rs +83 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range/delta.rs +148 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range/generic/group.rs +138 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range/generic/simple.rs +76 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range/generic.rs +93 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range/key.rs +272 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range/obj_id.rs +202 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range/opid_list.rs +329 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range/raw.rs +38 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range/rle.rs +216 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range/value.rs +547 -0
- data/vendor/automerge-rust/automerge/src/columnar/column_range.rs +17 -0
- data/vendor/automerge-rust/automerge/src/columnar/encoding/boolean.rs +197 -0
- data/vendor/automerge-rust/automerge/src/columnar/encoding/col_error.rs +88 -0
- data/vendor/automerge-rust/automerge/src/columnar/encoding/column_decoder.rs +133 -0
- data/vendor/automerge-rust/automerge/src/columnar/encoding/decodable_impls.rs +175 -0
- data/vendor/automerge-rust/automerge/src/columnar/encoding/delta.rs +96 -0
- data/vendor/automerge-rust/automerge/src/columnar/encoding/encodable_impls.rs +200 -0
- data/vendor/automerge-rust/automerge/src/columnar/encoding/leb128.rs +82 -0
- data/vendor/automerge-rust/automerge/src/columnar/encoding/properties.rs +178 -0
- data/vendor/automerge-rust/automerge/src/columnar/encoding/raw.rs +101 -0
- data/vendor/automerge-rust/automerge/src/columnar/encoding/rle.rs +239 -0
- data/vendor/automerge-rust/automerge/src/columnar/encoding.rs +67 -0
- data/vendor/automerge-rust/automerge/src/columnar/splice_error.rs +47 -0
- data/vendor/automerge-rust/automerge/src/columnar.rs +14 -0
- data/vendor/automerge-rust/automerge/src/convert.rs +112 -0
- data/vendor/automerge-rust/automerge/src/cursor.rs +296 -0
- data/vendor/automerge-rust/automerge/src/decoding.rs +475 -0
- data/vendor/automerge-rust/automerge/src/error.rs +159 -0
- data/vendor/automerge-rust/automerge/src/exid.rs +238 -0
- data/vendor/automerge-rust/automerge/src/hydrate/list.rs +140 -0
- data/vendor/automerge-rust/automerge/src/hydrate/map.rs +132 -0
- data/vendor/automerge-rust/automerge/src/hydrate/tests.rs +40 -0
- data/vendor/automerge-rust/automerge/src/hydrate/text.rs +89 -0
- data/vendor/automerge-rust/automerge/src/hydrate.rs +368 -0
- data/vendor/automerge-rust/automerge/src/indexed_cache.rs +113 -0
- data/vendor/automerge-rust/automerge/src/iter/doc.rs +603 -0
- data/vendor/automerge-rust/automerge/src/iter/keys.rs +93 -0
- data/vendor/automerge-rust/automerge/src/iter/list_range.rs +433 -0
- data/vendor/automerge-rust/automerge/src/iter/map_range.rs +316 -0
- data/vendor/automerge-rust/automerge/src/iter/spans.rs +601 -0
- data/vendor/automerge-rust/automerge/src/iter/tools.rs +427 -0
- data/vendor/automerge-rust/automerge/src/iter/values.rs +36 -0
- data/vendor/automerge-rust/automerge/src/iter.rs +25 -0
- data/vendor/automerge-rust/automerge/src/legacy/mod.rs +364 -0
- data/vendor/automerge-rust/automerge/src/legacy/serde_impls/actor_id.rs +25 -0
- data/vendor/automerge-rust/automerge/src/legacy/serde_impls/change_hash.rs +29 -0
- data/vendor/automerge-rust/automerge/src/legacy/serde_impls/element_id.rs +27 -0
- data/vendor/automerge-rust/automerge/src/legacy/serde_impls/mod.rs +31 -0
- data/vendor/automerge-rust/automerge/src/legacy/serde_impls/object_id.rs +36 -0
- data/vendor/automerge-rust/automerge/src/legacy/serde_impls/op.rs +668 -0
- data/vendor/automerge-rust/automerge/src/legacy/serde_impls/op_type.rs +26 -0
- data/vendor/automerge-rust/automerge/src/legacy/serde_impls/opid.rs +25 -0
- data/vendor/automerge-rust/automerge/src/legacy/serde_impls/scalar_value.rs +63 -0
- data/vendor/automerge-rust/automerge/src/legacy/utility_impls/element_id.rs +66 -0
- data/vendor/automerge-rust/automerge/src/legacy/utility_impls/key.rs +49 -0
- data/vendor/automerge-rust/automerge/src/legacy/utility_impls/mod.rs +4 -0
- data/vendor/automerge-rust/automerge/src/legacy/utility_impls/object_id.rs +74 -0
- data/vendor/automerge-rust/automerge/src/legacy/utility_impls/opid.rs +68 -0
- data/vendor/automerge-rust/automerge/src/lib.rs +315 -0
- data/vendor/automerge-rust/automerge/src/marks.rs +478 -0
- data/vendor/automerge-rust/automerge/src/op_set2/change/batch.rs +2002 -0
- data/vendor/automerge-rust/automerge/src/op_set2/change/collector.rs +974 -0
- data/vendor/automerge-rust/automerge/src/op_set2/change.rs +332 -0
- data/vendor/automerge-rust/automerge/src/op_set2/columns.rs +714 -0
- data/vendor/automerge-rust/automerge/src/op_set2/meta.rs +174 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op.rs +1363 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op_set/elems.rs +43 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op_set/found_op.rs +60 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op_set/index.rs +197 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op_set/insert.rs +179 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op_set/mark_index.rs +292 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op_set/marks.rs +86 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op_set/op_iter.rs +1295 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op_set/op_query.rs +82 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op_set/top_op.rs +50 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op_set/visible.rs +290 -0
- data/vendor/automerge-rust/automerge/src/op_set2/op_set.rs +1793 -0
- data/vendor/automerge-rust/automerge/src/op_set2/parents.rs +133 -0
- data/vendor/automerge-rust/automerge/src/op_set2/skip_list.rs +714 -0
- data/vendor/automerge-rust/automerge/src/op_set2/types.rs +769 -0
- data/vendor/automerge-rust/automerge/src/op_set2.rs +18 -0
- data/vendor/automerge-rust/automerge/src/patches/patch.rs +95 -0
- data/vendor/automerge-rust/automerge/src/patches/patch_builder.rs +382 -0
- data/vendor/automerge-rust/automerge/src/patches/patch_log.rs +584 -0
- data/vendor/automerge-rust/automerge/src/patches.rs +7 -0
- data/vendor/automerge-rust/automerge/src/query/list_state.rs +230 -0
- data/vendor/automerge-rust/automerge/src/query/seek_mark.rs +142 -0
- data/vendor/automerge-rust/automerge/src/read.rs +326 -0
- data/vendor/automerge-rust/automerge/src/sequence_tree.rs +662 -0
- data/vendor/automerge-rust/automerge/src/storage/bundle/builder.rs +942 -0
- data/vendor/automerge-rust/automerge/src/storage/bundle/error.rs +42 -0
- data/vendor/automerge-rust/automerge/src/storage/bundle/meta.rs +23 -0
- data/vendor/automerge-rust/automerge/src/storage/bundle/storage.rs +146 -0
- data/vendor/automerge-rust/automerge/src/storage/bundle.rs +210 -0
- data/vendor/automerge-rust/automerge/src/storage/change/change_actors.rs +311 -0
- data/vendor/automerge-rust/automerge/src/storage/change/change_op_columns.rs +621 -0
- data/vendor/automerge-rust/automerge/src/storage/change/compressed.rs +51 -0
- data/vendor/automerge-rust/automerge/src/storage/change/op_with_change_actors.rs +1 -0
- data/vendor/automerge-rust/automerge/src/storage/change.rs +523 -0
- data/vendor/automerge-rust/automerge/src/storage/chunk.rs +312 -0
- data/vendor/automerge-rust/automerge/src/storage/columns/column.rs +42 -0
- data/vendor/automerge-rust/automerge/src/storage/columns/column_builder.rs +199 -0
- data/vendor/automerge-rust/automerge/src/storage/columns/column_specification.rs +340 -0
- data/vendor/automerge-rust/automerge/src/storage/columns/raw_column.rs +286 -0
- data/vendor/automerge-rust/automerge/src/storage/columns.rs +355 -0
- data/vendor/automerge-rust/automerge/src/storage/document/compression.rs +362 -0
- data/vendor/automerge-rust/automerge/src/storage/document.rs +411 -0
- data/vendor/automerge-rust/automerge/src/storage/load/change_collector.rs +15 -0
- data/vendor/automerge-rust/automerge/src/storage/load.rs +136 -0
- data/vendor/automerge-rust/automerge/src/storage/parse/leb128.rs +302 -0
- data/vendor/automerge-rust/automerge/src/storage/parse.rs +619 -0
- data/vendor/automerge-rust/automerge/src/storage/save/document.rs +27 -0
- data/vendor/automerge-rust/automerge/src/storage.rs +26 -0
- data/vendor/automerge-rust/automerge/src/sync/bloom.rs +161 -0
- data/vendor/automerge-rust/automerge/src/sync/message_builder.rs +118 -0
- data/vendor/automerge-rust/automerge/src/sync/state.rs +214 -0
- data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/bloom.rs +162 -0
- data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/mod.rs +625 -0
- data/vendor/automerge-rust/automerge/src/sync/v1_compat_test/state.rs +120 -0
- data/vendor/automerge-rust/automerge/src/sync.rs +2482 -0
- data/vendor/automerge-rust/automerge/src/text_diff/LICENSE +201 -0
- data/vendor/automerge-rust/automerge/src/text_diff/myers.rs +332 -0
- data/vendor/automerge-rust/automerge/src/text_diff/replace.rs +139 -0
- data/vendor/automerge-rust/automerge/src/text_diff/utils.rs +119 -0
- data/vendor/automerge-rust/automerge/src/text_diff.rs +515 -0
- data/vendor/automerge-rust/automerge/src/text_value.rs +276 -0
- data/vendor/automerge-rust/automerge/src/transaction/commit.rs +34 -0
- data/vendor/automerge-rust/automerge/src/transaction/inner.rs +1403 -0
- data/vendor/automerge-rust/automerge/src/transaction/manual_transaction.rs +147 -0
- data/vendor/automerge-rust/automerge/src/transaction/owned_transaction.rs +266 -0
- data/vendor/automerge-rust/automerge/src/transaction/result.rs +21 -0
- data/vendor/automerge-rust/automerge/src/transaction/transactable.rs +203 -0
- data/vendor/automerge-rust/automerge/src/transaction.rs +513 -0
- data/vendor/automerge-rust/automerge/src/types.rs +749 -0
- data/vendor/automerge-rust/automerge/src/validation.rs +29 -0
- data/vendor/automerge-rust/automerge/src/value.rs +763 -0
- data/vendor/automerge-rust/automerge/tests/batch_insert.rs +1034 -0
- data/vendor/automerge-rust/automerge/tests/block_tests.rs +887 -0
- data/vendor/automerge-rust/automerge/tests/convert_string_to_text.rs +72 -0
- data/vendor/automerge-rust/automerge/tests/diff_marks.rs +1508 -0
- data/vendor/automerge-rust/automerge/tests/fixtures/64bit_obj_id_change.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fixtures/64bit_obj_id_doc.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_has_incorrect_meta.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_is_ok.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fixtures/counter_value_is_overlong.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks_compressed.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fixtures/two_change_chunks_out_of_order.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fuzz-crashers/action-is-48.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fuzz-crashers/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 +0 -0
- data/vendor/automerge-rust/automerge/tests/fuzz-crashers/incorrect_max_op.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fuzz-crashers/invalid_deflate_stream.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fuzz-crashers/missing_actor.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fuzz-crashers/overflow_in_length.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fuzz-crashers/too_many_deps.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/fuzz-crashers/too_many_ops.automerge +0 -0
- data/vendor/automerge-rust/automerge/tests/test.rs +2668 -0
- data/vendor/automerge-rust/automerge/tests/test_mark_patches.rs +41 -0
- data/vendor/automerge-rust/automerge/tests/test_save_load_orphans.rs +84 -0
- data/vendor/automerge-rust/automerge/tests/text.rs +1098 -0
- data/vendor/automerge-rust/automerge/tests/text_encoding.rs +640 -0
- data/vendor/automerge-rust/automerge-c/CMakeLists.txt +439 -0
- data/vendor/automerge-rust/automerge-c/Cargo.toml +22 -0
- data/vendor/automerge-rust/automerge-c/README.md +233 -0
- data/vendor/automerge-rust/automerge-c/build.rs +21 -0
- data/vendor/automerge-rust/automerge-c/cbindgen.toml +48 -0
- data/vendor/automerge-rust/automerge-c/cmake/Cargo.toml.in +22 -0
- data/vendor/automerge-rust/automerge-c/cmake/automerge-c-config.cmake.in +99 -0
- data/vendor/automerge-rust/automerge-c/cmake/cbindgen.toml.in +48 -0
- data/vendor/automerge-rust/automerge-c/cmake/config.h.in +58 -0
- data/vendor/automerge-rust/automerge-c/cmake/enum-string-functions-gen.cmake +183 -0
- data/vendor/automerge-rust/automerge-c/cmake/file-regex-replace.cmake +33 -0
- data/vendor/automerge-rust/automerge-c/cmake/file-touch.cmake +35 -0
- data/vendor/automerge-rust/automerge-c/docs/CMakeLists.txt +39 -0
- data/vendor/automerge-rust/automerge-c/docs/img/brandmark.png +0 -0
- data/vendor/automerge-rust/automerge-c/examples/CMakeLists.txt +42 -0
- data/vendor/automerge-rust/automerge-c/examples/README.md +9 -0
- data/vendor/automerge-rust/automerge-c/examples/quickstart.c +131 -0
- data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/result.h +30 -0
- data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/stack.h +130 -0
- data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/stack_callback_data.h +53 -0
- data/vendor/automerge-rust/automerge-c/include/automerge-c/utils/string.h +29 -0
- data/vendor/automerge-rust/automerge-c/src/actor_id.rs +193 -0
- data/vendor/automerge-rust/automerge-c/src/byte_span.rs +227 -0
- data/vendor/automerge-rust/automerge-c/src/change.rs +356 -0
- data/vendor/automerge-rust/automerge-c/src/cursor.rs +168 -0
- data/vendor/automerge-rust/automerge-c/src/doc/list.rs +636 -0
- data/vendor/automerge-rust/automerge-c/src/doc/map.rs +556 -0
- data/vendor/automerge-rust/automerge-c/src/doc/mark.rs +296 -0
- data/vendor/automerge-rust/automerge-c/src/doc/utils.rs +46 -0
- data/vendor/automerge-rust/automerge-c/src/doc.rs +1009 -0
- data/vendor/automerge-rust/automerge-c/src/index.rs +84 -0
- data/vendor/automerge-rust/automerge-c/src/item.rs +2177 -0
- data/vendor/automerge-rust/automerge-c/src/items.rs +401 -0
- data/vendor/automerge-rust/automerge-c/src/lib.rs +11 -0
- data/vendor/automerge-rust/automerge-c/src/obj.rs +216 -0
- data/vendor/automerge-rust/automerge-c/src/result.rs +653 -0
- data/vendor/automerge-rust/automerge-c/src/sync/have.rs +42 -0
- data/vendor/automerge-rust/automerge-c/src/sync/message.rs +146 -0
- data/vendor/automerge-rust/automerge-c/src/sync/state.rs +262 -0
- data/vendor/automerge-rust/automerge-c/src/sync.rs +7 -0
- data/vendor/automerge-rust/automerge-c/src/utils/result.c +33 -0
- data/vendor/automerge-rust/automerge-c/src/utils/stack.c +106 -0
- data/vendor/automerge-rust/automerge-c/src/utils/stack_callback_data.c +9 -0
- data/vendor/automerge-rust/automerge-c/src/utils/string.c +46 -0
- data/vendor/automerge-rust/automerge-c/test/CMakeLists.txt +67 -0
- data/vendor/automerge-rust/automerge-c/test/actor_id_tests.c +140 -0
- data/vendor/automerge-rust/automerge-c/test/base_state.c +17 -0
- data/vendor/automerge-rust/automerge-c/test/base_state.h +39 -0
- data/vendor/automerge-rust/automerge-c/test/byte_span_tests.c +119 -0
- data/vendor/automerge-rust/automerge-c/test/cmocka_utils.c +91 -0
- data/vendor/automerge-rust/automerge-c/test/cmocka_utils.h +42 -0
- data/vendor/automerge-rust/automerge-c/test/cursor_tests.c +263 -0
- data/vendor/automerge-rust/automerge-c/test/doc_state.c +27 -0
- data/vendor/automerge-rust/automerge-c/test/doc_state.h +17 -0
- data/vendor/automerge-rust/automerge-c/test/doc_tests.c +335 -0
- data/vendor/automerge-rust/automerge-c/test/enum_string_tests.c +148 -0
- data/vendor/automerge-rust/automerge-c/test/files/brave-ape-49.automerge +0 -0
- data/vendor/automerge-rust/automerge-c/test/item_tests.c +313 -0
- data/vendor/automerge-rust/automerge-c/test/list_tests.c +544 -0
- data/vendor/automerge-rust/automerge-c/test/macro_utils.c +38 -0
- data/vendor/automerge-rust/automerge-c/test/macro_utils.h +23 -0
- data/vendor/automerge-rust/automerge-c/test/main.c +33 -0
- data/vendor/automerge-rust/automerge-c/test/map_tests.c +1610 -0
- data/vendor/automerge-rust/automerge-c/test/mark_tests.c +124 -0
- data/vendor/automerge-rust/automerge-c/test/ported_wasm/basic_tests.c +1642 -0
- data/vendor/automerge-rust/automerge-c/test/ported_wasm/cursor_tests.c +108 -0
- data/vendor/automerge-rust/automerge-c/test/ported_wasm/suite.c +17 -0
- data/vendor/automerge-rust/automerge-c/test/ported_wasm/sync_tests.c +1280 -0
- data/vendor/automerge-rust/automerge-c/test/str_utils.c +15 -0
- data/vendor/automerge-rust/automerge-c/test/str_utils.h +17 -0
- data/vendor/automerge-rust/automerge-test/Cargo.toml +17 -0
- data/vendor/automerge-rust/automerge-test/README.md +3 -0
- data/vendor/automerge-rust/automerge-test/src/lib.rs +487 -0
- data/vendor/automerge-rust/hexane/CHANGELOG.md +34 -0
- data/vendor/automerge-rust/hexane/Cargo.toml +47 -0
- data/vendor/automerge-rust/hexane/README.md +292 -0
- data/vendor/automerge-rust/hexane/RESULTS.txt +20 -0
- data/vendor/automerge-rust/hexane/TODO +18 -0
- data/vendor/automerge-rust/hexane/benches/insert.rs +82 -0
- data/vendor/automerge-rust/hexane/benches/seek.rs +77 -0
- data/vendor/automerge-rust/hexane/benches/splice.rs +82 -0
- data/vendor/automerge-rust/hexane/src/aggregate.rs +288 -0
- data/vendor/automerge-rust/hexane/src/boolean.rs +478 -0
- data/vendor/automerge-rust/hexane/src/columndata.rs +2540 -0
- data/vendor/automerge-rust/hexane/src/cursor.rs +756 -0
- data/vendor/automerge-rust/hexane/src/delta.rs +793 -0
- data/vendor/automerge-rust/hexane/src/encoder.rs +639 -0
- data/vendor/automerge-rust/hexane/src/leb128.rs +82 -0
- data/vendor/automerge-rust/hexane/src/lib.rs +95 -0
- data/vendor/automerge-rust/hexane/src/pack.rs +325 -0
- data/vendor/automerge-rust/hexane/src/raw.rs +314 -0
- data/vendor/automerge-rust/hexane/src/rle.rs +928 -0
- data/vendor/automerge-rust/hexane/src/slab/tree.rs +1373 -0
- data/vendor/automerge-rust/hexane/src/slab/writer.rs +535 -0
- data/vendor/automerge-rust/hexane/src/slab.rs +224 -0
- data/vendor/automerge-rust/hexane/src/test.rs +108 -0
- data/vendor/bundle/ruby/3.3.0/bin/rake +29 -0
- data/vendor/bundle/ruby/3.3.0/bin/rake-compiler +29 -0
- data/vendor/bundle/ruby/3.3.0/bin/rake-compiler-dock +29 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/History.rdoc +1732 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/Manifest.txt +32 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/README.rdoc +845 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/Rakefile +97 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/design_rationale.rb +54 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/hoe/minitest.rb +30 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/assertions.rb +850 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/autorun.rb +6 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/benchmark.rb +452 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/compress.rb +94 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/error_on_warning.rb +11 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/expectations.rb +321 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/hell.rb +11 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/manual_plugins.rb +16 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/mock.rb +327 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/parallel.rb +72 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/pride.rb +4 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/pride_plugin.rb +135 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/spec.rb +353 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/test.rb +238 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/test_task.rb +324 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest/unit.rb +42 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/lib/minitest.rb +1250 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/metametameta.rb +150 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_assertions.rb +1677 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_benchmark.rb +137 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_mock.rb +1213 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_reporter.rb +437 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_spec.rb +1159 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_test.rb +1374 -0
- data/vendor/bundle/ruby/3.3.0/gems/minitest-5.27.0/test/minitest/test_minitest_test_task.rb +57 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/History.rdoc +2454 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/MIT-LICENSE +21 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/README.rdoc +155 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/command_line_usage.rdoc +171 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/Rakefile1 +38 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/Rakefile2 +35 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/a.c +6 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/b.c +6 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/example/main.c +11 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/glossary.rdoc +42 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/jamis.rb +592 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/proto_rake.rdoc +127 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rake.1 +156 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rakefile.rdoc +635 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/doc/rational.rdoc +151 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/exe/rake +27 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/application.rb +847 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/backtrace.rb +25 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/clean.rb +78 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/cloneable.rb +17 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/cpu_counter.rb +122 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/default_loader.rb +15 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/dsl_definition.rb +196 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/early_time.rb +22 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/ext/core.rb +26 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/ext/string.rb +176 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_creation_task.rb +25 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_list.rb +435 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_task.rb +58 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_utils.rb +137 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/file_utils_ext.rb +135 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/invocation_chain.rb +57 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/invocation_exception_mixin.rb +17 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/late_time.rb +18 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/linked_list.rb +112 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/loaders/makefile.rb +54 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/multi_task.rb +14 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/name_space.rb +38 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/options.rb +31 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/packagetask.rb +222 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/phony.rb +16 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/private_reader.rb +21 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/promise.rb +100 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/pseudo_status.rb +30 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rake_module.rb +67 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rake_test_loader.rb +27 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/scope.rb +43 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task.rb +434 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_argument_error.rb +8 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_arguments.rb +113 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/task_manager.rb +333 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/tasklib.rb +12 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/testtask.rb +192 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/thread_history_display.rb +49 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/thread_pool.rb +157 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/trace_output.rb +23 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/version.rb +10 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake/win32.rb +17 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/lib/rake.rb +69 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-13.4.2/rake.gemspec +102 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/Gemfile +8 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/History.md +695 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/LICENSE.txt +20 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/README.md +476 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/Rakefile +15 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/appveyor.yml +22 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/bin/rake-compiler +24 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/cucumber.yml +4 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/compile.feature +79 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-compile.feature +23 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-package-multi.feature +15 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/cross-package.feature +14 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-compile.feature +22 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-no-native-compile.feature +33 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/java-package.feature +24 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/package.feature +40 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/compilation.rb +70 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/cross_compilation.rb +27 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/execution.rb +52 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/folders.rb +32 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/gem.rb +46 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/step_definitions/java_compilation.rb +7 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/env.rb +10 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/file_template_helpers.rb +137 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/generator_helpers.rb +123 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/features/support/platform_extension_helpers.rb +27 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/baseextensiontask.rb +90 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/compiler_config.rb +38 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/extensioncompiler.rb +51 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/extensiontask.rb +589 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/lib/rake/javaextensiontask.rb +321 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/bin/cross-ruby.rake +189 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/bootstrap.rake +11 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/common.rake +10 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/cucumber.rake +23 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/gem.rake +15 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-1.3.1/tasks/rspec.rake +9 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/CHANGELOG.md +446 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/CONTRIBUTING.md +109 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Dockerfile.jruby +79 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Dockerfile.mri.erb +282 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Gemfile +8 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/README.md +447 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/Rakefile +246 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/bin/rake-compiler-dock +18 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/buildkitd.toml +2 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/gem_helper.rb +54 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_i686.rb +18 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_musl_cross.sh +37 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_osxcross.sh +45 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/mk_pkg_config.sh +24 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/parallel_docker_build.rb +169 -0
- 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
- 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
- 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
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/rcd-env.sh +6 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/runas +7 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/sigfw.c +45 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_codesign +17 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_vbox +30 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/build/sudoers +1 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/colors.rb +43 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/docker_check.rb +356 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/predefined_user_group.rb +5 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/starter.rb +206 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/version.rb +4 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock.rb +151 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/Dockerfile +66 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/README.md +14 -0
- 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
- 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
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/mingw-w64-enable-ucrt.patch +22 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/rake-compiler-dock.gemspec +34 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.alpine +17 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.debian +24 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/fixtures/mig_test_rpc.defs +8 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Gemfile +11 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Rakefile +97 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RcdTestExtService.java +19 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RubyRcdTest.java +16 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/extconf.rb +111 -0
- 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
- 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
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/lib/rcd_test.rb +6 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/rcd_test.gemspec +28 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/test/test_basic.rb +49 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_environment_variables.rb +108 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_mig.rb +18 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_parallel_docker_build.rb +95 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_rubygems_plugins.rb +12 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_starter.rb +158 -0
- data/vendor/bundle/ruby/3.3.0/gems/rake-compiler-dock-1.12.0/test/test_versions.rb +82 -0
- data/vendor/bundle/ruby/3.3.0/specifications/minitest-5.27.0.gemspec +32 -0
- data/vendor/bundle/ruby/3.3.0/specifications/rake-13.4.2.gemspec +26 -0
- data/vendor/bundle/ruby/3.3.0/specifications/rake-compiler-1.3.1.gemspec +33 -0
- data/vendor/bundle/ruby/3.3.0/specifications/rake-compiler-dock-1.12.0.gemspec +28 -0
- 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
|
+
}
|