This commit is contained in:
David Caro 2025-12-26 21:14:01 -05:00 committed by GitHub
commit b534cafc2d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 36 additions and 8 deletions

View file

@ -127,13 +127,25 @@ def install_environment(
# #
# Because of this, we allow specifying "cli" dependencies by prefixing # Because of this, we allow specifying "cli" dependencies by prefixing
# with 'cli:'. # with 'cli:'.
cli_deps = { #
dep for dep in additional_dependencies if dep.startswith('cli:') # We can pass arbitrary arguments to the `cargo install` invocation by
} # adding '--' before the arguments.
lib_deps = set(additional_dependencies) - cli_deps cli_deps = []
lib_deps = []
cargo_params = []
for index, dep in enumerate(additional_dependencies):
if dep == '--':
cargo_params = list(additional_dependencies[index + 1:])
break
if dep.startswith('cli:'):
cli_deps.append(dep)
continue
lib_deps.append(dep)
cli_deps_set = set(cli_deps)
lib_deps_set = set(lib_deps)
packages_to_install: set[tuple[str, ...]] = {('--path', '.')} packages_to_install: set[tuple[str, ...]] = {('--path', '.')}
for cli_dep in cli_deps: for cli_dep in cli_deps_set:
cli_dep = cli_dep.removeprefix('cli:') cli_dep = cli_dep.removeprefix('cli:')
package, _, crate_version = cli_dep.partition(':') package, _, crate_version = cli_dep.partition(':')
if crate_version != '': if crate_version != '':
@ -150,11 +162,12 @@ def install_environment(
tmpdir = ctx.enter_context(tempfile.TemporaryDirectory()) tmpdir = ctx.enter_context(tempfile.TemporaryDirectory())
ctx.enter_context(envcontext((('RUSTUP_HOME', tmpdir),))) ctx.enter_context(envcontext((('RUSTUP_HOME', tmpdir),)))
if len(lib_deps) > 0: if len(lib_deps_set) > 0:
_add_dependencies(prefix, lib_deps) _add_dependencies(prefix, lib_deps_set)
for args in packages_to_install: for args in packages_to_install:
cmd_output_b( cmd_output_b(
'cargo', 'install', '--bins', '--root', envdir, *args, 'cargo', 'install', '--bins', '--root', envdir, *args,
*cargo_params,
cwd=prefix.prefix_dir, cwd=prefix.prefix_dir,
) )

View file

@ -44,13 +44,19 @@ def _make_hello_world(tmp_path):
src_dir.joinpath('main.rs').write_text( src_dir.joinpath('main.rs').write_text(
'fn main() {\n' 'fn main() {\n'
' println!("Hello, world!");\n' ' println!("Hello, world!");\n'
' if cfg!(feature = "foo") {\n'
' println!("With feature foo");\n'
' }\n'
'}\n', '}\n',
) )
tmp_path.joinpath('Cargo.toml').write_text( tmp_path.joinpath('Cargo.toml').write_text(
'[package]\n' '[package]\n'
'name = "hello_world"\n' 'name = "hello_world"\n'
'version = "0.1.0"\n' 'version = "0.1.0"\n'
'edition = "2021"\n', 'edition = "2021"\n'
'\n'
'[features]\n'
'foo = []\n',
) )
@ -113,3 +119,12 @@ def test_run_lib_additional_dependencies(tmp_path):
assert bin_dir.is_dir() assert bin_dir.is_dir()
assert not bin_dir.joinpath('shellharden').exists() assert not bin_dir.joinpath('shellharden').exists()
assert not bin_dir.joinpath('shellharden.exe').exists() assert not bin_dir.joinpath('shellharden.exe').exists()
def test_run_features_additional_dependencies(tmp_path):
_make_hello_world(tmp_path)
deps = ('shellharden:4.2.0', 'git-version')
cargo_params = ('--', '--features', 'foo')
ret = run_language(tmp_path, rust, 'hello_world', deps=deps + cargo_params)
assert ret == (0, b'Hello, world!\nWith feature foo\n')