diff --git a/crates/uv-settings/src/lib.rs b/crates/uv-settings/src/lib.rs index 8d78972501a3b..b9ff4f307385b 100644 --- a/crates/uv-settings/src/lib.rs +++ b/crates/uv-settings/src/lib.rs @@ -657,6 +657,7 @@ pub struct EnvironmentOptions { pub no_env_file: EnvFlag, pub venv_seed: EnvFlag, pub venv_clear: EnvFlag, + pub init_bare: EnvFlag, } impl EnvironmentOptions { @@ -749,6 +750,7 @@ impl EnvironmentOptions { no_env_file: EnvFlag::new(EnvVars::UV_NO_ENV_FILE)?, venv_seed: EnvFlag::new(EnvVars::UV_VENV_SEED)?, venv_clear: EnvFlag::new(EnvVars::UV_VENV_CLEAR)?, + init_bare: EnvFlag::new(EnvVars::UV_INIT_BARE)?, }) } } diff --git a/crates/uv-static/src/env_vars.rs b/crates/uv-static/src/env_vars.rs index 9492aaabe7e22..8ce16e0a597a5 100644 --- a/crates/uv-static/src/env_vars.rs +++ b/crates/uv-static/src/env_vars.rs @@ -380,6 +380,11 @@ impl EnvVars { #[attr_added_in("0.3.0")] pub const UV_TOOL_BIN_DIR: &'static str = "UV_TOOL_BIN_DIR"; + /// Equivalent to the `--bare` argument for `uv init`. If set, uv will only create a + /// `pyproject.toml`. + #[attr_added_in("0.10.7")] + pub const UV_INIT_BARE: &'static str = "UV_INIT_BARE"; + /// Equivalent to the `--build-backend` argument for `uv init`. Determines the default backend /// to use when creating a new project. #[attr_added_in("0.8.2")] diff --git a/crates/uv/src/settings.rs b/crates/uv/src/settings.rs index d2e6e1ca2df80..3fbbef3484e7f 100644 --- a/crates/uv/src/settings.rs +++ b/crates/uv/src/settings.rs @@ -431,6 +431,8 @@ impl InitSettings { ) .unwrap_or(kind.packaged_by_default()); + let bare = resolve_flag(bare, "bare", environment.init_bare).is_enabled(); + let filesystem_install_mirrors = filesystem .map(|fs| fs.install_mirrors.clone()) .unwrap_or_default(); diff --git a/crates/uv/tests/it/init.rs b/crates/uv/tests/it/init.rs index de65b7bb5d93f..db128d4fa4986 100644 --- a/crates/uv/tests/it/init.rs +++ b/crates/uv/tests/it/init.rs @@ -647,6 +647,52 @@ fn init_bare_opt_in() { }); } +#[test] +fn init_bare_env_var() { + let context = uv_test::test_context!("3.12"); + + uv_snapshot!(context.filters(), context.init().arg("foo").env(EnvVars::UV_INIT_BARE, "true"), @" + success: true + exit_code: 0 + ----- stdout ----- + + ----- stderr ----- + Initialized project `foo` at `[TEMP_DIR]/foo` + "); + + context + .temp_dir + .child("foo/README.md") + .assert(predicate::path::missing()); + context + .temp_dir + .child("foo/hello.py") + .assert(predicate::path::missing()); + context + .temp_dir + .child("foo/.python-version") + .assert(predicate::path::missing()); + context + .temp_dir + .child("foo/.git") + .assert(predicate::path::missing()); + + let pyproject = context.read("foo/pyproject.toml"); + insta::with_settings!({ + filters => context.filters(), + }, { + assert_snapshot!( + pyproject, @r#" + [project] + name = "foo" + version = "0.1.0" + requires-python = ">=3.12" + dependencies = [] + "# + ); + }); +} + // General init --script correctness test #[test] fn init_script() -> Result<()> {