{"record":{"id":"28f1799a3e148d04","repo":"Jguer/yay","slug":"unknown-upgrade-exclusion-q","errorCode":null,"errorMessage":"unknown upgrade exclusion %q","messagePattern":"unknown upgrade exclusion %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/settings/lua/autocmd.go","lineNumber":384,"sourceCode":"\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)\n\t\tif !ok {\n\t\t\treturn result, fmt.Errorf(\"skip_menu must be a boolean\")\n\t\t}\n\n\t\tresult.SkipMenu = bool(skipMenu)\n\t}","sourceCodeStart":366,"sourceCodeEnd":402,"githubUrl":"https://github.com/Jguer/yay/blob/328f4b4939fb35f38c2f7c7ce3b8638a839bafa5/pkg/settings/lua/autocmd.go#L366-L402","documentation":"Exclude entries that are strings but not in the validExcludes set (the packages actually offered for upgrade) produce 'unknown upgrade exclusion \"<name>\"'. The library throws this because excluding a package that is not part of this upgrade round indicates a stale or incorrect hook.","triggerScenarios":"Callback returns { exclude = { 'somepkg' } } where 'somepkg' is not among the packages in the current upgrade selection passed via validExcludes.","commonSituations":"Hardcoded exclude lists that outlive the package being removed/renamed; typos in package names; excludes written for a previous upgrade still running in later ones.","solutions":["Correct the package name spelling to match the upgrade set","Remove the stale entry from the exclude list","Compute excludes dynamically from the event's package list instead of hardcoding","Ignore the hook (remove the autocmd) if exclusions are no longer relevant"],"exampleFix":"-- before\nreturn { exclude = { 'linux-lts-old' } }\n-- after\nreturn { exclude = { 'linux-lts' } }","handlingStrategy":"validation","validationCode":"-- cross-check excludes against the packages offered in the event\nfor _, name in ipairs(result.exclude or {}) do\n  local found = false\n  for _, pkg in ipairs(event.packages or {}) do if pkg == name then found = true end end\n  if not found then error('unknown exclusion: ' .. name) end\nend","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Derive excludes from the event's package list, not hardcoded names","Prune stale excludes when packages are removed/renamed","Keep a single source of truth for exclusion names in your config"],"tags":["lua","validation","upgrade","configuration"],"backgroundTag":"invalid-enum-value","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"}