async def generate_command_environment( self, task_name, build_base, dependencies, ): # noqa: D102 if sys.platform == 'win32': raise SkipExtensionException('Not usable on Windows systems') # check if all dependencies are available # removes dependencies available in the environment from the parameter check_dependency_availability( dependencies, script_filename='package.sh') hook_path = build_base / ('colcon_command_prefix_%s.sh' % task_name) expand_template( Path(__file__).parent / 'template' / 'command_prefix.sh.em', hook_path, {'dependencies': dependencies}) cmd = ['.', str(hook_path), '&&', 'env'] env = await get_environment_variables(cmd, cwd=str(build_base)) # write environment variables to file for debugging env_path = build_base / ('colcon_command_prefix_%s.sh.env' % task_name) with env_path.open('w') as h: for key in sorted(env.keys()): value = env[key] h.write('{key}={value}\n'.format_map(locals())) return env
async def generate_command_environment( self, task_name, build_base, dependencies, ): # noqa: D102 global powershell_executable_name if not self._is_primary: raise SkipExtensionException('Not usable outside of PowerShell') # check if all dependencies are available # removes dependencies available in the environment from the parameter check_dependency_availability( dependencies, script_filename='package.ps1') hook_path = build_base / ('colcon_command_prefix_%s.ps1' % task_name) expand_template( Path(__file__).parent / 'template' / 'command_prefix.ps1.em', hook_path, {'dependencies': dependencies}) cmd = [ '.', str(hook_path), ';', '(Get-Item Env:).GetEnumerator()', '|', 'ForEach-Object', '{ "$($_.Key)=$($_.Value)" }' ] if POWERSHELL_EXECUTABLE is None: raise RuntimeError( "Could not find '{powershell_executable_name}' executable" .format(powershell_executable_name=powershell_executable_name)) cmd = [POWERSHELL_EXECUTABLE, '-Command', ' '.join(cmd)] env = await get_environment_variables( cmd, cwd=str(build_base), shell=False) # write environment variables to file for debugging env_path = build_base / \ ('colcon_command_prefix_%s.ps1.env' % task_name) with env_path.open('w') as h: for key in sorted(env.keys()): value = env[key] h.write('{key}={value}\n'.format_map(locals())) return env
def test_check_dependency_availability(): with TemporaryDirectory(prefix='test_colcon_') as prefix_path: prefix_path = Path(prefix_path) dependencies = OrderedDict() dependencies['pkgA'] = prefix_path # missing package with pytest.raises(RuntimeError) as e: check_dependency_availability(dependencies, script_filename='package.ext') assert len(dependencies) == 1 assert 'Failed to find the following files:' in str(e.value) assert str(prefix_path / 'share' / 'pkgA' / 'package.ext') \ in str(e.value) assert 'Check that the following packages have been built:' \ in str(e.value) assert '- pkgA' in str(e.value) # package in workspace (prefix_path / 'share' / 'pkgA').mkdir(parents=True) (prefix_path / 'share' / 'pkgA' / 'package.ext').write_text('') check_dependency_availability(dependencies, script_filename='package.ext') assert len(dependencies) == 1 # package in environment dependencies['pkgA'] = prefix_path / 'invalid' with patch('colcon_core.shell.find_installed_packages_in_environment', side_effect=lambda: {'pkgA': prefix_path / 'env'}): with patch('colcon_core.shell.logger.warning') as warn: check_dependency_availability(dependencies, script_filename='package.ext') assert len(dependencies) == 0 assert warn.call_count == 1 assert len(warn.call_args[0]) == 1 assert warn.call_args[0][0].startswith( "The following packages are in the workspace but haven't been " 'built:') assert '- pkgA' in warn.call_args[0][0] assert 'They are being used from the following locations instead:' \ in warn.call_args[0][0] assert str(prefix_path / 'env') in warn.call_args[0][0] assert '--packages-ignore pkgA' in warn.call_args[0][0]