Cockatrice/tests
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
..
card_zone_algorithms [Game] Preserve hand card order when restoring connection (#7266) 2026-09-07 08:21:44 +02:00
carddatabase [Filter] Restore exact, case-insensitive set code search (#7336) 2026-09-21 14:22:05 +02:00
deck_list_model [Models] Mirror custom deck zones in the deck list model (#7203) 2026-09-05 22:00:20 +02:00
deck_list_zones [Client] Add zone management to the deck state manager (#7204) 2026-09-05 22:00:21 +02:00
loading_from_clipboard Fix/cmake test only build (#6709) 2026-03-15 17:24:50 +01:00
movecard_tests [Server] Consolidate Server_Game construction parameters into a GameConfig struct (#7128) 2026-08-16 19:13:03 +02:00
oracle [Client] Show localized card names, texts and pictures (#7294) 2026-09-18 12:03:07 +02:00
picture_loader_benchmark [Tests] Add manual picture loader benchmark against the real card hosts (#7288) 2026-09-21 18:30:04 +02:00
settings [Settings] Back up the settings folder before migrating (#7386) 2026-10-03 14:59:58 +02:00
theme_migration [Theme] Carry Default theme directory customizations over to System (#7385) 2026-10-03 13:43:25 +02:00
clamped_arithmetic_test.cpp Unify counter clamp arithmetic into shared addClamped() helper (#7009) 2026-06-28 16:10:57 -07:00
CMakeLists.txt [Theme] Carry Default theme directory customizations over to System (#7385) 2026-10-03 13:43:25 +02:00
deck_hash_performance_test.cpp Hashing tests (#5026) 2025-12-23 17:48:10 +01:00
dummy_test.cpp Clang script (#3085) 2018-02-06 08:45:13 -05:00
expression_test.cpp Turn Card, Deck_List, Protocol, RNG, Network (Client, Server), Settings and Utility into libraries and remove cockatrice_common. (#6212) 2025-10-09 07:36:12 +02:00
lag_monitor_test.cpp [Client] Detect main-thread event loop stalls (#7155) 2026-08-23 00:53:40 +02:00
latency_tracker_test.cpp [Network] Measure real server round-trip times (#7153) 2026-08-23 00:03:52 +02:00
loader_local_matching_test.cpp [PictureLoader] Fix custom-folder pictures in subdirectories not loading (#7340) 2026-09-21 21:48:34 +02:00
metrics_registry_test.cpp [Client/Server/Protocol] Surface live metrics in the Developer tab (#7212) 2026-09-11 17:18:56 +02:00
password_hash_test.cpp [Security] Use a CSPRNG for salts, tokens, and RNG seeding (#7192) 2026-09-04 13:49:18 +02:00
playmat_resolver_test.cpp [Game] Playmats (#7101) 2026-08-21 10:40:49 +02:00
report_categories_test.cpp [Server/Client] Unify report categories (#7345) 2026-09-24 18:37:54 +02:00
server_card_counter_test.cpp Split trice_limits.h into dedicated headers (#7025) 2026-06-29 14:37:52 -07:00
server_counter_test.cpp Centralize counter API with server-side bounds and no-op filtering (#6879) 2026-05-21 20:39:35 -07:00
server_developer_role_test.cpp [Server/Client/Protocol] Add developer staff role (#7211) 2026-09-11 17:18:56 +02:00
server_game_join_test.cpp [Game] Allow judges to enter any game regardless of restrictions (#7315) 2026-09-19 10:39:52 +02:00
server_rate_limiter_test.cpp [PictureLoader] Schedule exponential backoff on 429 - Too many request handler and call failed on fail (#7053) 2026-08-08 22:55:27 +02:00
single_instance_manager_test.cpp [Client] Hand off single-instance payloads outside the readyRead signal (#7373) 2026-10-02 21:19:02 +02:00
test_age_formatting.cpp do not save a const reference to the user data in the info dialog (#6974) 2026-06-09 23:35:00 -07:00
warning_categories_test.cpp [Server/Client/Protocol] Reporting users + moderation queue functionality (#7091) 2026-08-21 15:00:13 +02:00