If a game has a `__required` SDL which is an empty string will fail verification
because the check for building the list of hashes will fail, implying that the
whole game including all the SDLs will be validated.
At the same time, if we are importing a game using a config file that doesn't
specify the `install_tags` for such a game, the install tags won't be saved
due to calling an early `exit(0)`.
These two issues combined can cause a verification, repair, verification loop.
This commit addresses both of those issues.
Related convertation on Discord:
https://discord.com/channels/695233346627698689/695234626582609940/1084939380713594924
This allows additional SDL tags to be installed without going through a repair.
It will also now redownload deleted files if there's an update rather than just
trusting what the old manifest says should be installed locally.
In order to prevent multiple instances of Legendary mucking with installed game data
acquire a lock as soon as it is required and only release it (implicitly) when
Legendary exits.
This is a bit jank, but should prevent people from messing up their local data by
running two install commands at a time.
EGL sync is technically also affected by this, but in its case we simply skip the
sync/import/export and leave it to the next instance with a lock to do.
The retry logic may attempt to update metadata for an asset for
a different platform. This can cause an exception if it's not
also in the "still_needs_update" set.
Manifests up to version 21 can now be serialised with all
new features enabled.*
*SHA256 hash of EGL and Legendary serialised manifest matched,
but new features weren't used yet, so at empty placeholder data
works correctly.
This adds an uninstall "action". As yet unused.
Not sure if the order is correct, we'll have to see.
(Legendary won't support it until Epic does anyway)
For some reason using a newer version gives users a Cloudflare error page.
That is of course not possible to resolve in this context, and until I can
figure out a better way to solve this, we'll just use an old version that
does still work.