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