Integrate per-save identity and interaction UI

This commit is contained in:
Alexander Sellite 2026-09-01 17:30:50 -04:00
parent ac82a28f3b
commit 4fda6e97f6
58 changed files with 3471 additions and 461 deletions

View file

@ -16,6 +16,10 @@ const ENVIRONMENT_VARIABLE := "straywild_DATA_DIR"
const CREATE_ENVIRONMENT_VARIABLE := "straywild_CREATE_DATA_DIR"
const LEGACY_ENVIRONMENT_VARIABLE := "NETFISHING_DATA_DIR"
const LEGACY_CREATE_ENVIRONMENT_VARIABLE := "NETFISHING_CREATE_DATA_DIR"
const ISOLATED_VALIDATION_ENVIRONMENT := (
"straywild_ISOLATED_VALIDATION_STORAGE"
)
const ISOLATED_VALIDATION_DIRECTORY := "isolated-validation-data"
const APPLICATION_ID := "straywild"
const LEGACY_APPLICATION_ID := "netfishing"
const APP_DATA_PORTABLE_PATH := "user://portable-data"
@ -57,6 +61,9 @@ enum Mode {
COMMAND_LINE_OVERRIDE,
}
static var _process_validation_root := ""
static var _process_validation_device_id := ""
var mode := Mode.UNRESOLVED
var root_path := ""
var root_id := ""
@ -67,6 +74,11 @@ var override_active := false
func resolve() -> bool:
# Validation scripts may be launched directly instead of through the
# repository runner. Keep the opt-in flag fail-safe: it must never follow a
# real user's bootstrap pointer merely because XDG isolation was omitted.
if _isolated_validation_requested():
return _resolve_isolated_validation_root()
prepare_legacy_user_data()
_load_bootstrap_identity()
var command_line: String = _command_line_override()
@ -116,6 +128,44 @@ func resolve() -> bool:
return false
func _resolve_isolated_validation_root() -> bool:
# Behave like app-data storage after choosing the isolated root so migration
# tests can still exercise live root switching within their sandbox.
override_active = false
mode = Mode.APP_DATA
if _process_validation_device_id.is_empty():
_process_validation_device_id = (
Crypto.new().generate_random_bytes(16).hex_encode()
)
device_id = _process_validation_device_id
if _process_validation_root.is_empty():
var parent: String
if OS.has_environment("XDG_DATA_HOME"):
parent = ProjectSettings.globalize_path("user://")
else:
parent = OS.get_temp_dir().path_join(
"straywild-validation-%d-%d"
% [OS.get_process_id(), Time.get_ticks_usec()]
)
_process_validation_root = parent.path_join(
ISOLATED_VALIDATION_DIRECTORY
)
if not has_data_manifest(_process_validation_root):
var created: Dictionary = create_unbound_root(
_process_validation_root
)
if not bool(created.get("ok", false)):
return false
return _activate_existing(_process_validation_root, "", false)
static func _isolated_validation_requested() -> bool:
return (
DisplayServer.get_name() == "headless"
and OS.get_environment(ISOLATED_VALIDATION_ENVIRONMENT) == "1"
)
func prepare_legacy_user_data() -> void:
var current_root: String = _normalize(
ProjectSettings.globalize_path("user://")