From 9bed0c4b538c94abd0ef8b5fcb62005761d0665a Mon Sep 17 00:00:00 2001
From: Dmitri Bogomolov <4glitch@gmail.com>
Date: Thu, 23 Apr 2020 13:56:44 +0300
Subject: [PATCH] Use appdirs in first place, it's also a dependency for
 pyopencl

---
 src/namecoin.py | 32 ++-----------------------
 src/paths.py    | 63 ++++++++++++++++++++++++++++++-------------------
 2 files changed, 41 insertions(+), 54 deletions(-)

diff --git a/src/namecoin.py b/src/namecoin.py
index ae2bde79..4a6cf8d5 100644
--- a/src/namecoin.py
+++ b/src/namecoin.py
@@ -6,11 +6,11 @@ Namecoin queries
 import base64
 import httplib
 import json
-import os
 import socket
 import sys
 
 import defaults
+import paths
 import tr  # translate
 from addresses import decodeAddress
 from bmconfigparser import BMConfigParser
@@ -267,34 +267,6 @@ class namecoinConnection(object):
             raise Exception("Socket error in RPC connection: %s" % exc)
 
 
-def lookupNamecoinFolder():
-    """
-    Look up the namecoin data folder.
-
-    .. todo:: Check whether this works on other platforms as well!
-    """
-
-    app = "namecoin"
-    from os import path, environ
-    if sys.platform == "darwin":
-        if "HOME" in environ:
-            dataFolder = path.join(os.environ["HOME"],
-                                   "Library/Application Support/", app) + '/'
-        else:
-            print(
-                "Could not find home folder, please report this message"
-                " and your OS X version to the BitMessage Github."
-            )
-            sys.exit()
-
-    elif "win32" in sys.platform or "win64" in sys.platform:
-        dataFolder = path.join(environ["APPDATA"], app) + "\\"
-    else:
-        dataFolder = path.join(environ["HOME"], ".%s" % app) + "/"
-
-    return dataFolder
-
-
 def ensureNamecoinOptions():
     """
     Ensure all namecoin options are set, by setting those to default values
@@ -313,7 +285,7 @@ def ensureNamecoinOptions():
     # Try to read user/password from .namecoin configuration file.
     defaultUser = ""
     defaultPass = ""
-    nmcFolder = lookupNamecoinFolder()
+    nmcFolder = paths.lookupUserconfigDir('namecoin')
     nmcConfig = nmcFolder + "namecoin.conf"
     try:
         nmc = open(nmcConfig, "r")
diff --git a/src/paths.py b/src/paths.py
index c162f0b3..cb847f37 100644
--- a/src/paths.py
+++ b/src/paths.py
@@ -32,48 +32,63 @@ def lookupExeFolder():
     return exeFolder
 
 
+def lookupUserconfigDir(appname):
+    """Lookup user data directory for the *appname* application"""
+    try:
+        from appdirs import user_config_dir
+        return user_config_dir(appname, False, roaming=True) + os.path.sep
+    except ImportError:
+        pass
+
+    if sys.platform == 'darwin':
+        try:
+            dataFolder = os.path.join(
+                os.environ['HOME'],
+                "Library/Application Support/", appname) + '/'
+        except KeyError:
+            sys.exit(
+                "Could not find home folder, please report this message"
+                " and your OS X version to the BitMessage Github.")
+    elif sys.platform.startswith('win'):
+        dataFolder = os.path.join(
+            os.environ['APPDATA'], appname
+        ).decode(sys.getfilesystemencoding(), 'ignore') + os.path.sep
+    else:
+        dataFolder = os.path.join(
+            os.environ['HOME'], '.%s' % appname) + os.path.sep
+
+    return dataFolder
+
+
 def lookupAppdataFolder():
     """Returns path of the folder where application data is stored"""
     APPNAME = "PyBitmessage"
+
     dataFolder = os.environ.get('BITMESSAGE_HOME')
     if dataFolder:
         if dataFolder[-1] not in (os.path.sep, os.path.altsep):
             dataFolder += os.path.sep
-    elif sys.platform == 'darwin':
-        try:
-            dataFolder = os.path.join(
-                os.environ['HOME'],
-                'Library/Application Support/', APPNAME
-            ) + '/'
+        return dataFolder
 
-        except KeyError:
-            sys.exit(
-                'Could not find home folder, please report this message'
-                ' and your OS X version to the BitMessage Github.')
-    elif sys.platform.startswith('win'):
-        dataFolder = os.path.join(
-            os.environ['APPDATA'], APPNAME
-        ).decode(sys.getfilesystemencoding(), 'ignore') + os.path.sep
+    dataFolder = lookupUserconfigDir(APPNAME)
+    # Try to follow XDG spec on Linux, Unix or BSD
+    # TODO: use pyxdg
+    if os.name == 'posix' and sys.platform != 'darwin':
         try:
-            os.path.isdir(dataFolder)
-        except WindowsError:
-            from appdirs import user_data_dir
-            dataFolder = user_data_dir('PyBitmessage', False)
-    else:
-        try:
-            dataFolder = os.path.join(os.environ['XDG_CONFIG_HOME'], APPNAME)
+            datadir = os.path.join(os.environ['XDG_CONFIG_HOME'], APPNAME)
         except KeyError:
-            dataFolder = os.path.join(os.environ['HOME'], '.config', APPNAME)
+            datadir = os.path.join(os.environ['HOME'], '.config', APPNAME)
 
         # Migrate existing data to the proper location
         # if this is an existing install
         try:
-            move(os.path.join(os.environ['HOME'], '.%s' % APPNAME), dataFolder)
+            move(dataFolder, datadir)
+            dataFolder = datadir + os.path.sep
             logger.info('Moving data folder to %s', dataFolder)
         except IOError:
             # Old directory may not exist.
             pass
-        dataFolder = dataFolder + os.path.sep
+
     return dataFolder