summaryrefslogtreecommitdiff
path: root/addons/gdUnit4/src/update/GdUnitPatcher.gd
diff options
context:
space:
mode:
Diffstat (limited to 'addons/gdUnit4/src/update/GdUnitPatcher.gd')
-rw-r--r--addons/gdUnit4/src/update/GdUnitPatcher.gd75
1 files changed, 75 insertions, 0 deletions
diff --git a/addons/gdUnit4/src/update/GdUnitPatcher.gd b/addons/gdUnit4/src/update/GdUnitPatcher.gd
new file mode 100644
index 0000000..73d25c9
--- /dev/null
+++ b/addons/gdUnit4/src/update/GdUnitPatcher.gd
@@ -0,0 +1,75 @@
+class_name GdUnitPatcher
+extends RefCounted
+
+
+const _base_dir := "res://addons/gdUnit4/src/update/patches/"
+
+var _patches := Dictionary()
+
+
+func scan(current :GdUnit4Version) -> void:
+ _scan(_base_dir, current)
+
+
+func _scan(scan_path :String, current :GdUnit4Version) -> void:
+ _patches = Dictionary()
+ var patch_paths := _collect_patch_versions(scan_path, current)
+ for path in patch_paths:
+ prints("scan for patches checked '%s'" % path)
+ _patches[path] = _scan_patches(path)
+
+
+func patch_count() -> int:
+ var count := 0
+ for key :String in _patches.keys():
+ @warning_ignore("unsafe_method_access")
+ count += _patches[key].size()
+ return count
+
+
+func execute() -> void:
+ for key :String in _patches.keys():
+ for path :String in _patches[key]:
+ var patch :GdUnitPatch = (load(key + "/" + path) as GDScript).new()
+ if patch:
+ prints("execute patch", patch.version(), patch.get_script().resource_path)
+ if not patch.execute():
+ prints("error checked execution patch %s" % key + "/" + path)
+
+
+func _collect_patch_versions(scan_path :String, current :GdUnit4Version) -> PackedStringArray:
+ if not DirAccess.dir_exists_absolute(scan_path):
+ return PackedStringArray()
+ var patches := Array()
+ var dir := DirAccess.open(scan_path)
+ if dir != null:
+ @warning_ignore("return_value_discarded")
+ dir.list_dir_begin() # TODO GODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547
+ var next := "."
+ while next != "":
+ next = dir.get_next()
+ if next.is_empty() or next == "." or next == "..":
+ continue
+ var version := GdUnit4Version.parse(next)
+ if version.is_greater(current):
+ patches.append(scan_path + next)
+ patches.sort()
+ return PackedStringArray(patches)
+
+
+func _scan_patches(path :String) -> PackedStringArray:
+ var patches := Array()
+ var dir := DirAccess.open(path)
+ if dir != null:
+ @warning_ignore("return_value_discarded")
+ dir.list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547
+ var next := "."
+ while next != "":
+ next = dir.get_next()
+ # step over directory links and .uid files
+ if next.is_empty() or next == "." or next == ".." or next.ends_with(".uid"):
+ continue
+ patches.append(next)
+ # make sorted from lowest to high version
+ patches.sort()
+ return PackedStringArray(patches)