Skip to content

Commit 2a10172

Browse files
feat(dev): Add persist option to load_file method
1 parent 1692af5 commit 2a10172

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

lua/orgmode/files/init.lua

+26-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ local Listitem = require('orgmode.files.elements.listitem')
88
---@class OrgFilesOpts
99
---@field paths string | string[]
1010

11+
---@class OrgLoadFileOpts
12+
---@field persist boolean Persist the file in the list of loaded files if it belongs to path
13+
1114
---@class OrgFiles
1215
---@field paths string[]
1316
---@field files table<string, OrgFile> table with files that are part of paths
@@ -52,6 +55,7 @@ function OrgFiles:load(force)
5255
end)
5356
end
5457

58+
---@deprecated Use `load_file` with `persist` option instead
5559
---@param filename string
5660
---@return OrgPromise<OrgFile | false>
5761
function OrgFiles:add_to_paths(filename)
@@ -153,25 +157,44 @@ function OrgFiles:filenames()
153157
end, self:all())
154158
end
155159

160+
---@param filename string
161+
---@param opts? OrgLoadFileOpts
156162
---@return OrgPromise<OrgFile | false>
157-
function OrgFiles:load_file(filename)
163+
function OrgFiles:load_file(filename, opts)
164+
opts = opts or {}
158165
filename = vim.fn.resolve(vim.fn.fnamemodify(filename, ':p'))
166+
167+
local persist_if_required = function(file)
168+
---@cast file OrgFile
169+
if self.files[filename] or not opts.persist then
170+
return
171+
end
172+
local all_paths = self:_files()
173+
if vim.tbl_contains(all_paths, filename) then
174+
self.files[filename] = file
175+
end
176+
end
177+
159178
local file = self.all_files[filename]
160179
if file then
180+
persist_if_required(file)
161181
return file:reload()
162182
end
163183

164184
return OrgFile.load(filename):next(function(orgfile)
165185
if orgfile then
186+
persist_if_required(file)
166187
self.all_files[filename] = orgfile
167188
end
168189
return orgfile
169190
end)
170191
end
171192

193+
---@param filename string
194+
---@param opts? OrgLoadFileOpts
172195
---@return OrgFile | false
173-
function OrgFiles:load_file_sync(filename, timeout)
174-
return self:load_file(filename):wait(timeout)
196+
function OrgFiles:load_file_sync(filename, opts, timeout)
197+
return self:load_file(filename, opts):wait(timeout)
175198
end
176199

177200
---@param filename string

tests/plenary/init_spec.lua

+22-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
local orgmode = require('orgmode')
2-
local Date = require('orgmode.objects.date')
32

43
describe('Init', function()
54
local org = orgmode.setup({
@@ -37,6 +36,28 @@ describe('Init', function()
3736
assert.are.same({ 'NESTED', 'OFFICE', 'PRIVATE', 'PROJECT', 'WORK' }, org.files:get_tags())
3837
end)
3938

39+
it('should load file and persist to files if it belongs to path', function()
40+
local fname = vim.fn.resolve(vim.fn.tempname() .. '.org')
41+
vim.fn.writefile({ '* Appended' }, fname)
42+
43+
assert.is.Nil(org.files.files[fname])
44+
assert.are.same({}, org.files:find_headlines_by_title('Appended'))
45+
assert.are.same({ vim.fn.getcwd() .. '/tests/plenary/fixtures/*' }, org.files.paths)
46+
47+
-- Not added because it does not belong to defined path
48+
org.files:load_file_sync(fname, { persist = true })
49+
assert.is.Nil(org.files.files[fname])
50+
51+
org.files.files[todo_file] = nil
52+
53+
org.files:load_file_sync(todo_file)
54+
-- Not added because persist was not provided
55+
assert.is.Nil(org.files.files[fname])
56+
57+
org.files:load_file_sync(todo_file, { persist = true })
58+
assert.is.Not.Nil(org.files.files[todo_file])
59+
end)
60+
4061
it('should append files to paths', function()
4162
local fname = vim.fn.resolve(vim.fn.tempname() .. '.org')
4263
vim.fn.writefile({ '* Appended' }, fname)

0 commit comments

Comments
 (0)