aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaehwang Jung <tomtomjhj@gmail.com>2023-03-11 16:52:46 +0900
committerJaehwang Jung <tomtomjhj@gmail.com>2023-03-11 18:22:00 +0900
commit2748202e0eb28574cdc65dcb758adea89023271d (patch)
tree3e9a5a834bf280b3ecc1d29c56557c6f3f4a17d4
parent236c20795eb9f11e21e0719b735ea741711acc08 (diff)
downloadrneovim-2748202e0eb28574cdc65dcb758adea89023271d.tar.gz
rneovim-2748202e0eb28574cdc65dcb758adea89023271d.tar.bz2
rneovim-2748202e0eb28574cdc65dcb758adea89023271d.zip
fix(diff): trigger on_bytes only once after diffget/diffput
Problem: The fix from b50ee4a8dc4306e4be78ac33fb74b21dc6be5538 may adjust extmark twice, triggering on_bytes callback twice. Solution: Don't let mark_adjust adjust extmark.
-rw-r--r--src/nvim/diff.c2
-rw-r--r--test/functional/lua/buffer_updates_spec.lua19
2 files changed, 20 insertions, 1 deletions
diff --git a/src/nvim/diff.c b/src/nvim/diff.c
index 289939b2ca..52c5732f23 100644
--- a/src/nvim/diff.c
+++ b/src/nvim/diff.c
@@ -3136,7 +3136,7 @@ static void diffgetput(const int addr_count, const int idx_cur, const int idx_fr
if (added != 0) {
// Adjust marks. This will change the following entries!
- mark_adjust(lnum, lnum + count - 1, (long)MAXLNUM, added, kExtmarkUndo);
+ mark_adjust(lnum, lnum + count - 1, (long)MAXLNUM, added, kExtmarkNOOP);
if (curwin->w_cursor.lnum >= lnum) {
// Adjust the cursor position if it's in/after the changed
// lines.
diff --git a/test/functional/lua/buffer_updates_spec.lua b/test/functional/lua/buffer_updates_spec.lua
index b1b39501f7..2cd3123dcd 100644
--- a/test/functional/lua/buffer_updates_spec.lua
+++ b/test/functional/lua/buffer_updates_spec.lua
@@ -1171,6 +1171,25 @@ describe('lua: nvim_buf_attach on_bytes', function()
}
end)
+ it('works with :diffput and :diffget', function()
+ local check_events = setup_eventcheck(verify, {"AAA"})
+ command('diffthis')
+ command('new')
+ command('diffthis')
+ meths.buf_set_lines(0, 0, -1, true, {"AAA", "BBB"})
+ feed('G')
+ command('diffput')
+ check_events {
+ { "test1", "bytes", 1, 3, 1, 0, 4, 0, 0, 0, 1, 0, 4 };
+ }
+ meths.buf_set_lines(0, 0, -1, true, {"AAA", "CCC"})
+ feed('<C-w>pG')
+ command('diffget')
+ check_events {
+ { "test1", "bytes", 1, 4, 1, 0, 4, 1, 0, 4, 1, 0, 4 };
+ }
+ end)
+
local function test_lockmarks(mode)
local description = (mode ~= "") and mode or "(baseline)"
it("test_lockmarks " .. description .. " %delete _", function()