{"record":{"id":"b00d00bc7631f804","repo":"Jguer/yay","slug":"exclude-entries-must-be-strings","errorCode":null,"errorMessage":"exclude entries must be strings","messagePattern":"exclude entries must be strings","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/settings/lua/autocmd.go","lineNumber":378,"sourceCode":"\tif !ok {\n\t\treturn result, fmt.Errorf(\"callback must return nil or table, got %s\", value.Type())\n\t}\n\n\tif excludeValue := tbl.RawGetString(\"exclude\"); excludeValue != glua.LNil {\n\t\texcludeTbl, ok := excludeValue.(*glua.LTable)\n\t\tif !ok {\n\t\t\treturn result, fmt.Errorf(\"exclude must be a table\")\n\t\t}\n\n\t\tvar parseErr error\n\t\texcludeTbl.ForEach(func(_ glua.LValue, val glua.LValue) {\n\t\t\tif parseErr != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlname, ok := val.(glua.LString)\n\t\t\tif !ok {\n\t\t\t\tparseErr = fmt.Errorf(\"exclude entries must be strings\")\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tname := string(lname)\n\t\t\tif !validExcludes.Contains(name) {\n\t\t\t\tparseErr = fmt.Errorf(\"unknown upgrade exclusion %q\", name)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tresult.Exclude = append(result.Exclude, name)\n\t\t})\n\t\tif parseErr != nil {\n\t\t\treturn result, parseErr\n\t\t}\n\t}\n\n\tif skipMenuValue := tbl.RawGetString(\"skip_menu\"); skipMenuValue != glua.LNil {\n\t\tskipMenu, ok := skipMenuValue.(glua.LBool)","sourceCodeStart":360,"sourceCodeEnd":396,"githubUrl":"https://github.com/Jguer/yay/blob/328f4b4939fb35f38c2f7c7ce3b8638a839bafa5/pkg/settings/lua/autocmd.go#L360-L396","documentation":"Each entry of the returned 'exclude' table must be a Lua string; a non-string value (number, boolean, nested table, nil) sets parseErr to 'exclude entries must be strings', which RunUpgradeSelect wraps as 'UpgradeSelect: <that error>'. Thrown to guarantee the exclude list can be compared against package names.","triggerScenarios":"Callback returns { exclude = { 1, true, {'linux'} } } — any ForEach iteration encountering a non-LString value.","commonSituations":"Using numeric indices values by accident ({ [1]=123 }); passing package objects/tables instead of their name fields; JSON-ish data pasted into Lua with numbers as names.","solutions":["Ensure every element is a quoted string: { 'linux', 'zfs-dkms' }","Convert numbers with tostring() if a name is numeric","Extract the name field if you have package tables: exclude = { pkg.name }","Remove nil holes that shift array contents"],"exampleFix":"-- before\nreturn { exclude = { 123 } }\n-- after\nreturn { exclude = { tostring(123) } }","handlingStrategy":"validation","validationCode":"for i, v in ipairs(result.exclude or {}) do\n  if type(v) ~= 'string' then error('exclude[' .. i .. '] must be a string') end\nend","typeGuard":"local function allStrings(t)\n  if t == nil then return true end\n  for _, v in ipairs(t) do if type(v) ~= 'string' then return false end end\n  return true\nend","tryCatchPattern":null,"preventionTips":["Quote every package name in the exclude list","Convert numeric names with tostring()","Run a pre-check loop over exclude before returning it"],"tags":["lua","validation","type-mismatch","upgrade"],"backgroundTag":"type-mismatch","analyzedSha":"328f4b4939fb35f38c2f7c7ce3b8638a839bafa5","analyzedAt":"2026-09-07T16:45:12.608Z","contentChangedAt":"2026-09-07T16:45:12.608Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}