Prevent command prompt from opening when running git blame on windows (#10747)

Jason Wen created

Release Notes:

- Fixed issue reported in discord where the git blame feature would open
command prompt windows

Change summary

Cargo.lock               |  1 +
crates/git/Cargo.toml    |  1 +
crates/git/src/blame.rs  | 14 ++++++++++++--
crates/git/src/commit.rs | 14 ++++++++++++--
4 files changed, 26 insertions(+), 4 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -4327,6 +4327,7 @@ dependencies = [
  "time",
  "unindent",
  "url",
+ "windows 0.53.0",
 ]
 
 [[package]]

crates/git/Cargo.toml 🔗

@@ -24,6 +24,7 @@ text.workspace = true
 time.workspace = true
 url.workspace = true
 serde.workspace = true
+windows.workspace = true
 
 [dev-dependencies]
 unindent.workspace = true

crates/git/src/blame.rs 🔗

@@ -14,6 +14,9 @@ use time::OffsetDateTime;
 use time::UtcOffset;
 use url::Url;
 
+#[cfg(windows)]
+use std::os::windows::process::CommandExt;
+
 pub use git2 as libgit;
 
 #[derive(Debug, Clone, Default)]
@@ -76,7 +79,9 @@ fn run_git_blame(
     path: &Path,
     contents: &Rope,
 ) -> Result<String> {
-    let child = Command::new(git_binary)
+    let mut child = Command::new(git_binary);
+
+    child
         .current_dir(working_directory)
         .arg("blame")
         .arg("--incremental")
@@ -85,7 +90,12 @@ fn run_git_blame(
         .arg(path.as_os_str())
         .stdin(Stdio::piped())
         .stdout(Stdio::piped())
-        .stderr(Stdio::piped())
+        .stderr(Stdio::piped());
+
+    #[cfg(windows)]
+    child.creation_flags(windows::Win32::System::Threading::CREATE_NO_WINDOW.0);
+
+    let child = child
         .spawn()
         .map_err(|e| anyhow!("Failed to start git blame process: {}", e))?;
 

crates/git/src/commit.rs 🔗

@@ -4,15 +4,25 @@ use collections::HashMap;
 use std::path::Path;
 use std::process::Command;
 
+#[cfg(windows)]
+use std::os::windows::process::CommandExt;
+
 pub fn get_messages(working_directory: &Path, shas: &[Oid]) -> Result<HashMap<Oid, String>> {
     const MARKER: &'static str = "<MARKER>";
 
-    let output = Command::new("git")
+    let mut command = Command::new("git");
+
+    command
         .current_dir(working_directory)
         .arg("show")
         .arg("-s")
         .arg(format!("--format=%B{}", MARKER))
-        .args(shas.iter().map(ToString::to_string))
+        .args(shas.iter().map(ToString::to_string));
+
+    #[cfg(windows)]
+    command.creation_flags(windows::Win32::System::Threading::CREATE_NO_WINDOW.0);
+
+    let output = command
         .output()
         .map_err(|e| anyhow!("Failed to start git blame process: {}", e))?;