Two failures that compounded in the last round of ElvUI breakage:
1. The sweep script only lived in /tmp during a session — re-derived
from scratch each time, so the EXCLUDE_FORKS knowledge wasn't
anywhere reviewable.
2. The old filename-only filter ('if -ElvUI in name skip') missed
ElvUI's customizations inside otherwise-stock-named files AND
rsync --delete killed -ElvUI suffixed widgets that exist only in
ElvUI's bundle (e.g. AceGUIWidget-Button-ElvUI.lua).
This tool fixes both:
- Lives in the repo (tools/sweep.py), so the exclusion list is
visible in version control and reviewable.
- EXCLUDED_FORKS = {'coa-elvui'} hardcoded with an in-source comment
explaining why.
- --exclude='*-ElvUI*' passed to every rsync as belt-and-braces, so
even if a future fork accidentally carries an ElvUI-namespaced
file we never wanted to overwrite, the sweep won't touch it.
- Refuses to add new lib dirs — only updates ones already present
in the fork.
- --dry-run flag for safe verification.
README updated with a 'Forks excluded from sweep' section documenting
the same.
coa-ace3
Canonical Ace3 bundle for the CoA Guild 'Exiles' addon forks.
Lifted from upstream WoWUIDev/Ace3 at commit
52e5f2c
(2026-05-17), with a small stack of CoA-compat patches on top (see below). Every fork in the Exiles
org should converge on this bundle so the runtime LibStub resolution is predictable and addons
can't quietly regress when one of them is disabled.
CoA-compat patches on top of upstream
| # | Issue | Fix |
|---|---|---|
| 1 | Upstream Ace3 calls Texture:Set*Texture(<FileDataID>) with numeric FileDataIDs in 42 places across AceGUI-3.0/widgets/* and AceConfigDialog-3.0. FileDataIDs are a retail-only API (post WoD/Legion). On the WoW 3.3.5-based CoA client, SetTexture only accepts string paths — passing a number silently fails and the engine renders a red placeholder. Symptom: solid-red squares where color swatches / checkboxes / window chrome should be. |
Each FDID call was substituted with the string path that already lived in the trailing comment, e.g. colorSwatch:SetTexture(130939) → colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch"). |
| 2 | AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua Constructor parents its frame to the global InterfaceOptionsFramePanelContainer. On the CoA reworked FrameXML that global is nil at AceGUI widget-construction time, and CreateFrame("Frame", nil, nil) is fine, but downstream code that calls :SetPoint against the parent / :Show it via the options tree relies on a real parent. Symptom: every addon that registers a Blizzard Interface Options panel via AceConfigDialog errors during load. |
Guard at line 102: local _parent = InterfaceOptionsFramePanelContainer or UIParent and pass _parent to CreateFrame. Widget behaviour is unchanged on retail; on CoA the panel parents to UIParent so the rest of the widget works. |
| 3 | AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua :AddToBlizOptions uses the Dragonflight+ Settings.* API (Settings.GetCategory, Settings.RegisterCanvasLayoutCategory, Settings.RegisterCanvasLayoutSubcategory, Settings.RegisterAddOnCategory). The Settings table doesn't exist on the 3.3.5-based CoA client, so every AceConfig-driven options panel errors out the moment it's registered. |
Wrap the whole Settings.* block in if Settings and Settings.GetCategory then … else … end. The else branch falls back to the WotLK-era InterfaceOptions_AddCategory(group.frame) after stamping the category name via group:SetName(name or appName, parent). |
| 4 | AceDB-3.0/AceDB-3.0.lua:114 — the simple-value __index metatable for defaults is function(t,k2) return k2~=nil and v or nil end. Whenever the default value v is itself falsy (false, 0, ""), the and short-circuits and the or nil resolves to nil, so ["*"] = false and similar falsy defaults are silently lost when read. |
Replaces the one-liner with an explicit if k2 == nil then return nil end; return v so falsy defaults round-trip correctly. Backport of WoWUIDev/Ace3 PR #10 (open since 2023-11-04, not merged upstream). Drop this patch if/when upstream merges. |
Versions
| Library | MINOR |
|---|---|
| LibStub | 2 |
| CallbackHandler-1.0 | 8 |
| AceAddon-3.0 | 13 |
| AceEvent-3.0 | 4 |
| AceTimer-3.0 | 17 |
| AceHook-3.0 | 9 |
| AceDB-3.0 | 33 |
| AceDBOptions-3.0 | 15 |
| AceConfig-3.0 | 3 |
| AceConfigRegistry-3.0 | 22 |
| AceConfigCmd-3.0 | 14 |
| AceConfigDialog-3.0 | 92 |
| AceGUI-3.0 | 41 |
| AceLocale-3.0 | 6 |
| AceConsole-3.0 | 7 |
| AceComm-3.0 | 14 |
| AceSerializer-3.0 | 5 |
| AceBucket-3.0 | 4 |
| AceTab-3.0 | 3 |
AceTimer-3.0 calls C_Timer.After at load — confirmed available on the CoA Beta client.
How to consume
Option 1: source bundle (preferred for forks)
Each Exiles/coa-* fork should rsync the libs it embeds from this bundle, so the diff is uniform:
rsync -a /path/to/coa-ace3/AceAddon-3.0/ /path/to/coa-foo/Libs/AceAddon-3.0/
Or replace the entire Libs/Ace3/ tree in one go.
Option 2: standalone addon
Drop the contents (except README.md / .gitattributes) into
Interface/AddOns/Ace3/ and the loadable Ace3.toc will register every library at top
priority via LibStub. Useful for non-bundling forks (chatter, sexymap, clique, …) to
get Ace without each one carrying its own copy.
Sync policy
Bumping upstream means a single commit here, then a sweep across every fork that embeds these
libs. Note the new upstream commit in the README's commit-pin line above, and re-apply
the CoA-compat patches listed above against the new revision (the FDID one is mechanical —
see /tmp/fix_fdid.py history). Keep patches minimal and documented in this README;
prefer fixing them upstream where reasonable.
Run the sweep via tools/sweep.py from this repo — it walks every sibling coa-* fork
under /home/sub/repos/coa, finds each fork's bundled LibStub / CallbackHandler-1.0 /
Ace*-3.0 dirs, and rsyncs them from this bundle. Use --dry-run first.
Forks excluded from sweep
coa-elvui is excluded from the sweep — see EXCLUDED_FORKS in tools/sweep.py. ElvUI
ships its own bundled Ace3 stack with ElvUI-specific patches inside otherwise-stock-named
files (AceLocale-3.0.lua, AceConfigDialog-3.0.lua, every AceGUI-3.0/widgets/*.lua)
plus -ElvUI-suffixed widgets that don't exist in canonical at all (e.g.
AceGUIWidget-Button-ElvUI.lua). rsync --delete obliterates the latter; an in-place
sync overwrites the former. Either failure breaks /ec and floods locale errors. ElvUI
maintains its own bundle on its own cadence and must never be touched by this tool.
The sweep also passes --exclude='*-ElvUI*' to every rsync as a belt-and-braces guard
against future forks that happen to carry an ElvUI-namespaced file we didn't anticipate.