diff --git a/frappyman.py b/frappyman.py index 104f3dd..4287ed7 100644 --- a/frappyman.py +++ b/frappyman.py @@ -377,16 +377,29 @@ class FrappyManager(ServiceManager): proposed_cfg[service] = proposed self.state[f'sea {service}'] = seacfg - given_addons = givencfgs.get('addons', '') - running_addons = self.frappy_cfgs.get('addons', '') - if running_addons: - for cfg in running_addons.split(','): - seacfg = self.frappy2sea.get(cfg.strip()) - if seacfg is not None and seacfg.endswith('.addon') and seacfg[:-6] not in sealist[2:]: - proposed_cfg['addons'] = {running_addons} - break - elif given_addons: - proposed_cfg['addons'] = {given_addons} + running_addons = self.frappy_cfgs.get('addons') + running_addons = set(','.split(running_addons)) if running_addons else () + proposed_addons = set() + running_sea_addons = set() + for cfg in running_addons: + seacfg = self.frappy2sea.get(cfg.strip()) + if seacfg is None: + proposed_addons.add(cfg) # addons with no sea cfg should be kept + elif seacfg.endswith('.addon') and seacfg[:-6] in sealist[2:]: + proposed_addons.add(cfg) + running_sea_addons.add(seacfg) + + for scfg in sealist[2:]: + seacfg = scfg + '.addon' + if seacfg not in running_sea_addons: + proposed = self.sea2frappy.get(seacfg) or set() + if proposed: + if len(proposed) > 1: + self.error = f'ambiguous frappy cfg for {seacfg}.addon: {proposed}' + else: + proposed_addons |= proposed + if proposed_addons and set(proposed_addons) != set(running_addons): + proposed_cfg['addons'] = {','.join(sorted(proposed_addons))} for service in FrappyManager.services: given = givencfgs.get(service) @@ -412,7 +425,7 @@ class FrappyManager(ServiceManager): proposed = running if proposed is None: self.remarks[service] = 'ambiguous frappy cfg' - self.error = True + self.error = f'ambiguous frappy cfg for {seacfg}: {available}' else: self.remarks[service] = '' if running == proposed: