From 17ff88902ba089285a8d635c4bda05dbaea94131 Mon Sep 17 00:00:00 2001 From: Remo Senekowitsch Date: Wed, 10 Sep 2025 18:19:41 +0200 Subject: [PATCH] Avoid initializing nested Git repository Previously a Git repository was initialized if a Cargo workspace was detected. However, it's also possible for users to initialize rustlings in an existing Git repository that doesn't contain a Cargo workspace. In that case, it's still undesirable to initialize a nested Git repository for rustlings. We therefore search all ancestors of the current working directory for `.git` or `.jj` directories to determine if rustlings is being initialized in an existing Git repository. --- src/init.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/init.rs b/src/init.rs index 971b0e51..2987907e 100644 --- a/src/init.rs +++ b/src/init.rs @@ -29,6 +29,21 @@ pub fn init() -> Result<()> { bail!(RUSTLINGS_DIR_ALREADY_EXISTS_ERR); } + let is_inside_vcs_repository = 'detect_repo: { + let Ok(mut dir) = std::env::current_dir() else { + break 'detect_repo false; + }; + loop { + if dir.join(".git").exists() || dir.join(".jj").exists() { + break 'detect_repo true; + } + match dir.parent() { + Some(parent) => dir = parent.into(), + None => break 'detect_repo false, + } + } + }; + let locate_project_output = Command::new("cargo") .arg("locate-project") .arg("-q") @@ -59,7 +74,7 @@ pub fn init() -> Result<()> { } let mut stdout = io::stdout().lock(); - let mut init_git = true; + let mut init_git = !is_inside_vcs_repository; if locate_project_output.status.success() { if Path::new("exercises").exists() && Path::new("solutions").exists() {