support XDG Base Directory Specification (closes #765)

This commit is contained in:
Romain Bignon 2012-01-27 17:33:29 +01:00
commit 3a3bbd377e
3 changed files with 39 additions and 11 deletions

View file

@ -21,6 +21,7 @@
from __future__ import with_statement
import os
import shutil
from weboob.core.bcall import BackendsCall
from weboob.core.modules import ModulesLoader, ModuleLoadError
@ -52,17 +53,35 @@ class Weboob(object):
self.scheduler = scheduler
# Create WORKDIR
if workdir is None:
workdir = os.environ.get('WEBOOB_WORKDIR', self.WORKDIR)
self.workdir = os.path.realpath(workdir)
if workdir is not None:
datadir = workdir
elif 'WEBOOB_WORKDIR' in os.environ:
datadir = workdir = os.environ.get('WEBOOB_WORKDIR')
else:
old_workdir = os.path.join(os.path.expanduser('~'), '.weboob')
xdg_config_home = os.environ.get('XDG_CONFIG_HOME', os.path.join(os.path.expanduser('~'), '.config', 'weboob'))
xdg_data_home = os.environ.get('XDG_DATA_HOME', os.path.join(os.path.expanduser('~'), '.local', 'share', 'weboob'))
if not os.path.exists(self.workdir):
os.mkdir(self.workdir, 0700)
elif not os.path.isdir(self.workdir):
self.logger.warning(u'"%s" is not a directory' % self.workdir)
if os.path.isdir(old_workdir):
self.logger.warning('You are using "%s" as working directory. Files are moved into %s and %s.'
% (old_workdir, xdg_config_home, xdg_data_home))
self.create_dir(xdg_config_home)
self.create_dir(xdg_data_home)
for f in os.listdir(old_workdir):
if f in Repositories.SHARE_DIRS:
dest = xdg_data_home
else:
dest = xdg_config_home
shutil.move(os.path.join(old_workdir, f), dest)
os.unlink(old_workdir)
workdir = xdg_config_home
datadir = xdg_data_home
self.workdir = os.path.realpath(workdir)
self.create_dir(workdir)
# Repositories management
self.repositories = Repositories(self.workdir, self.VERSION)
self.repositories = Repositories(datadir, self.VERSION)
# Backends loader
self.modules_loader = ModulesLoader(self.repositories)
@ -77,6 +96,12 @@ class Weboob(object):
# Storage
self.storage = storage
def create_dir(self, name):
if not os.path.exists(name):
os.makedirs(name)
elif not os.path.isdir(name):
self.logger.error(u'"%s" is not a directory' % name)
def __deinit__(self):
self.deinit()

View file

@ -309,6 +309,8 @@ class Repositories(object):
REPOSITORIES_DIR = 'repositories'
ICONS_DIR = 'icons'
SHARE_DIRS = [MODULES_DIR, REPOSITORIES_DIR, ICONS_DIR]
def __init__(self, workdir, version):
self.logger = getLogger('repositories')
self.version = version
@ -318,6 +320,7 @@ class Repositories(object):
self.repos_dir = os.path.join(self.workdir, self.REPOSITORIES_DIR)
self.icons_dir = os.path.join(self.workdir, self.ICONS_DIR)
self.create_dir(self.workdir)
self.create_dir(self.repos_dir)
self.create_dir(self.modules_dir)
self.create_dir(self.icons_dir)
@ -335,9 +338,9 @@ class Repositories(object):
def create_dir(self, name):
if not os.path.exists(name):
os.mkdir(name)
os.makedirs(name)
elif not os.path.isdir(name):
self.logger.warning(u'"%s" is not a directory' % name)
self.logger.error(u'"%s" is not a directory' % name)
def _extend_module_info(self, repos, info):
if repos.local:

View file

@ -237,7 +237,7 @@ class ReplApplication(Cmd, ConsoleApplication):
except ImportError:
pass
else:
history_filepath = os.path.join(self.weboob.WORKDIR, '%s_history' % self.APPNAME)
history_filepath = os.path.join(self.weboob.workdir, '%s_history' % self.APPNAME)
try:
readline.read_history_file(history_filepath)
except IOError: