From 05a3364e14965eeab04da8fd5e57bb883c162217 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 10 Feb 2021 12:07:56 +0000 Subject: Search XDG_DATA_HOME/gir-1.0 for GIR XML too For completeness. There probably won't be any, but the XDG base directory specification is most useful if it's consistently followed everywhere, and the specification says to look in XDG_DATA_HOME before XDG_DATA_DIRS. Signed-off-by: Simon McVittie --- girepository/girparser.c | 6 ++++++ giscanner/transformer.py | 3 +++ giscanner/utils.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/girepository/girparser.c b/girepository/girparser.c index 2b7c4ede..531cea07 100644 --- a/girepository/girparser.c +++ b/girepository/girparser.c @@ -329,6 +329,12 @@ locate_gir (GIrParser *parser, } } + path = g_build_filename (g_get_user_data_dir (), GIR_SUFFIX, girname, NULL); + g_debug ("Trying %s from user data dir", path); + if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) + return path; + g_free (path); + for (dir = datadirs; *dir; dir++) { path = g_build_filename (*dir, GIR_SUFFIX, girname, NULL); diff --git a/giscanner/transformer.py b/giscanner/transformer.py index 545ce6cc..88d429a6 100644 --- a/giscanner/transformer.py +++ b/giscanner/transformer.py @@ -185,6 +185,9 @@ None.""" from_env = os.getenv('GI_GIR_PATH', '') if from_env: searchdirs.extend(from_env.split(os.pathsep)) + user_data = utils.get_user_data_dir() + if user_data is not None: + searchdirs.append(os.path.join(user_data, 'gir-1.0')) for path in utils.get_system_data_dirs(): searchdirs.append(os.path.join(path, 'gir-1.0')) searchdirs.append(GIR_DIR) diff --git a/giscanner/utils.py b/giscanner/utils.py index 31c7ea48..9840143c 100644 --- a/giscanner/utils.py +++ b/giscanner/utils.py @@ -236,6 +236,36 @@ def get_user_cache_dir(dir=None): return None +def get_user_data_dir(): + ''' + This is a Python reimplemention of `g_get_user_data_dir()` because we don't want to + rely on the python-xdg package and we can't depend on GLib via introspection. + If any changes are made to that function they'll need to be copied here. + ''' + + xdg_data_home = os.environ.get('XDG_DATA_HOME') + if xdg_data_home is not None: + try: + os.makedirs(xdg_data_home, mode=0o700, exist_ok=True) + except EnvironmentError: + # Let's fall back to ~/.local/share below + pass + else: + return xdg_data_home + + homedir = os.path.expanduser('~') + if homedir is not None: + datadir = os.path.join(homedir, '.local', 'share') + try: + os.makedirs(datadir, mode=0o700, exist_ok=True) + except EnvironmentError: + return None + else: + return datadir + + return None + + def get_system_data_dirs(): ''' This is a Python reimplemention of `g_get_system_data_dirs()` because we don't want to -- cgit v1.2.1