From e86d95ccfcda25d1e48e272c940aff4cbb1f05a6 Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Wed, 18 Aug 2021 22:09:54 +0200 Subject: [PATCH] Added support for XDG user dirs. --- scripts/libs/fsutil.gd | 65 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/scripts/libs/fsutil.gd b/scripts/libs/fsutil.gd index b0afbbf..4c690ad 100644 --- a/scripts/libs/fsutil.gd +++ b/scripts/libs/fsutil.gd @@ -6,6 +6,15 @@ extends Object class_name GDBFsUtil const __META_FILENAME_REGEX = "__gdb_fsutil_filename_regex__" +const __META_ENVVAR_REGEX = "__gdb_fsutil_envvar_regex__" + +class SpecialFolder: + var path := "" + var name := "" + + func _init(path_ : String, name_ : String): + self.path = path_ + self.name = name_ ################ # public stuff # @@ -67,6 +76,23 @@ static func get_home_folder() -> String: return "/" +static func get_special_folders() -> Array: + if OS.has_feature("X11"): + return __get_xdg_folders() + return [] + +static func replace_environment_variables(string : String) -> String: + var matches := __get_envvar_regex().search_all(string) + var parts := PoolStringArray() + var pos := 0 + for the_match in matches: + var var_name : String = the_match.strings[-2] if !the_match.strings[-1] else the_match.strings[-1] + parts.append(string.substr(pos, the_match.get_start())) + parts.append(OS.get_environment(var_name)) + pos = the_match.get_end() + parts.append(string.substr(pos)) + return parts.join("") + ################# # private stuff # ################# @@ -79,6 +105,19 @@ static func __get_filename_regex() -> RegEx: tree.set_meta(__META_FILENAME_REGEX, filename_regex) return filename_regex +static func __get_envvar_regex() -> RegEx: + var tree := GDBUtility.get_scene_tree() + if tree.has_meta(__META_ENVVAR_REGEX): + return tree.get_meta(__META_ENVVAR_REGEX) as RegEx + var envvar_regex := RegEx.new() + if OS.has_feature("Windows"): + envvar_regex.compile("%(\\w+)%") + else: + envvar_regex.compile("\\$({(\\w+)}|(\\w+))") + + tree.set_meta(__META_ENVVAR_REGEX, envvar_regex) + return envvar_regex + static func __find_all_by_name(path, name, result, files_only): var dir = Directory.new() if dir.open(path) != OK: @@ -98,3 +137,29 @@ static func __find_all_by_name(path, name, result, files_only): __find_all_by_name(full_name, name, result, files_only) dir.list_dir_end() + +static func __get_xdg_folders() -> Array: + var user_dirs_filename := get_home_folder().plus_file(".config/user-dirs.dirs") + var user_dirs_file := File.new() + if !user_dirs_file.file_exists(user_dirs_filename): + return [] + var status := user_dirs_file.open(user_dirs_filename, File.READ) + if status != OK: + printerr("Error fetching XDG user dirs.") + return [] + + var dir_regex := RegEx.new() + status = dir_regex.compile("^XDG_([A-Z]+)_DIR=\"([^\"]+)\"$") + assert(status == OK) + + var folders := [] + while !user_dirs_file.eof_reached(): + var line := user_dirs_file.get_line().strip_edges() + var result := dir_regex.search(line) + if result == null: + continue + var folder_name : String = result.strings[1].capitalize() + var folder_path : String = replace_environment_variables(result.strings[2]) + folders.append(SpecialFolder.new(folder_path, folder_name)) + + return folders