diff --git a/keymapper/config.py b/keymapper/config.py index 1c8de78d..17e1e470 100644 --- a/keymapper/config.py +++ b/keymapper/config.py @@ -27,7 +27,7 @@ import json import shutil import copy -from keymapper.paths import CONFIG +from keymapper.paths import CONFIG, touch from keymapper.logger import logger @@ -98,10 +98,7 @@ class _Config: def save_config(self): """Save the config to the file system.""" - if not os.path.exists(CONFIG_PATH): - logger.debug('Creating "%s"', CONFIG_PATH) - os.makedirs(os.path.dirname(CONFIG_PATH), exist_ok=True) - os.mknod(CONFIG_PATH) + touch(CONFIG_PATH) with open(CONFIG_PATH, 'w') as file: json.dump(self._config, file, indent=4) diff --git a/keymapper/logger.py b/keymapper/logger.py index 234b83b5..0a8d0045 100644 --- a/keymapper/logger.py +++ b/keymapper/logger.py @@ -113,8 +113,7 @@ def add_filehandler(path='~/.log/key-mapper'): log_path = os.path.expanduser(path) log_file = os.path.join(log_path, 'log') - if not os.path.exists(log_path): - os.makedirs(log_path) + os.makedirs(log_path, exist_ok=True) if os.path.exists(log_file): # keep the log path small, start from scratch each time diff --git a/keymapper/mapping.py b/keymapper/mapping.py index 7cf0be11..60d4ff9a 100644 --- a/keymapper/mapping.py +++ b/keymapper/mapping.py @@ -24,11 +24,10 @@ import os import json -import shutil import copy from keymapper.logger import logger -from keymapper.paths import get_config_path +from keymapper.paths import get_config_path, touch def keep_reverse_mapping_intact(func): @@ -171,12 +170,7 @@ class Mapping: path = get_config_path(device, preset) logger.info('Saving preset to %s', path) - if not os.path.exists(path): - logger.debug('Creating "%s"', path) - os.makedirs(os.path.dirname(path), exist_ok=True) - os.mknod(path) - # if this is done with sudo rights, give the file to the user - shutil.chown(path, os.getlogin(), os.getlogin()) + touch(path) with open(path, 'w') as file: # make sure to keep the option to add metadata if ever needed, diff --git a/keymapper/paths.py b/keymapper/paths.py index f157d483..6c0edd5b 100644 --- a/keymapper/paths.py +++ b/keymapper/paths.py @@ -23,11 +23,45 @@ import os +import shutil + +from keymapper.logger import logger CONFIG = os.path.join('/home', os.getlogin(), '.config/key-mapper') +def touch(path, log=True): + """Create an empty file and all its parent dirs, give it to the user.""" + if os.path.exists(path): + return + + if log: + logger.info('Creating file "%s"', path) + + mkdir(os.path.dirname(path), log=False) + + os.mknod(path) + shutil.chown(path, os.getlogin(), os.getlogin()) + + +def mkdir(path, log=True): + """Create a folder, give it to the user.""" + if os.path.exists(path): + return + + if log: + logger.info('Creating dir "%s"', path) + + # give all newly created folders to the user. + # e.g. if .config/key-mapper/mouse/ is created the latter two + base = os.path.split(path)[0] + mkdir(base, log=False) + + os.makedirs(path) + shutil.chown(path, os.getlogin(), os.getlogin()) + + def get_config_path(device=None, preset=None): """Get a path to the stored preset, or to store a preset to.""" if device is None: diff --git a/keymapper/presets.py b/keymapper/presets.py index 3b165e00..3f51f51b 100644 --- a/keymapper/presets.py +++ b/keymapper/presets.py @@ -26,7 +26,7 @@ import os import time import glob -from keymapper.paths import get_config_path +from keymapper.paths import get_config_path, mkdir from keymapper.logger import logger from keymapper.getdevices import get_devices @@ -53,8 +53,7 @@ def get_presets(device): device : string """ device_folder = get_config_path(device) - if not os.path.exists(device_folder): - os.makedirs(device_folder) + mkdir(device_folder) paths = glob.glob(os.path.join(device_folder, '*.json')) presets = [