git: Fix staging file hunks on Windows (#26661)

Closes #26458 

I had checked, and also reference the implementation in vscode.

Release Notes:

- N/A

---------

Co-authored-by: 张小白 <364772080@qq.com>
This commit is contained in:
CharlesChen0823 2025-03-26 15:46:04 +08:00 committed by GitHub
parent a02f7e5cda
commit de67d93a92
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -10,7 +10,8 @@ use parking_lot::Mutex;
use rope::Rope; use rope::Rope;
use schemars::JsonSchema; use schemars::JsonSchema;
use serde::Deserialize; use serde::Deserialize;
use std::borrow::Borrow; use std::borrow::{Borrow, Cow};
use std::ffi::OsStr;
use std::future; use std::future;
use std::path::Component; use std::path::Component;
use std::process::{ExitStatus, Stdio}; use std::process::{ExitStatus, Stdio};
@ -550,7 +551,7 @@ impl GitRepository for RealGitRepository {
.current_dir(&working_directory) .current_dir(&working_directory)
.envs(env) .envs(env)
.args(["update-index", "--add", "--cacheinfo", "100644", &sha]) .args(["update-index", "--add", "--cacheinfo", "100644", &sha])
.arg(path.as_ref()) .arg(path.to_unix_style())
.output() .output()
.await?; .await?;
@ -565,7 +566,7 @@ impl GitRepository for RealGitRepository {
.current_dir(&working_directory) .current_dir(&working_directory)
.envs(env) .envs(env)
.args(["update-index", "--force-remove"]) .args(["update-index", "--force-remove"])
.arg(path.as_ref()) .arg(path.to_unix_style())
.output() .output()
.await?; .await?;
@ -779,7 +780,7 @@ impl GitRepository for RealGitRepository {
.current_dir(&working_directory?) .current_dir(&working_directory?)
.envs(env) .envs(env)
.args(["update-index", "--add", "--remove", "--"]) .args(["update-index", "--add", "--remove", "--"])
.args(paths.iter().map(|p| p.as_ref())) .args(paths.iter().map(|p| p.to_unix_style()))
.output() .output()
.await?; .await?;
@ -1336,6 +1337,20 @@ impl RepoPath {
RepoPath(path.into()) RepoPath(path.into())
} }
pub fn to_unix_style(&self) -> Cow<'_, OsStr> {
#[cfg(target_os = "windows")]
{
use std::ffi::OsString;
let path = self.0.as_os_str().to_string_lossy().replace("\\", "/");
Cow::Owned(OsString::from(path))
}
#[cfg(not(target_os = "windows"))]
{
Cow::Borrowed(self.0.as_os_str())
}
}
} }
impl std::fmt::Display for RepoPath { impl std::fmt::Display for RepoPath {