Cockatrice/libcockatrice_settings/libcockatrice/settings
BruebachL 3aba1ef929
[Settings] Back up the settings folder before migrating (#7386)
* [Settings] Back up the settings folder before migrating

The per-file settings migration only preserved global.ini, as
global.ini.old. Everything else the migrations write was overwritten in
place with no way back: the legacy migration and the 17 per-domain
migrateXxxSettings functions all write straight into the per-domain .ini
files, so any of them that got a key mapping wrong silently replaced a
working file. The re-migration path is the sharpest case, because
migrateSettingsFromGlobalIni() runs again whenever an older build wrote
non-sentinel keys back into global.ini, and those values then land on
top of per-domain files the user had already edited.

Snapshot the whole settings folder before either migration runs, into a
timestamped sibling settings-backup-<yyyyMMdd-HHmmss>. A sibling rather
than a child, so a backup is never copied into the next backup and the
"Open Settings Folder" action keeps showing only live files. Keep every
snapshot; settings files are kilobytes, so growth is not a concern.

SettingsMigration::isMigrationPending() gates the copy so a normal start
creates nothing. It reuses the same condition migrateSettingsFromGlobalIni()
uses to decide whether it has work, factored into a shared helper so the
two cannot drift, and it ignores the legacy migration on an empty profile
where that migration only writes its sentinel. The backup itself skips a
folder whose files are all empty, which covers a fresh profile whose
global.ini was created but never written.

A failed copy logs a warning and returns an empty path rather than
aborting the migration, since a full disk or an unwritable data folder
must not leave the client unable to start. global.ini.old still works as
the single-file escape hatch.

Document the folder layout, the automatic backups, and the fact that
migrations only run forwards, so users know to copy the settings folder
before downgrading to a version that cannot read the per-group files.

* [Client] Match the desktop file name case for the portal app ID

QGuiApplication::setDesktopFileName() was given "Cockatrice"/"Oracle"
while the installed desktop entries are cockatrice.desktop and
oracle.desktop. Linux paths are case-sensitive, so xdg-desktop-portal
failed the app-info lookup for "Cockatrice" and Qt warned on every
QDesktopServices call that it could not register with the host portal.
The same string becomes the xdg-shell appId, so the window icon lookup
failed on Wayland for the same reason.

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-10-03 14:59:58 +02:00
..
appearance_settings.cpp [Themes] Add identity default palettes for the image themes (#7280) 2026-09-18 15:16:07 +02:00
appearance_settings.h [Themes] Add identity default palettes for the image themes (#7280) 2026-09-18 15:16:07 +02:00
cache_storage_settings.cpp [Settings] Shuffle some settings around (#7084) 2026-08-08 22:27:41 +02:00
cache_storage_settings.h [Settings] Split cache_settings monolith into multiple SettingsManager sub-classes (#7050) 2026-07-27 11:25:39 +02:00
card_database_settings.cpp [Settings] Shuffle some settings around (#7084) 2026-08-08 22:27:41 +02:00
card_database_settings.h [Card Database] Improve loading times through binary cache (#7051) 2026-07-27 23:12:53 +02:00
card_override_settings.cpp [SettingsManager] Make setting getters const (#6748) 2026-03-27 18:13:25 +01:00
card_override_settings.h Standardize Doxygen documentation (#6885) 2026-05-21 22:58:07 +02:00
cards_display_settings.cpp [DeckEditor] Show card counts in Visual Deck Editor banners (#7339) 2026-09-23 19:19:30 +02:00
cards_display_settings.h [DeckEditor] Show card counts in Visual Deck Editor banners (#7339) 2026-09-23 19:19:30 +02:00
chat_settings.cpp [Client] Add option to use game time in game log timestamps (#7265) 2026-10-02 17:30:48 +02:00
chat_settings.h [Client] Add option to use game time in game log timestamps (#7265) 2026-10-02 17:30:48 +02:00
commander_bracket_settings.cpp [DeckEditor] Use CommanderSpellbook.com to estimate bracket if format is 'commander' (#6415) 2026-08-09 00:46:17 +02:00
commander_bracket_settings.h [DeckEditor] Use CommanderSpellbook.com to estimate bracket if format is 'commander' (#6415) 2026-08-09 00:46:17 +02:00
debug_settings.cpp [SettingsManager] Make setting getters const (#6748) 2026-03-27 18:13:25 +01:00
debug_settings.h Standardize Doxygen documentation (#6885) 2026-05-21 22:58:07 +02:00
deck_editor_settings.cpp [VDE] Add a new setting to determine initial tab (Context/Deck/Database) (#7122) 2026-08-15 21:55:39 +02:00
deck_editor_settings.h [VDE] Add a new setting to determine initial tab (Context/Deck/Database) (#7122) 2026-08-15 21:55:39 +02:00
download_settings.cpp [PictureLoader] Add user-configurable per-host request caps (#7287) 2026-09-21 18:30:03 +02:00
download_settings.h [PictureLoader] Add user-configurable per-host request caps (#7287) 2026-09-21 18:30:03 +02:00
game_filters_settings.cpp [GamesModel] Rename 'Creator' column to 'Host' (#7083) 2026-08-13 18:58:21 +02:00
game_filters_settings.h [GamesModel] Rename 'Creator' column to 'Host' (#7083) 2026-08-13 18:58:21 +02:00
game_settings.cpp [Settings] Shuffle some settings around (#7084) 2026-08-08 22:27:41 +02:00
game_settings.h [Settings] Split cache_settings monolith into multiple SettingsManager sub-classes (#7050) 2026-07-27 11:25:39 +02:00
interface_settings.cpp [Game] Playmats (#7101) 2026-08-21 10:40:49 +02:00
interface_settings.h [Game] Playmats (#7101) 2026-08-21 10:40:49 +02:00
layouts_settings.cpp [SettingsManager] Make setting getters const (#6748) 2026-03-27 18:13:25 +01:00
layouts_settings.h Standardize Doxygen documentation (#6885) 2026-05-21 22:58:07 +02:00
message_settings.cpp [SettingsManager] Make setting getters const (#6748) 2026-03-27 18:13:25 +01:00
message_settings.h Standardize Doxygen documentation (#6885) 2026-05-21 22:58:07 +02:00
network_settings.cpp [Settings] Shuffle some settings around (#7084) 2026-08-08 22:27:41 +02:00
network_settings.h [Settings] Shuffle some settings around (#7084) 2026-08-08 22:27:41 +02:00
paths_settings.cpp [Settings] Shuffle some settings around (#7084) 2026-08-08 22:27:41 +02:00
paths_settings.h [Settings] Split cache_settings monolith into multiple SettingsManager sub-classes (#7050) 2026-07-27 11:25:39 +02:00
personal_settings.cpp [Settings] Shuffle some settings around (#7084) 2026-08-08 22:27:41 +02:00
personal_settings.h [Settings] Shuffle some settings around (#7084) 2026-08-08 22:27:41 +02:00
recents_settings.cpp [Settings] Shuffle some settings around (#7084) 2026-08-08 22:27:41 +02:00
recents_settings.h Standardize Doxygen documentation (#6885) 2026-05-21 22:58:07 +02:00
servers_settings.cpp [DeckShare] Open shared decks via links with a gated preview flow (#7244) 2026-09-20 20:22:17 +02:00
servers_settings.h [DeckShare] Open shared decks via links with a gated preview flow (#7244) 2026-09-20 20:22:17 +02:00
settings_manager.cpp [Settings] Split cache_settings monolith into multiple SettingsManager sub-classes (#7050) 2026-07-27 11:25:39 +02:00
settings_manager.h [Settings] Split cache_settings monolith into multiple SettingsManager sub-classes (#7050) 2026-07-27 11:25:39 +02:00
settings_migration.cpp [Settings] Back up the settings folder before migrating (#7386) 2026-10-03 14:59:58 +02:00
settings_migration.h [Settings] Back up the settings folder before migrating (#7386) 2026-10-03 14:59:58 +02:00
sound_settings.cpp [Settings] Shuffle some settings around (#7084) 2026-08-08 22:27:41 +02:00
sound_settings.h [Settings] Split cache_settings monolith into multiple SettingsManager sub-classes (#7050) 2026-07-27 11:25:39 +02:00
tabs_settings.cpp [Mods] Properly close card art rules tab on disconnect (#7227) 2026-09-01 11:31:49 +02:00
tabs_settings.h [Mods] Properly close card art rules tab on disconnect (#7227) 2026-09-01 11:31:49 +02:00
updates_settings.cpp [Settings] Shuffle some settings around (#7084) 2026-08-08 22:27:41 +02:00
updates_settings.h [Settings] Split cache_settings monolith into multiple SettingsManager sub-classes (#7050) 2026-07-27 11:25:39 +02:00
visual_deck_storage_settings.cpp [DeckShare] Browse and open public decks with loading, error and accessibility states (#7245) 2026-09-20 20:22:17 +02:00
visual_deck_storage_settings.h [DeckShare] Browse and open public decks with loading, error and accessibility states (#7245) 2026-09-20 20:22:17 +02:00