Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Roadmap to Automerge 1.0 #300

Closed
ept opened this issue Jan 11, 2021 · 7 comments
Closed

Roadmap to Automerge 1.0 #300

ept opened this issue Jan 11, 2021 · 7 comments

Comments

@ept
Copy link
Member

ept commented Jan 11, 2021

Hi all! I wanted to give an update and invite discussion on our plans to ship a 1.0 version of Automerge. The performance branch has been a work in progress for about a year and a half, and I owe you all some news about getting it merged and released!

The performance branch and data format evolution

Despite its name, the performance branch is not only about improving performance, but also about updating the data formats to something that we can support long-term. One of the key parts of this has been a binary encoding format for changes and documents (#253), which is orders of magnitude more compact than the JSON data format used by the currently released version of Automerge. This binary format is now pretty stable: I made a few more tweaks to it in #296, but beyond that I do not expect further changes.

The binary data format is the primary reason why this work has been happening on a topic branch rather than main. Since this data format is used by collaborators to exchange their edits, and different collaborators may be running different versions of the software, it's important that it is forward and backward compatible. We have been storing up all the breaking data format changes on the performance branch so that when it is released, we only need to perform a one-time migration from JSON to the binary format, and thereafter have no more migrations for hopefully a very long time, if ever. That means getting the fundamentals of the format right before releasing it.

The binary format is carefully designed to be extensible while maintaining compatibility, and so it will allow seamless collaboration across different versions of Automerge. That means we can add features to future versions of Automerge without breaking compatibility. If you are collaborating with users running different app versions, including different versions of Automerge, they will still be able to interoperate.

The plan is to ship this binary format in Automerge 1.0. Now that the format is pretty stable, the time has come to discuss the steps towards getting it released.

What's changing and what's remaining the same

The fundamentals of Automerge will remain unchanged in 1.0:

  • The API will remain largely unchanged, except for some tweaks that are detailed in the changelog and below. Automerge will continue to have a JSON data model plus extensions (e.g. relational tables, text, date objects), and Automerge.change() will continue working as-is.
  • The fundamental model remains the same: users can edit offline and sync with other collaborators when online again; sync can happen via a server, a peer-to-peer protocol, or any other communication channel. Automerge itself remains just a data structure, with storage and networking provided by associated libraries.
  • Unlike other CRDT libraries, Automerge continues to remember the full editing history of a document, unless you explicitly choose to discard history. The binary format allows us to keep all this history at very low cost (see Preview: Automerge binary data format #253). This enables things like powerful undo and revert features, visualising change history, allowing one user to suggest changes that can be accepted or rejected by another user, and more.
  • Automerge continues to consist of a frontend and backend, which can run on different threads. The frontend is lightweight and can run on a UI thread, while the backend containing the CRDT logic (which is sometimes expensive) can be on a background thread where it doesn't interfere with UI responsiveness. In future we may even have multiple frontends presenting different views onto a single shared backend, to save memory. However, this threading stuff is optional; it's also fine to do everything on a single thread.

The biggest changes are:

  • The compact binary format, as discussed above. We will provide a migration tool to convert any existing Automerge documents to the new format.
  • Much improved performance. More on this below.
  • Multi-language support! The Rust port of Automerge is closely tracking the performance branch, and we have detailed tests to check interoperability between the JS and Rust implementations. The Rust code compiles to WebAssembly (an almost-drop-in replacement for the JavaScript implementation, providing much better performance) and also to native code that can be used through a C API/FFI (allowing portability e.g. to iOS and Android without requiring a JS runtime). There is already a Swift wrapper for the Rust backend, and eventually I hope we will have wrappers for all mainstream languages and platforms, which will all be able to interoperate. Rust is an ideal language to provide this level of portability.
  • Change history is secured through chaining cryptographic hashes, like a Git commit history or a blockchain (except that we use SHA-256 rather than Git's insecure SHA-1). When two users are syncing their changes, if they have the same hashes, then they are guaranteed to be in the same state. This is a much stronger guarantee than algorithms based on vector clocks can provide, where it is possible that two users believe they are in sync, when in fact their states are inconsistent (see discussion in Automerge 1.0 sync protocol #290).
  • The undo/redo feature is temporarily removed. Not because it's not important, but to cut scope and help us ship 1.0 sooner. The existing implementation is a hack, and rather than continue supporting that hack, I would rather remove the feature for now, and bring it back in better form in the future. Since we're remembering editing history anyway, we have the freedom to implement arbitrary undo algorithms in the future, even across editing sessions (i.e. you can restart your app, and then undo changes you made before the restart).
  • Network protocols for syncing Automerge need to be updated to handle hash chaining (see Automerge 1.0 sync protocol #290). This mostly affects implementers of those network protocols; applications using Automerge can remain largely unchanged.

The Rust and JS implementations

The current JavaScript implementation of Automerge is quite slow and memory-hungry (including the one on the performance branch, despite the name).
The Rust implementation compiled to WebAssembly is a huge improvement; I don't have figures right now, but I expect that switching to wasm will be a good way forward for people who have run into performance problems with the current Automerge. (Update: Orion has posted some benchmark figures comparing the JS and wasm implementations.)

The wasm version is a drop-in replacement on Node.js, and almost a drop-in replacement in web browsers. The only issue is that loading wasm modules on the web is asynchronous (it returns a promise), and so the initialization of Automerge needs to be made async. This will require a small code change for applications. Apart from that, the API remains the same.

For now, our plan is to maintain both the JS and Rust implementations side-by-side as equal partners, and to see how they work out in the wild. If it turns out that Rust+wasm is superior in every way, we may eventually deprecate the JS implementation and move the JS API to be a wrapper around a wasm core. But before doing that we will have to see how they compare in terms of performance, memory use, compatibility, tooling, etc.

On the JS side, I have also been working on performance improvements through new internal data structures for Automerge. This effort is orthogonal to the Rust implementation: in the Rust port, @orionz has been focussing on profiling and optimizing the existing data structures, whereas my experimental new data structures are a more radical rethink, building upon the new binary format. My hope is that, in the same way as the binary format has reduced the storage cost of Automerge documents by orders of magnitude, the new data structures will improve performance by orders of magnitude. In particular, saving and loading large documents to/from disk will become super fast. But the new data structures are not actually working yet! I think I'm getting close, but it's a quite complex research project.

If my new data structures work as well as I hope they will, we will port them over to Rust to gain the additional wasm speed boost. But if they don't work, I don't want this to hold up the release of Automerge 1.0. Hence publishing this roadmap, even though the new data structures remain a point of uncertainty.

What still needs to be done

Here are the main things that I think still need to be done before shipping 1.0:

  • API for network sync that deals with hash chaining (Automerge 1.0 sync protocol #290), and coordination with networking and storage libraries for Automerge to ensure it works for everyone.
  • Data migration tool to convert existing JSON Automerge documents into the new binary format (Binary format data migration tool #298).
  • Complete interoperability between JS and Rust implementations (this is almost done; the main thing missing on the Rust side is full-document compression).
  • Detailed specification and documentation of the Automerge data format. This will be an open specification, free for anybody to implement if they can't use the JS or Rust implementation for whatever reason (Specification of binary data format #297).
  • Fuzz testing (testing consistency with large numbers of pseudorandomly generated inputs). Even though we already have a solid suite of unit tests with near-complete coverage, this would further help ensure that Automerge is highly reliable (Fuzz testing #299).
  • Further performance improvements (hopefully including my new data structures, if I can get them working). Keeping this vague for now, but I have high hopes.

That list is not terribly long — it feels like 1.0 is finally moving within reach! Feedback welcome on any things you think should be added or removed from that list.

In terms of timescale, I expect that we will be shipping at least a release candidate for 1.0 within the first quarter of 2021. Assuming no major issues are found, a definitive release should follow shortly afterwards.

Thank you to all the people who have contributed and are still contributing to this effort! Especially big thanks to @orionz and @alexjg for the excellent Rust implementation, @lightsprint09 for the Swift wrapper, @HerbCaudill and @pvh for Automerge-related libraries and feedback, and many other contributors and community members!

@echarles
Copy link

Thx all contributors to this huge effort.

We are tracking for the Jupyter RTC initiative the branches with a wasm javascript client (generated from rust) and a python server (also generated from script). It looks like we are happy with having rust the single source of truth and generating binding in various languages (javascript, python...).

Looking forward to get this merged with as many features as possible. I would say that you could target a Automerge 1.0alpha0 even without all performance improvement. I guess having aligned repository with the master branches is for now the best improvement we could think to.

@alexjg
Copy link
Contributor

alexjg commented Jan 11, 2021

This is fantastic, we're so close!

One thing I've been thinking a lot about is interoperability. I think having a formal specification will be an enormous step forward for this but I wonder if it would also be worth having automated compliance tests. This has worked well for other standardisation efforts (e.g the Acid test). I would normally suggest that this could be done after the 1.0 release but here it might actually be convenient to do it as part of the fuzz testing task. If we write the fuzz tests in an implementation independent manner then they can function as compliance tests.

@ept
Copy link
Member Author

ept commented Jan 11, 2021

I would say that you could target a Automerge 1.0alpha0 even without all performance improvement.

Yes, I think we can do that. But I do think we will want at least #290, #298 and full Rust-JS interop for a first alpha release, otherwise those will be the first things that people get stuck with.

One thing I've been thinking a lot about is interoperability.

Yes, this is very important. I made a start with some JS-wasm interop tests in 3fef7e2 but more are needed. The fuzzer should be able to run against both the JS and the wasm backend, so that should help. The process of writing the format spec will probably also suggest test cases.

@skokenes
Copy link
Contributor

Exciting!

As someone who has an implementation of a network protocol for Automerge, my question is how soon can I access something to test the hash chaining changes? Is that available in the performance branch already, or should I watch #290 ?

@ept
Copy link
Member Author

ept commented Jan 12, 2021

@skokenes The hash chaining is already implemented on the performance branch and baked into the binary encoding for changes and documents. If you want to see the hashes, you can use decodeChange() to decode a binary change to JSON. However, the API for syncing hash graphs is not yet available; see #290 for that.

@ept
Copy link
Member Author

ept commented May 5, 2021

Okay, I said in January that I hoped to ship a 1.0 preview release in the first quarter of 2021 — which hasn't quite happened, as it's now May. However, we've now completed all the blockers for the preview release and so I'm going to close this issue.

There are still a few things to do before we can ship a stable 1.0 release, which are mentioned above on this issue, and which we are tracking in the 1.0 milestone. In particular, we need a data conversion tool from the old to the new data format, we need more and better documentation, and of course we need to find any bugs that are found.

@ept ept closed this as completed May 5, 2021
echarles pushed a commit to datalayer-externals/automerge-classic-arch that referenced this issue Feb 16, 2023
commit e1f8d769f44b48cdeb03855ac9e2b223fb229187
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 10 08:53:07 2022 -0500

    update authors

commit 3e5525f1a6541664e5e30ad179b2f217ba7b7422
Merge: f4ba1770 1c21abc5
Author: Orion Henry <orionz@users.noreply.github.com>
Date:   Wed Mar 9 14:36:29 2022 -0500

    Merge pull request automerge#304 from jkankiewicz/c_api_exp

    Fix "fmt" workflow step violations

commit 1c21abc5a37941ce189ff48d994c1ce3dda4827f
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Mar 9 11:13:01 2022 -0800

    Fix CMake and Rust code formatting issues.

commit f4ba1770a96c5200ae124706dffbab327a628c23
Merge: bf1ae609 f41b30d1
Author: Orion Henry <orionz@users.noreply.github.com>
Date:   Wed Mar 9 12:05:58 2022 -0500

    Merge pull request automerge#300 from jkankiewicz/c_api_exp

    Add unit test suites for the `AMlistSet*` and `AMmapSet*` functions

commit f41b30d118ef60965239a02afddbbfb14dc4392f
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 22:08:36 2022 -0800

    Added a brief description of the `AmObjType` enum.
    Added the `AmStatus` enum to the enum docs page.

commit af7386a482d2cb9cee2d188ef443498ddab40ddb
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 21:50:52 2022 -0800

    Added a unit test suite for the  `AMlistSet*`
    functions.

commit 1eb70c6eee846b912806d058a43c6e04a9184a62
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 21:42:42 2022 -0800

    Added the rest of the `AMlistSet*` functions.
    Started the enum tags at `1` so they won't be
    inherently false.
    Alphabetized enum tags for the docs.
    Improved the docs.

commit 6489cba13b49656aa0704d329a90c6e7e4a809e1
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 18:01:46 2022 -0800

    Alphabetize functions in the docs.

commit 74c245b82d49971094d731ef4442b9af14e53c15
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 07:54:25 2022 -0800

    Fix a typo in `AMmapSetObject()`'s documentation.

commit b2a879ba4e23c884f2bf43d77e950c1ad8a34c7e
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 06:24:22 2022 -0800

    Append missing EOF linefeed.

commit fbf0f29b66ad9109081490754872d149d5575ac6
Merge: c56d54b5 bf1ae609
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 01:08:12 2022 -0800

    Merge branch 'c_api_exp' of https://github.com/automerge/automerge-rs into c_api_exp

commit c56d54b565451c0fe65e86b658e094178579fd25
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 01:07:11 2022 -0800

    Added unit test cases for the new `AMmapSet*`
    functions by @orionz.
    Moved the unit test cases for the `AMmapSet*` functions into their own
    unit test suite.

commit 7e59b5576034bc0404fe793758088fea2eae6330
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 01:01:47 2022 -0800

    Edited the Doxygen documentation.

commit bf1ae6091318d005c49407e10a20f4822e41adc1
Author: Orion Henry <orion.henry@gmail.com>
Date:   Mon Mar 7 11:59:22 2022 -0500

    fmt

commit e82a7cc78e166cc05e90138df040cdcdb4d83c13
Merge: a44e69d2 965c2d56
Author: Orion Henry <orionz@users.noreply.github.com>
Date:   Mon Mar 7 11:55:32 2022 -0500

    Merge pull request automerge#299 from jkankiewicz/c_api_exp

    Enable unit testing of the C API

commit 965c2d56c32068d3af07705aff7d0a4386393004
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Mon Mar 7 06:37:36 2022 -0800

    Enable unit testing of the C API.

commit a44e69d2c72ff3e712c1109e3cf2f0d00f2af0c0
Author: Orion Henry <orion.henry@gmail.com>
Date:   Sun Mar 6 14:00:46 2022 -0500

    remove datatype mapset

commit 88153c44e767b47fa1bb0bdd0d4bc5d43f2b6a7a
Merge: 41512e9c c6194e97
Author: Orion Henry <orionz@users.noreply.github.com>
Date:   Sun Mar 6 10:32:39 2022 -0500

    Merge pull request automerge#298 from jkankiewicz/rebase_c_api_exp

    Rebase the "c_api_exp" branch on the "experiment" branch

commit c6194e973235ac43bcdf97b19b0274653b2e6b99
Merge: a2d745c8 41512e9c
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 6 01:09:56 2022 -0800

    Merge branch 'c_api_exp' into rebase_c_api_exp

commit a2d745c8d9c649d444339dc5e1df733af0a5bfec
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 6 00:44:37 2022 -0800

    Replace the `utils::import_value` function with
    the `utils::import_scalar` function.
    Exclude `# Safety` comments from the documentation.

commit 0681e28b4063988fada6d632366b471996d6d66a
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 16:04:17 2022 -0500

    support new as_ref api

commit 916e23fcc20aae9a27f17e9b98f267fac364d5bb
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:56:27 2022 -0500

    fmt

commit 71cd6a1f18796ab8f502d07d1d80784d1e3b9cd2
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:54:38 2022 -0500

    lock data at 64 bit - no c_long

commit e00bd4c20191e86b9f1bd11be2bab31e3a23fc97
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:27:55 2022 -0500

    verbose

commit 39d157c554a71e00978b1d9244e1c1cfbe7c24f3
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 14:56:23 2022 -0500

    clippy cleanup

commit 7f650fb8e0e7173c72d192c60506e46abb41f92f
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Feb 23 02:14:06 2022 -0800

    Added Doxygen documentation generation.
    Renamed `AMDatatype` to `AmDataType`.
    Reorganized the `AmDataType` tags.
    Renamed `AMfree()` to `AMdestroy()`.
    Renamed `AMclone()` to `AMdup()`.

commit b0b803eef8d07b5171b9ab736eae3e2f13d6158b
Author: Orion Henry <orion.henry@gmail.com>
Date:   Tue Feb 22 11:30:42 2022 -0500

    get simple test passing

commit cab9017ffa369365afb73c37275063a0c174b12e
Author: Orion Henry <orion.henry@gmail.com>
Date:   Wed Feb 9 15:50:44 2022 -0500

    rework to return a queriable result

commit a557e848f39d21b69d4b6c56434c1600b1cf6d94
Author: Jason Kankiewicz <you@example.com>
Date:   Mon Feb 14 14:38:00 2022 -0800

    Add a CI step to run the CMake build of the C bindings for @alexjg.

commit c8c0c72f3bfced414cc443255b6a912c56b9ecfc
Author: Jason Kankiewicz <you@example.com>
Date:   Mon Feb 14 14:09:58 2022 -0800

    Add CMake instructions for @orionz.

commit fb62c4b02a0971bf814272a58c500dd5a31e694a
Author: Jason Kankiewicz <you@example.com>
Date:   Thu Feb 10 23:28:54 2022 -0800

    Add CMake support.

commit 7bc3bb6850de84eff9ad5a66eed2363c12ad7738
Author: Jason Kankiewicz <you@example.com>
Date:   Thu Feb 10 22:49:53 2022 -0800

    Replace *intptr_t in C function signatures.

commit 60395a2db04d37d549cd9b0e5178af5f52ceb5f3
Author: Orion Henry <orion.henry@gmail.com>
Date:   Sun Feb 6 18:59:19 2022 -0500

    am_pop and am_pop_value

commit b1e88047d22c4382aa58fc3fc337eb3d8a36140a
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Feb 3 19:43:36 2022 -0500

    break the ground

commit 41512e9c78a649186646bcaa5d78632724bd8403
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 16:04:17 2022 -0500

    support new as_ref api

commit bcee6a9623c0ce1289271df180368a81d50508d6
Merge: cf98f78d 9a89db3
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:58:19 2022 -0500

    Merge remote-tracking branch 'origin/experiment' into c_api_exp

commit cf98f78dd172f214d3f417913470956ff998d9d5
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:56:27 2022 -0500

    fmt

commit 3c1f449c5c024892658b37abbc74e19b746413e2
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:54:38 2022 -0500

    lock data at 64 bit - no c_long

commit 2c2ec0b0c5d74bbe950f629a701ea1209f8ad4b6
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:27:55 2022 -0500

    verbose

commit b72b9c989a60ca4bbcd7c47e1e6bf89356346a2f
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 14:56:23 2022 -0500

    clippy cleanup

commit 3ba28f91ccb5a7499a5442804ffa91001b01a3ef
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Feb 23 02:14:06 2022 -0800

    Added Doxygen documentation generation.
    Renamed `AMDatatype` to `AmDataType`.
    Reorganized the `AmDataType` tags.
    Renamed `AMfree()` to `AMdestroy()`.
    Renamed `AMclone()` to `AMdup()`.

commit 8564e5b7531fb4e5194cf845b3d48e52a16827bd
Author: Orion Henry <orion.henry@gmail.com>
Date:   Tue Feb 22 11:30:42 2022 -0500

    get simple test passing

commit 60835e6ae7361199e03225dd33a8aa9c4614a20e
Author: Orion Henry <orion.henry@gmail.com>
Date:   Wed Feb 9 15:50:44 2022 -0500

    rework to return a queriable result

commit 89466d9e8c77b67b3526d56beb5f263aadb7fca0
Author: Jason Kankiewicz <you@example.com>
Date:   Mon Feb 14 14:38:00 2022 -0800

    Add a CI step to run the CMake build of the C bindings for @alexjg.

commit e2485bd5fda8b0e290038c579b2080faadbc5026
Author: Jason Kankiewicz <you@example.com>
Date:   Mon Feb 14 14:09:58 2022 -0800

    Add CMake instructions for @orionz.

commit b5cc7dd63dd76c816be1f23a0b91ba1f7327a32c
Author: Jason Kankiewicz <you@example.com>
Date:   Thu Feb 10 23:28:54 2022 -0800

    Add CMake support.

commit 685536f0cf9808b10af5efc9341f85acc2490fdf
Author: Jason Kankiewicz <you@example.com>
Date:   Thu Feb 10 22:49:53 2022 -0800

    Replace *intptr_t in C function signatures.

commit c1c6e7bb6615d168bcdad41f1621b17ff8ea7725
Author: Orion Henry <orion.henry@gmail.com>
Date:   Sun Feb 6 18:59:19 2022 -0500

    am_pop and am_pop_value

commit e68c8d347e5e45451b6b2193542b9f2bdaf283ce
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Feb 3 19:43:36 2022 -0500

    break the ground
echarles pushed a commit to datalayer-externals/automerge-classic-arch that referenced this issue Feb 16, 2023
commit 97a36e728e43c9adbe21fd942a73472d0daa2e05
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Fri Apr 8 03:24:46 2022 -0600

    Updated the unit test suites.

commit 56e2beb946e61d3262f58953d4f2e27cfd4c13b0
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Fri Apr 8 03:22:30 2022 -0600

    Tied the lifetime of an `AMobjId` struct to its
    owning `AMdoc` struct.

commit e16c980b2eea39459b1b47045e2fbff69ad2965e
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Fri Apr 8 03:21:26 2022 -0600

    Reverted the `AMobjId` struct to being an opaque
    type.
    Added `AMobjId::new()`to fix a compilation error.
    Tied the lifetime of an `AMobjId` struct to its owning `AMdoc` struct.
    Added the `AMvalue::ChangeHash` variant.

commit 7c769b2cfe041747565c95aeffef311b45a5a19e
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Fri Apr 8 03:12:15 2022 -0600

    Renamed the `AMobj` struct to `AMobjId` for
    clarity.
    Reverted the `AMobjId` struct to being an opaque type.
    Tied the lifetime of an `AMobjId` struct to its owning `AMdoc` struct.
    Renamed `AMcreate()` to `AMallocDoc()` for consistency with C's standard
    library functions.
    Renamed `AMdestroy()` to `AMfreeDoc()` for consistency with C's standard
    library functions.
    Renamed the `obj` function arguments to `obj_id` for clarity.
    Replaced the "set" verb in function names with the "put" verb for
    consistency iwth recent API changes.
    Renamed `AMclear()` to `AMfreeResult()` for consistency with C's
    standard library functions.
    Added `AMfreeObjId()` to enable dropping a persisted `AMojbId` struct.

commit 8d1b3bfcf21485be833e66473ec04e5e12282934
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Fri Apr 8 02:52:52 2022 -0600

    Added a field for persisting `AMobjId` structs to the
    `AMdoc` struct.
    Renamed `AMdoc::create()` to `AMdoc::new()` to be more idiomatic.
    Added `AMdoc::insert_object()` and `AMdoc::set_object()` for persisting
    `AMobjId` structs.
    Added `AMdoc::drop_obj_id()` to enable dropping a persisted `AMobjId`
    struct.

commit b9b0f96357275b522b5f5494dc8bbbee86bf9735
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Thu Mar 17 15:17:08 2022 -0700

    Ensure CMake targets can be built after a clean.

commit d565db1ea8ada9246f6a0ece35968980da90eff9
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Thu Mar 17 15:10:09 2022 -0700

    Prevent unnecessary updating of the generated
    header file.

commit d3647e75d3f01aa91e337ec0e98c4b3a9f5b57f2
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Mar 16 02:50:59 2022 -0700

    Documented the `AMObj.ID` struct member.

commit cc58cbf4bbbcef7baf074c20c3c22efcd56e668d
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Mar 16 02:03:37 2022 -0700

    Normalize the formatting of the `AMobjType_tag()`
    function.

commit c2954dd2c7ff228509c5a129c93cdf9e47192643
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Mar 16 02:02:03 2022 -0700

    Remove superfluous backslashes.

commit bcb6e759a445c01f9bf5c0cfe53a8f3816311eae
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Mar 16 02:01:33 2022 -0700

    Removed the `AMconfig()` function.
    Implemented the `AMgetActor()` function.
    Added the `AMgetActorHex()` function.
    Added the `AMsetActor()` function.
    Added the `AMsetActorHex()` function.

commit 9b2c566b9efb934cef99622736725abf5779b6af
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Mar 16 01:50:31 2022 -0700

    Added the "hex" and "smol_str" crate dependencies
    to the C API.

commit 99e06e1f730283e9009d7ad5a3f77828b786df6a
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Mar 16 01:06:15 2022 -0700

    Corrected a spelling error.

commit 629b19c71dcaf0373afeec6f629c8e836db81529
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 13 20:30:54 2022 -0700

    Align backslashes.

commit 09d25a32b716fb10728c67d35f5eeec480a6ce7c
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 13 20:30:23 2022 -0700

    Add EOF linefeed.

commit 4ed14ee7481d45f9dbedf08f16f435e5608e49d1
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 13 20:05:30 2022 -0700

    Fix "fmt" CI job violations.

commit f53b40625dc724726bfb739a64cc6913fea8ed99
Merge: 7d5538d8 e1f8d769
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 13 16:34:11 2022 -0700

    Merge branch 'c_api_exp' of https://github.com/automerge/automerge-rs into c_api_exp

commit 7d5538d8a42b79485348fbbf0b40c6f0dadaa59b
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 13 16:31:22 2022 -0700

    Updated the C API's unit test suite.

commit 335cd1c85f099c431843bc930dafde1bb1174eaf
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 13 16:27:39 2022 -0700

    Removed superfluous `AMobj` traits.

commit 420f8cab64c4614e7fb5c9cfce5cfc59cf7039cb
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 13 16:25:48 2022 -0700

    Moved the `AMobj` struct into the `result` module.
    Changed the `AMobj` struct into an enum.
    Added the `AMbyteSpan` struct.
    Added the `AMvalue` enum.
    Added the `AMresult::Nothing` variant.

commit 4eca88ff01bcf70ee3002775a8b5faa71bca29f5
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 13 15:56:06 2022 -0700

    Normalized all type name prefixes to "AM".
    Reduced the `AMstatus` enum's `<type>Ok` tags to a single `Ok` tag.
    Removed the `to_obj` macro.
    Added the `to_obj_id` macro.
    Moved the `AMobj` struct into the `result` module.
    Added the `AMresult::Nothing` variant.
    Added the `AMresultSize` function.
    Added the `AMresultValue` function.
    Added the `AMlistGet` function.
    Added the `AMmapGet` function.
    Removed the `AMgetObj` function.
    Added the `AMobjSize` function.

commit 2f94c6fd906bf31a30a1db578334c2d1a41e16c0
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 13 15:29:02 2022 -0700

    Compensate for unconfigurable cbindgen behavior.
    Prevent Doxygen documentation regeneration.

commit 5de00b799868339c3fd0f5f1d2c984980989714d
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 13 15:24:45 2022 -0700

    Alphabetized the cbindgen settings.

commit e1f8d769f44b48cdeb03855ac9e2b223fb229187
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 10 08:53:07 2022 -0500

    update authors

commit 3e5525f1a6541664e5e30ad179b2f217ba7b7422
Merge: f4ba1770 1c21abc5
Author: Orion Henry <orionz@users.noreply.github.com>
Date:   Wed Mar 9 14:36:29 2022 -0500

    Merge pull request automerge#304 from jkankiewicz/c_api_exp

    Fix "fmt" workflow step violations

commit 1c21abc5a37941ce189ff48d994c1ce3dda4827f
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Mar 9 11:13:01 2022 -0800

    Fix CMake and Rust code formatting issues.

commit f4ba1770a96c5200ae124706dffbab327a628c23
Merge: bf1ae609 f41b30d1
Author: Orion Henry <orionz@users.noreply.github.com>
Date:   Wed Mar 9 12:05:58 2022 -0500

    Merge pull request automerge#300 from jkankiewicz/c_api_exp

    Add unit test suites for the `AMlistSet*` and `AMmapSet*` functions

commit f41b30d118ef60965239a02afddbbfb14dc4392f
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 22:08:36 2022 -0800

    Added a brief description of the `AmObjType` enum.
    Added the `AmStatus` enum to the enum docs page.

commit af7386a482d2cb9cee2d188ef443498ddab40ddb
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 21:50:52 2022 -0800

    Added a unit test suite for the  `AMlistSet*`
    functions.

commit 1eb70c6eee846b912806d058a43c6e04a9184a62
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 21:42:42 2022 -0800

    Added the rest of the `AMlistSet*` functions.
    Started the enum tags at `1` so they won't be
    inherently false.
    Alphabetized enum tags for the docs.
    Improved the docs.

commit 6489cba13b49656aa0704d329a90c6e7e4a809e1
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 18:01:46 2022 -0800

    Alphabetize functions in the docs.

commit 74c245b82d49971094d731ef4442b9af14e53c15
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 07:54:25 2022 -0800

    Fix a typo in `AMmapSetObject()`'s documentation.

commit b2a879ba4e23c884f2bf43d77e950c1ad8a34c7e
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 06:24:22 2022 -0800

    Append missing EOF linefeed.

commit fbf0f29b66ad9109081490754872d149d5575ac6
Merge: c56d54b5 bf1ae609
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 01:08:12 2022 -0800

    Merge branch 'c_api_exp' of https://github.com/automerge/automerge-rs into c_api_exp

commit c56d54b565451c0fe65e86b658e094178579fd25
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 01:07:11 2022 -0800

    Added unit test cases for the new `AMmapSet*`
    functions by @orionz.
    Moved the unit test cases for the `AMmapSet*` functions into their own
    unit test suite.

commit 7e59b5576034bc0404fe793758088fea2eae6330
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Tue Mar 8 01:01:47 2022 -0800

    Edited the Doxygen documentation.

commit bf1ae6091318d005c49407e10a20f4822e41adc1
Author: Orion Henry <orion.henry@gmail.com>
Date:   Mon Mar 7 11:59:22 2022 -0500

    fmt

commit e82a7cc78e166cc05e90138df040cdcdb4d83c13
Merge: a44e69d2 965c2d56
Author: Orion Henry <orionz@users.noreply.github.com>
Date:   Mon Mar 7 11:55:32 2022 -0500

    Merge pull request automerge#299 from jkankiewicz/c_api_exp

    Enable unit testing of the C API

commit 965c2d56c32068d3af07705aff7d0a4386393004
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Mon Mar 7 06:37:36 2022 -0800

    Enable unit testing of the C API.

commit a44e69d2c72ff3e712c1109e3cf2f0d00f2af0c0
Author: Orion Henry <orion.henry@gmail.com>
Date:   Sun Mar 6 14:00:46 2022 -0500

    remove datatype mapset

commit 88153c44e767b47fa1bb0bdd0d4bc5d43f2b6a7a
Merge: 41512e9c c6194e97
Author: Orion Henry <orionz@users.noreply.github.com>
Date:   Sun Mar 6 10:32:39 2022 -0500

    Merge pull request automerge#298 from jkankiewicz/rebase_c_api_exp

    Rebase the "c_api_exp" branch on the "experiment" branch

commit c6194e973235ac43bcdf97b19b0274653b2e6b99
Merge: a2d745c8 41512e9c
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 6 01:09:56 2022 -0800

    Merge branch 'c_api_exp' into rebase_c_api_exp

commit a2d745c8d9c649d444339dc5e1df733af0a5bfec
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Sun Mar 6 00:44:37 2022 -0800

    Replace the `utils::import_value` function with
    the `utils::import_scalar` function.
    Exclude `# Safety` comments from the documentation.

commit 0681e28b4063988fada6d632366b471996d6d66a
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 16:04:17 2022 -0500

    support new as_ref api

commit 916e23fcc20aae9a27f17e9b98f267fac364d5bb
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:56:27 2022 -0500

    fmt

commit 71cd6a1f18796ab8f502d07d1d80784d1e3b9cd2
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:54:38 2022 -0500

    lock data at 64 bit - no c_long

commit e00bd4c20191e86b9f1bd11be2bab31e3a23fc97
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:27:55 2022 -0500

    verbose

commit 39d157c554a71e00978b1d9244e1c1cfbe7c24f3
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 14:56:23 2022 -0500

    clippy cleanup

commit 7f650fb8e0e7173c72d192c60506e46abb41f92f
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Feb 23 02:14:06 2022 -0800

    Added Doxygen documentation generation.
    Renamed `AMDatatype` to `AmDataType`.
    Reorganized the `AmDataType` tags.
    Renamed `AMfree()` to `AMdestroy()`.
    Renamed `AMclone()` to `AMdup()`.

commit b0b803eef8d07b5171b9ab736eae3e2f13d6158b
Author: Orion Henry <orion.henry@gmail.com>
Date:   Tue Feb 22 11:30:42 2022 -0500

    get simple test passing

commit cab9017ffa369365afb73c37275063a0c174b12e
Author: Orion Henry <orion.henry@gmail.com>
Date:   Wed Feb 9 15:50:44 2022 -0500

    rework to return a queriable result

commit a557e848f39d21b69d4b6c56434c1600b1cf6d94
Author: Jason Kankiewicz <you@example.com>
Date:   Mon Feb 14 14:38:00 2022 -0800

    Add a CI step to run the CMake build of the C bindings for @alexjg.

commit c8c0c72f3bfced414cc443255b6a912c56b9ecfc
Author: Jason Kankiewicz <you@example.com>
Date:   Mon Feb 14 14:09:58 2022 -0800

    Add CMake instructions for @orionz.

commit fb62c4b02a0971bf814272a58c500dd5a31e694a
Author: Jason Kankiewicz <you@example.com>
Date:   Thu Feb 10 23:28:54 2022 -0800

    Add CMake support.

commit 7bc3bb6850de84eff9ad5a66eed2363c12ad7738
Author: Jason Kankiewicz <you@example.com>
Date:   Thu Feb 10 22:49:53 2022 -0800

    Replace *intptr_t in C function signatures.

commit 60395a2db04d37d549cd9b0e5178af5f52ceb5f3
Author: Orion Henry <orion.henry@gmail.com>
Date:   Sun Feb 6 18:59:19 2022 -0500

    am_pop and am_pop_value

commit b1e88047d22c4382aa58fc3fc337eb3d8a36140a
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Feb 3 19:43:36 2022 -0500

    break the ground

commit 41512e9c78a649186646bcaa5d78632724bd8403
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 16:04:17 2022 -0500

    support new as_ref api

commit bcee6a9623c0ce1289271df180368a81d50508d6
Merge: cf98f78d 9a89db3
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:58:19 2022 -0500

    Merge remote-tracking branch 'origin/experiment' into c_api_exp

commit cf98f78dd172f214d3f417913470956ff998d9d5
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:56:27 2022 -0500

    fmt

commit 3c1f449c5c024892658b37abbc74e19b746413e2
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:54:38 2022 -0500

    lock data at 64 bit - no c_long

commit 2c2ec0b0c5d74bbe950f629a701ea1209f8ad4b6
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 15:27:55 2022 -0500

    verbose

commit b72b9c989a60ca4bbcd7c47e1e6bf89356346a2f
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Mar 3 14:56:23 2022 -0500

    clippy cleanup

commit 3ba28f91ccb5a7499a5442804ffa91001b01a3ef
Author: Jason Kankiewicz <jason.kankiewicz@gmail.com>
Date:   Wed Feb 23 02:14:06 2022 -0800

    Added Doxygen documentation generation.
    Renamed `AMDatatype` to `AmDataType`.
    Reorganized the `AmDataType` tags.
    Renamed `AMfree()` to `AMdestroy()`.
    Renamed `AMclone()` to `AMdup()`.

commit 8564e5b7531fb4e5194cf845b3d48e52a16827bd
Author: Orion Henry <orion.henry@gmail.com>
Date:   Tue Feb 22 11:30:42 2022 -0500

    get simple test passing

commit 60835e6ae7361199e03225dd33a8aa9c4614a20e
Author: Orion Henry <orion.henry@gmail.com>
Date:   Wed Feb 9 15:50:44 2022 -0500

    rework to return a queriable result

commit 89466d9e8c77b67b3526d56beb5f263aadb7fca0
Author: Jason Kankiewicz <you@example.com>
Date:   Mon Feb 14 14:38:00 2022 -0800

    Add a CI step to run the CMake build of the C bindings for @alexjg.

commit e2485bd5fda8b0e290038c579b2080faadbc5026
Author: Jason Kankiewicz <you@example.com>
Date:   Mon Feb 14 14:09:58 2022 -0800

    Add CMake instructions for @orionz.

commit b5cc7dd63dd76c816be1f23a0b91ba1f7327a32c
Author: Jason Kankiewicz <you@example.com>
Date:   Thu Feb 10 23:28:54 2022 -0800

    Add CMake support.

commit 685536f0cf9808b10af5efc9341f85acc2490fdf
Author: Jason Kankiewicz <you@example.com>
Date:   Thu Feb 10 22:49:53 2022 -0800

    Replace *intptr_t in C function signatures.

commit c1c6e7bb6615d168bcdad41f1621b17ff8ea7725
Author: Orion Henry <orion.henry@gmail.com>
Date:   Sun Feb 6 18:59:19 2022 -0500

    am_pop and am_pop_value

commit e68c8d347e5e45451b6b2193542b9f2bdaf283ce
Author: Orion Henry <orion.henry@gmail.com>
Date:   Thu Feb 3 19:43:36 2022 -0500

    break the ground
@hyemmie
Copy link

hyemmie commented Aug 21, 2023

Hello @ept . I understand that this implementation is already deprecated, but I have a question. You mentioned that the undo & redo feature is a hack. Could you clarify what specific aspects you believe are lacking? Are you referring to the limitation that users can only undo their own actions?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants