みなさんこんにちは、きみのぶです。 昨日つぶやいたこれ。
追加とか削除を考えずとも、良い矛盾のない二つの編集があった場合は自動マージしてもいいんじゃないかという気がしてきた。
— vorotamoroz aka きみのぶ (@vorotamoroz) December 15, 2022
実装して半日使ってみたところ良い感じに動いたので公開しました。
まぁ、追加とか削除を考えないと「矛盾のない二つの編集」の確度が低すぎて結局考えたのですが。
Self-hosted LiveSyncはコンフリクトの検出をCouchDB、PouchDBに頼っているのですが、今までは衝突したら必ず自分でコンフリクトの解消をする必要がありました。これ、そこそこ面倒ですよね。できないよりははるかに良いのですが。 特に、両方の端末でチェックを付けたものをConcat bothすると酷いことになるので、モバイルではPeriodic Sync派の僕としては非常にストレスがあったのです。
今回はこれを良い感じにしました。
例えば、下記のようなチェックボックスがあるノートあった場合。
- [ ] a
- [x] b
- [ ] c
- [x] d
端末Aでaにチェックをつけて……
- [x] a
- [x] b
- [ ] c
- [x] d
端末Bでdからチェックを外す変更があった場合。こんなんですね。
- [ ] a
- [x] b
- [ ] c
- [ ] d
今まではグチャグチャになってましたが、0.17.2以降は自動的にこんな風にマージされます。
- [x] a
- [x] b
- [ ] c
- [ ] d
さて、この「良い感じマージ」ですが、一応解説をすると下記のような仕様になっています。
- 共通の元リビジョンを探して、それぞれの変更を行ごとに検出。
- 何もしてない行はもちろんそのまま
- 挿入された行はそのまま挿入される。この順序は衝突しているノートの編集時刻順
- 両方から削除された行もそのまま
- 修正(削除→挿入)された行は、挿入された行が同じであればその通りに。それぞれ違う行に修正されていた場合はマージを諦めて元のロジックに
という感じ。
このおかげで、雑にチェックをつけたり消したりしても、それなりにマージしてくれるようになりました。 Liveでもそこそこマージするので、まぁ多分大丈夫じゃないかなって思ってます。
また、昔からあったバグですが、コンフリクトしたらとりあえず受信した内容をストレージに書き込むというデカ目の不具合も直したり。
あまりにも便利なので、両方ともデフォルトで有効にしていますが、どちらも昔の挙動に戻すオプションがあるので問題があったらとりあえず元に戻すオプションをONにして教えてください。
スマホから書いたら少し乱筆気味ですが、ひとまず。
2022/12/16 20分