Skip to content

Commit

Permalink
Release v0.28.0
Browse files Browse the repository at this point in the history
  • Loading branch information
mtkennerly committed Jan 15, 2025
1 parent b0a4604 commit 822da32
Show file tree
Hide file tree
Showing 13 changed files with 109 additions and 18 deletions.
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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.28.0
- v0.27.0
- v0.26.0
- v0.25.0
Expand All @@ -16,7 +17,6 @@ body:
- v0.24.0
- v0.23.0
- v0.22.0
- v0.21.0
- Other
validations:
required: true
Expand Down
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## Unreleased
## v0.28.0 (2025-01-15)

* Added:
* On Linux, for Lutris roots that point to a Flatpak installation,
Expand Down
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "ludusavi"
version = "0.27.0"
version = "0.28.0"
authors = ["mtkennerly <mtkennerly@gmail.com>"]
edition = "2021"
description = "Game save backup tool"
Expand Down
3 changes: 2 additions & 1 deletion assets/flatpak/com.github.mtkennerly.ludusavi.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,14 @@
</keywords>
<screenshots>
<screenshot type="default">
<image type="source">https://raw.githubusercontent.com/mtkennerly/ludusavi/v0.27.0/docs/sample-gui-linux.png</image>
<image type="source">https://raw.githubusercontent.com/mtkennerly/ludusavi/v0.28.0/docs/sample-gui-linux.png</image>
<caption>Graphical user interface</caption>
</screenshot>
</screenshots>
<content_rating type="oars-1.1" />
<launchable type="desktop-id">com.github.mtkennerly.ludusavi.desktop</launchable>
<releases>
<release version="0.28.0" date="2025-01-15"/>
<release version="0.27.0" date="2024-11-19"/>
<release version="0.26.0" date="2024-10-29"/>
<release version="0.25.0" date="2024-08-18"/>
Expand Down
3 changes: 2 additions & 1 deletion assets/linux/com.mtkennerly.ludusavi.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,14 @@
</keywords>
<screenshots>
<screenshot type="default">
<image type="source">https://raw.githubusercontent.com/mtkennerly/ludusavi/v0.27.0/docs/sample-gui-linux.png</image>
<image type="source">https://raw.githubusercontent.com/mtkennerly/ludusavi/v0.28.0/docs/sample-gui-linux.png</image>
<caption>Graphical user interface</caption>
</screenshot>
</screenshots>
<content_rating type="oars-1.1" />
<launchable type="desktop-id">com.mtkennerly.ludusavi.desktop</launchable>
<releases>
<release version="0.28.0" date="2025-01-15"/>
<release version="0.27.0" date="2024-11-19"/>
<release version="0.26.0" date="2024-10-29"/>
<release version="0.25.0" date="2024-08-18"/>
Expand Down
48 changes: 47 additions & 1 deletion docs/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ Commands:
Find game titles
manifest
Options for Ludusavi's data set
config
Options for Ludusavi's configuration
cloud
Cloud sync
wrap
Expand Down Expand Up @@ -74,6 +76,9 @@ Options:
Print information to stdout in machine-readable JSON. This replaces the default,
human-readable output
--gui
Use GUI dialogs for prompts and some information
--sort <SORT>
Sort the game list by different criteria. When not specified, this defers to the config
file
Expand Down Expand Up @@ -112,6 +117,10 @@ Options:
Don't perform any cloud checks or synchronization. When not specified, this defers to the
config file
--dump-registry
Include the serialized registry content in the output. Only includes the native Windows
registry, not Wine
-h, --help
Print help (see a summary with '-h')
```
Expand All @@ -136,6 +145,8 @@ Options:
--api
Print information to stdout in machine-readable JSON. This replaces the default,
human-readable output
--gui
Use GUI dialogs for prompts and some information
--sort <SORT>
Sort the game list by different criteria. When not specified, this defers to Ludusavi's
config file [possible values: name, name-rev, size, size-rev, status, status-rev]
Expand All @@ -149,6 +160,9 @@ Options:
--no-cloud-sync
Don't perform any cloud checks or synchronization. When not specified, this defers to the
config file
--dump-registry
Include the serialized registry content in the output. Only includes the native Windows
registry, not Wine
-h, --help
Print help
```
Expand Down Expand Up @@ -204,7 +218,8 @@ Options:
Find game titles
Precedence: Steam ID -> GOG ID -> Lutris ID -> exact names -> normalized names. Once a match is
found for one of these options, Ludusavi will stop looking and return that match.
found for one of these options, Ludusavi will stop looking and return that match, unless you set
`--multiple`, in which case, the results will be sorted by how well they match.
If there are no matches, Ludusavi will exit with an error. Depending on the options chosen, there
may be multiple matches, but the default is a single match.
Expand All @@ -225,6 +240,9 @@ Options:
Print information to stdout in machine-readable JSON. This replaces the default,
human-readable output
--multiple
Keep looking for all potential matches, instead of stopping at the first match
--path <PATH>
Directory in which to find backups. When unset, this defaults to the restore path from the
config file
Expand All @@ -248,6 +266,9 @@ Options:
Look up game by an approximation of the title. Ignores capitalization, "edition" suffixes,
year suffixes, and some special symbols. This may find multiple games for a single input
--fuzzy
Look up games with fuzzy matching. This may find multiple games for a single input
--disabled
Select games that are disabled
Expand Down Expand Up @@ -320,6 +341,31 @@ Options:
Don't ask for confirmation
--gui
Show a GUI notification during restore/backup
--path <PATH>
Directory in which to find/store backups. It will be created if it does not already exist.
When not specified, this defers to the config file
--format <FORMAT>
Format in which to store new backups. When not specified, this defers to the config file
[possible values: simple, zip]
--compression <COMPRESSION>
Compression method to use for new zip backups. When not specified, this defers to the
config file [possible values: none, deflate, bzip2, zstd]
--compression-level <COMPRESSION_LEVEL>
Compression level to use for new zip backups. When not specified, this defers to the
config file. Valid ranges: 1 to 9 for deflate/bzip2, -7 to 22 for zstd
--full-limit <FULL_LIMIT>
Maximum number of full backups to retain per game. Must be between 1 and 255 (inclusive).
When not specified, this defers to the config file
--differential-limit <DIFFERENTIAL_LIMIT>
Maximum number of differential backups to retain per full backup. Must be between 0 and
255 (inclusive). When not specified, this defers to the config file
--cloud-sync
Upload any changes to the cloud when the backup is complete. If the local and cloud
backups are not in sync to begin with, then nothing will be uploaded. When not specified,
this defers to the config file
--no-cloud-sync
Don't perform any cloud checks or synchronization. When not specified, this defers to the
config file
-h, --help
Print help
```
Expand Down
2 changes: 0 additions & 2 deletions docs/help/custom-games.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,10 @@ and the placeholders defined in the
If you have a folder name that contains a special glob character,
you can escape it by wrapping it in brackets (e.g., `[` becomes `[[]`).

<!--
Installed names should be a bare folder name only,
because Ludusavi will look for this folder in each root.
Ludusavi automatically looks for the game's own name as well,
so you only need to specify a custom folder name if it's different.
For example, if you have an other-type root at `C:\Games`,
and there's a game called `Some Game` installed at `C:\Games\sg`,
then you would set the installed name as `sg`.
-->
1 change: 0 additions & 1 deletion docs/help/game-launch-wrapping.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ one when the game starts, and one when the game stops.
In Playnite, navigate to settings -> scripts -> game scripts,
and configure the following:

<!-- `--gui` -->
* Execute before starting a game
(if you want Ludusavi to restore your latest backup):
```
Expand Down
10 changes: 9 additions & 1 deletion docs/schema/api-input.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ definitions:
FilePath:
type: string
FindTitle:
description: "Find game titles\n\nPrecedence: Steam ID -> GOG ID -> Lutris ID -> exact names -> normalized names. Once a match is found for one of these options, Ludusavi will stop looking and return that match.\n\nDepending on the options chosen, there may be multiple matches, but the default is a single match.\n\nAliases will be resolved to the target title."
description: "Find game titles\n\nPrecedence: Steam ID -> GOG ID -> Lutris ID -> exact names -> normalized names. Once a match is found for one of these options, Ludusavi will stop looking and return that match, unless you set `multiple: true`, in which case, the results will be sorted by how well they match.\n\nDepending on the options chosen, there may be multiple matches, but the default is a single match.\n\nAliases will be resolved to the target title."
type: object
properties:
backup:
Expand All @@ -44,6 +44,10 @@ definitions:
description: Select games that are disabled.
default: false
type: boolean
fuzzy:
description: Look up games with fuzzy matching. This may find multiple games for a single input.
default: false
type: boolean
gogId:
description: Look up game by a GOG ID.
default: ~
Expand All @@ -58,6 +62,10 @@ definitions:
type:
- string
- "null"
multiple:
description: "Keep looking for all potential matches, instead of stopping at the first match."
default: false
type: boolean
names:
description: "Look up game by an exact title. With multiple values, they will be checked in the order given."
default: []
Expand Down
1 change: 0 additions & 1 deletion docs/schema/api-output.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ definitions:
type: array
items:
type: string
uniqueItems: true
Response:
description: A response to an individual request.
oneOf:
Expand Down
31 changes: 25 additions & 6 deletions docs/schema/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ properties:
default:
rclone:
arguments: "--fast-list --ignore-checksum"
path: "C:\\opt\\rclone.exe"
path: "C:/opt/rclone.exe"
allOf:
- $ref: "#/definitions/Apps"
backup:
Expand Down Expand Up @@ -36,7 +36,8 @@ properties:
zip:
compression: deflate
ignoredGames: []
path: "C:\\Users\\mtken/ludusavi-backup"
onlyConstructive: false
path: "C:/Users/mtken/ludusavi-backup"
retention:
differential: 0
full: 1
Expand Down Expand Up @@ -81,7 +82,7 @@ properties:
restore:
default:
ignoredGames: []
path: "C:\\Users\\mtken/ludusavi-backup"
path: "C:/Users/mtken/ludusavi-backup"
reverseRedirects: false
sort:
key: status
Expand Down Expand Up @@ -131,7 +132,7 @@ definitions:
description: Settings for Rclone.
default:
arguments: "--fast-list --ignore-checksum"
path: "C:\\opt\\rclone.exe"
path: "C:/opt/rclone.exe"
allOf:
- $ref: "#/definitions/App"
BackupConfig:
Expand Down Expand Up @@ -172,9 +173,13 @@ definitions:
items:
type: string
uniqueItems: true
onlyConstructive:
description: "Don't create a new backup if there are only removed saves and no new/edited ones."
default: false
type: boolean
path:
description: Full path to a directory in which to save backups.
default: "C:\\Users\\mtken/ludusavi-backup"
default: "C:/Users/mtken/ludusavi-backup"
allOf:
- $ref: "#/definitions/FilePath"
retention:
Expand Down Expand Up @@ -346,6 +351,12 @@ definitions:
ignore:
description: Whether to disable this game.
type: boolean
installDir:
description: Bare folder names where the game has been installed.
default: []
type: array
items:
type: string
integration:
default: override
allOf:
Expand Down Expand Up @@ -452,6 +463,10 @@ definitions:
type: string
enum:
- es-ES
- description: Swedish
type: string
enum:
- sv-SE
- description: Thai
type: string
enum:
Expand All @@ -464,6 +479,10 @@ definitions:
type: string
enum:
- uk-UA
- description: Vietnamese
type: string
enum:
- vi-VN
ManifestConfig:
type: object
properties:
Expand Down Expand Up @@ -529,7 +548,7 @@ definitions:
uniqueItems: true
path:
description: Full path to a directory from which to restore data.
default: "C:\\Users\\mtken/ludusavi-backup"
default: "C:/Users/mtken/ludusavi-backup"
allOf:
- $ref: "#/definitions/FilePath"
reverseRedirects:
Expand Down
20 changes: 20 additions & 0 deletions docs/schema/general-output.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,14 @@ definitions:
when:
type: string
format: date-time
ApiDump:
type: object
properties:
registry:
description: "Serialized registry content, if any, when enabled by `--dump-registry`."
type:
- string
- "null"
ApiErrors:
type: object
properties:
Expand Down Expand Up @@ -125,6 +133,7 @@ definitions:
required:
- change
- decision
- dump
- files
- registry
properties:
Expand All @@ -136,6 +145,10 @@ definitions:
description: How Ludusavi decided to handle this game.
allOf:
- $ref: "#/definitions/OperationStepDecision"
dump:
description: Raw data.
allOf:
- $ref: "#/definitions/ApiDump"
files:
description: Each key is a file path.
type: object
Expand All @@ -160,6 +173,13 @@ definitions:
$ref: "#/definitions/ApiBackup"
- description: "Used by the `find` command."
type: object
properties:
score:
description: "How well the title matches the query. Range: 0.0 to 1.0 (higher is better)."
type:
- number
- "null"
format: double
ApiRegistry:
type: object
required:
Expand Down

0 comments on commit 822da32

Please sign in to comment.