From 2c9b039d21b849b98bbb574781d26694af44911b Mon Sep 17 00:00:00 2001 From: deadc0de6 Date: Fri, 15 Sep 2017 13:13:19 +0200 Subject: [PATCH] move profiles dotfiles under sub-entry "dotfiles" --- README.md | 18 +++++++++----- dotdrop/config.py | 60 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 58 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 6d164f9..d2c34f2 100644 --- a/README.md +++ b/README.md @@ -121,10 +121,12 @@ the config files, for example: ... profiles: host1: - - f_vimrc - - f_xinitrc + dotfiles: + - f_vimrc + - f_xinitrc host2: - - f_vimrc + dotfiles: + - f_vimrc ... ``` @@ -203,6 +205,7 @@ the following entries: ``` : + dotfiles: - - - ... @@ -295,7 +298,8 @@ dotfiles: - vundle profiles: home: - - f_vimrc + dotfiles: + - f_vimrc ``` Thus when `f_vimrc` is installed, the command @@ -379,9 +383,11 @@ dotfiles: src: xinitrc profiles: home: - - f_xinitrc + dotfiles: + - f_xinitrc office: - - f_xinitrc + dotfiles: + - f_xinitrc ``` Installing the dotfiles (the `--profile` switch is not needed if diff --git a/dotdrop/config.py b/dotdrop/config.py index a31095c..1eff5af 100644 --- a/dotdrop/config.py +++ b/dotdrop/config.py @@ -14,10 +14,11 @@ from action import Action class Cfg: key_all = 'ALL' key_config = 'config' - key_profiles = 'profiles' key_dotfiles = 'dotfiles' key_actions = 'actions' key_dotpath = 'dotpath' + key_profiles = 'profiles' + key_profiles_dots = 'dotfiles' key_dotfiles_src = 'src' key_dotfiles_dst = 'dst' key_dotfiles_link = 'link' @@ -53,8 +54,22 @@ class Cfg: if self.key_dotfiles not in self.content: self.log.err('missing \"%s\" in config' % (self.key_dotfiles)) return False + if self.content[self.key_profiles]: + one = list(self.content[self.key_profiles].keys())[0] + if self.key_profiles_dots not in \ + self.content[self.key_profiles][one]: + self._migrate_conf() return True + def _migrate_conf(self): + """ make sure dotfiles are in a sub + "dotfiles" entry in profiles (#12) """ + new = {} + for k, v in self.content[self.key_profiles].items(): + new[k] = {self.key_profiles_dots: v} + self.content[self.key_profiles] = new + self._save(self.content, self.cfgpath) + def _parse_actions(self, actions, entries): """ parse actions specified for an element """ res = [] @@ -77,6 +92,7 @@ class Cfg: self.profiles = self.content[self.key_profiles] if self.profiles is None: self.profiles = {} + self.content[self.key_profiles] = {} # parse the configs self.configs = self.content[self.key_config] # parse the dotfiles @@ -96,12 +112,15 @@ class Cfg: # attribute dotfiles to each profile for k, v in self.profiles.items(): self.prodots[k] = [] - if v is None: + dots = None + if self.key_profiles_dots in v: + dots = v[self.key_profiles_dots] + if dots is None: continue - if len(v) == 1 and v == [self.key_all]: + if len(dots) == 1 and dots == [self.key_all]: self.prodots[k] = self.dotfiles.values() else: - self.prodots[k].extend([self.dotfiles[dot] for dot in v]) + self.prodots[k].extend([self.dotfiles[d] for d in dots]) # make sure we have an absolute dotpath self.curdotpath = self.configs[self.key_dotpath] self.configs[self.key_dotpath] = self._get_abs_dotpath(self.curdotpath) @@ -131,17 +150,25 @@ class Cfg: self.key_dotfiles_dst: dotfile.dst, self.key_dotfiles_src: dotfile.src } + if link: dots[dotfile.key][self.key_dotfiles_link] = True + profiles = self.profiles - if profile in profiles and profiles[profile] != [self.key_all]: - if self.content[self.key_profiles][profile] is None: - self.content[self.key_profiles][profile] = [] - self.content[self.key_profiles][profile].append(dotfile.key) + if profile in profiles and \ + profiles[profile][self.key_profiles_dots] != [self.key_all]: + # existing profile and not ALL + pro = self.content[self.key_profiles][profile] + if not pro[self.key_profiles_dots]: + pro[self.key_profiles_dots] = [] + pro[self.key_profiles_dots].append(dotfile.key) elif profile not in profiles: - if self.content[self.key_profiles] is None: - self.content[self.key_profiles] = {} - self.content[self.key_profiles][profile] = [dotfile.key] + # new profile + if profile not in self.content[self.key_profiles]: + self.content[self.key_profiles][profile] = {} + pro = self.content[self.key_profiles][profile] + pro[self.key_profiles_dots] = [dotfile.key] + # assign profiles to the content self.profiles = self.content[self.key_profiles] def get_dotfiles(self, profile): @@ -173,9 +200,14 @@ class Cfg: # temporary reset dotpath tmp = self.configs[self.key_dotpath] self.configs[self.key_dotpath] = self.curdotpath - with open(self.cfgpath, 'w') as f: - ret = yaml.dump(self.content, f, - default_flow_style=False, indent=2) + ret = self._save(self.content, self.cfgpath) # restore dotpath self.configs[self.key_dotpath] = tmp return ret + + def _save(self, content, path): + ret = False + with open(path, 'w') as f: + ret = yaml.dump(content, f, + default_flow_style=False, indent=2) + return ret