Skip to content

Commit 635edca

Browse files
committed
fix: use merged spec for pack_spec.version instead of first spec
Standalone spec version/branch was being overridden when a dependency spec was processed first. Now resolve_all updates pack_spec.version.
1 parent 2218bcf commit 635edca

File tree

4 files changed

+91
-19
lines changed

4 files changed

+91
-19
lines changed

lua/zpack/import.lua

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,6 @@ local is_enabled = function(spec)
1414
return true
1515
end
1616

17-
---Normalize plugin version using priority: version > sem_version > branch > tag > commit
18-
---@param spec zpack.Spec
19-
---@return string|vim.VersionRange|nil version
20-
local normalize_version = function(spec)
21-
if spec.version ~= nil then
22-
return spec.version
23-
elseif spec.sem_version then
24-
return vim.version.range(spec.sem_version)
25-
elseif spec.branch then
26-
return spec.branch
27-
elseif spec.tag then
28-
return spec.tag
29-
elseif spec.commit then
30-
return spec.commit
31-
end
32-
return nil
33-
end
3417

3518
---Normalize plugin source using priority: [1] > src > url > dir
3619
---@param spec zpack.Spec
@@ -186,7 +169,7 @@ M.import_specs = function(spec_item_or_list, ctx)
186169
table.insert(state.spec_registry[src].specs, spec)
187170
else
188171
state.spec_registry[src] = { specs = { spec }, load_status = "pending" }
189-
local pack_spec = { src = src, version = normalize_version(spec), name = spec.name }
172+
local pack_spec = { src = src, version = utils.normalize_version(spec), name = spec.name }
190173
table.insert(ctx.vim_packs, pack_spec)
191174
state.src_to_pack_spec[src] = pack_spec
192175
end

lua/zpack/merge.lua

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,13 +231,20 @@ function M.resolve_opts(specs, plugin)
231231
end
232232

233233
---Pre-compute merged_spec for all entries in the registry
234+
---Also updates pack_spec.version based on merged specs
234235
function M.resolve_all()
235236
local state = require('zpack.state')
237+
local utils = require('zpack.utils')
236238

237-
for _, entry in pairs(state.spec_registry) do
239+
for src, entry in pairs(state.spec_registry) do
238240
if entry.specs and #entry.specs > 0 then
239241
entry.sorted_specs = M.sort_specs(entry.specs)
240242
entry.merged_spec = M.merge_spec_array(entry.sorted_specs)
243+
244+
local pack_spec = state.src_to_pack_spec[src]
245+
if pack_spec then
246+
pack_spec.version = utils.normalize_version(entry.merged_spec)
247+
end
241248
end
242249
end
243250
end

lua/zpack/utils.lua

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,24 @@ M.normalize_name = function(name)
161161
return name:lower():gsub("^n?vim%-", ""):gsub("%.n?vim$", ""):gsub("[%.%-]lua", ""):gsub("[^a-z]+", "")
162162
end
163163

164+
---Normalize plugin version using priority: version > sem_version > branch > tag > commit
165+
---@param spec zpack.Spec
166+
---@return string|vim.VersionRange|nil version
167+
M.normalize_version = function(spec)
168+
if spec.version ~= nil then
169+
return spec.version
170+
elseif spec.sem_version then
171+
return vim.version.range(spec.sem_version)
172+
elseif spec.branch then
173+
return spec.branch
174+
elseif spec.tag then
175+
return spec.tag
176+
elseif spec.commit then
177+
return spec.commit
178+
end
179+
return nil
180+
end
181+
164182
---Resolve the main module for a plugin (for auto-setup)
165183
---Inspired by lazy.nvim's loader.get_main()
166184
---Results are cached in plugin.main (for found modules) and state.resolve_main_not_found (for not-found)

tests/merge_test.lua

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,70 @@ return function()
184184

185185
helpers.cleanup_test_env()
186186
end)
187+
188+
helpers.test("standalone branch is not overridden by nil dependency branch", function()
189+
helpers.setup_test_env()
190+
191+
require('zpack').setup({
192+
spec = {
193+
{
194+
'test/parent',
195+
dependencies = {
196+
'test/dep',
197+
},
198+
},
199+
{
200+
'test/dep',
201+
branch = 'main',
202+
},
203+
},
204+
defaults = { confirm = false },
205+
})
206+
207+
helpers.flush_pending()
208+
local state = require('zpack.state')
209+
local src = 'https://github.com/test/dep'
210+
211+
local merged_spec = state.spec_registry[src].merged_spec
212+
helpers.assert_equal(merged_spec.branch, 'main', "standalone branch should be preserved")
213+
214+
local pack_spec = state.src_to_pack_spec[src]
215+
helpers.assert_equal(pack_spec.version, 'main', "pack_spec.version should use merged branch")
216+
217+
helpers.cleanup_test_env()
218+
end)
219+
220+
helpers.test("dependency branch is used when standalone has no branch", function()
221+
helpers.setup_test_env()
222+
223+
require('zpack').setup({
224+
spec = {
225+
{
226+
'test/parent',
227+
dependencies = {
228+
{ 'test/dep', branch = 'develop' },
229+
},
230+
},
231+
{
232+
'test/dep',
233+
config = function() end,
234+
},
235+
},
236+
defaults = { confirm = false },
237+
})
238+
239+
helpers.flush_pending()
240+
local state = require('zpack.state')
241+
local src = 'https://github.com/test/dep'
242+
243+
local merged_spec = state.spec_registry[src].merged_spec
244+
helpers.assert_equal(merged_spec.branch, 'develop', "dependency branch should be used when standalone has none")
245+
246+
local pack_spec = state.src_to_pack_spec[src]
247+
helpers.assert_equal(pack_spec.version, 'develop', "pack_spec.version should use dependency branch")
248+
249+
helpers.cleanup_test_env()
250+
end)
187251
end)
188252

189253
helpers.describe("Merge Module Unit Tests", function()

0 commit comments

Comments
 (0)