diff options
author | Raphael <glephunter@gmail.com> | 2023-10-29 15:44:52 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-29 15:44:52 +0800 |
commit | 0da27e9bdec14acf82731c4d5e0ad7d673697af7 (patch) | |
tree | ae702350cb6180f053d6d1d2d2d84e7bd6b59073 | |
parent | 82b1a389ba98f5f8e8d6c9d7485386be272a22df (diff) | |
download | rneovim-0da27e9bdec14acf82731c4d5e0ad7d673697af7.tar.gz rneovim-0da27e9bdec14acf82731c4d5e0ad7d673697af7.tar.bz2 rneovim-0da27e9bdec14acf82731c4d5e0ad7d673697af7.zip |
fix(api): load buffer first on nvim_buf_set_lines (#25823)
Fix #22670
Fix #8659
-rw-r--r-- | src/nvim/api/buffer.c | 24 | ||||
-rw-r--r-- | test/functional/api/buffer_spec.lua | 15 |
2 files changed, 31 insertions, 8 deletions
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index 64dddea5b8..86298efe08 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -359,6 +359,14 @@ void nvim_buf_set_lines(uint64_t channel_id, Buffer buffer, Integer start, Integ return; } + // loaded buffer first if it's not loaded + if (buf->b_ml.ml_mfp == NULL) { + if (!buf_ensure_loaded(buf)) { + api_set_error(err, kErrorTypeException, "Failed to load buffer"); + return; + } + } + bool oob = false; start = normalize_index(buf, start, true, &oob); end = normalize_index(buf, end, true, &oob); @@ -396,10 +404,6 @@ void nvim_buf_set_lines(uint64_t channel_id, Buffer buffer, Integer start, Integ goto end; } - if (!buf_ensure_loaded(buf)) { - goto end; - } - if (u_save_buf(buf, (linenr_T)(start - 1), (linenr_T)end) == FAIL) { api_set_error(err, kErrorTypeException, "Failed to save undo information"); goto end; @@ -537,6 +541,14 @@ void nvim_buf_set_text(uint64_t channel_id, Buffer buffer, Integer start_row, In return; } + // loaded buffer first if it's not loaded + if (buf->b_ml.ml_mfp == NULL) { + if (!buf_ensure_loaded(buf)) { + api_set_error(err, kErrorTypeException, "Failed to load buffer"); + return; + } + } + bool oob = false; // check range is ordered and everything! @@ -645,10 +657,6 @@ void nvim_buf_set_text(uint64_t channel_id, Buffer buffer, Integer start_row, In goto end; } - if (!buf_ensure_loaded(buf)) { - goto end; - } - // Small note about undo states: unlike set_lines, we want to save the // undo state of one past the end_row, since end_row is inclusive. if (u_save_buf(buf, (linenr_T)start_row - 1, (linenr_T)end_row + 1) == FAIL) { diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index 9833ebee4c..6ed9aa574a 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -713,6 +713,21 @@ describe('api/buf', function() feed('<c-w>p') eq(3, funcs.winnr()) end) + + it('set_lines on unloaded buffer #8659 #22670', function() + local bufnr = curbuf('get_number') + meths.buf_set_lines(bufnr, 0, -1, false, {'a', 'b', 'c'}) + meths.buf_set_name(bufnr, 'set_lines') + finally(function() + os.remove('set_lines') + end) + command('write!') + command('new') + command('bunload! '..bufnr) + local new_bufnr = funcs.bufnr('set_lines', true) + meths.buf_set_lines(new_bufnr, 0, -1, false, {}) + eq({''}, meths.buf_get_lines(new_bufnr, 0, -1, false)) + end) end) describe('nvim_buf_set_text', function() |