mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-15 23:24:52 +09:00
Write plugin versions while loading configs
The staging copy made by Config.set() went through the constructor, so plugin migrations ran a second time on the live fields. A version-gated migration was applied twice when setPluginVersions() changed the version. Staging now copies the fields with update() instead. A config saved without <plugin>.version got the running version as its default, so setPluginVersions() saw no change and nothing saved the stamp. The constructor now writes the registered plugin versions after the migrations run and marks the config dirty when that changes a loaded value. Controller.bootstrap() saves the instances that came out dirty, and setPluginVersions() is gone. Restructure the SyncHook and plugin config tests by method, and suggest the controller config version for role migrations in the docs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
aec0fc7a1e
commit
e455d17bb7
10 files changed
+188
-119
No files matched your search
+22
-2
@@ -357,8 +357,28 @@ hooks.instanceConfig.attach(plugin.name, config => {
|
||||
});
|
||||
```
|
||||
|
||||
The version field is missing in configs saved before the plugin was loaded with Clusterio versions that track it.
|
||||
Roles have no version.
|
||||
The version field is missing or empty in configs saved before Clusterio tracked it, and in configs last loaded in recovery mode.
|
||||
|
||||
Roles have no version of their own.
|
||||
They are stored on the controller, so use the version in the controller config, which is loaded before the roles:
|
||||
|
||||
```js
|
||||
let controllerVersion;
|
||||
hooks.controllerConfig.attach(plugin.name, config => {
|
||||
controllerVersion ??= config["foo_frobber.version"] ?? "";
|
||||
return config;
|
||||
});
|
||||
hooks.role.attach(plugin.name, role => {
|
||||
// foo_frobber.edit was split out of foo_frobber.view in 1.2.0
|
||||
if (
|
||||
controllerVersion && lib.integerFullVersion(controllerVersion) < lib.integerFullVersion("1.2.0")
|
||||
&& role.permissions.includes("foo_frobber.view")
|
||||
) {
|
||||
role.permissions.push("foo_frobber.edit");
|
||||
}
|
||||
return role;
|
||||
});
|
||||
```
|
||||
|
||||
Data the plugin stores itself, like files in the database directory or values in the save, is up to the plugin to migrate from its other entrypoints.
|
||||
Modules don't need migrating, save patching replaces the files of every module when an instance starts.
|
||||
|
||||
Reference in new issue
Block a user