diff --git a/riocli/parameter/upload.py b/riocli/parameter/upload.py index 53835fac..7231a3d1 100644 --- a/riocli/parameter/upload.py +++ b/riocli/parameter/upload.py @@ -50,7 +50,11 @@ def upload_configurations( """ Upload a directories as configuration parameters. """ - trees = filter_trees(path, tree_names) + try: + trees = filter_trees(path, tree_names) + except Exception as e: + click.secho('{} {}'.format(Symbols.ERROR, e), fg=Colors.RED) + raise SystemExit(1) click.secho('Following configuration trees will be uploaded') click.secho() diff --git a/riocli/parameter/utils.py b/riocli/parameter/utils.py index ed527c92..4ac41ee1 100644 --- a/riocli/parameter/utils.py +++ b/riocli/parameter/utils.py @@ -14,6 +14,7 @@ import filecmp import json import os +import re import typing from filecmp import dircmp @@ -39,6 +40,9 @@ def filter_trees( if tree_names and each not in tree_names: continue + if not is_valid_tree_name(each): + raise Exception('Invalid tree name \'{}\'. Tree name must be 3-50 characters ' + 'and can contain letters, digits, _ and -'.format(each)) trees.append(each) if tree_names and not trees: @@ -91,3 +95,8 @@ def phase3(self) -> None: self.common_files, shallow=False) self.same_files, self.diff_files, self.funny_files = f_comp + + +def is_valid_tree_name(name: str) -> bool: + """Validates a config tree name""" + return bool(re.match(r'^[0-9A-Za-z][0-9A-Za-z._-]{0,49}$', name))