Restructure step R: the app is Starsync (dev.foxyz.starsync)
- Linux app id dev.foxyz.starsync, binary starsync; Windows starsync.exe, company foxyz; server starsync-server; Dart package starsync; archives starsync-<ver>-*. - 1.2.x compatibility: watch_together and watch-together-server launchers (Linux) / copies (Windows) in the archive; the updater accepts both names and relaunches the new binary; update.sh/.bat use whichever server exists. - First start copies (never moves) the old support folder and this app's Hive boxes out of ~/Documents into <support>/hive; a marker makes it run once; AppDirs is a port; settings schema version with ordered migrations. - Launcher entry dev.foxyz.starsync.desktop; the old one removed. - Repository name and URLs unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f4ca02c3cf
commit
51c1c5ab78
96 files changed
+1169
-489
No files matched your search
@@ -6,6 +6,7 @@ import 'package:signals/signals_flutter.dart';
|
||||
|
||||
import '../controls/model/controls_prefs.dart';
|
||||
import '../shaders/shader_presets.dart';
|
||||
import 'settings_schema.dart';
|
||||
|
||||
// App preferences (Settings page), one Hive box. Signals start at their
|
||||
// defaults and take the stored values once [AppSettings.ensureLoaded]
|
||||
@@ -134,6 +135,9 @@ class AppSettings {
|
||||
Future<void> _loadNow() async {
|
||||
try {
|
||||
final box = _box = await Hive.openBox(settingsBoxName);
|
||||
for (final line in await migrateSettings(box)) {
|
||||
debugPrint(line);
|
||||
}
|
||||
final mode = box.get(_keyHwdecMode);
|
||||
hwdecMode.value = HwdecMode.values
|
||||
.where((m) => m.name == mode)
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
import 'package:hive_ce/hive.dart';
|
||||
|
||||
// The `settings` box's layout version and the ordered steps between
|
||||
// versions. A step rewrites stored values for a new layout (renamed keys,
|
||||
// changed formats); the restructure steps add theirs here.
|
||||
|
||||
/// The layout this build reads. 1: the layout of 1.2.x, where versioning
|
||||
/// starts (a box without a version is at 1).
|
||||
const settingsSchemaVersion = 1;
|
||||
|
||||
/// The box key holding the stored version.
|
||||
const settingsSchemaKey = 'schemaVersion';
|
||||
|
||||
/// One step: brings a box at `to - 1` to [to].
|
||||
class SettingsMigration {
|
||||
final int to;
|
||||
/// For the log ("settings schema 2: ...").
|
||||
final String what;
|
||||
final Future<void> Function(Box box) apply;
|
||||
const SettingsMigration(this.to, this.what, this.apply);
|
||||
}
|
||||
|
||||
/// Every step in order of [SettingsMigration.to] (2, 3, ...); empty while
|
||||
/// version 1 is current.
|
||||
const settingsMigrations = <SettingsMigration>[];
|
||||
|
||||
/// Runs the [steps] past the box's stored version up to [current], in
|
||||
/// order, storing the version after each, then stores [current]. A box
|
||||
/// from a newer build (a downgrade) is left as it is. Returns a log line
|
||||
/// per step run.
|
||||
Future<List<String>> migrateSettings(Box box,
|
||||
{List<SettingsMigration> steps = settingsMigrations, int current = settingsSchemaVersion}) async {
|
||||
final stored = box.get(settingsSchemaKey);
|
||||
var at = stored is int ? stored : 1;
|
||||
if (at > current) return ['settings schema $at is newer than this build ($current): left as is'];
|
||||
final ran = <String>[];
|
||||
for (final step in [...steps]..sort((a, b) => a.to.compareTo(b.to))) {
|
||||
if (step.to <= at || step.to > current) continue;
|
||||
await step.apply(box);
|
||||
at = step.to;
|
||||
await box.put(settingsSchemaKey, at);
|
||||
ran.add('settings schema ${step.to}: ${step.what}');
|
||||
}
|
||||
if (stored != current) await box.put(settingsSchemaKey, current);
|
||||
return ran;
|
||||
}
|
||||
Reference in new issue
Block a user