| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Restore upstream MO2's exact key cases (gameName, installationFile,
nexusDescription, etc.) in readMeta/saveMeta/doInstall/createMod —
matches mod-shipped meta.ini cases, so on Linux Qt6's case-sensitive
QSettings IniFormat, setValue updates in place without producing a
duplicate key.
normalizeMetaIniCase() repurposed: instead of folding everything to
lowercase (which mismatched the upstream-style setValue calls and
caused the very dupes it was trying to fix), it now canonicalizes
known per-mod meta.ini keys to their upstream CamelCase, deduping
case-insensitive collisions per section. Cleans up dirty files
written during the 5d1fb29 -> 1f19892 window so they collapse to a
single canonical key per setting on first read.
Tests updated to assert canonical-CamelCase output.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
|
|
meta.ini: Qt6 QSettings IniFormat is case-sensitive on Linux. Pre-existing
CamelCase keys + lowercase setValue() left both casings in the file, so
mods grew duplicate entries on every install. Added MetaIniUtils::
normalizeMetaIniCase() to fold keys to lowercase and dedupe per-section
(keeping non-empty values) before any QSettings open in readMeta,
saveMeta, doInstall, and createMod.
SKSE Log Redirector: deployExternalMappings created per-file symlinks
under the redirected destination, so any new log file the game wrote
post-deploy ended up as a real file outside the mapping. For
isDirectory && createTarget mappings, now publish a single directory
symlink dst -> src when the destination is missing, an existing symlink,
or empty. Falls back to per-file symlinks when dst already has real
content (preserves user data). Cleanup removes the symlink, leaving no
files behind.
Tests under src/tests/ (gtest, opt-in via BUILD_TESTING):
- test_metainiutils: 6 tests covering no-op cases, case-only dedup,
multi-line continuations, per-section scoping, and end-to-end
verification that QSettings duplication is fixed.
- test_external_dir_mapping: 6 tests covering directory symlink deploy,
flow-through writes, idempotency, empty-dir replacement, real-file
fallback, and cleanup.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|