diff --git a/README.md b/README.md index 28598d0..9276078 100644 --- a/README.md +++ b/README.md @@ -256,6 +256,7 @@ func _on_plugin_updated(plugin): ## Known Limitations - Godot always show errors from plugin repositories in `./plugged` even with `.gdignore` (See [#32](https://github.com/imjp94/gd-plug/issues/32)) + - This can be worked around by placing the `.plugged` folder within `addons`, e.g. `addons/gd-plug/.plugged` - Sometimes random .import files will be unable to remove, while the reason behind it still remains unknown. - Workaround: Read output for those .import files that failed to remove, and manually delete them. - `autoload` script references in project setting are not cleared as plugin uninstalled. diff --git a/addons/gd-plug/plug.gd b/addons/gd-plug/plug.gd index 8b20175..8adb7a0 100644 --- a/addons/gd-plug/plug.gd +++ b/addons/gd-plug/plug.gd @@ -575,7 +575,7 @@ func remove_installed_plugin(plugin_name): _mutex.unlock() return result -func directory_copy_recursively(from, to, args={}): +func directory_copy_recursively(from, to, args={}, from_root = from): var include = args.get("include", []) var exclude = args.get("exclude", []) var test = args.get("test", false) @@ -589,26 +589,21 @@ func directory_copy_recursively(from, to, args={}): while not file_name.is_empty(): var source = dir.get_current_dir() + ("/" if dir.get_current_dir() != "res://" else "") + file_name var dest = to + ("/" if to != "res://" else "") + file_name + var include_test_source = source.erase(0, from_root.length()) - if dir.current_is_dir(): - dest_files += directory_copy_recursively(source, dest, args) - else: - for include_key in include: - if include_key in source: - var is_excluded = false - for exclude_key in exclude: - if exclude_key in source: - is_excluded = true - break - if not is_excluded: - if test: - if not silent_test: logger.warn("[TEST] Writing to %s" % dest) - else: - dir.make_dir_recursive(to) - if dir.copy(source, dest) == OK: - logger.debug("Copy from %s to %s" % [source, dest]) - dest_files.append(dest) - break + if !_test_path_includes_any_key(exclude, include_test_source): + if dir.current_is_dir(): + dest_files += directory_copy_recursively(source, dest, args, from_root) + else: + if _test_path_includes_any_key(include, include_test_source): + if test: + if !silent_test: + logger.warn("[TEST] Writing to %s" % dest) + else: + dir.make_dir_recursive(to) + if dir.copy(source, dest) == OK: + logger.debug("Copy from %s to %s" % [source, dest]) + dest_files.append(dest) file_name = dir.get_next() dir.list_dir_end() else: @@ -616,6 +611,18 @@ func directory_copy_recursively(from, to, args={}): return dest_files +func _test_path_includes_any_key(keys, path): + for key in keys: + if key.begins_with("res://"): + key = key.erase(0, "res:/".length()) + if path.begins_with(key): + return true + continue + + if key in path: + return true + return false + func directory_delete_recursively(dir_path, args={}): var remove_empty_directory = args.get("remove_empty_directory", true) var exclude = args.get("exclude", [])