Older versions of Sphinx don't work with whatever the default version of
Python is on GitHub Actions, and never versions of Sphinx need a newer
version of Python.
Also update the RTD theme and Breathe while I'm at it.
It happens to behave nicely with MSVC's RelWithDebInfo, but it's undefined behaviour, and GCC (I don't know what parameters were used) errors due to a bounds-check assertion failure.
They don't need to be member functions, and needing a pointer to an
instance of that interface is awkward.
The function names have also changed to reflect that they're not
specific to the masterlists.
This allows common metadata to be shared across masterlists in a
'prelude' YAML file that is then injected into a masterlist when it is
loaded. Masterlist metadata can then reference anchors within the
prelude to make use of those common metadata.
The prelude file will be version controlled in a separate Git
repository, so the masterlist update functions also apply to managing
its versioning.
There's not much point having a Masterlist class with only three static
member functions. This refactoring also helps break the association
between the Git-related functions and masterlists, which will help when
implementing support for prelude files.
To reflect that it will soon be used to provide info for other
version-controlled files. Also rename its revision_id and
revision_date fields to remove the revision_ prefixes.
LOOT's ability to roll back to a working masterlist version hasn't been
exercised in years, as our CI testing has gotten better at catching
issues before they reach users.
Coupling updating a masterlist with loading it also complicates the
introduction of a common prelude, so given the very low usefulness of
the functionality it's best to drop it entirely .
Check after adding group edges, as after that LOOT only adds edges if
they don't cause a cycle. Adding tie-break edges is the step that takes
longest and scales the worst (by far), so failing before that would
provide a much better user experience.
This property can be used to provide detail about a requirement or
incompatibility that can be displayed in the error message displayed
for the file (if one is displayed).
While the value could actually be NaN, that's also what esplugin uses to
signal that the version could not be found, and either way a NaN value
is useless.