Fix the issues with non-ASCII characters in path on Windows #1613

Open
g1itch wants to merge 4 commits from g1itch/windows into v0.6
4 changed files with 46 additions and 53 deletions

View File

@ -12,7 +12,7 @@ The PyBitmessage startup script
import os import os
import sys import sys
app_dir = os.path.dirname(os.path.abspath(__file__)) app_dir = os.path.dirname(os.path.abspath(unicode(__file__)))
os.chdir(app_dir) os.chdir(app_dir)
sys.path.insert(0, app_dir) sys.path.insert(0, app_dir)

View File

@ -29,7 +29,8 @@ class sqlThread(threading.Thread):
def run(self): # pylint: disable=too-many-locals, too-many-branches, too-many-statements def run(self): # pylint: disable=too-many-locals, too-many-branches, too-many-statements
"""Process SQL queries from `.helper_sql.sqlSubmitQueue`""" """Process SQL queries from `.helper_sql.sqlSubmitQueue`"""
helper_sql.sql_available = True helper_sql.sql_available = True
self.conn = sqlite3.connect(state.appdata + 'messages.dat') self.conn = sqlite3.connect(
os.path.join(state.appdata, 'messages.dat'))
self.conn.text_factory = str self.conn.text_factory = str
self.cur = self.conn.cursor() self.cur = self.conn.cursor()

View File

@ -6,11 +6,11 @@ Namecoin queries
import base64 import base64
import httplib import httplib
import json import json
import os
import socket import socket
import sys import sys
import defaults import defaults
import paths
import tr # translate import tr # translate
from addresses import decodeAddress from addresses import decodeAddress
from bmconfigparser import BMConfigParser from bmconfigparser import BMConfigParser
@ -267,34 +267,6 @@ class namecoinConnection(object):
raise Exception("Socket error in RPC connection: %s" % exc) 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(): def ensureNamecoinOptions():
""" """
Ensure all namecoin options are set, by setting those to default values 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. # Try to read user/password from .namecoin configuration file.
defaultUser = "" defaultUser = ""
defaultPass = "" defaultPass = ""
nmcFolder = lookupNamecoinFolder() nmcFolder = paths.lookupUserconfigDir('namecoin')
nmcConfig = nmcFolder + "namecoin.conf" nmcConfig = nmcFolder + "namecoin.conf"
try: try:
nmc = open(nmcConfig, "r") nmc = open(nmcConfig, "r")

View File

@ -23,7 +23,8 @@ def lookupExeFolder():
# targetdir/Bitmessage.app/Contents/MacOS/Bitmessage # targetdir/Bitmessage.app/Contents/MacOS/Bitmessage
os.path.dirname(sys.executable).split(os.path.sep)[0] + os.path.sep os.path.dirname(sys.executable).split(os.path.sep)[0] + os.path.sep
if frozen == "macosx_app" else if frozen == "macosx_app" else
os.path.dirname(sys.executable) + os.path.sep) os.path.dirname(sys.executable).decode(
sys.getfilesystemencoding(), 'ignore') + os.path.sep)
elif __file__: elif __file__:
exeFolder = os.path.dirname(__file__) + os.path.sep exeFolder = os.path.dirname(__file__) + os.path.sep
else: else:
@ -31,44 +32,63 @@ def lookupExeFolder():
return exeFolder 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(): def lookupAppdataFolder():
"""Returns path of the folder where application data is stored""" """Returns path of the folder where application data is stored"""
APPNAME = "PyBitmessage" APPNAME = "PyBitmessage"
dataFolder = os.environ.get('BITMESSAGE_HOME') dataFolder = os.environ.get('BITMESSAGE_HOME')
if dataFolder: if dataFolder:
if dataFolder[-1] not in (os.path.sep, os.path.altsep): if dataFolder[-1] not in (os.path.sep, os.path.altsep):
dataFolder += os.path.sep dataFolder += os.path.sep
elif sys.platform == 'darwin': return dataFolder
try:
dataFolder = os.path.join(
os.environ['HOME'],
'Library/Application Support/', APPNAME
) + '/'
except KeyError: dataFolder = lookupUserconfigDir(APPNAME)
sys.exit( # Try to follow XDG spec on Linux, Unix or BSD
'Could not find home folder, please report this message' # TODO: use pyxdg
' and your OS X version to the BitMessage Github.') if os.name == 'posix' and sys.platform != 'darwin':
elif 'win32' in sys.platform or 'win64' in sys.platform:
dataFolder = os.path.join(
os.environ['APPDATA'].decode(
sys.getfilesystemencoding(), 'ignore'), APPNAME
) + os.path.sep
else:
try: try:
dataFolder = os.path.join(os.environ['XDG_CONFIG_HOME'], APPNAME) datadir = os.path.join(os.environ['XDG_CONFIG_HOME'], APPNAME)
except KeyError: 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 # Migrate existing data to the proper location
# if this is an existing install # if this is an existing install
try: 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) logger.info('Moving data folder to %s', dataFolder)
except IOError: except IOError:
# Old directory may not exist. # Old directory may not exist.
pass pass
dataFolder = dataFolder + os.path.sep
return dataFolder return dataFolder