From 860ecc9b1d1ca4f83765ff8297251a38eb34ce6f Mon Sep 17 00:00:00 2001 From: Douglas Rhine <59268455+dgcampea@users.noreply.github.com> Date: Mon, 7 Jun 2021 19:22:00 +0100 Subject: [PATCH 1/5] add xdg base dir spec support --- rednotebook/util/filesystem.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/rednotebook/util/filesystem.py b/rednotebook/util/filesystem.py index 3c4699ee2..0e248a19b 100644 --- a/rednotebook/util/filesystem.py +++ b/rednotebook/util/filesystem.py @@ -102,7 +102,20 @@ def get_user_dir(self, config): if self.portable: user_dir = os.path.join(self.app_dir, "user") else: + # preserve backward compat: if ~/.rednotebook exists keep using it user_dir = os.path.join(self.user_home_dir, ".rednotebook") + if os.path.exists(user_dir): + pass + elif "XDG_CONFIG_HOME" in os.environ: + user_dir = os.path.join( + os.environ["XDG_CONFIG_HOME"], "rednotebook" + ) + elif "APPDATA" in os.environ and platform.system() == "Windows": + user_dir = os.path.join(os.environ["APPDATA"], "rednotebook") + else: + user_dir = os.path.join( + self.user_home_dir, ".config", "rednotebook" + ) return user_dir From 61b0c13ce02ce0af76c5bf83cde4930d05cc8fc5 Mon Sep 17 00:00:00 2001 From: Douglas Rhine <59268455+dgcampea@users.noreply.github.com> Date: Mon, 7 Jun 2021 19:44:12 +0100 Subject: [PATCH 2/5] use tempfile for temp_dir --- rednotebook/util/filesystem.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rednotebook/util/filesystem.py b/rednotebook/util/filesystem.py index 0e248a19b..10ffc9018 100644 --- a/rednotebook/util/filesystem.py +++ b/rednotebook/util/filesystem.py @@ -23,6 +23,7 @@ import platform import subprocess import sys +import tempfile ENCODING = sys.getfilesystemencoding() or locale.getlocale()[1] or "UTF-8" @@ -78,9 +79,9 @@ def __init__(self, config): self.data_dir = self.default_data_dir # Assert that all dirs and files are in place so that logging can take start - make_directories( - [self.journal_user_dir, self.data_dir, self.template_dir, self.temp_dir] - ) + make_directories([self.journal_user_dir, self.data_dir, self.template_dir]) + self.temp_dir = tempfile.mkdtemp(prefix="rednotebook-") + make_files([(self.config_file, ""), (self.log_file, "")]) self.last_pic_dir = self.user_home_dir @@ -125,7 +126,6 @@ def is_valid_journal_path(self, path): def __getattribute__(self, attr): user_paths = { "template_dir": "templates", - "temp_dir": "tmp", "default_data_dir": "data", "config_file": "configuration.cfg", "log_file": "rednotebook.log", From 290baa0f756e145ddcf62596a49576edd412c479 Mon Sep 17 00:00:00 2001 From: Douglas Rhine <59268455+dgcampea@users.noreply.github.com> Date: Mon, 7 Jun 2021 20:48:00 +0100 Subject: [PATCH 3/5] use XDG_CACHE_HOME for help file required for flatpak --- rednotebook/gui/menu.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/rednotebook/gui/menu.py b/rednotebook/gui/menu.py index af31bf2ba..347233e35 100644 --- a/rednotebook/gui/menu.py +++ b/rednotebook/gui/menu.py @@ -16,6 +16,7 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ----------------------------------------------------------------------- import os +import platform import webbrowser from gi.repository import GdkPixbuf, Gtk @@ -408,7 +409,18 @@ def on_help_menu_item_activate(self, widget): headers=[_("RedNotebook Documentation"), info.version, ""], options={"toc": 1}, ) - utils.show_html_in_browser(html, os.path.join(temp_dir, "help.html")) + + # workaround: for flatpak, temp_dir is located at /tmp which is not visible outside sandbox + # but XDG_CACHE_HOME is. + if platform.system() == "Linux": + cache_dir = os.getenv( + "XDG_CACHE_HOME", os.path.join(os.path.expanduser("~"), ".cache") + ) + help_file = os.path.join(cache_dir, "help.html") + else: + help_file = os.path.join(temp_dir, "help.html") + + utils.show_html_in_browser(html, help_file) def on_online_help(self, widget): webbrowser.open(info.answers_url) From 26d65eba5b53d1c3bfeb6ea2f2f850ca3c89036f Mon Sep 17 00:00:00 2001 From: Douglas Rhine <59268455+dgcampea@users.noreply.github.com> Date: Sat, 11 Sep 2021 15:06:57 +0100 Subject: [PATCH 4/5] use XDG_STATE_HOME for log file --- rednotebook/util/filesystem.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/rednotebook/util/filesystem.py b/rednotebook/util/filesystem.py index 10ffc9018..12cfb7cb8 100644 --- a/rednotebook/util/filesystem.py +++ b/rednotebook/util/filesystem.py @@ -82,7 +82,8 @@ def __init__(self, config): make_directories([self.journal_user_dir, self.data_dir, self.template_dir]) self.temp_dir = tempfile.mkdtemp(prefix="rednotebook-") - make_files([(self.config_file, ""), (self.log_file, "")]) + make_file(self.config_file) + make_file_with_dir(self.log_file, "") self.last_pic_dir = self.user_home_dir self.last_file_dir = self.user_home_dir @@ -132,6 +133,19 @@ def __getattribute__(self, attr): } if attr in user_paths: + if attr == "log_file": + if platform.system() == "Windows": + # do not apply XDG spec for Windows + logpath = self.journal_user_dir + elif "XDG_STATE_HOME" in os.environ: + logpath = os.path.join(os.environ["XDG_STATE_HOME"], "rednotebook") + else: + logpath = os.path.join( + self.user_home_dir, ".local", "state", "rednotebook" + ) + + return os.path.join(logpath, user_paths.get("log_file")) + return os.path.join(self.journal_user_dir, user_paths.get(attr)) return dict.__getattribute__(self, attr) From 6d62f8d8ac6027787dc3e99aef7cc8f7cd40e19f Mon Sep 17 00:00:00 2001 From: Douglas Rhine <59268455+dgcampea@users.noreply.github.com> Date: Sat, 11 Sep 2021 15:13:26 +0100 Subject: [PATCH 5/5] add CHANGELOG entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bf00968a..c58ecdd14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # next (unreleased) * Fix Python crash on start (#583, Max Krummenacher). * Prevent save failures on network and cloud drives (#593, Robert Little). +* Implement XDG Base Directory spec (#581, @dgcampea) # 2.22 (2021-04-25) * Add a "Give Feedback" button (#551, Rahul Jha).