diff --git a/python/gvtest/config.py b/python/gvtest/config.py index c526e5b..5578d59 100644 --- a/python/gvtest/config.py +++ b/python/gvtest/config.py @@ -304,6 +304,13 @@ def resolve_targets( result: Dict[str, Dict] = {} for name in last_targets_names: result[name] = all_defined[name] + + # Store the directory of the config that defined + # the targets, for resolving relative paths + self._targets_config_dir: str | None = ( + str(last_targets_file.parent) + if last_targets_file is not None else None + ) return result def get_targets(self) -> Dict[str, Dict]: diff --git a/python/gvtest/runner.py b/python/gvtest/runner.py index 9f0bacf..1533d64 100644 --- a/python/gvtest/runner.py +++ b/python/gvtest/runner.py @@ -458,13 +458,18 @@ def _resolve_targets_for_dir( return [] # Build Target objects + config_dir: str | None = getattr( + loader, '_targets_config_dir', None + ) targets: list[Target] = [] for name, cfg in yaml_targets.items(): # If CLI specifies targets, filter if (self.target_names != ['default'] and name not in self.target_names): continue - targets.append(Target.from_dict(name, cfg)) + t = Target.from_dict(name, cfg) + t.config_dir = config_dir + targets.append(t) return targets diff --git a/python/gvtest/targets.py b/python/gvtest/targets.py index bec824c..9209d0e 100644 --- a/python/gvtest/targets.py +++ b/python/gvtest/targets.py @@ -53,6 +53,7 @@ def __init__( if config is None: config = '{}' self.config: dict[str, Any] = json.loads(config) + self.config_dir: str | None = None @classmethod def from_dict( @@ -62,6 +63,7 @@ def from_dict( t = cls.__new__(cls) t.name = name t.config = dict(config) + t.config_dir: str | None = None return t def get_name(self) -> str: @@ -70,7 +72,16 @@ def get_name(self) -> str: def get_sourceme(self) -> str | None: sourceme = self.config.get('sourceme') if sourceme is not None: - return _expand_env(sourceme) + sourceme = _expand_env(sourceme) + if not os.path.isabs(sourceme): + config_dir = getattr( + self, 'config_dir', None + ) + if config_dir is not None: + sourceme = os.path.join( + config_dir, sourceme + ) + return sourceme return None def get_envvars(self) -> dict[str, str] | None: