mirror of
				https://github.com/astral-sh/uv.git
				synced 2025-10-31 12:06:13 +00:00 
			
		
		
		
	 37a71fd26a
			
		
	
	
		37a71fd26a
		
			
		
	
	
	
		
			
	
		
	
	
		
			Some checks are pending
		
		
	
	CI / Determine changes (push) Waiting to run
				
			CI / cargo clippy | ubuntu (push) Blocked by required conditions
				
			CI / cargo clippy | windows (push) Blocked by required conditions
				
			CI / cargo dev generate-all (push) Blocked by required conditions
				
			CI / cargo shear (push) Waiting to run
				
			CI / cargo test | ubuntu (push) Blocked by required conditions
				
			CI / cargo test | macos (push) Blocked by required conditions
				
			CI / cargo test | windows (push) Blocked by required conditions
				
			CI / check windows trampoline | aarch64 (push) Blocked by required conditions
				
			CI / check windows trampoline | i686 (push) Blocked by required conditions
				
			CI / build binary | windows aarch64 (push) Blocked by required conditions
				
			CI / check windows trampoline | x86_64 (push) Blocked by required conditions
				
			CI / test windows trampoline | i686 (push) Blocked by required conditions
				
			CI / test windows trampoline | x86_64 (push) Blocked by required conditions
				
			CI / typos (push) Waiting to run
				
			CI / mkdocs (push) Waiting to run
				
			CI / check system | python on macos x86-64 (push) Blocked by required conditions
				
			CI / build binary | linux libc (push) Blocked by required conditions
				
			CI / build binary | linux musl (push) Blocked by required conditions
				
			CI / lint (push) Waiting to run
				
			CI / build binary | macos aarch64 (push) Blocked by required conditions
				
			CI / build binary | macos x86_64 (push) Blocked by required conditions
				
			CI / build binary | windows x86_64 (push) Blocked by required conditions
				
			CI / cargo build (msrv) (push) Blocked by required conditions
				
			CI / build binary | freebsd (push) Blocked by required conditions
				
			CI / ecosystem test | pydantic/pydantic-core (push) Blocked by required conditions
				
			CI / ecosystem test | prefecthq/prefect (push) Blocked by required conditions
				
			CI / integration test | pypy on ubuntu (push) Blocked by required conditions
				
			CI / ecosystem test | pallets/flask (push) Blocked by required conditions
				
			CI / smoke test | linux (push) Blocked by required conditions
				
			CI / check system | alpine (push) Blocked by required conditions
				
			CI / smoke test | macos (push) Blocked by required conditions
				
			CI / smoke test | windows x86_64 (push) Blocked by required conditions
				
			CI / smoke test | windows aarch64 (push) Blocked by required conditions
				
			CI / integration test | conda on ubuntu (push) Blocked by required conditions
				
			CI / integration test | deadsnakes python3.9 on ubuntu (push) Blocked by required conditions
				
			CI / integration test | free-threaded on linux (push) Blocked by required conditions
				
			CI / integration test | free-threaded on windows (push) Blocked by required conditions
				
			CI / integration test | pypy on windows (push) Blocked by required conditions
				
			CI / integration test | graalpy on ubuntu (push) Blocked by required conditions
				
			CI / integration test | graalpy on windows (push) Blocked by required conditions
				
			CI / integration test | github actions (push) Blocked by required conditions
				
			CI / integration test | free-threaded python on github actions (push) Blocked by required conditions
				
			CI / integration test | determine publish changes (push) Blocked by required conditions
				
			CI / integration test | uv publish (push) Blocked by required conditions
				
			CI / integration test | uv_build (push) Blocked by required conditions
				
			CI / check cache | ubuntu (push) Blocked by required conditions
				
			CI / check cache | macos aarch64 (push) Blocked by required conditions
				
			CI / check system | python on debian (push) Blocked by required conditions
				
			CI / check system | python on fedora (push) Blocked by required conditions
				
			CI / check system | python on ubuntu (push) Blocked by required conditions
				
			CI / check system | python on opensuse (push) Blocked by required conditions
				
			CI / check system | python on rocky linux 8 (push) Blocked by required conditions
				
			CI / check system | python on rocky linux 9 (push) Blocked by required conditions
				
			CI / check system | pypy on ubuntu (push) Blocked by required conditions
				
			CI / check system | pyston (push) Blocked by required conditions
				
			CI / check system | python on macos aarch64 (push) Blocked by required conditions
				
			CI / check system | homebrew python on macos aarch64 (push) Blocked by required conditions
				
			CI / check system | python3.10 on windows x86-64 (push) Blocked by required conditions
				
			CI / check system | python3.10 on windows x86 (push) Blocked by required conditions
				
			CI / check system | python3.13 on windows x86-64 (push) Blocked by required conditions
				
			CI / check system | x86-64 python3.13 on windows aarch64 (push) Blocked by required conditions
				
			CI / check system | windows registry (push) Blocked by required conditions
				
			CI / check system | python3.12 via chocolatey (push) Blocked by required conditions
				
			CI / check system | python3.9 via pyenv (push) Blocked by required conditions
				
			CI / check system | python3.13 (push) Blocked by required conditions
				
			CI / check system | conda3.11 on macos aarch64 (push) Blocked by required conditions
				
			CI / check system | conda3.8 on macos aarch64 (push) Blocked by required conditions
				
			CI / check system | conda3.11 on linux x86-64 (push) Blocked by required conditions
				
			CI / check system | conda3.8 on linux x86-64 (push) Blocked by required conditions
				
			CI / check system | conda3.11 on windows x86-64 (push) Blocked by required conditions
				
			CI / check system | conda3.8 on windows x86-64 (push) Blocked by required conditions
				
			CI / check system | amazonlinux (push) Blocked by required conditions
				
			CI / check system | embedded python3.10 on windows x86-64 (push) Blocked by required conditions
				
			CI / benchmarks (push) Blocked by required conditions
				
			Currently, `uv init` works without a `git` executable, and with a working `git` executable, but not with a broken `git`, be it from GitHub Action's Windows CI or from the shim we insert. `uv init` calls git twice: Once `git rev-parse` to check whether a git repo already exists, and then `git init` (if there is no git repository yet and no `--vcs none`). By separately handling the cases where git failed during `git rev-parse` doesn't work vs. where the is no repository when checking for an existing repo work tree, we can avoid calling `git init` for broken git and erroring. We have to hardcode the expected git command outputs to be able to check.
		
			
				
	
	
		
			96 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use std::io::Write;
 | |
| use std::path::{Path, PathBuf};
 | |
| use std::process::{Command, Stdio};
 | |
| 
 | |
| use serde::Deserialize;
 | |
| use uv_git::GIT;
 | |
| 
 | |
| #[derive(Debug, thiserror::Error)]
 | |
| pub enum VersionControlError {
 | |
|     #[error("Attempted to initialize a Git repository, but `git` was not found in PATH")]
 | |
|     GitNotInstalled,
 | |
|     #[error("Failed to initialize Git repository at `{0}`\nstdout: {1}\nstderr: {2}")]
 | |
|     GitInit(PathBuf, String, String),
 | |
|     #[error("`git` command failed")]
 | |
|     GitCommand(#[source] std::io::Error),
 | |
|     #[error(transparent)]
 | |
|     Io(#[from] std::io::Error),
 | |
| }
 | |
| 
 | |
| /// The version control system to use.
 | |
| #[derive(Clone, Copy, Debug, PartialEq, Default, Deserialize)]
 | |
| #[serde(deny_unknown_fields, rename_all = "kebab-case")]
 | |
| #[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
 | |
| #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
 | |
| pub enum VersionControlSystem {
 | |
|     /// Use Git for version control.
 | |
|     #[default]
 | |
|     Git,
 | |
|     /// Do not use any version control system.
 | |
|     None,
 | |
| }
 | |
| 
 | |
| impl VersionControlSystem {
 | |
|     /// Initializes the VCS system based on the provided path.
 | |
|     pub fn init(&self, path: &Path) -> Result<(), VersionControlError> {
 | |
|         match self {
 | |
|             Self::Git => {
 | |
|                 let Ok(git) = GIT.as_ref() else {
 | |
|                     return Err(VersionControlError::GitNotInstalled);
 | |
|                 };
 | |
| 
 | |
|                 let output = Command::new(git)
 | |
|                     .arg("init")
 | |
|                     .current_dir(path)
 | |
|                     .stdout(Stdio::piped())
 | |
|                     .stderr(Stdio::piped())
 | |
|                     .output()
 | |
|                     .map_err(VersionControlError::GitCommand)?;
 | |
|                 if !output.status.success() {
 | |
|                     let stdout = String::from_utf8_lossy(&output.stdout);
 | |
|                     let stderr = String::from_utf8_lossy(&output.stderr);
 | |
|                     return Err(VersionControlError::GitInit(
 | |
|                         path.to_path_buf(),
 | |
|                         stdout.to_string(),
 | |
|                         stderr.to_string(),
 | |
|                     ));
 | |
|                 }
 | |
| 
 | |
|                 // Create the `.gitignore`, if it doesn't exist.
 | |
|                 match fs_err::OpenOptions::new()
 | |
|                     .write(true)
 | |
|                     .create_new(true)
 | |
|                     .open(path.join(".gitignore"))
 | |
|                 {
 | |
|                     Ok(mut file) => file.write_all(GITIGNORE.as_bytes())?,
 | |
|                     Err(err) if err.kind() == std::io::ErrorKind::AlreadyExists => (),
 | |
|                     Err(err) => return Err(err.into()),
 | |
|                 }
 | |
| 
 | |
|                 Ok(())
 | |
|             }
 | |
|             Self::None => Ok(()),
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl std::fmt::Display for VersionControlSystem {
 | |
|     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 | |
|         match self {
 | |
|             Self::Git => write!(f, "git"),
 | |
|             Self::None => write!(f, "none"),
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| const GITIGNORE: &str = "# Python-generated files
 | |
| __pycache__/
 | |
| *.py[oc]
 | |
| build/
 | |
| dist/
 | |
| wheels/
 | |
| *.egg-info
 | |
| 
 | |
| # Virtual environments
 | |
| .venv
 | |
| ";
 |