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

postのbufferを保存する際にリモート側の差分も取り込む #13

Open
2 of 4 tasks
kyoh86 opened this issue Apr 15, 2024 · 7 comments
Open
2 of 4 tasks
Assignees

Comments

@kyoh86
Copy link
Owner

kyoh86 commented Apr 15, 2024

  • diff & patchを呼ぶ形で実装
  • rhysd/conflict-marker.vimにdoc充実のPRを出す
    • mapのが何定義されてるかとかも書かれてないので辛い
  • jsdiff のmerge.jsを手直しする
  • jsdiffを使った実装(diff/patchに依存しない形)に直す
@kyoh86 kyoh86 self-assigned this Apr 15, 2024
kyoh86 added a commit that referenced this issue May 14, 2024
kyoh86 added a commit that referenced this issue May 14, 2024
@kyoh86

This comment was marked as outdated.

@kyoh86
Copy link
Owner Author

kyoh86 commented May 14, 2024

そしてそれはトランザクションなしには(徹底的には)やれない。

@kyoh86
Copy link
Owner Author

kyoh86 commented May 14, 2024

警告するだけだともったいないというか面倒くさいので、こうしたい。

  • 加工する前のデータ(A)を取っておく
  • 保存する前に今のバッファの内容(B)との差分(B-A)を取る
  • リモートの最新データ(C)を取る
  • Cに差分(B-A)を適用してバッファに反映する

差分を適用しようとしたときに、もしコンフリクトが起きたらgitのmergeがそうするように、その部分にマーカーを挿入したものをバッファに適用する。

<<<<<<<
our
=======
their
>>>>>>>

こうだよね。

これがあれば rhysd/conflict-marker.vim でGitと同じようにコンフリクトとシンプルに戦えるから良いと思う。

@kyoh86
Copy link
Owner Author

kyoh86 commented May 14, 2024

仕様まとめ

  • Vimプラグイン
  • Denops製
  • buftype=acwriteを使って、リモートにマスタのある文書を取得・編集・保存できる
  • 取得~編集~保存の間にリモートのマスタデータを誰か第三者がいじるかもしれない
  • いじった結果をVimに取得していたデータ(編集後)でうっかり上書きすることを防ぎたい

防ぐためにはどうするか

  • 加工する前のデータ(A)を取っておく
  • 保存する前に今のバッファの内容(B)との差分(B-A)を取る
  • リモートの最新データ(C)を取る
  • Cに差分(B-A)を適用してバッファに反映する

差分を適用しようとしたときに、もしコンフリクトが起きたらgitのmergeがそうするように、その部分にマーカーを挿入したものをバッファに適用する。

<<<<<<<
our
=======
their
>>>>>>>

こうだよね。

これがあれば rhysd/conflict-marker.vim でGitと同じようにコンフリクトとシンプルに戦えるから良いと思う。

あと、そもそも編集が行われてないんだったらこういう保存周りの処理を一切呼ばないようにしたい。コストの無駄なので。

@kyoh86
Copy link
Owner Author

kyoh86 commented May 15, 2024

diffは下手に頑張らず、外部コマンドに頼った方がよさそう。
diff a.txt b.txt | patch --merge c.txt
--mergeが肝

--merge  Merge using conflict markers instead of creating reject files.

@kyoh86
Copy link
Owner Author

kyoh86 commented May 15, 2024

diff の --from-file --to-file 使えば、どちらか片方はSTDINに任せられる

@kyoh86 kyoh86 changed the title postのbufferにはbufhiddenのオプションを指定して、hideできないようにするべきかもしれない postのbufferを保存する際にリモート側の差分も取り込む May 15, 2024
@kyoh86
Copy link
Owner Author

kyoh86 commented May 15, 2024

jsdiffの話

kpdecker/jsdiff#307
もろにマージ欲しいと書いてる人がいる。
exportはされてるけどREADMEに書かれてない、しかも変更がめちゃくちゃ古い。
https://github.com/kpdecker/jsdiff/blob/master/src/patch/merge.js

kpdecker/jsdiff#181
ここで欲されて実装されたけどパブリックにならないまま放置されてる

kpdecker/jsdiff#341
今分かってるバグはこれ。

@kyoh86 kyoh86 mentioned this issue Jun 11, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Development

No branches or pull requests

1 participant