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,1805 @@
|
|
|
1
|
+
#include "ruby.h"
|
|
2
|
+
#include "ruby/encoding.h"
|
|
3
|
+
|
|
4
|
+
#include <stdbool.h>
|
|
5
|
+
#include <stddef.h>
|
|
6
|
+
#include <stdint.h>
|
|
7
|
+
#include <string.h>
|
|
8
|
+
|
|
9
|
+
typedef struct AMactorId AMactorId;
|
|
10
|
+
typedef struct AMchange AMchange;
|
|
11
|
+
typedef struct AMcursor AMcursor;
|
|
12
|
+
typedef struct AMdoc AMdoc;
|
|
13
|
+
typedef struct AMitem AMitem;
|
|
14
|
+
typedef struct AMmark AMmark;
|
|
15
|
+
typedef struct AMobjId AMobjId;
|
|
16
|
+
typedef struct AMresult AMresult;
|
|
17
|
+
typedef struct AMsyncMessage AMsyncMessage;
|
|
18
|
+
typedef struct AMsyncState AMsyncState;
|
|
19
|
+
|
|
20
|
+
typedef struct {
|
|
21
|
+
const uint8_t *src;
|
|
22
|
+
size_t count;
|
|
23
|
+
} AMbyteSpan;
|
|
24
|
+
|
|
25
|
+
typedef struct {
|
|
26
|
+
unsigned char detail[sizeof(size_t) + sizeof(ptrdiff_t) + sizeof(void *)];
|
|
27
|
+
} AMitems;
|
|
28
|
+
|
|
29
|
+
typedef enum {
|
|
30
|
+
AM_STATUS_OK = 0,
|
|
31
|
+
AM_STATUS_ERROR = 1,
|
|
32
|
+
AM_STATUS_INVALID_RESULT = 2,
|
|
33
|
+
} AMstatus;
|
|
34
|
+
|
|
35
|
+
typedef enum {
|
|
36
|
+
AM_OBJ_TYPE_DEFAULT = 0,
|
|
37
|
+
AM_OBJ_TYPE_LIST = 1,
|
|
38
|
+
AM_OBJ_TYPE_MAP = 2,
|
|
39
|
+
AM_OBJ_TYPE_TEXT = 3,
|
|
40
|
+
} AMobjType;
|
|
41
|
+
|
|
42
|
+
typedef enum {
|
|
43
|
+
AM_MARK_EXPAND_DEFAULT = 0,
|
|
44
|
+
AM_MARK_EXPAND_NONE = 1,
|
|
45
|
+
AM_MARK_EXPAND_BEFORE = 2,
|
|
46
|
+
AM_MARK_EXPAND_AFTER = 3,
|
|
47
|
+
AM_MARK_EXPAND_BOTH = 4,
|
|
48
|
+
} AMmarkExpand;
|
|
49
|
+
|
|
50
|
+
typedef enum {
|
|
51
|
+
AM_VAL_TYPE_VOID = 1 << 0,
|
|
52
|
+
AM_VAL_TYPE_ACTOR_ID = 1 << 1,
|
|
53
|
+
AM_VAL_TYPE_BOOL = 1 << 2,
|
|
54
|
+
AM_VAL_TYPE_BYTES = 1 << 3,
|
|
55
|
+
AM_VAL_TYPE_CHANGE = 1 << 4,
|
|
56
|
+
AM_VAL_TYPE_CHANGE_HASH = 1 << 5,
|
|
57
|
+
AM_VAL_TYPE_COUNTER = 1 << 6,
|
|
58
|
+
AM_VAL_TYPE_CURSOR = 1 << 7,
|
|
59
|
+
AM_VAL_TYPE_DOC = 1 << 8,
|
|
60
|
+
AM_VAL_TYPE_F64 = 1 << 9,
|
|
61
|
+
AM_VAL_TYPE_INT = 1 << 10,
|
|
62
|
+
AM_VAL_TYPE_MARK = 1 << 11,
|
|
63
|
+
AM_VAL_TYPE_NULL = 1 << 12,
|
|
64
|
+
AM_VAL_TYPE_OBJ_TYPE = 1 << 13,
|
|
65
|
+
AM_VAL_TYPE_STR = 1 << 14,
|
|
66
|
+
AM_VAL_TYPE_SYNC_HAVE = 1 << 15,
|
|
67
|
+
AM_VAL_TYPE_SYNC_MESSAGE = 1 << 16,
|
|
68
|
+
AM_VAL_TYPE_SYNC_STATE = 1 << 17,
|
|
69
|
+
AM_VAL_TYPE_TIMESTAMP = 1 << 18,
|
|
70
|
+
AM_VAL_TYPE_UINT = 1 << 19,
|
|
71
|
+
AM_VAL_TYPE_UNKNOWN = 1 << 20,
|
|
72
|
+
} AMvalType;
|
|
73
|
+
|
|
74
|
+
extern AMresult *AMactorIdFromStr(AMbyteSpan value);
|
|
75
|
+
extern AMbyteSpan AMactorIdStr(const AMactorId *actor_id);
|
|
76
|
+
extern AMresult *AMapplyChanges(AMdoc *doc, const AMitems *items);
|
|
77
|
+
extern AMresult *AMchangeFromBytes(const uint8_t *src, size_t count);
|
|
78
|
+
extern AMbyteSpan AMchangeRawBytes(const AMchange *change);
|
|
79
|
+
extern AMresult *AMclone(const AMdoc *doc);
|
|
80
|
+
extern AMresult *AMcommit(AMdoc *doc, AMbyteSpan message, const int64_t *timestamp);
|
|
81
|
+
extern AMresult *AMcreate(const AMactorId *actor_id);
|
|
82
|
+
extern AMbyteSpan AMcursorBytes(const AMcursor *cursor);
|
|
83
|
+
extern AMresult *AMcursorFromBytes(const uint8_t *src, size_t count);
|
|
84
|
+
extern AMresult *AMemptyChange(AMdoc *doc, AMbyteSpan message, const int64_t *timestamp);
|
|
85
|
+
extern bool AMequal(AMdoc *doc1, AMdoc *doc2);
|
|
86
|
+
extern AMresult *AMfork(AMdoc *doc, const AMitems *heads);
|
|
87
|
+
extern AMresult *AMgenerateSyncMessage(AMdoc *doc, AMsyncState *sync_state);
|
|
88
|
+
extern AMresult *AMgetActorId(const AMdoc *doc);
|
|
89
|
+
extern AMresult *AMgetChangeByHash(AMdoc *doc, const uint8_t *src, size_t count);
|
|
90
|
+
extern AMresult *AMgetChanges(AMdoc *doc, const AMitems *have_deps);
|
|
91
|
+
extern AMresult *AMgetChangesAdded(AMdoc *doc1, AMdoc *doc2);
|
|
92
|
+
extern AMresult *AMgetCursor(const AMdoc *doc, const AMobjId *obj_id, size_t position, const AMitems *heads);
|
|
93
|
+
extern AMresult *AMgetCursorPosition(const AMdoc *doc, const AMobjId *obj_id, const AMcursor *cursor, const AMitems *heads);
|
|
94
|
+
extern AMresult *AMgetHeads(AMdoc *doc);
|
|
95
|
+
extern AMresult *AMgetLastLocalChange(AMdoc *doc);
|
|
96
|
+
extern AMresult *AMgetMissingDeps(AMdoc *doc, const AMitems *heads);
|
|
97
|
+
extern AMitem *AMitemResult(const AMitem *item);
|
|
98
|
+
extern AMresult *AMitemFromBool(bool value);
|
|
99
|
+
extern AMresult *AMitemFromBytes(const uint8_t *src, size_t count);
|
|
100
|
+
extern AMresult *AMitemFromCounter(int64_t value);
|
|
101
|
+
extern AMresult *AMitemFromF64(double value);
|
|
102
|
+
extern AMresult *AMitemFromInt(int64_t value);
|
|
103
|
+
extern AMresult *AMitemFromNull(void);
|
|
104
|
+
extern AMresult *AMitemFromStr(AMbyteSpan value);
|
|
105
|
+
extern AMresult *AMitemFromTimestamp(int64_t value);
|
|
106
|
+
extern AMresult *AMitemFromUint(uint64_t value);
|
|
107
|
+
extern bool AMitemKey(const AMitem *item, AMbyteSpan *value);
|
|
108
|
+
extern const AMobjId *AMitemObjId(const AMitem *item);
|
|
109
|
+
extern bool AMitemPos(const AMitem *item, size_t *value);
|
|
110
|
+
extern AMresult *AMitemFromChangeHash(AMbyteSpan value);
|
|
111
|
+
extern bool AMitemToActorId(const AMitem *item, const AMactorId **value);
|
|
112
|
+
extern bool AMitemToBool(const AMitem *item, bool *value);
|
|
113
|
+
extern bool AMitemToBytes(const AMitem *item, AMbyteSpan *value);
|
|
114
|
+
extern bool AMitemToChange(AMitem *item, AMchange **value);
|
|
115
|
+
extern bool AMitemToChangeHash(const AMitem *item, AMbyteSpan *value);
|
|
116
|
+
extern bool AMitemToCounter(const AMitem *item, int64_t *value);
|
|
117
|
+
extern bool AMitemToCursor(const AMitem *item, const AMcursor **value);
|
|
118
|
+
extern bool AMitemToDoc(AMitem *item, AMdoc **value);
|
|
119
|
+
extern bool AMitemToF64(const AMitem *item, double *value);
|
|
120
|
+
extern bool AMitemToInt(const AMitem *item, int64_t *value);
|
|
121
|
+
extern bool AMitemToMark(const AMitem *item, const AMmark **value);
|
|
122
|
+
extern bool AMitemToStr(const AMitem *item, AMbyteSpan *value);
|
|
123
|
+
extern bool AMitemToSyncMessage(const AMitem *item, const AMsyncMessage **value);
|
|
124
|
+
extern bool AMitemToSyncState(AMitem *item, AMsyncState **value);
|
|
125
|
+
extern bool AMitemToTimestamp(const AMitem *item, int64_t *value);
|
|
126
|
+
extern bool AMitemToUint(const AMitem *item, uint64_t *value);
|
|
127
|
+
extern AMvalType AMitemValType(const AMitem *item);
|
|
128
|
+
extern void AMitemsAdvance(AMitems *items, ptrdiff_t n);
|
|
129
|
+
extern AMitem *AMitemsNext(AMitems *items, ptrdiff_t n);
|
|
130
|
+
extern size_t AMitemsSize(const AMitems *items);
|
|
131
|
+
extern AMresult *AMkeys(const AMdoc *doc, const AMobjId *obj_id, const AMitems *heads);
|
|
132
|
+
extern AMresult *AMlistDelete(AMdoc *doc, const AMobjId *obj_id, size_t pos);
|
|
133
|
+
extern AMresult *AMlistGet(const AMdoc *doc, const AMobjId *obj_id, size_t pos, const AMitems *heads);
|
|
134
|
+
extern AMresult *AMlistGetAll(const AMdoc *doc, const AMobjId *obj_id, size_t pos, const AMitems *heads);
|
|
135
|
+
extern AMresult *AMlistIncrement(AMdoc *doc, const AMobjId *obj_id, size_t pos, int64_t value);
|
|
136
|
+
extern AMresult *AMlistPutBool(AMdoc *doc, const AMobjId *obj_id, size_t pos, bool insert, bool value);
|
|
137
|
+
extern AMresult *AMlistPutBytes(AMdoc *doc, const AMobjId *obj_id, size_t pos, bool insert, AMbyteSpan value);
|
|
138
|
+
extern AMresult *AMlistPutCounter(AMdoc *doc, const AMobjId *obj_id, size_t pos, bool insert, int64_t value);
|
|
139
|
+
extern AMresult *AMlistPutF64(AMdoc *doc, const AMobjId *obj_id, size_t pos, bool insert, double value);
|
|
140
|
+
extern AMresult *AMlistPutInt(AMdoc *doc, const AMobjId *obj_id, size_t pos, bool insert, int64_t value);
|
|
141
|
+
extern AMresult *AMlistPutNull(AMdoc *doc, const AMobjId *obj_id, size_t pos, bool insert);
|
|
142
|
+
extern AMresult *AMlistPutObject(AMdoc *doc, const AMobjId *obj_id, size_t pos, bool insert, AMobjType obj_type);
|
|
143
|
+
extern AMresult *AMlistPutStr(AMdoc *doc, const AMobjId *obj_id, size_t pos, bool insert, AMbyteSpan value);
|
|
144
|
+
extern AMresult *AMlistPutTimestamp(AMdoc *doc, const AMobjId *obj_id, size_t pos, bool insert, int64_t value);
|
|
145
|
+
extern AMresult *AMlistPutUint(AMdoc *doc, const AMobjId *obj_id, size_t pos, bool insert, uint64_t value);
|
|
146
|
+
extern AMresult *AMlistRange(const AMdoc *doc, const AMobjId *obj_id, size_t begin, size_t end, const AMitems *heads);
|
|
147
|
+
extern AMresult *AMload(const uint8_t *src, size_t count);
|
|
148
|
+
extern AMresult *AMloadIncremental(AMdoc *doc, const uint8_t *src, size_t count);
|
|
149
|
+
extern AMresult *AMmapDelete(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key);
|
|
150
|
+
extern AMresult *AMmapGet(const AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, const AMitems *heads);
|
|
151
|
+
extern AMresult *AMmapGetAll(const AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, const AMitems *heads);
|
|
152
|
+
extern AMresult *AMmapIncrement(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, int64_t value);
|
|
153
|
+
extern AMresult *AMmapPutBool(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, bool value);
|
|
154
|
+
extern AMresult *AMmapPutBytes(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, AMbyteSpan value);
|
|
155
|
+
extern AMresult *AMmapPutCounter(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, int64_t value);
|
|
156
|
+
extern AMresult *AMmapPutF64(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, double value);
|
|
157
|
+
extern AMresult *AMmapPutInt(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, int64_t value);
|
|
158
|
+
extern AMresult *AMmapPutNull(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key);
|
|
159
|
+
extern AMresult *AMmapPutObject(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, AMobjType obj_type);
|
|
160
|
+
extern AMresult *AMmapPutStr(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, AMbyteSpan value);
|
|
161
|
+
extern AMresult *AMmapPutTimestamp(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, int64_t value);
|
|
162
|
+
extern AMresult *AMmapPutUint(AMdoc *doc, const AMobjId *obj_id, AMbyteSpan key, uint64_t value);
|
|
163
|
+
extern AMresult *AMmapRange(const AMdoc *doc, const AMobjId *obj_id, AMbyteSpan begin, AMbyteSpan end, const AMitems *heads);
|
|
164
|
+
extern AMresult *AMmarkClear(AMdoc *doc, const AMobjId *obj_id, size_t start, size_t end, AMmarkExpand expand, AMbyteSpan name);
|
|
165
|
+
extern AMresult *AMmarkCreate(AMdoc *doc, const AMobjId *obj_id, size_t start, size_t end, AMmarkExpand expand, AMbyteSpan name, const AMitem *value);
|
|
166
|
+
extern size_t AMmarkEnd(const AMmark *mark);
|
|
167
|
+
extern AMbyteSpan AMmarkName(const AMmark *mark);
|
|
168
|
+
extern size_t AMmarkStart(const AMmark *mark);
|
|
169
|
+
extern AMresult *AMmarkValue(const AMmark *mark);
|
|
170
|
+
extern AMresult *AMmarks(const AMdoc *doc, const AMobjId *obj_id, const AMitems *heads);
|
|
171
|
+
extern AMresult *AMmerge(AMdoc *dest, AMdoc *src);
|
|
172
|
+
extern AMobjType AMobjObjType(const AMdoc *doc, const AMobjId *obj_id);
|
|
173
|
+
extern size_t AMobjSize(const AMdoc *doc, const AMobjId *obj_id, const AMitems *heads);
|
|
174
|
+
extern size_t AMpendingOps(const AMdoc *doc);
|
|
175
|
+
extern AMresult *AMreceiveSyncMessage(AMdoc *doc, AMsyncState *sync_state, const AMsyncMessage *sync_message);
|
|
176
|
+
extern AMbyteSpan AMresultError(const AMresult *result);
|
|
177
|
+
extern void AMresultFree(AMresult *result);
|
|
178
|
+
extern AMitem *AMresultItem(AMresult *result);
|
|
179
|
+
extern AMitems AMresultItems(AMresult *result);
|
|
180
|
+
extern AMresult *AMresultCat(const AMresult *dest, const AMresult *src);
|
|
181
|
+
extern size_t AMresultSize(const AMresult *result);
|
|
182
|
+
extern AMstatus AMresultStatus(const AMresult *result);
|
|
183
|
+
extern size_t AMrollback(AMdoc *doc);
|
|
184
|
+
extern AMresult *AMsave(AMdoc *doc);
|
|
185
|
+
extern AMresult *AMsaveIncremental(AMdoc *doc);
|
|
186
|
+
extern AMresult *AMsetActorId(AMdoc *doc, const AMactorId *actor_id);
|
|
187
|
+
extern AMresult *AMspliceText(AMdoc *doc, const AMobjId *obj_id, size_t pos, ptrdiff_t del, AMbyteSpan text);
|
|
188
|
+
extern AMresult *AMsyncMessageDecode(const uint8_t *src, size_t count);
|
|
189
|
+
extern AMresult *AMsyncMessageEncode(const AMsyncMessage *sync_message);
|
|
190
|
+
extern AMresult *AMsyncStateDecode(const uint8_t *src, size_t count);
|
|
191
|
+
extern AMresult *AMsyncStateEncode(const AMsyncState *sync_state);
|
|
192
|
+
extern bool AMsyncStateEqual(const AMsyncState *sync_state1, const AMsyncState *sync_state2);
|
|
193
|
+
extern AMresult *AMsyncStateInit(void);
|
|
194
|
+
extern AMresult *AMsyncStateSharedHeads(const AMsyncState *sync_state);
|
|
195
|
+
extern AMresult *AMtext(const AMdoc *doc, const AMobjId *obj_id, const AMitems *heads);
|
|
196
|
+
extern AMresult *AMchangeActorId(const AMchange *change);
|
|
197
|
+
extern AMbyteSpan AMchangeMessage(const AMchange *change);
|
|
198
|
+
extern int64_t AMchangeTime(const AMchange *change);
|
|
199
|
+
extern AMbyteSpan AMchangeHash(const AMchange *change);
|
|
200
|
+
extern uint64_t AMchangeSeq(const AMchange *change);
|
|
201
|
+
extern uint64_t AMchangeMaxOp(const AMchange *change);
|
|
202
|
+
extern uint64_t AMchangeStartOp(const AMchange *change);
|
|
203
|
+
extern AMresult *AMchangeDeps(const AMchange *change);
|
|
204
|
+
extern size_t AMchangeSize(const AMchange *change);
|
|
205
|
+
extern bool AMchangeIsEmpty(const AMchange *change);
|
|
206
|
+
extern AMbyteSpan AMchangeExtraBytes(const AMchange *change);
|
|
207
|
+
|
|
208
|
+
typedef struct {
|
|
209
|
+
AMresult *result;
|
|
210
|
+
AMdoc *doc;
|
|
211
|
+
} amrb_doc_t;
|
|
212
|
+
|
|
213
|
+
typedef struct {
|
|
214
|
+
AMresult *result;
|
|
215
|
+
AMsyncState *state;
|
|
216
|
+
} amrb_sync_state_t;
|
|
217
|
+
|
|
218
|
+
typedef struct {
|
|
219
|
+
AMresult **items;
|
|
220
|
+
long len;
|
|
221
|
+
long capacity;
|
|
222
|
+
} amrb_result_stack_t;
|
|
223
|
+
|
|
224
|
+
static VALUE mAutomerge;
|
|
225
|
+
static VALUE cDocument;
|
|
226
|
+
static VALUE cSyncState;
|
|
227
|
+
static VALUE cError;
|
|
228
|
+
static VALUE cCounter;
|
|
229
|
+
static VALUE cTimestamp;
|
|
230
|
+
static VALUE cBytes;
|
|
231
|
+
static VALUE cText;
|
|
232
|
+
static VALUE cUint;
|
|
233
|
+
static ID id_actor_id;
|
|
234
|
+
static ID id_message;
|
|
235
|
+
static ID id_timestamp;
|
|
236
|
+
static ID id_value;
|
|
237
|
+
static ID id_value_key;
|
|
238
|
+
|
|
239
|
+
static AMbyteSpan null_span(void) {
|
|
240
|
+
AMbyteSpan span;
|
|
241
|
+
span.src = NULL;
|
|
242
|
+
span.count = 0;
|
|
243
|
+
return span;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
static AMbyteSpan string_span(VALUE value) {
|
|
247
|
+
StringValue(value);
|
|
248
|
+
AMbyteSpan span;
|
|
249
|
+
span.src = (const uint8_t *)RSTRING_PTR(value);
|
|
250
|
+
span.count = (size_t)RSTRING_LEN(value);
|
|
251
|
+
return span;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
static VALUE utf8_string_from_span(AMbyteSpan span) {
|
|
255
|
+
VALUE string = rb_str_new((const char *)span.src, (long)span.count);
|
|
256
|
+
rb_enc_associate(string, rb_utf8_encoding());
|
|
257
|
+
return string;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
static VALUE binary_string_from_span(AMbyteSpan span) {
|
|
261
|
+
VALUE string = rb_str_new((const char *)span.src, (long)span.count);
|
|
262
|
+
rb_enc_associate(string, rb_ascii8bit_encoding());
|
|
263
|
+
return string;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
static void raise_with_message(VALUE error_class, VALUE message) {
|
|
267
|
+
rb_exc_raise(rb_exc_new_str(error_class, message));
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
static void raise_result(AMresult *result) {
|
|
271
|
+
if (!result) {
|
|
272
|
+
rb_raise(cError, "Automerge returned a null result");
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
AMstatus status = AMresultStatus(result);
|
|
276
|
+
if (status == AM_STATUS_OK) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
VALUE message;
|
|
281
|
+
if (status == AM_STATUS_ERROR) {
|
|
282
|
+
message = utf8_string_from_span(AMresultError(result));
|
|
283
|
+
} else {
|
|
284
|
+
message = rb_sprintf("invalid Automerge result status %d", status);
|
|
285
|
+
}
|
|
286
|
+
AMresultFree(result);
|
|
287
|
+
raise_with_message(cError, message);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
static void check_result(AMresult *result) {
|
|
291
|
+
raise_result(result);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
static void checked_free_result(AMresult *result) {
|
|
295
|
+
check_result(result);
|
|
296
|
+
AMresultFree(result);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
static VALUE scalar_object(VALUE klass, VALUE value) {
|
|
300
|
+
VALUE obj = rb_obj_alloc(klass);
|
|
301
|
+
rb_ivar_set(obj, id_value, value);
|
|
302
|
+
return obj;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
static VALUE path_array(VALUE path) {
|
|
306
|
+
if (NIL_P(path)) {
|
|
307
|
+
return rb_ary_new();
|
|
308
|
+
}
|
|
309
|
+
if (RB_TYPE_P(path, T_ARRAY)) {
|
|
310
|
+
return path;
|
|
311
|
+
}
|
|
312
|
+
VALUE ary = rb_ary_new2(1);
|
|
313
|
+
rb_ary_push(ary, path);
|
|
314
|
+
return ary;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
static VALUE path_key_string(VALUE key) {
|
|
318
|
+
if (RB_TYPE_P(key, T_SYMBOL)) {
|
|
319
|
+
key = rb_sym2str(key);
|
|
320
|
+
}
|
|
321
|
+
StringValue(key);
|
|
322
|
+
return key;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
static size_t path_index(VALUE index) {
|
|
326
|
+
if (!RB_INTEGER_TYPE_P(index)) {
|
|
327
|
+
rb_raise(rb_eTypeError, "list path segment must be an Integer");
|
|
328
|
+
}
|
|
329
|
+
long value = NUM2LONG(index);
|
|
330
|
+
if (value < 0) {
|
|
331
|
+
rb_raise(rb_eArgError, "list index must be non-negative");
|
|
332
|
+
}
|
|
333
|
+
return (size_t)value;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
static void stack_init(amrb_result_stack_t *stack, long capacity) {
|
|
337
|
+
stack->len = 0;
|
|
338
|
+
stack->capacity = capacity > 0 ? capacity : 1;
|
|
339
|
+
stack->items = ALLOC_N(AMresult *, stack->capacity);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
static void stack_push(amrb_result_stack_t *stack, AMresult *result) {
|
|
343
|
+
if (stack->len == stack->capacity) {
|
|
344
|
+
REALLOC_N(stack->items, AMresult *, stack->capacity * 2);
|
|
345
|
+
stack->capacity *= 2;
|
|
346
|
+
}
|
|
347
|
+
stack->items[stack->len++] = result;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
static void stack_free(amrb_result_stack_t *stack) {
|
|
351
|
+
for (long i = 0; i < stack->len; i++) {
|
|
352
|
+
AMresultFree(stack->items[i]);
|
|
353
|
+
}
|
|
354
|
+
xfree(stack->items);
|
|
355
|
+
stack->items = NULL;
|
|
356
|
+
stack->len = 0;
|
|
357
|
+
stack->capacity = 0;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
static void doc_free(void *ptr) {
|
|
361
|
+
amrb_doc_t *doc = (amrb_doc_t *)ptr;
|
|
362
|
+
if (doc) {
|
|
363
|
+
if (doc->result) {
|
|
364
|
+
AMresultFree(doc->result);
|
|
365
|
+
}
|
|
366
|
+
xfree(doc);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
static size_t doc_memsize(const void *ptr) {
|
|
371
|
+
(void)ptr;
|
|
372
|
+
return sizeof(amrb_doc_t);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
static const rb_data_type_t amrb_doc_type = {
|
|
376
|
+
"Automerge::Document",
|
|
377
|
+
{NULL, doc_free, doc_memsize},
|
|
378
|
+
NULL, NULL,
|
|
379
|
+
RUBY_TYPED_FREE_IMMEDIATELY
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
static VALUE doc_alloc(VALUE klass) {
|
|
383
|
+
amrb_doc_t *doc = ALLOC(amrb_doc_t);
|
|
384
|
+
doc->result = NULL;
|
|
385
|
+
doc->doc = NULL;
|
|
386
|
+
return TypedData_Wrap_Struct(klass, &amrb_doc_type, doc);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
static amrb_doc_t *get_doc(VALUE self) {
|
|
390
|
+
amrb_doc_t *doc;
|
|
391
|
+
TypedData_Get_Struct(self, amrb_doc_t, &amrb_doc_type, doc);
|
|
392
|
+
if (!doc || !doc->doc) {
|
|
393
|
+
rb_raise(cError, "uninitialized Automerge document");
|
|
394
|
+
}
|
|
395
|
+
return doc;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
static VALUE doc_from_result(VALUE klass, AMresult *result) {
|
|
399
|
+
check_result(result);
|
|
400
|
+
AMitem *item = AMresultItem(result);
|
|
401
|
+
AMdoc *native_doc = NULL;
|
|
402
|
+
if (!item || !AMitemToDoc(item, &native_doc) || !native_doc) {
|
|
403
|
+
AMresultFree(result);
|
|
404
|
+
rb_raise(cError, "Automerge result did not contain a document");
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
VALUE obj = doc_alloc(klass);
|
|
408
|
+
amrb_doc_t *doc;
|
|
409
|
+
TypedData_Get_Struct(obj, amrb_doc_t, &amrb_doc_type, doc);
|
|
410
|
+
doc->result = result;
|
|
411
|
+
doc->doc = native_doc;
|
|
412
|
+
return obj;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
static void sync_state_free(void *ptr) {
|
|
416
|
+
amrb_sync_state_t *state = (amrb_sync_state_t *)ptr;
|
|
417
|
+
if (state) {
|
|
418
|
+
if (state->result) {
|
|
419
|
+
AMresultFree(state->result);
|
|
420
|
+
}
|
|
421
|
+
xfree(state);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
static size_t sync_state_memsize(const void *ptr) {
|
|
426
|
+
(void)ptr;
|
|
427
|
+
return sizeof(amrb_sync_state_t);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
static const rb_data_type_t amrb_sync_state_type = {
|
|
431
|
+
"Automerge::SyncState",
|
|
432
|
+
{NULL, sync_state_free, sync_state_memsize},
|
|
433
|
+
NULL, NULL,
|
|
434
|
+
RUBY_TYPED_FREE_IMMEDIATELY
|
|
435
|
+
};
|
|
436
|
+
|
|
437
|
+
static VALUE sync_state_alloc(VALUE klass) {
|
|
438
|
+
amrb_sync_state_t *state = ALLOC(amrb_sync_state_t);
|
|
439
|
+
state->result = NULL;
|
|
440
|
+
state->state = NULL;
|
|
441
|
+
return TypedData_Wrap_Struct(klass, &amrb_sync_state_type, state);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
static amrb_sync_state_t *get_sync_state(VALUE self) {
|
|
445
|
+
amrb_sync_state_t *state;
|
|
446
|
+
TypedData_Get_Struct(self, amrb_sync_state_t, &amrb_sync_state_type, state);
|
|
447
|
+
if (!state || !state->state) {
|
|
448
|
+
rb_raise(cError, "uninitialized Automerge sync state");
|
|
449
|
+
}
|
|
450
|
+
return state;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
static VALUE sync_state_from_result(VALUE klass, AMresult *result) {
|
|
454
|
+
check_result(result);
|
|
455
|
+
AMitem *item = AMresultItem(result);
|
|
456
|
+
AMsyncState *native_state = NULL;
|
|
457
|
+
if (!item || !AMitemToSyncState(item, &native_state) || !native_state) {
|
|
458
|
+
AMresultFree(result);
|
|
459
|
+
rb_raise(cError, "Automerge result did not contain a sync state");
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
VALUE obj = sync_state_alloc(klass);
|
|
463
|
+
amrb_sync_state_t *state;
|
|
464
|
+
TypedData_Get_Struct(obj, amrb_sync_state_t, &amrb_sync_state_type, state);
|
|
465
|
+
state->result = result;
|
|
466
|
+
state->state = native_state;
|
|
467
|
+
return obj;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
static AMresult *item_result_from_bytes(VALUE bytes, int change) {
|
|
471
|
+
StringValue(bytes);
|
|
472
|
+
AMbyteSpan span = string_span(bytes);
|
|
473
|
+
return change ? AMchangeFromBytes(span.src, span.count) : AMitemFromChangeHash(span);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
static AMresult *items_result_from_array(VALUE values, int change) {
|
|
477
|
+
Check_Type(values, T_ARRAY);
|
|
478
|
+
long len = RARRAY_LEN(values);
|
|
479
|
+
AMresult *acc = NULL;
|
|
480
|
+
for (long i = 0; i < len; i++) {
|
|
481
|
+
VALUE bytes = rb_ary_entry(values, i);
|
|
482
|
+
AMresult *next_item = item_result_from_bytes(bytes, change);
|
|
483
|
+
check_result(next_item);
|
|
484
|
+
if (!acc) {
|
|
485
|
+
acc = next_item;
|
|
486
|
+
} else {
|
|
487
|
+
AMresult *joined = AMresultCat(acc, next_item);
|
|
488
|
+
AMresultFree(acc);
|
|
489
|
+
AMresultFree(next_item);
|
|
490
|
+
check_result(joined);
|
|
491
|
+
acc = joined;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return acc;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
static VALUE bytes_from_change_item(AMitem *item) {
|
|
498
|
+
AMchange *change = NULL;
|
|
499
|
+
if (!AMitemToChange(item, &change) || !change) {
|
|
500
|
+
rb_raise(cError, "expected Automerge change");
|
|
501
|
+
}
|
|
502
|
+
return binary_string_from_span(AMchangeRawBytes(change));
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
static VALUE bytes_from_item(AMitem *item, int change) {
|
|
506
|
+
AMbyteSpan span = null_span();
|
|
507
|
+
bool ok = change ? AMitemToChangeHash(item, &span) : AMitemToBytes(item, &span);
|
|
508
|
+
if (!ok) {
|
|
509
|
+
rb_raise(cError, "expected Automerge byte value");
|
|
510
|
+
}
|
|
511
|
+
return binary_string_from_span(span);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
static VALUE array_from_items_result(AMresult *result, int item_kind) {
|
|
515
|
+
check_result(result);
|
|
516
|
+
AMitems items = AMresultItems(result);
|
|
517
|
+
VALUE ary = rb_ary_new2((long)AMitemsSize(&items));
|
|
518
|
+
AMitem *item = NULL;
|
|
519
|
+
while ((item = AMitemsNext(&items, 1)) != NULL) {
|
|
520
|
+
if (item_kind == AM_VAL_TYPE_CHANGE) {
|
|
521
|
+
rb_ary_push(ary, bytes_from_change_item(item));
|
|
522
|
+
} else if (item_kind == AM_VAL_TYPE_CHANGE_HASH) {
|
|
523
|
+
rb_ary_push(ary, bytes_from_item(item, 1));
|
|
524
|
+
} else {
|
|
525
|
+
AMbyteSpan span = null_span();
|
|
526
|
+
if (!AMitemToStr(item, &span)) {
|
|
527
|
+
AMresultFree(result);
|
|
528
|
+
rb_raise(cError, "expected Automerge string item");
|
|
529
|
+
}
|
|
530
|
+
rb_ary_push(ary, utf8_string_from_span(span));
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
AMresultFree(result);
|
|
534
|
+
return ary;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
static VALUE value_from_object(amrb_doc_t *doc, const AMobjId *obj, const AMitems *heads);
|
|
538
|
+
|
|
539
|
+
static VALUE value_from_item(amrb_doc_t *doc, AMitem *item, const AMitems *heads);
|
|
540
|
+
|
|
541
|
+
static VALUE value_from_item(amrb_doc_t *doc, AMitem *item, const AMitems *heads) {
|
|
542
|
+
if (!item) {
|
|
543
|
+
return Qnil;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
switch (AMitemValType(item)) {
|
|
547
|
+
case AM_VAL_TYPE_VOID:
|
|
548
|
+
case AM_VAL_TYPE_NULL:
|
|
549
|
+
return Qnil;
|
|
550
|
+
case AM_VAL_TYPE_BOOL: {
|
|
551
|
+
bool value = false;
|
|
552
|
+
if (!AMitemToBool(item, &value)) rb_raise(cError, "expected boolean item");
|
|
553
|
+
return value ? Qtrue : Qfalse;
|
|
554
|
+
}
|
|
555
|
+
case AM_VAL_TYPE_BYTES: {
|
|
556
|
+
AMbyteSpan span = null_span();
|
|
557
|
+
if (!AMitemToBytes(item, &span)) rb_raise(cError, "expected bytes item");
|
|
558
|
+
return scalar_object(cBytes, binary_string_from_span(span));
|
|
559
|
+
}
|
|
560
|
+
case AM_VAL_TYPE_COUNTER: {
|
|
561
|
+
int64_t value = 0;
|
|
562
|
+
if (!AMitemToCounter(item, &value)) rb_raise(cError, "expected counter item");
|
|
563
|
+
return scalar_object(cCounter, LL2NUM(value));
|
|
564
|
+
}
|
|
565
|
+
case AM_VAL_TYPE_F64: {
|
|
566
|
+
double value = 0.0;
|
|
567
|
+
if (!AMitemToF64(item, &value)) rb_raise(cError, "expected float item");
|
|
568
|
+
return DBL2NUM(value);
|
|
569
|
+
}
|
|
570
|
+
case AM_VAL_TYPE_INT: {
|
|
571
|
+
int64_t value = 0;
|
|
572
|
+
if (!AMitemToInt(item, &value)) rb_raise(cError, "expected int item");
|
|
573
|
+
return LL2NUM(value);
|
|
574
|
+
}
|
|
575
|
+
case AM_VAL_TYPE_UINT: {
|
|
576
|
+
uint64_t value = 0;
|
|
577
|
+
if (!AMitemToUint(item, &value)) rb_raise(cError, "expected uint item");
|
|
578
|
+
return scalar_object(cUint, ULL2NUM(value));
|
|
579
|
+
}
|
|
580
|
+
case AM_VAL_TYPE_TIMESTAMP: {
|
|
581
|
+
int64_t value = 0;
|
|
582
|
+
if (!AMitemToTimestamp(item, &value)) rb_raise(cError, "expected timestamp item");
|
|
583
|
+
return scalar_object(cTimestamp, LL2NUM(value));
|
|
584
|
+
}
|
|
585
|
+
case AM_VAL_TYPE_STR: {
|
|
586
|
+
AMbyteSpan span = null_span();
|
|
587
|
+
if (!AMitemToStr(item, &span)) rb_raise(cError, "expected string item");
|
|
588
|
+
return utf8_string_from_span(span);
|
|
589
|
+
}
|
|
590
|
+
case AM_VAL_TYPE_OBJ_TYPE:
|
|
591
|
+
return value_from_object(doc, AMitemObjId(item), heads);
|
|
592
|
+
case AM_VAL_TYPE_CHANGE:
|
|
593
|
+
return bytes_from_change_item(item);
|
|
594
|
+
case AM_VAL_TYPE_CHANGE_HASH:
|
|
595
|
+
return bytes_from_item(item, 1);
|
|
596
|
+
default:
|
|
597
|
+
rb_raise(cError, "unsupported Automerge value type %d", AMitemValType(item));
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
static VALUE value_from_object(amrb_doc_t *doc, const AMobjId *obj, const AMitems *heads) {
|
|
602
|
+
AMobjType type = AMobjObjType(doc->doc, obj);
|
|
603
|
+
if (type == AM_OBJ_TYPE_TEXT) {
|
|
604
|
+
AMresult *result = AMtext(doc->doc, obj, heads);
|
|
605
|
+
check_result(result);
|
|
606
|
+
AMitem *item = AMresultItem(result);
|
|
607
|
+
AMbyteSpan span = null_span();
|
|
608
|
+
if (!item || !AMitemToStr(item, &span)) {
|
|
609
|
+
AMresultFree(result);
|
|
610
|
+
rb_raise(cError, "expected Automerge text value");
|
|
611
|
+
}
|
|
612
|
+
VALUE text = scalar_object(cText, utf8_string_from_span(span));
|
|
613
|
+
AMresultFree(result);
|
|
614
|
+
return text;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
if (type == AM_OBJ_TYPE_MAP) {
|
|
618
|
+
VALUE hash = rb_hash_new();
|
|
619
|
+
AMresult *result = AMmapRange(doc->doc, obj, null_span(), null_span(), heads);
|
|
620
|
+
check_result(result);
|
|
621
|
+
AMitems items = AMresultItems(result);
|
|
622
|
+
AMitem *item = NULL;
|
|
623
|
+
while ((item = AMitemsNext(&items, 1)) != NULL) {
|
|
624
|
+
AMbyteSpan key = null_span();
|
|
625
|
+
if (AMitemKey(item, &key)) {
|
|
626
|
+
rb_hash_aset(hash, utf8_string_from_span(key), value_from_item(doc, item, heads));
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
AMresultFree(result);
|
|
630
|
+
return hash;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
if (type == AM_OBJ_TYPE_LIST) {
|
|
634
|
+
size_t size = AMobjSize(doc->doc, obj, heads);
|
|
635
|
+
VALUE ary = rb_ary_new2((long)size);
|
|
636
|
+
AMresult *result = AMlistRange(doc->doc, obj, 0, size, heads);
|
|
637
|
+
check_result(result);
|
|
638
|
+
AMitems items = AMresultItems(result);
|
|
639
|
+
AMitem *item = NULL;
|
|
640
|
+
while ((item = AMitemsNext(&items, 1)) != NULL) {
|
|
641
|
+
rb_ary_push(ary, value_from_item(doc, item, heads));
|
|
642
|
+
}
|
|
643
|
+
AMresultFree(result);
|
|
644
|
+
return ary;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
rb_raise(cError, "unsupported Automerge object type %d", type);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
static AMresult *get_child_result(amrb_doc_t *doc, const AMobjId *obj, VALUE segment, const AMitems *heads) {
|
|
651
|
+
AMobjType type = AMobjObjType(doc->doc, obj);
|
|
652
|
+
if (type == AM_OBJ_TYPE_MAP) {
|
|
653
|
+
VALUE key = path_key_string(segment);
|
|
654
|
+
return AMmapGet(doc->doc, obj, string_span(key), heads);
|
|
655
|
+
}
|
|
656
|
+
if (type == AM_OBJ_TYPE_LIST) {
|
|
657
|
+
return AMlistGet(doc->doc, obj, path_index(segment), heads);
|
|
658
|
+
}
|
|
659
|
+
rb_raise(cError, "cannot descend into Automerge object type %d", type);
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
static const AMobjId *resolve_object(amrb_doc_t *doc, VALUE path, amrb_result_stack_t *stack, const AMitems *heads) {
|
|
663
|
+
VALUE ary = path_array(path);
|
|
664
|
+
long len = RARRAY_LEN(ary);
|
|
665
|
+
const AMobjId *obj = NULL;
|
|
666
|
+
|
|
667
|
+
for (long i = 0; i < len; i++) {
|
|
668
|
+
AMresult *result = get_child_result(doc, obj, rb_ary_entry(ary, i), heads);
|
|
669
|
+
check_result(result);
|
|
670
|
+
AMitem *item = AMresultItem(result);
|
|
671
|
+
if (!item || AMitemValType(item) != AM_VAL_TYPE_OBJ_TYPE) {
|
|
672
|
+
AMresultFree(result);
|
|
673
|
+
stack_free(stack);
|
|
674
|
+
rb_raise(cError, "path does not resolve to an Automerge object");
|
|
675
|
+
}
|
|
676
|
+
obj = AMitemObjId(item);
|
|
677
|
+
stack_push(stack, result);
|
|
678
|
+
}
|
|
679
|
+
return obj;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
static const AMobjId *resolve_parent(amrb_doc_t *doc, VALUE path, VALUE *last_segment, amrb_result_stack_t *stack, const AMitems *heads) {
|
|
683
|
+
VALUE ary = path_array(path);
|
|
684
|
+
long len = RARRAY_LEN(ary);
|
|
685
|
+
if (len == 0) {
|
|
686
|
+
rb_raise(rb_eArgError, "path must not be empty");
|
|
687
|
+
}
|
|
688
|
+
*last_segment = rb_ary_entry(ary, len - 1);
|
|
689
|
+
|
|
690
|
+
const AMobjId *obj = NULL;
|
|
691
|
+
for (long i = 0; i < len - 1; i++) {
|
|
692
|
+
AMresult *result = get_child_result(doc, obj, rb_ary_entry(ary, i), heads);
|
|
693
|
+
check_result(result);
|
|
694
|
+
AMitem *item = AMresultItem(result);
|
|
695
|
+
if (!item || AMitemValType(item) != AM_VAL_TYPE_OBJ_TYPE) {
|
|
696
|
+
AMresultFree(result);
|
|
697
|
+
stack_free(stack);
|
|
698
|
+
rb_raise(cError, "path parent does not resolve to an Automerge object");
|
|
699
|
+
}
|
|
700
|
+
obj = AMitemObjId(item);
|
|
701
|
+
stack_push(stack, result);
|
|
702
|
+
}
|
|
703
|
+
return obj;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/* Convert a Ruby heads array (array of binary 32-byte change hashes) into a
|
|
707
|
+
* heap-allocated AMresult containing AMchangeHash items. Returns NULL when the
|
|
708
|
+
* Ruby value is nil. The caller owns the returned AMresult and must call
|
|
709
|
+
* AMresultFree. */
|
|
710
|
+
static AMresult *heads_result_from_ruby(VALUE heads) {
|
|
711
|
+
if (NIL_P(heads)) return NULL;
|
|
712
|
+
return items_result_from_array(heads, 0);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
/* Helper to extract a borrowed AMitems view from an AMresult, or set the
|
|
716
|
+
* provided AMitems * to NULL when the result is NULL. */
|
|
717
|
+
static const AMitems *heads_items_view(AMresult *head_result, AMitems *out) {
|
|
718
|
+
if (!head_result) return NULL;
|
|
719
|
+
*out = AMresultItems(head_result);
|
|
720
|
+
return out;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
static void put_ruby_value_map(amrb_doc_t *doc, const AMobjId *obj, VALUE key_value, VALUE value);
|
|
724
|
+
static void put_ruby_value_list(amrb_doc_t *doc, const AMobjId *obj, size_t pos, bool insert, VALUE value);
|
|
725
|
+
|
|
726
|
+
static int fill_hash_i(VALUE key, VALUE value, VALUE payload) {
|
|
727
|
+
VALUE *values = (VALUE *)payload;
|
|
728
|
+
amrb_doc_t *doc = (amrb_doc_t *)values[0];
|
|
729
|
+
const AMobjId *obj = (const AMobjId *)values[1];
|
|
730
|
+
put_ruby_value_map(doc, obj, key, value);
|
|
731
|
+
return ST_CONTINUE;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
static void fill_hash(amrb_doc_t *doc, const AMobjId *obj, VALUE hash) {
|
|
735
|
+
VALUE payload[2];
|
|
736
|
+
payload[0] = (VALUE)doc;
|
|
737
|
+
payload[1] = (VALUE)obj;
|
|
738
|
+
rb_hash_foreach(hash, fill_hash_i, (VALUE)payload);
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
static void fill_array(amrb_doc_t *doc, const AMobjId *obj, VALUE array) {
|
|
742
|
+
long len = RARRAY_LEN(array);
|
|
743
|
+
for (long i = 0; i < len; i++) {
|
|
744
|
+
put_ruby_value_list(doc, obj, (size_t)i, true, rb_ary_entry(array, i));
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
static void fill_text(amrb_doc_t *doc, const AMobjId *obj, VALUE text) {
|
|
749
|
+
VALUE value = rb_ivar_get(text, id_value);
|
|
750
|
+
StringValue(value);
|
|
751
|
+
checked_free_result(AMspliceText(doc->doc, obj, 0, 0, string_span(value)));
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
static AMresult *scalar_item_result_from_ruby(VALUE value) {
|
|
755
|
+
if (NIL_P(value)) {
|
|
756
|
+
return AMitemFromNull();
|
|
757
|
+
}
|
|
758
|
+
if (value == Qtrue || value == Qfalse) {
|
|
759
|
+
return AMitemFromBool(value == Qtrue);
|
|
760
|
+
}
|
|
761
|
+
if (RB_INTEGER_TYPE_P(value)) {
|
|
762
|
+
return AMitemFromInt(NUM2LL(value));
|
|
763
|
+
}
|
|
764
|
+
if (RB_FLOAT_TYPE_P(value)) {
|
|
765
|
+
return AMitemFromF64(NUM2DBL(value));
|
|
766
|
+
}
|
|
767
|
+
if (RB_TYPE_P(value, T_STRING)) {
|
|
768
|
+
return AMitemFromStr(string_span(value));
|
|
769
|
+
}
|
|
770
|
+
if (rb_obj_is_kind_of(value, cCounter)) {
|
|
771
|
+
return AMitemFromCounter(NUM2LL(rb_ivar_get(value, id_value)));
|
|
772
|
+
}
|
|
773
|
+
if (rb_obj_is_kind_of(value, cTimestamp)) {
|
|
774
|
+
return AMitemFromTimestamp(NUM2LL(rb_ivar_get(value, id_value)));
|
|
775
|
+
}
|
|
776
|
+
if (rb_obj_is_kind_of(value, cUint)) {
|
|
777
|
+
return AMitemFromUint(NUM2ULL(rb_ivar_get(value, id_value)));
|
|
778
|
+
}
|
|
779
|
+
if (rb_obj_is_kind_of(value, cBytes)) {
|
|
780
|
+
VALUE bytes = rb_ivar_get(value, id_value);
|
|
781
|
+
StringValue(bytes);
|
|
782
|
+
AMbyteSpan span = string_span(bytes);
|
|
783
|
+
return AMitemFromBytes(span.src, span.count);
|
|
784
|
+
}
|
|
785
|
+
rb_raise(rb_eTypeError, "mark values must be Automerge scalar values");
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
static const AMobjId *obj_id_from_result(AMresult *result) {
|
|
789
|
+
check_result(result);
|
|
790
|
+
AMitem *item = AMresultItem(result);
|
|
791
|
+
const AMobjId *obj = item ? AMitemObjId(item) : NULL;
|
|
792
|
+
if (!obj) {
|
|
793
|
+
AMresultFree(result);
|
|
794
|
+
rb_raise(cError, "Automerge result did not contain an object id");
|
|
795
|
+
}
|
|
796
|
+
return obj;
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
static void put_ruby_value_map(amrb_doc_t *doc, const AMobjId *obj, VALUE key_value, VALUE value) {
|
|
800
|
+
VALUE key = path_key_string(key_value);
|
|
801
|
+
AMbyteSpan key_span = string_span(key);
|
|
802
|
+
AMresult *result = NULL;
|
|
803
|
+
|
|
804
|
+
if (NIL_P(value)) {
|
|
805
|
+
checked_free_result(AMmapPutNull(doc->doc, obj, key_span));
|
|
806
|
+
} else if (value == Qtrue || value == Qfalse) {
|
|
807
|
+
checked_free_result(AMmapPutBool(doc->doc, obj, key_span, value == Qtrue));
|
|
808
|
+
} else if (RB_INTEGER_TYPE_P(value)) {
|
|
809
|
+
checked_free_result(AMmapPutInt(doc->doc, obj, key_span, NUM2LL(value)));
|
|
810
|
+
} else if (RB_FLOAT_TYPE_P(value)) {
|
|
811
|
+
checked_free_result(AMmapPutF64(doc->doc, obj, key_span, NUM2DBL(value)));
|
|
812
|
+
} else if (RB_TYPE_P(value, T_STRING)) {
|
|
813
|
+
checked_free_result(AMmapPutStr(doc->doc, obj, key_span, string_span(value)));
|
|
814
|
+
} else if (rb_obj_is_kind_of(value, cCounter)) {
|
|
815
|
+
checked_free_result(AMmapPutCounter(doc->doc, obj, key_span, NUM2LL(rb_ivar_get(value, id_value))));
|
|
816
|
+
} else if (rb_obj_is_kind_of(value, cTimestamp)) {
|
|
817
|
+
checked_free_result(AMmapPutTimestamp(doc->doc, obj, key_span, NUM2LL(rb_ivar_get(value, id_value))));
|
|
818
|
+
} else if (rb_obj_is_kind_of(value, cUint)) {
|
|
819
|
+
checked_free_result(AMmapPutUint(doc->doc, obj, key_span, NUM2ULL(rb_ivar_get(value, id_value))));
|
|
820
|
+
} else if (rb_obj_is_kind_of(value, cBytes)) {
|
|
821
|
+
VALUE bytes = rb_ivar_get(value, id_value);
|
|
822
|
+
StringValue(bytes);
|
|
823
|
+
checked_free_result(AMmapPutBytes(doc->doc, obj, key_span, string_span(bytes)));
|
|
824
|
+
} else if (rb_obj_is_kind_of(value, cText)) {
|
|
825
|
+
result = AMmapPutObject(doc->doc, obj, key_span, AM_OBJ_TYPE_TEXT);
|
|
826
|
+
const AMobjId *child = obj_id_from_result(result);
|
|
827
|
+
fill_text(doc, child, value);
|
|
828
|
+
AMresultFree(result);
|
|
829
|
+
} else if (RB_TYPE_P(value, T_HASH)) {
|
|
830
|
+
result = AMmapPutObject(doc->doc, obj, key_span, AM_OBJ_TYPE_MAP);
|
|
831
|
+
const AMobjId *child = obj_id_from_result(result);
|
|
832
|
+
fill_hash(doc, child, value);
|
|
833
|
+
AMresultFree(result);
|
|
834
|
+
} else if (RB_TYPE_P(value, T_ARRAY)) {
|
|
835
|
+
result = AMmapPutObject(doc->doc, obj, key_span, AM_OBJ_TYPE_LIST);
|
|
836
|
+
const AMobjId *child = obj_id_from_result(result);
|
|
837
|
+
fill_array(doc, child, value);
|
|
838
|
+
AMresultFree(result);
|
|
839
|
+
} else {
|
|
840
|
+
rb_raise(rb_eTypeError, "unsupported Automerge value type: %"PRIsVALUE, rb_obj_class(value));
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
static void put_ruby_value_list(amrb_doc_t *doc, const AMobjId *obj, size_t pos, bool insert, VALUE value) {
|
|
845
|
+
AMresult *result = NULL;
|
|
846
|
+
if (NIL_P(value)) {
|
|
847
|
+
checked_free_result(AMlistPutNull(doc->doc, obj, pos, insert));
|
|
848
|
+
} else if (value == Qtrue || value == Qfalse) {
|
|
849
|
+
checked_free_result(AMlistPutBool(doc->doc, obj, pos, insert, value == Qtrue));
|
|
850
|
+
} else if (RB_INTEGER_TYPE_P(value)) {
|
|
851
|
+
checked_free_result(AMlistPutInt(doc->doc, obj, pos, insert, NUM2LL(value)));
|
|
852
|
+
} else if (RB_FLOAT_TYPE_P(value)) {
|
|
853
|
+
checked_free_result(AMlistPutF64(doc->doc, obj, pos, insert, NUM2DBL(value)));
|
|
854
|
+
} else if (RB_TYPE_P(value, T_STRING)) {
|
|
855
|
+
checked_free_result(AMlistPutStr(doc->doc, obj, pos, insert, string_span(value)));
|
|
856
|
+
} else if (rb_obj_is_kind_of(value, cCounter)) {
|
|
857
|
+
checked_free_result(AMlistPutCounter(doc->doc, obj, pos, insert, NUM2LL(rb_ivar_get(value, id_value))));
|
|
858
|
+
} else if (rb_obj_is_kind_of(value, cTimestamp)) {
|
|
859
|
+
checked_free_result(AMlistPutTimestamp(doc->doc, obj, pos, insert, NUM2LL(rb_ivar_get(value, id_value))));
|
|
860
|
+
} else if (rb_obj_is_kind_of(value, cUint)) {
|
|
861
|
+
checked_free_result(AMlistPutUint(doc->doc, obj, pos, insert, NUM2ULL(rb_ivar_get(value, id_value))));
|
|
862
|
+
} else if (rb_obj_is_kind_of(value, cBytes)) {
|
|
863
|
+
VALUE bytes = rb_ivar_get(value, id_value);
|
|
864
|
+
StringValue(bytes);
|
|
865
|
+
checked_free_result(AMlistPutBytes(doc->doc, obj, pos, insert, string_span(bytes)));
|
|
866
|
+
} else if (rb_obj_is_kind_of(value, cText)) {
|
|
867
|
+
result = AMlistPutObject(doc->doc, obj, pos, insert, AM_OBJ_TYPE_TEXT);
|
|
868
|
+
const AMobjId *child = obj_id_from_result(result);
|
|
869
|
+
fill_text(doc, child, value);
|
|
870
|
+
AMresultFree(result);
|
|
871
|
+
} else if (RB_TYPE_P(value, T_HASH)) {
|
|
872
|
+
result = AMlistPutObject(doc->doc, obj, pos, insert, AM_OBJ_TYPE_MAP);
|
|
873
|
+
const AMobjId *child = obj_id_from_result(result);
|
|
874
|
+
fill_hash(doc, child, value);
|
|
875
|
+
AMresultFree(result);
|
|
876
|
+
} else if (RB_TYPE_P(value, T_ARRAY)) {
|
|
877
|
+
result = AMlistPutObject(doc->doc, obj, pos, insert, AM_OBJ_TYPE_LIST);
|
|
878
|
+
const AMobjId *child = obj_id_from_result(result);
|
|
879
|
+
fill_array(doc, child, value);
|
|
880
|
+
AMresultFree(result);
|
|
881
|
+
} else {
|
|
882
|
+
rb_raise(rb_eTypeError, "unsupported Automerge value type: %"PRIsVALUE, rb_obj_class(value));
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
static VALUE doc_initialize(int argc, VALUE *argv, VALUE self) {
|
|
887
|
+
VALUE arg = Qnil;
|
|
888
|
+
rb_scan_args(argc, argv, "01", &arg);
|
|
889
|
+
|
|
890
|
+
VALUE actor = Qnil;
|
|
891
|
+
if (RB_TYPE_P(arg, T_HASH)) {
|
|
892
|
+
actor = rb_hash_aref(arg, ID2SYM(id_actor_id));
|
|
893
|
+
} else {
|
|
894
|
+
actor = arg;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
AMactorId *actor_id = NULL;
|
|
898
|
+
AMresult *actor_result = NULL;
|
|
899
|
+
if (!NIL_P(actor)) {
|
|
900
|
+
StringValue(actor);
|
|
901
|
+
actor_result = AMactorIdFromStr(string_span(actor));
|
|
902
|
+
check_result(actor_result);
|
|
903
|
+
AMitem *actor_item = AMresultItem(actor_result);
|
|
904
|
+
const AMactorId *actor_ptr = NULL;
|
|
905
|
+
if (!actor_item || !AMitemToActorId(actor_item, &actor_ptr)) {
|
|
906
|
+
AMresultFree(actor_result);
|
|
907
|
+
rb_raise(cError, "invalid actor id");
|
|
908
|
+
}
|
|
909
|
+
actor_id = (AMactorId *)actor_ptr;
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
AMresult *result = AMcreate(actor_id);
|
|
913
|
+
if (actor_result) {
|
|
914
|
+
AMresultFree(actor_result);
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
VALUE obj = doc_from_result(CLASS_OF(self), result);
|
|
918
|
+
amrb_doc_t *src;
|
|
919
|
+
amrb_doc_t *dst;
|
|
920
|
+
TypedData_Get_Struct(obj, amrb_doc_t, &amrb_doc_type, src);
|
|
921
|
+
TypedData_Get_Struct(self, amrb_doc_t, &amrb_doc_type, dst);
|
|
922
|
+
dst->result = src->result;
|
|
923
|
+
dst->doc = src->doc;
|
|
924
|
+
src->result = NULL;
|
|
925
|
+
src->doc = NULL;
|
|
926
|
+
return self;
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
static VALUE doc_s_load(VALUE klass, VALUE bytes) {
|
|
930
|
+
StringValue(bytes);
|
|
931
|
+
AMbyteSpan span = string_span(bytes);
|
|
932
|
+
return doc_from_result(klass, AMload(span.src, span.count));
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
static VALUE doc_clone(VALUE self) {
|
|
936
|
+
amrb_doc_t *doc = get_doc(self);
|
|
937
|
+
return doc_from_result(CLASS_OF(self), AMclone(doc->doc));
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
static VALUE doc_equal(VALUE self, VALUE other) {
|
|
941
|
+
amrb_doc_t *doc = get_doc(self);
|
|
942
|
+
amrb_doc_t *other_doc = get_doc(other);
|
|
943
|
+
return AMequal(doc->doc, other_doc->doc) ? Qtrue : Qfalse;
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
static VALUE doc_get(int argc, VALUE *argv, VALUE self) {
|
|
947
|
+
VALUE path = Qnil;
|
|
948
|
+
VALUE opts = Qnil;
|
|
949
|
+
rb_scan_args(argc, argv, "1:", &path, &opts);
|
|
950
|
+
amrb_doc_t *doc = get_doc(self);
|
|
951
|
+
AMresult *head_result = NULL;
|
|
952
|
+
if (!NIL_P(opts)) {
|
|
953
|
+
VALUE heads = rb_hash_aref(opts, ID2SYM(rb_intern2("heads", 5)));
|
|
954
|
+
head_result = heads_result_from_ruby(heads);
|
|
955
|
+
}
|
|
956
|
+
AMitems head_items;
|
|
957
|
+
const AMitems *heads = heads_items_view(head_result, &head_items);
|
|
958
|
+
|
|
959
|
+
VALUE ary = path_array(path);
|
|
960
|
+
VALUE value;
|
|
961
|
+
if (RARRAY_LEN(ary) == 0) {
|
|
962
|
+
value = value_from_object(doc, NULL, heads);
|
|
963
|
+
} else {
|
|
964
|
+
amrb_result_stack_t stack;
|
|
965
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
966
|
+
const AMobjId *parent = NULL;
|
|
967
|
+
VALUE last = Qnil;
|
|
968
|
+
parent = resolve_parent(doc, ary, &last, &stack, heads);
|
|
969
|
+
AMresult *result = get_child_result(doc, parent, last, heads);
|
|
970
|
+
check_result(result);
|
|
971
|
+
value = value_from_item(doc, AMresultItem(result), heads);
|
|
972
|
+
AMresultFree(result);
|
|
973
|
+
stack_free(&stack);
|
|
974
|
+
}
|
|
975
|
+
if (head_result) AMresultFree(head_result);
|
|
976
|
+
return value;
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
static VALUE values_array_from_result(amrb_doc_t *doc, AMresult *result, const AMitems *heads) {
|
|
980
|
+
check_result(result);
|
|
981
|
+
AMitems items = AMresultItems(result);
|
|
982
|
+
VALUE ary = rb_ary_new2((long)AMitemsSize(&items));
|
|
983
|
+
AMitem *item = NULL;
|
|
984
|
+
while ((item = AMitemsNext(&items, 1)) != NULL) {
|
|
985
|
+
rb_ary_push(ary, value_from_item(doc, item, heads));
|
|
986
|
+
}
|
|
987
|
+
AMresultFree(result);
|
|
988
|
+
return ary;
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
static VALUE doc_get_all(int argc, VALUE *argv, VALUE self) {
|
|
992
|
+
VALUE path = Qnil;
|
|
993
|
+
VALUE opts = Qnil;
|
|
994
|
+
rb_scan_args(argc, argv, "1:", &path, &opts);
|
|
995
|
+
amrb_doc_t *doc = get_doc(self);
|
|
996
|
+
AMresult *head_result = NULL;
|
|
997
|
+
if (!NIL_P(opts)) {
|
|
998
|
+
head_result = heads_result_from_ruby(rb_hash_aref(opts, ID2SYM(rb_intern2("heads", 5))));
|
|
999
|
+
}
|
|
1000
|
+
AMitems head_items;
|
|
1001
|
+
const AMitems *heads = heads_items_view(head_result, &head_items);
|
|
1002
|
+
|
|
1003
|
+
VALUE ary = path_array(path);
|
|
1004
|
+
amrb_result_stack_t stack;
|
|
1005
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1006
|
+
VALUE last = Qnil;
|
|
1007
|
+
const AMobjId *parent = resolve_parent(doc, ary, &last, &stack, heads);
|
|
1008
|
+
AMobjType type = AMobjObjType(doc->doc, parent);
|
|
1009
|
+
VALUE values;
|
|
1010
|
+
if (type == AM_OBJ_TYPE_MAP) {
|
|
1011
|
+
VALUE key = path_key_string(last);
|
|
1012
|
+
values = values_array_from_result(doc, AMmapGetAll(doc->doc, parent, string_span(key), heads), heads);
|
|
1013
|
+
} else if (type == AM_OBJ_TYPE_LIST) {
|
|
1014
|
+
values = values_array_from_result(doc, AMlistGetAll(doc->doc, parent, path_index(last), heads), heads);
|
|
1015
|
+
} else {
|
|
1016
|
+
stack_free(&stack);
|
|
1017
|
+
if (head_result) AMresultFree(head_result);
|
|
1018
|
+
rb_raise(cError, "cannot read conflicts from Automerge object type %d", type);
|
|
1019
|
+
}
|
|
1020
|
+
stack_free(&stack);
|
|
1021
|
+
if (head_result) AMresultFree(head_result);
|
|
1022
|
+
return values;
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
static VALUE doc_put(VALUE self, VALUE path, VALUE value) {
|
|
1026
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1027
|
+
VALUE ary = path_array(path);
|
|
1028
|
+
amrb_result_stack_t stack;
|
|
1029
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1030
|
+
VALUE last = Qnil;
|
|
1031
|
+
const AMobjId *parent = resolve_parent(doc, ary, &last, &stack, NULL);
|
|
1032
|
+
AMobjType type = AMobjObjType(doc->doc, parent);
|
|
1033
|
+
if (type == AM_OBJ_TYPE_MAP) {
|
|
1034
|
+
put_ruby_value_map(doc, parent, last, value);
|
|
1035
|
+
} else if (type == AM_OBJ_TYPE_LIST) {
|
|
1036
|
+
put_ruby_value_list(doc, parent, path_index(last), false, value);
|
|
1037
|
+
} else {
|
|
1038
|
+
stack_free(&stack);
|
|
1039
|
+
rb_raise(cError, "cannot put into Automerge object type %d", type);
|
|
1040
|
+
}
|
|
1041
|
+
stack_free(&stack);
|
|
1042
|
+
return self;
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
static VALUE doc_insert(VALUE self, VALUE path, VALUE index, VALUE value) {
|
|
1046
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1047
|
+
amrb_result_stack_t stack;
|
|
1048
|
+
VALUE ary = path_array(path);
|
|
1049
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1050
|
+
const AMobjId *obj = resolve_object(doc, ary, &stack, NULL);
|
|
1051
|
+
if (AMobjObjType(doc->doc, obj) != AM_OBJ_TYPE_LIST) {
|
|
1052
|
+
stack_free(&stack);
|
|
1053
|
+
rb_raise(cError, "insert target must be an Automerge list");
|
|
1054
|
+
}
|
|
1055
|
+
put_ruby_value_list(doc, obj, path_index(index), true, value);
|
|
1056
|
+
stack_free(&stack);
|
|
1057
|
+
return self;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
static VALUE doc_delete(VALUE self, VALUE path) {
|
|
1061
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1062
|
+
VALUE ary = path_array(path);
|
|
1063
|
+
amrb_result_stack_t stack;
|
|
1064
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1065
|
+
VALUE last = Qnil;
|
|
1066
|
+
const AMobjId *parent = resolve_parent(doc, ary, &last, &stack, NULL);
|
|
1067
|
+
AMobjType type = AMobjObjType(doc->doc, parent);
|
|
1068
|
+
if (type == AM_OBJ_TYPE_MAP) {
|
|
1069
|
+
VALUE key = path_key_string(last);
|
|
1070
|
+
checked_free_result(AMmapDelete(doc->doc, parent, string_span(key)));
|
|
1071
|
+
} else if (type == AM_OBJ_TYPE_LIST) {
|
|
1072
|
+
checked_free_result(AMlistDelete(doc->doc, parent, path_index(last)));
|
|
1073
|
+
} else {
|
|
1074
|
+
stack_free(&stack);
|
|
1075
|
+
rb_raise(cError, "cannot delete from Automerge object type %d", type);
|
|
1076
|
+
}
|
|
1077
|
+
stack_free(&stack);
|
|
1078
|
+
return self;
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
static VALUE doc_increment(VALUE self, VALUE path, VALUE amount) {
|
|
1082
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1083
|
+
VALUE ary = path_array(path);
|
|
1084
|
+
amrb_result_stack_t stack;
|
|
1085
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1086
|
+
VALUE last = Qnil;
|
|
1087
|
+
const AMobjId *parent = resolve_parent(doc, ary, &last, &stack, NULL);
|
|
1088
|
+
int64_t delta = NUM2LL(amount);
|
|
1089
|
+
AMobjType type = AMobjObjType(doc->doc, parent);
|
|
1090
|
+
if (type == AM_OBJ_TYPE_MAP) {
|
|
1091
|
+
VALUE key = path_key_string(last);
|
|
1092
|
+
checked_free_result(AMmapIncrement(doc->doc, parent, string_span(key), delta));
|
|
1093
|
+
} else if (type == AM_OBJ_TYPE_LIST) {
|
|
1094
|
+
checked_free_result(AMlistIncrement(doc->doc, parent, path_index(last), delta));
|
|
1095
|
+
} else {
|
|
1096
|
+
stack_free(&stack);
|
|
1097
|
+
rb_raise(cError, "cannot increment in Automerge object type %d", type);
|
|
1098
|
+
}
|
|
1099
|
+
stack_free(&stack);
|
|
1100
|
+
return self;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
static VALUE doc_splice_text(VALUE self, VALUE path, VALUE index, VALUE delete_count, VALUE text) {
|
|
1104
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1105
|
+
StringValue(text);
|
|
1106
|
+
VALUE ary = path_array(path);
|
|
1107
|
+
amrb_result_stack_t stack;
|
|
1108
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1109
|
+
const AMobjId *obj = resolve_object(doc, ary, &stack, NULL);
|
|
1110
|
+
if (AMobjObjType(doc->doc, obj) != AM_OBJ_TYPE_TEXT) {
|
|
1111
|
+
stack_free(&stack);
|
|
1112
|
+
rb_raise(cError, "splice_text target must be Automerge text");
|
|
1113
|
+
}
|
|
1114
|
+
checked_free_result(AMspliceText(doc->doc, obj, (size_t)NUM2LONG(index), (ptrdiff_t)NUM2LONG(delete_count), string_span(text)));
|
|
1115
|
+
stack_free(&stack);
|
|
1116
|
+
return self;
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
static VALUE doc_splice_list(VALUE self, VALUE path, VALUE index, VALUE delete_count, VALUE values) {
|
|
1120
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1121
|
+
Check_Type(values, T_ARRAY);
|
|
1122
|
+
VALUE ary = path_array(path);
|
|
1123
|
+
amrb_result_stack_t stack;
|
|
1124
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1125
|
+
const AMobjId *obj = resolve_object(doc, ary, &stack, NULL);
|
|
1126
|
+
if (AMobjObjType(doc->doc, obj) != AM_OBJ_TYPE_LIST) {
|
|
1127
|
+
stack_free(&stack);
|
|
1128
|
+
rb_raise(cError, "splice target must be an Automerge list");
|
|
1129
|
+
}
|
|
1130
|
+
size_t pos = (size_t)NUM2LONG(index);
|
|
1131
|
+
long del = NUM2LONG(delete_count);
|
|
1132
|
+
for (long i = 0; i < del; i++) {
|
|
1133
|
+
checked_free_result(AMlistDelete(doc->doc, obj, pos));
|
|
1134
|
+
}
|
|
1135
|
+
for (long i = 0; i < RARRAY_LEN(values); i++) {
|
|
1136
|
+
put_ruby_value_list(doc, obj, pos + (size_t)i, true, rb_ary_entry(values, i));
|
|
1137
|
+
}
|
|
1138
|
+
stack_free(&stack);
|
|
1139
|
+
return self;
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
static VALUE doc_keys(int argc, VALUE *argv, VALUE self) {
|
|
1143
|
+
VALUE path = Qnil;
|
|
1144
|
+
VALUE opts = Qnil;
|
|
1145
|
+
rb_scan_args(argc, argv, "01:", &path, &opts);
|
|
1146
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1147
|
+
AMresult *head_result = NULL;
|
|
1148
|
+
if (!NIL_P(opts)) {
|
|
1149
|
+
head_result = heads_result_from_ruby(rb_hash_aref(opts, ID2SYM(rb_intern2("heads", 5))));
|
|
1150
|
+
}
|
|
1151
|
+
AMitems head_items;
|
|
1152
|
+
const AMitems *heads = heads_items_view(head_result, &head_items);
|
|
1153
|
+
VALUE ary = path_array(path);
|
|
1154
|
+
amrb_result_stack_t stack;
|
|
1155
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1156
|
+
const AMobjId *obj = resolve_object(doc, ary, &stack, heads);
|
|
1157
|
+
VALUE keys = array_from_items_result(AMkeys(doc->doc, obj, heads), AM_VAL_TYPE_STR);
|
|
1158
|
+
stack_free(&stack);
|
|
1159
|
+
if (head_result) AMresultFree(head_result);
|
|
1160
|
+
return keys;
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
static VALUE doc_length(int argc, VALUE *argv, VALUE self) {
|
|
1164
|
+
VALUE path = Qnil;
|
|
1165
|
+
VALUE opts = Qnil;
|
|
1166
|
+
rb_scan_args(argc, argv, "01:", &path, &opts);
|
|
1167
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1168
|
+
AMresult *head_result = NULL;
|
|
1169
|
+
if (!NIL_P(opts)) {
|
|
1170
|
+
head_result = heads_result_from_ruby(rb_hash_aref(opts, ID2SYM(rb_intern2("heads", 5))));
|
|
1171
|
+
}
|
|
1172
|
+
AMitems head_items;
|
|
1173
|
+
const AMitems *heads = heads_items_view(head_result, &head_items);
|
|
1174
|
+
VALUE ary = path_array(path);
|
|
1175
|
+
amrb_result_stack_t stack;
|
|
1176
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1177
|
+
const AMobjId *obj = resolve_object(doc, ary, &stack, heads);
|
|
1178
|
+
size_t size = AMobjSize(doc->doc, obj, heads);
|
|
1179
|
+
stack_free(&stack);
|
|
1180
|
+
if (head_result) AMresultFree(head_result);
|
|
1181
|
+
return SIZET2NUM(size);
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
static VALUE doc_cursor(int argc, VALUE *argv, VALUE self) {
|
|
1185
|
+
VALUE path = Qnil;
|
|
1186
|
+
VALUE position = Qnil;
|
|
1187
|
+
VALUE opts = Qnil;
|
|
1188
|
+
rb_scan_args(argc, argv, "20:", &path, &position, &opts);
|
|
1189
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1190
|
+
AMresult *head_result = NULL;
|
|
1191
|
+
if (!NIL_P(opts)) {
|
|
1192
|
+
head_result = heads_result_from_ruby(rb_hash_aref(opts, ID2SYM(rb_intern2("heads", 5))));
|
|
1193
|
+
}
|
|
1194
|
+
AMitems head_items;
|
|
1195
|
+
const AMitems *heads = heads_items_view(head_result, &head_items);
|
|
1196
|
+
VALUE ary = path_array(path);
|
|
1197
|
+
amrb_result_stack_t stack;
|
|
1198
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1199
|
+
const AMobjId *obj = resolve_object(doc, ary, &stack, heads);
|
|
1200
|
+
AMresult *result = AMgetCursor(doc->doc, obj, (size_t)NUM2LONG(position), heads);
|
|
1201
|
+
check_result(result);
|
|
1202
|
+
AMitem *item = AMresultItem(result);
|
|
1203
|
+
const AMcursor *cursor = NULL;
|
|
1204
|
+
if (!item || !AMitemToCursor(item, &cursor)) {
|
|
1205
|
+
AMresultFree(result);
|
|
1206
|
+
stack_free(&stack);
|
|
1207
|
+
if (head_result) AMresultFree(head_result);
|
|
1208
|
+
rb_raise(cError, "expected Automerge cursor");
|
|
1209
|
+
}
|
|
1210
|
+
VALUE bytes = binary_string_from_span(AMcursorBytes(cursor));
|
|
1211
|
+
AMresultFree(result);
|
|
1212
|
+
stack_free(&stack);
|
|
1213
|
+
if (head_result) AMresultFree(head_result);
|
|
1214
|
+
return bytes;
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
static VALUE doc_cursor_position(int argc, VALUE *argv, VALUE self) {
|
|
1218
|
+
VALUE path = Qnil;
|
|
1219
|
+
VALUE cursor_bytes = Qnil;
|
|
1220
|
+
VALUE opts = Qnil;
|
|
1221
|
+
rb_scan_args(argc, argv, "20:", &path, &cursor_bytes, &opts);
|
|
1222
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1223
|
+
AMresult *head_result = NULL;
|
|
1224
|
+
if (!NIL_P(opts)) {
|
|
1225
|
+
head_result = heads_result_from_ruby(rb_hash_aref(opts, ID2SYM(rb_intern2("heads", 5))));
|
|
1226
|
+
}
|
|
1227
|
+
AMitems head_items;
|
|
1228
|
+
const AMitems *heads = heads_items_view(head_result, &head_items);
|
|
1229
|
+
VALUE ary = path_array(path);
|
|
1230
|
+
amrb_result_stack_t stack;
|
|
1231
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1232
|
+
const AMobjId *obj = resolve_object(doc, ary, &stack, heads);
|
|
1233
|
+
StringValue(cursor_bytes);
|
|
1234
|
+
AMbyteSpan span = string_span(cursor_bytes);
|
|
1235
|
+
AMresult *cursor_result = AMcursorFromBytes(span.src, span.count);
|
|
1236
|
+
check_result(cursor_result);
|
|
1237
|
+
AMitem *cursor_item = AMresultItem(cursor_result);
|
|
1238
|
+
const AMcursor *cursor = NULL;
|
|
1239
|
+
if (!cursor_item || !AMitemToCursor(cursor_item, &cursor)) {
|
|
1240
|
+
AMresultFree(cursor_result);
|
|
1241
|
+
stack_free(&stack);
|
|
1242
|
+
if (head_result) AMresultFree(head_result);
|
|
1243
|
+
rb_raise(cError, "invalid Automerge cursor");
|
|
1244
|
+
}
|
|
1245
|
+
AMresult *result = AMgetCursorPosition(doc->doc, obj, cursor, heads);
|
|
1246
|
+
check_result(result);
|
|
1247
|
+
AMitem *item = AMresultItem(result);
|
|
1248
|
+
uint64_t pos = 0;
|
|
1249
|
+
if (!AMitemToUint(item, &pos)) {
|
|
1250
|
+
AMresultFree(result);
|
|
1251
|
+
AMresultFree(cursor_result);
|
|
1252
|
+
stack_free(&stack);
|
|
1253
|
+
if (head_result) AMresultFree(head_result);
|
|
1254
|
+
rb_raise(cError, "expected cursor position");
|
|
1255
|
+
}
|
|
1256
|
+
AMresultFree(result);
|
|
1257
|
+
AMresultFree(cursor_result);
|
|
1258
|
+
stack_free(&stack);
|
|
1259
|
+
if (head_result) AMresultFree(head_result);
|
|
1260
|
+
return ULL2NUM(pos);
|
|
1261
|
+
}
|
|
1262
|
+
|
|
1263
|
+
static AMmarkExpand mark_expand_from_value(VALUE value) {
|
|
1264
|
+
if (NIL_P(value)) return AM_MARK_EXPAND_NONE;
|
|
1265
|
+
if (RB_TYPE_P(value, T_SYMBOL)) {
|
|
1266
|
+
VALUE str = rb_sym2str(value);
|
|
1267
|
+
value = str;
|
|
1268
|
+
}
|
|
1269
|
+
StringValue(value);
|
|
1270
|
+
if (RSTRING_LEN(value) == 4 && strncmp(RSTRING_PTR(value), "none", 4) == 0) return AM_MARK_EXPAND_NONE;
|
|
1271
|
+
if (RSTRING_LEN(value) == 6 && strncmp(RSTRING_PTR(value), "before", 6) == 0) return AM_MARK_EXPAND_BEFORE;
|
|
1272
|
+
if (RSTRING_LEN(value) == 5 && strncmp(RSTRING_PTR(value), "after", 5) == 0) return AM_MARK_EXPAND_AFTER;
|
|
1273
|
+
if (RSTRING_LEN(value) == 4 && strncmp(RSTRING_PTR(value), "both", 4) == 0) return AM_MARK_EXPAND_BOTH;
|
|
1274
|
+
rb_raise(rb_eArgError, "mark expand must be one of: none, before, after, both");
|
|
1275
|
+
}
|
|
1276
|
+
|
|
1277
|
+
static VALUE mark_hash_from_item(amrb_doc_t *doc, AMitem *item, const AMitems *heads) {
|
|
1278
|
+
const AMmark *mark = NULL;
|
|
1279
|
+
if (!item || !AMitemToMark(item, &mark) || !mark) {
|
|
1280
|
+
rb_raise(cError, "expected Automerge mark");
|
|
1281
|
+
}
|
|
1282
|
+
VALUE hash = rb_hash_new();
|
|
1283
|
+
rb_hash_aset(hash, ID2SYM(rb_intern2("name", 4)), utf8_string_from_span(AMmarkName(mark)));
|
|
1284
|
+
rb_hash_aset(hash, ID2SYM(rb_intern2("start", 5)), SIZET2NUM(AMmarkStart(mark)));
|
|
1285
|
+
rb_hash_aset(hash, ID2SYM(rb_intern2("end", 3)), SIZET2NUM(AMmarkEnd(mark)));
|
|
1286
|
+
AMresult *value_result = AMmarkValue(mark);
|
|
1287
|
+
check_result(value_result);
|
|
1288
|
+
rb_hash_aset(hash, ID2SYM(id_value_key), value_from_item(doc, AMresultItem(value_result), heads));
|
|
1289
|
+
AMresultFree(value_result);
|
|
1290
|
+
return hash;
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
static VALUE doc_marks(int argc, VALUE *argv, VALUE self) {
|
|
1294
|
+
VALUE path = Qnil;
|
|
1295
|
+
VALUE opts = Qnil;
|
|
1296
|
+
rb_scan_args(argc, argv, "1:", &path, &opts);
|
|
1297
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1298
|
+
AMresult *head_result = NULL;
|
|
1299
|
+
if (!NIL_P(opts)) {
|
|
1300
|
+
head_result = heads_result_from_ruby(rb_hash_aref(opts, ID2SYM(rb_intern2("heads", 5))));
|
|
1301
|
+
}
|
|
1302
|
+
AMitems head_items;
|
|
1303
|
+
const AMitems *heads = heads_items_view(head_result, &head_items);
|
|
1304
|
+
VALUE ary = path_array(path);
|
|
1305
|
+
amrb_result_stack_t stack;
|
|
1306
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1307
|
+
const AMobjId *obj = resolve_object(doc, ary, &stack, heads);
|
|
1308
|
+
AMresult *result = AMmarks(doc->doc, obj, heads);
|
|
1309
|
+
check_result(result);
|
|
1310
|
+
AMitems items = AMresultItems(result);
|
|
1311
|
+
VALUE marks = rb_ary_new2((long)AMitemsSize(&items));
|
|
1312
|
+
AMitem *item = NULL;
|
|
1313
|
+
while ((item = AMitemsNext(&items, 1)) != NULL) {
|
|
1314
|
+
rb_ary_push(marks, mark_hash_from_item(doc, item, heads));
|
|
1315
|
+
}
|
|
1316
|
+
AMresultFree(result);
|
|
1317
|
+
stack_free(&stack);
|
|
1318
|
+
if (head_result) AMresultFree(head_result);
|
|
1319
|
+
return marks;
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
static VALUE doc_mark(int argc, VALUE *argv, VALUE self) {
|
|
1323
|
+
VALUE path, start, end, name, value, expand;
|
|
1324
|
+
rb_scan_args(argc, argv, "51", &path, &start, &end, &name, &value, &expand);
|
|
1325
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1326
|
+
VALUE ary = path_array(path);
|
|
1327
|
+
VALUE mark_name = path_key_string(name);
|
|
1328
|
+
amrb_result_stack_t stack;
|
|
1329
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1330
|
+
const AMobjId *obj = resolve_object(doc, ary, &stack, NULL);
|
|
1331
|
+
AMresult *value_result = scalar_item_result_from_ruby(value);
|
|
1332
|
+
check_result(value_result);
|
|
1333
|
+
AMitem *value_item = AMresultItem(value_result);
|
|
1334
|
+
checked_free_result(AMmarkCreate(doc->doc, obj, (size_t)NUM2LONG(start), (size_t)NUM2LONG(end), mark_expand_from_value(expand), string_span(mark_name), value_item));
|
|
1335
|
+
AMresultFree(value_result);
|
|
1336
|
+
stack_free(&stack);
|
|
1337
|
+
return self;
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
static VALUE doc_unmark(int argc, VALUE *argv, VALUE self) {
|
|
1341
|
+
VALUE path, start, end, name, expand;
|
|
1342
|
+
rb_scan_args(argc, argv, "41", &path, &start, &end, &name, &expand);
|
|
1343
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1344
|
+
VALUE ary = path_array(path);
|
|
1345
|
+
VALUE mark_name = path_key_string(name);
|
|
1346
|
+
amrb_result_stack_t stack;
|
|
1347
|
+
stack_init(&stack, RARRAY_LEN(ary));
|
|
1348
|
+
const AMobjId *obj = resolve_object(doc, ary, &stack, NULL);
|
|
1349
|
+
checked_free_result(AMmarkClear(doc->doc, obj, (size_t)NUM2LONG(start), (size_t)NUM2LONG(end), mark_expand_from_value(expand), string_span(mark_name)));
|
|
1350
|
+
stack_free(&stack);
|
|
1351
|
+
return self;
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
static VALUE result_hash_or_nil(AMresult *result) {
|
|
1355
|
+
check_result(result);
|
|
1356
|
+
AMitem *item = AMresultItem(result);
|
|
1357
|
+
if (!item || AMitemValType(item) == AM_VAL_TYPE_VOID) {
|
|
1358
|
+
AMresultFree(result);
|
|
1359
|
+
return Qnil;
|
|
1360
|
+
}
|
|
1361
|
+
AMbyteSpan hash = null_span();
|
|
1362
|
+
if (!AMitemToChangeHash(item, &hash)) {
|
|
1363
|
+
AMresultFree(result);
|
|
1364
|
+
rb_raise(cError, "expected change hash");
|
|
1365
|
+
}
|
|
1366
|
+
VALUE value = binary_string_from_span(hash);
|
|
1367
|
+
AMresultFree(result);
|
|
1368
|
+
return value;
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
static VALUE doc_commit(int argc, VALUE *argv, VALUE self) {
|
|
1372
|
+
VALUE message = Qnil;
|
|
1373
|
+
VALUE timestamp = Qnil;
|
|
1374
|
+
rb_scan_args(argc, argv, "02", &message, ×tamp);
|
|
1375
|
+
if (RB_TYPE_P(message, T_HASH)) {
|
|
1376
|
+
VALUE opts = message;
|
|
1377
|
+
message = rb_hash_aref(opts, ID2SYM(id_message));
|
|
1378
|
+
timestamp = rb_hash_aref(opts, ID2SYM(id_timestamp));
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
AMbyteSpan span = null_span();
|
|
1382
|
+
if (!NIL_P(message)) {
|
|
1383
|
+
StringValue(message);
|
|
1384
|
+
span = string_span(message);
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
int64_t ts = 0;
|
|
1388
|
+
int64_t *ts_ptr = NULL;
|
|
1389
|
+
if (!NIL_P(timestamp)) {
|
|
1390
|
+
ts = NUM2LL(timestamp);
|
|
1391
|
+
ts_ptr = &ts;
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1395
|
+
return result_hash_or_nil(AMcommit(doc->doc, span, ts_ptr));
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
static VALUE doc_empty_change(int argc, VALUE *argv, VALUE self) {
|
|
1399
|
+
VALUE message = Qnil;
|
|
1400
|
+
VALUE timestamp = Qnil;
|
|
1401
|
+
rb_scan_args(argc, argv, "02", &message, ×tamp);
|
|
1402
|
+
if (RB_TYPE_P(message, T_HASH)) {
|
|
1403
|
+
VALUE opts = message;
|
|
1404
|
+
message = rb_hash_aref(opts, ID2SYM(id_message));
|
|
1405
|
+
timestamp = rb_hash_aref(opts, ID2SYM(id_timestamp));
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
AMbyteSpan span = null_span();
|
|
1409
|
+
if (!NIL_P(message)) {
|
|
1410
|
+
StringValue(message);
|
|
1411
|
+
span = string_span(message);
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
int64_t ts = 0;
|
|
1415
|
+
int64_t *ts_ptr = NULL;
|
|
1416
|
+
if (!NIL_P(timestamp)) {
|
|
1417
|
+
ts = NUM2LL(timestamp);
|
|
1418
|
+
ts_ptr = &ts;
|
|
1419
|
+
}
|
|
1420
|
+
|
|
1421
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1422
|
+
return result_hash_or_nil(AMemptyChange(doc->doc, span, ts_ptr));
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
static VALUE doc_save(VALUE self) {
|
|
1426
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1427
|
+
AMresult *result = AMsave(doc->doc);
|
|
1428
|
+
check_result(result);
|
|
1429
|
+
VALUE bytes = bytes_from_item(AMresultItem(result), 0);
|
|
1430
|
+
AMresultFree(result);
|
|
1431
|
+
return bytes;
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1434
|
+
static VALUE doc_save_incremental(VALUE self) {
|
|
1435
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1436
|
+
AMresult *result = AMsaveIncremental(doc->doc);
|
|
1437
|
+
check_result(result);
|
|
1438
|
+
VALUE bytes = bytes_from_item(AMresultItem(result), 0);
|
|
1439
|
+
AMresultFree(result);
|
|
1440
|
+
return bytes;
|
|
1441
|
+
}
|
|
1442
|
+
|
|
1443
|
+
static VALUE doc_load_incremental(VALUE self, VALUE bytes) {
|
|
1444
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1445
|
+
StringValue(bytes);
|
|
1446
|
+
AMbyteSpan span = string_span(bytes);
|
|
1447
|
+
AMresult *result = AMloadIncremental(doc->doc, span.src, span.count);
|
|
1448
|
+
check_result(result);
|
|
1449
|
+
AMitem *item = AMresultItem(result);
|
|
1450
|
+
uint64_t count = 0;
|
|
1451
|
+
if (!AMitemToUint(item, &count)) {
|
|
1452
|
+
AMresultFree(result);
|
|
1453
|
+
rb_raise(cError, "expected loaded change count");
|
|
1454
|
+
}
|
|
1455
|
+
AMresultFree(result);
|
|
1456
|
+
return ULL2NUM(count);
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
static VALUE doc_heads(VALUE self) {
|
|
1460
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1461
|
+
return array_from_items_result(AMgetHeads(doc->doc), AM_VAL_TYPE_CHANGE_HASH);
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1464
|
+
static VALUE doc_missing_deps(int argc, VALUE *argv, VALUE self) {
|
|
1465
|
+
VALUE heads = Qnil;
|
|
1466
|
+
rb_scan_args(argc, argv, "01", &heads);
|
|
1467
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1468
|
+
AMresult *head_result = NIL_P(heads) ? NULL : items_result_from_array(heads, 0);
|
|
1469
|
+
AMitems items;
|
|
1470
|
+
AMitems *items_ptr = NULL;
|
|
1471
|
+
if (head_result) {
|
|
1472
|
+
items = AMresultItems(head_result);
|
|
1473
|
+
items_ptr = &items;
|
|
1474
|
+
}
|
|
1475
|
+
VALUE missing = array_from_items_result(AMgetMissingDeps(doc->doc, items_ptr), AM_VAL_TYPE_CHANGE_HASH);
|
|
1476
|
+
if (head_result) AMresultFree(head_result);
|
|
1477
|
+
return missing;
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1480
|
+
static VALUE change_metadata_hash(AMchange *change) {
|
|
1481
|
+
VALUE hash = rb_hash_new();
|
|
1482
|
+
rb_hash_aset(hash, ID2SYM(rb_intern2("hash", 4)), binary_string_from_span(AMchangeHash(change)));
|
|
1483
|
+
AMbyteSpan msg = AMchangeMessage(change);
|
|
1484
|
+
if (msg.count > 0) {
|
|
1485
|
+
rb_hash_aset(hash, ID2SYM(id_message), utf8_string_from_span(msg));
|
|
1486
|
+
} else {
|
|
1487
|
+
rb_hash_aset(hash, ID2SYM(id_message), Qnil);
|
|
1488
|
+
}
|
|
1489
|
+
rb_hash_aset(hash, ID2SYM(id_timestamp), LL2NUM(AMchangeTime(change)));
|
|
1490
|
+
rb_hash_aset(hash, ID2SYM(rb_intern2("seq", 3)), ULL2NUM(AMchangeSeq(change)));
|
|
1491
|
+
rb_hash_aset(hash, ID2SYM(rb_intern2("max_op", 6)), ULL2NUM(AMchangeMaxOp(change)));
|
|
1492
|
+
rb_hash_aset(hash, ID2SYM(rb_intern2("start_op", 8)), ULL2NUM(AMchangeStartOp(change)));
|
|
1493
|
+
rb_hash_aset(hash, ID2SYM(rb_intern2("size", 4)), SIZET2NUM(AMchangeSize(change)));
|
|
1494
|
+
rb_hash_aset(hash, ID2SYM(rb_intern2("empty", 5)), AMchangeIsEmpty(change) ? Qtrue : Qfalse);
|
|
1495
|
+
|
|
1496
|
+
AMresult *actor_result = AMchangeActorId(change);
|
|
1497
|
+
check_result(actor_result);
|
|
1498
|
+
AMitem *actor_item = AMresultItem(actor_result);
|
|
1499
|
+
const AMactorId *actor = NULL;
|
|
1500
|
+
if (actor_item && AMitemToActorId(actor_item, &actor) && actor) {
|
|
1501
|
+
rb_hash_aset(hash, ID2SYM(id_actor_id), utf8_string_from_span(AMactorIdStr(actor)));
|
|
1502
|
+
}
|
|
1503
|
+
AMresultFree(actor_result);
|
|
1504
|
+
|
|
1505
|
+
AMresult *deps_result = AMchangeDeps(change);
|
|
1506
|
+
rb_hash_aset(hash, ID2SYM(rb_intern2("deps", 4)),
|
|
1507
|
+
array_from_items_result(deps_result, AM_VAL_TYPE_CHANGE_HASH));
|
|
1508
|
+
|
|
1509
|
+
AMbyteSpan extra = AMchangeExtraBytes(change);
|
|
1510
|
+
rb_hash_aset(hash, ID2SYM(rb_intern2("extra_bytes", 11)),
|
|
1511
|
+
extra.count > 0 ? binary_string_from_span(extra) : rb_str_new("", 0));
|
|
1512
|
+
return hash;
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
static VALUE doc_s_decode_change(VALUE klass, VALUE bytes) {
|
|
1516
|
+
(void)klass;
|
|
1517
|
+
StringValue(bytes);
|
|
1518
|
+
AMbyteSpan span = string_span(bytes);
|
|
1519
|
+
AMresult *result = AMchangeFromBytes(span.src, span.count);
|
|
1520
|
+
check_result(result);
|
|
1521
|
+
AMitem *item = AMresultItem(result);
|
|
1522
|
+
AMchange *change = NULL;
|
|
1523
|
+
if (!item || !AMitemToChange(item, &change) || !change) {
|
|
1524
|
+
AMresultFree(result);
|
|
1525
|
+
rb_raise(cError, "expected Automerge change bytes");
|
|
1526
|
+
}
|
|
1527
|
+
VALUE meta = change_metadata_hash(change);
|
|
1528
|
+
AMresultFree(result);
|
|
1529
|
+
return meta;
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
static VALUE doc_change_by_hash(VALUE self, VALUE hash) {
|
|
1533
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1534
|
+
StringValue(hash);
|
|
1535
|
+
AMbyteSpan span = string_span(hash);
|
|
1536
|
+
AMresult *result = AMgetChangeByHash(doc->doc, span.src, span.count);
|
|
1537
|
+
check_result(result);
|
|
1538
|
+
VALUE change = bytes_from_change_item(AMresultItem(result));
|
|
1539
|
+
AMresultFree(result);
|
|
1540
|
+
return change;
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1543
|
+
static VALUE doc_get_changes(int argc, VALUE *argv, VALUE self) {
|
|
1544
|
+
VALUE heads = Qnil;
|
|
1545
|
+
rb_scan_args(argc, argv, "01", &heads);
|
|
1546
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1547
|
+
AMresult *head_result = NIL_P(heads) ? NULL : items_result_from_array(heads, 0);
|
|
1548
|
+
AMitems items;
|
|
1549
|
+
AMitems *items_ptr = NULL;
|
|
1550
|
+
if (head_result) {
|
|
1551
|
+
items = AMresultItems(head_result);
|
|
1552
|
+
items_ptr = &items;
|
|
1553
|
+
}
|
|
1554
|
+
VALUE changes = array_from_items_result(AMgetChanges(doc->doc, items_ptr), AM_VAL_TYPE_CHANGE);
|
|
1555
|
+
if (head_result) AMresultFree(head_result);
|
|
1556
|
+
return changes;
|
|
1557
|
+
}
|
|
1558
|
+
|
|
1559
|
+
static VALUE doc_apply_changes(VALUE self, VALUE changes) {
|
|
1560
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1561
|
+
AMresult *change_result = items_result_from_array(changes, 1);
|
|
1562
|
+
if (!change_result) return self;
|
|
1563
|
+
AMitems items = AMresultItems(change_result);
|
|
1564
|
+
checked_free_result(AMapplyChanges(doc->doc, &items));
|
|
1565
|
+
AMresultFree(change_result);
|
|
1566
|
+
return self;
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
static VALUE doc_last_local_change(VALUE self) {
|
|
1570
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1571
|
+
AMresult *result = AMgetLastLocalChange(doc->doc);
|
|
1572
|
+
check_result(result);
|
|
1573
|
+
AMitem *item = AMresultItem(result);
|
|
1574
|
+
VALUE value = Qnil;
|
|
1575
|
+
if (item && AMitemValType(item) == AM_VAL_TYPE_CHANGE) {
|
|
1576
|
+
value = bytes_from_change_item(item);
|
|
1577
|
+
}
|
|
1578
|
+
AMresultFree(result);
|
|
1579
|
+
return value;
|
|
1580
|
+
}
|
|
1581
|
+
|
|
1582
|
+
static VALUE doc_merge(VALUE self, VALUE other) {
|
|
1583
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1584
|
+
amrb_doc_t *other_doc = get_doc(other);
|
|
1585
|
+
return array_from_items_result(AMmerge(doc->doc, other_doc->doc), AM_VAL_TYPE_CHANGE_HASH);
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
static VALUE doc_changes_added(VALUE self, VALUE other) {
|
|
1589
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1590
|
+
amrb_doc_t *other_doc = get_doc(other);
|
|
1591
|
+
return array_from_items_result(AMgetChangesAdded(doc->doc, other_doc->doc), AM_VAL_TYPE_CHANGE);
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
static VALUE doc_fork(int argc, VALUE *argv, VALUE self) {
|
|
1595
|
+
VALUE heads = Qnil;
|
|
1596
|
+
rb_scan_args(argc, argv, "01", &heads);
|
|
1597
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1598
|
+
AMresult *head_result = NIL_P(heads) ? NULL : items_result_from_array(heads, 0);
|
|
1599
|
+
AMitems items;
|
|
1600
|
+
AMitems *items_ptr = NULL;
|
|
1601
|
+
if (head_result) {
|
|
1602
|
+
items = AMresultItems(head_result);
|
|
1603
|
+
items_ptr = &items;
|
|
1604
|
+
}
|
|
1605
|
+
VALUE forked = doc_from_result(CLASS_OF(self), AMfork(doc->doc, items_ptr));
|
|
1606
|
+
if (head_result) AMresultFree(head_result);
|
|
1607
|
+
return forked;
|
|
1608
|
+
}
|
|
1609
|
+
|
|
1610
|
+
static VALUE doc_actor_id(VALUE self) {
|
|
1611
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1612
|
+
AMresult *result = AMgetActorId(doc->doc);
|
|
1613
|
+
check_result(result);
|
|
1614
|
+
AMitem *item = AMresultItem(result);
|
|
1615
|
+
const AMactorId *actor = NULL;
|
|
1616
|
+
if (!item || !AMitemToActorId(item, &actor)) {
|
|
1617
|
+
AMresultFree(result);
|
|
1618
|
+
rb_raise(cError, "expected actor id");
|
|
1619
|
+
}
|
|
1620
|
+
VALUE actor_id = utf8_string_from_span(AMactorIdStr(actor));
|
|
1621
|
+
AMresultFree(result);
|
|
1622
|
+
return actor_id;
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
static VALUE doc_set_actor_id(VALUE self, VALUE actor_id_value) {
|
|
1626
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1627
|
+
StringValue(actor_id_value);
|
|
1628
|
+
AMresult *actor_result = AMactorIdFromStr(string_span(actor_id_value));
|
|
1629
|
+
check_result(actor_result);
|
|
1630
|
+
AMitem *item = AMresultItem(actor_result);
|
|
1631
|
+
const AMactorId *actor = NULL;
|
|
1632
|
+
if (!item || !AMitemToActorId(item, &actor)) {
|
|
1633
|
+
AMresultFree(actor_result);
|
|
1634
|
+
rb_raise(cError, "invalid actor id");
|
|
1635
|
+
}
|
|
1636
|
+
checked_free_result(AMsetActorId(doc->doc, actor));
|
|
1637
|
+
AMresultFree(actor_result);
|
|
1638
|
+
return self;
|
|
1639
|
+
}
|
|
1640
|
+
|
|
1641
|
+
static VALUE doc_pending_ops(VALUE self) {
|
|
1642
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1643
|
+
return SIZET2NUM(AMpendingOps(doc->doc));
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
static VALUE doc_rollback(VALUE self) {
|
|
1647
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1648
|
+
return SIZET2NUM(AMrollback(doc->doc));
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1651
|
+
static VALUE doc_generate_sync_message(VALUE self, VALUE sync_state_value) {
|
|
1652
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1653
|
+
amrb_sync_state_t *sync_state = get_sync_state(sync_state_value);
|
|
1654
|
+
AMresult *result = AMgenerateSyncMessage(doc->doc, sync_state->state);
|
|
1655
|
+
check_result(result);
|
|
1656
|
+
AMitem *item = AMresultItem(result);
|
|
1657
|
+
if (!item || AMitemValType(item) == AM_VAL_TYPE_VOID) {
|
|
1658
|
+
AMresultFree(result);
|
|
1659
|
+
return Qnil;
|
|
1660
|
+
}
|
|
1661
|
+
const AMsyncMessage *message = NULL;
|
|
1662
|
+
if (!AMitemToSyncMessage(item, &message) || !message) {
|
|
1663
|
+
AMresultFree(result);
|
|
1664
|
+
rb_raise(cError, "expected sync message");
|
|
1665
|
+
}
|
|
1666
|
+
AMresult *encoded = AMsyncMessageEncode(message);
|
|
1667
|
+
check_result(encoded);
|
|
1668
|
+
VALUE bytes = bytes_from_item(AMresultItem(encoded), 0);
|
|
1669
|
+
AMresultFree(encoded);
|
|
1670
|
+
AMresultFree(result);
|
|
1671
|
+
return bytes;
|
|
1672
|
+
}
|
|
1673
|
+
|
|
1674
|
+
static VALUE doc_receive_sync_message(VALUE self, VALUE sync_state_value, VALUE bytes) {
|
|
1675
|
+
amrb_doc_t *doc = get_doc(self);
|
|
1676
|
+
amrb_sync_state_t *sync_state = get_sync_state(sync_state_value);
|
|
1677
|
+
StringValue(bytes);
|
|
1678
|
+
AMbyteSpan span = string_span(bytes);
|
|
1679
|
+
AMresult *message_result = AMsyncMessageDecode(span.src, span.count);
|
|
1680
|
+
check_result(message_result);
|
|
1681
|
+
AMitem *item = AMresultItem(message_result);
|
|
1682
|
+
const AMsyncMessage *message = NULL;
|
|
1683
|
+
if (!item || !AMitemToSyncMessage(item, &message)) {
|
|
1684
|
+
AMresultFree(message_result);
|
|
1685
|
+
rb_raise(cError, "invalid sync message");
|
|
1686
|
+
}
|
|
1687
|
+
checked_free_result(AMreceiveSyncMessage(doc->doc, sync_state->state, message));
|
|
1688
|
+
AMresultFree(message_result);
|
|
1689
|
+
return self;
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1692
|
+
static VALUE sync_state_initialize(VALUE self) {
|
|
1693
|
+
VALUE obj = sync_state_from_result(CLASS_OF(self), AMsyncStateInit());
|
|
1694
|
+
amrb_sync_state_t *src;
|
|
1695
|
+
amrb_sync_state_t *dst;
|
|
1696
|
+
TypedData_Get_Struct(obj, amrb_sync_state_t, &amrb_sync_state_type, src);
|
|
1697
|
+
TypedData_Get_Struct(self, amrb_sync_state_t, &amrb_sync_state_type, dst);
|
|
1698
|
+
dst->result = src->result;
|
|
1699
|
+
dst->state = src->state;
|
|
1700
|
+
src->result = NULL;
|
|
1701
|
+
src->state = NULL;
|
|
1702
|
+
return self;
|
|
1703
|
+
}
|
|
1704
|
+
|
|
1705
|
+
static VALUE sync_state_s_decode(VALUE klass, VALUE bytes) {
|
|
1706
|
+
StringValue(bytes);
|
|
1707
|
+
AMbyteSpan span = string_span(bytes);
|
|
1708
|
+
return sync_state_from_result(klass, AMsyncStateDecode(span.src, span.count));
|
|
1709
|
+
}
|
|
1710
|
+
|
|
1711
|
+
static VALUE sync_state_encode(VALUE self) {
|
|
1712
|
+
amrb_sync_state_t *state = get_sync_state(self);
|
|
1713
|
+
AMresult *result = AMsyncStateEncode(state->state);
|
|
1714
|
+
check_result(result);
|
|
1715
|
+
VALUE bytes = bytes_from_item(AMresultItem(result), 0);
|
|
1716
|
+
AMresultFree(result);
|
|
1717
|
+
return bytes;
|
|
1718
|
+
}
|
|
1719
|
+
|
|
1720
|
+
static VALUE sync_state_equal(VALUE self, VALUE other) {
|
|
1721
|
+
amrb_sync_state_t *state = get_sync_state(self);
|
|
1722
|
+
amrb_sync_state_t *other_state = get_sync_state(other);
|
|
1723
|
+
return AMsyncStateEqual(state->state, other_state->state) ? Qtrue : Qfalse;
|
|
1724
|
+
}
|
|
1725
|
+
|
|
1726
|
+
static VALUE sync_state_shared_heads(VALUE self) {
|
|
1727
|
+
amrb_sync_state_t *state = get_sync_state(self);
|
|
1728
|
+
return array_from_items_result(AMsyncStateSharedHeads(state->state), AM_VAL_TYPE_CHANGE_HASH);
|
|
1729
|
+
}
|
|
1730
|
+
|
|
1731
|
+
static VALUE ensure_class_under(VALUE parent, const char *name, VALUE superclass) {
|
|
1732
|
+
ID id = rb_intern2(name, (long)strlen(name));
|
|
1733
|
+
if (rb_const_defined(parent, id)) {
|
|
1734
|
+
return rb_const_get(parent, id);
|
|
1735
|
+
}
|
|
1736
|
+
return rb_define_class_under(parent, name, superclass);
|
|
1737
|
+
}
|
|
1738
|
+
|
|
1739
|
+
void Init_automerge_ext(void) {
|
|
1740
|
+
id_actor_id = rb_intern2("actor_id", 8);
|
|
1741
|
+
id_message = rb_intern2("message", 7);
|
|
1742
|
+
id_timestamp = rb_intern2("timestamp", 9);
|
|
1743
|
+
id_value = rb_intern2("@value", 6);
|
|
1744
|
+
id_value_key = rb_intern2("value", 5);
|
|
1745
|
+
|
|
1746
|
+
mAutomerge = rb_define_module("Automerge");
|
|
1747
|
+
cError = ensure_class_under(mAutomerge, "Error", rb_eStandardError);
|
|
1748
|
+
cCounter = ensure_class_under(mAutomerge, "Counter", rb_cObject);
|
|
1749
|
+
cTimestamp = ensure_class_under(mAutomerge, "Timestamp", rb_cObject);
|
|
1750
|
+
cBytes = ensure_class_under(mAutomerge, "Bytes", rb_cObject);
|
|
1751
|
+
cText = ensure_class_under(mAutomerge, "Text", rb_cObject);
|
|
1752
|
+
cUint = ensure_class_under(mAutomerge, "Uint", rb_cObject);
|
|
1753
|
+
|
|
1754
|
+
cDocument = ensure_class_under(mAutomerge, "Document", rb_cObject);
|
|
1755
|
+
rb_define_alloc_func(cDocument, doc_alloc);
|
|
1756
|
+
rb_define_method(cDocument, "initialize", doc_initialize, -1);
|
|
1757
|
+
rb_define_singleton_method(cDocument, "load", doc_s_load, 1);
|
|
1758
|
+
rb_define_singleton_method(cDocument, "decode_change", doc_s_decode_change, 1);
|
|
1759
|
+
rb_define_method(cDocument, "clone", doc_clone, 0);
|
|
1760
|
+
rb_define_method(cDocument, "dup", doc_clone, 0);
|
|
1761
|
+
rb_define_method(cDocument, "==", doc_equal, 1);
|
|
1762
|
+
rb_define_method(cDocument, "get", doc_get, -1);
|
|
1763
|
+
rb_define_method(cDocument, "get_all", doc_get_all, -1);
|
|
1764
|
+
rb_define_method(cDocument, "put", doc_put, 2);
|
|
1765
|
+
rb_define_method(cDocument, "insert", doc_insert, 3);
|
|
1766
|
+
rb_define_method(cDocument, "delete", doc_delete, 1);
|
|
1767
|
+
rb_define_method(cDocument, "increment", doc_increment, 2);
|
|
1768
|
+
rb_define_method(cDocument, "splice_text", doc_splice_text, 4);
|
|
1769
|
+
rb_define_method(cDocument, "splice", doc_splice_list, 4);
|
|
1770
|
+
rb_define_method(cDocument, "keys", doc_keys, -1);
|
|
1771
|
+
rb_define_method(cDocument, "length", doc_length, -1);
|
|
1772
|
+
rb_define_method(cDocument, "cursor", doc_cursor, -1);
|
|
1773
|
+
rb_define_method(cDocument, "cursor_position", doc_cursor_position, -1);
|
|
1774
|
+
rb_define_method(cDocument, "marks", doc_marks, -1);
|
|
1775
|
+
rb_define_method(cDocument, "mark", doc_mark, -1);
|
|
1776
|
+
rb_define_method(cDocument, "unmark", doc_unmark, -1);
|
|
1777
|
+
rb_define_method(cDocument, "commit", doc_commit, -1);
|
|
1778
|
+
rb_define_method(cDocument, "empty_change", doc_empty_change, -1);
|
|
1779
|
+
rb_define_method(cDocument, "save", doc_save, 0);
|
|
1780
|
+
rb_define_method(cDocument, "save_incremental", doc_save_incremental, 0);
|
|
1781
|
+
rb_define_method(cDocument, "load_incremental", doc_load_incremental, 1);
|
|
1782
|
+
rb_define_method(cDocument, "heads", doc_heads, 0);
|
|
1783
|
+
rb_define_method(cDocument, "missing_deps", doc_missing_deps, -1);
|
|
1784
|
+
rb_define_method(cDocument, "change_by_hash", doc_change_by_hash, 1);
|
|
1785
|
+
rb_define_method(cDocument, "get_changes", doc_get_changes, -1);
|
|
1786
|
+
rb_define_method(cDocument, "apply_changes", doc_apply_changes, 1);
|
|
1787
|
+
rb_define_method(cDocument, "last_local_change", doc_last_local_change, 0);
|
|
1788
|
+
rb_define_method(cDocument, "merge", doc_merge, 1);
|
|
1789
|
+
rb_define_method(cDocument, "changes_added", doc_changes_added, 1);
|
|
1790
|
+
rb_define_method(cDocument, "fork", doc_fork, -1);
|
|
1791
|
+
rb_define_method(cDocument, "actor_id", doc_actor_id, 0);
|
|
1792
|
+
rb_define_method(cDocument, "actor_id=", doc_set_actor_id, 1);
|
|
1793
|
+
rb_define_method(cDocument, "pending_ops", doc_pending_ops, 0);
|
|
1794
|
+
rb_define_method(cDocument, "rollback", doc_rollback, 0);
|
|
1795
|
+
rb_define_method(cDocument, "generate_sync_message", doc_generate_sync_message, 1);
|
|
1796
|
+
rb_define_method(cDocument, "receive_sync_message", doc_receive_sync_message, 2);
|
|
1797
|
+
|
|
1798
|
+
cSyncState = ensure_class_under(mAutomerge, "SyncState", rb_cObject);
|
|
1799
|
+
rb_define_alloc_func(cSyncState, sync_state_alloc);
|
|
1800
|
+
rb_define_method(cSyncState, "initialize", sync_state_initialize, 0);
|
|
1801
|
+
rb_define_singleton_method(cSyncState, "decode", sync_state_s_decode, 1);
|
|
1802
|
+
rb_define_method(cSyncState, "encode", sync_state_encode, 0);
|
|
1803
|
+
rb_define_method(cSyncState, "==", sync_state_equal, 1);
|
|
1804
|
+
rb_define_method(cSyncState, "shared_heads", sync_state_shared_heads, 0);
|
|
1805
|
+
}
|