From cf84623e62321a9e4f4fdae319af626813822c40 Mon Sep 17 00:00:00 2001 From: mtkennerly Date: Sun, 9 Apr 2023 19:58:53 +0800 Subject: [PATCH] Release v0.17.0 --- .github/ISSUE_TEMPLATE/bug.yaml | 2 +- CHANGELOG.md | 2 +- CONTRIBUTING.md | 1 + Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 53 ++++++++++++++++--- ...om.github.mtkennerly.ludusavi.metainfo.xml | 3 +- tasks.py | 5 +- 8 files changed, 57 insertions(+), 13 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index 4cde9db6..4b1d5308 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -7,6 +7,7 @@ body: label: Ludusavi version description: If you're not using the latest version, please update and make sure the problem still occurs. options: + - v0.17.0 - v0.16.0 - v0.15.2 - v0.15.1 @@ -16,7 +17,6 @@ body: - v0.13.0 - v0.12.1 - v0.12.0 - - v0.11.0 - Older validations: required: true diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d9bdfdc..70d36e43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## Unreleased +## v0.17.0 (2023-04-09) * Added: * A new "removed" status (icon: `x`) is now displayed for saves. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2c31e2a3..47b8fa1a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -66,3 +66,4 @@ Also install the Crowdin CLI manually. * Update the translation percentages in src/lang.rs * Run `cargo build` to update the version in Cargo.lock * Add the new version to `.github/ISSUE_TEMPLATE/*.yaml`. +* Update the README if necessary for any new features. diff --git a/Cargo.lock b/Cargo.lock index f7670a65..05fdb934 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2135,7 +2135,7 @@ dependencies = [ [[package]] name = "ludusavi" -version = "0.16.0" +version = "0.17.0" dependencies = [ "base64 0.13.1", "byte-unit", diff --git a/Cargo.toml b/Cargo.toml index 9426142e..ccdbf6d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ludusavi" -version = "0.16.0" +version = "0.17.0" authors = ["mtkennerly "] edition = "2021" description = "Game save backup tool" diff --git a/README.md b/README.md index c464f7ab..f882bac8 100644 --- a/README.md +++ b/README.md @@ -195,12 +195,23 @@ You can also use keyboard shortcuts to swap the three-dot menu with some specifi During a restore, Ludusavi only considers folders with a `mapping.yaml` file. -### Search -You can click the search icon and enter some text to just see games with -matching names. Note that this only affects which games you see in the list, +### Filter +You can click the filter icon at the top of the backup/restore screens to use some filters. +Note that this only affects which games you see in the list, but Ludusavi will still back up the full set of games. -Sorting options are also available while the search bar is open. +You can apply filters for the following: + +* Whether the game title matches a search. +* Whether multiple games have the same save files: + * `Unique` (no conflicts) + * `Duplicated` (conflicts exist) +* Whether all save files for a game are enabled for processing: + * `Complete` (all saves enabled) + * `Partial` (some saves disabled) +* Whether the game itself is enabled for processing: + * `Enabled` (checkbox next to game is checked) + * `Disabled` (checkbox next to game is unchecked) ### Duplicates You may see a "duplicates" badge next to some games. This means that some of @@ -209,6 +220,10 @@ the same files were also backed up for another game. That could be intentional also be a sign of an issue in the manifest data. You can expand the game's file list to see which exact entries are duplicated. +You can resolve conflicts by disabling certain save files from being backed up. +Once a conflict is resolved, the badge will become faded. +You can also click on the badge to view just the conflicting games. + ### Redirects You can use redirects to back up or restore to a different location than the original file. These are listed on the "other" screen, where you can click the plus button to add more @@ -328,9 +343,11 @@ For the `backup`/`restore` commands: * `values` (optional, map): Any registry values inside of the registry key. * `change` (string): Same as game-level field, but for a specific backup item. * `ignored` (optional, boolean): Whether this entry was ignored. + * `duplicatedBy` (optional, array of strings): Any other games that + also have the same registry key+value. The `backups` command is similar, but without `overall`, and with each game containing -`{"backups": [ {"name": , "when": } ]}`. +`{"backups": [ {"name": , "when": , "comment": } ]}`. The `find` command also does not have `overall`, and each game object is empty. Note that, in some error conditions, there may not be any JSON output, @@ -386,6 +403,9 @@ Here are the available settings in `config.yaml` (all are required unless otherw
Click to expand +* `runtime` (map): + * `threads` (integer): How many threads to use for parallel scanning. + Must be greater than 0. * `manifest` (map): * `url` (string): Where to download the primary manifest. * `etag` (string or null): This field is deprecated and has been superseded by cache.yaml. @@ -450,7 +470,7 @@ Here are the available settings in `config.yaml` (all are required unless otherw to control individual registry values as well. Settings on child paths override settings on parent paths. * `sort` (map): - * `key` (string): One of `name`, `size`. + * `key` (string): One of `name`, `size`, `status`. * `reversed` (boolean): If true, sort reverse alphabetical or from the largest size. * `retention` (map): * `full` (integer): Full backups to keep. Range: 1-255. @@ -475,6 +495,10 @@ Here are the available settings in `config.yaml` (all are required unless otherw * `sort` (map): * `key` (string): One of `name`, `size`. * `reversed` (boolean): If true, sort reverse alphabetical or from the largest size. +* `scan` (map): + * `showDeselectedGames` (boolean): In the GUI, show games that have been deselected. + * `showUnchangedGames` (boolean): In the GUI, show games that have been scanned, but do not have any changed saves. + * `showUnscannedGames` (boolean): In the GUI, show recent games that have not been scanned yet. * `customGames` (optional, list): * Each entry in the list should be a map with these fields: * `name` (string): Name of the game. @@ -498,6 +522,23 @@ restore:
+### Environment variables +Environment variables can be used to tweak some additional behavior: + +
+Click to expand + +* `RUST_LOG`: Configure logging. + Example: `RUST_LOG=ludusavi=debug` +* `LUDUSAVI_DEBUG`: If this is set to any value, + then Ludusavi will not detach from the console on Windows in GUI mode. + It will also print some debug messages in certain cases. + Example: `LUDUSAVI_DEBUG=1` +* `LUDUSAVI_THREADS`: Overrive the `runtime.threads` value from the config file. + Example: `LUDUSAVI_THREADS=8` + +
+ ## Comparison with other tools There are other excellent backup tools available, but not a singular cross-platform and cross-store solution: diff --git a/assets/com.github.mtkennerly.ludusavi.metainfo.xml b/assets/com.github.mtkennerly.ludusavi.metainfo.xml index 4ee562a2..a517f725 100644 --- a/assets/com.github.mtkennerly.ludusavi.metainfo.xml +++ b/assets/com.github.mtkennerly.ludusavi.metainfo.xml @@ -23,13 +23,14 @@ - https://raw.githubusercontent.com/mtkennerly/ludusavi/v0.16.0/docs/sample-gui-linux.png + https://raw.githubusercontent.com/mtkennerly/ludusavi/v0.17.0/docs/sample-gui-linux.png Graphical user interface com.github.mtkennerly.ludusavi.desktop + diff --git a/tasks.py b/tasks.py index c1ab2a3a..20363a07 100644 --- a/tasks.py +++ b/tasks.py @@ -59,8 +59,9 @@ def clean(ctx): @task -def prerelease(ctx): +def prerelease(ctx, update_lang=True): clean(ctx) legal(ctx) flatpak(ctx) - lang(ctx) + if update_lang: + lang(ctx)