@@ -45,9 +45,9 @@ pub fn try_os_str_into_bstr(path: Cow<'_, OsStr>) -> Result<Cow<'_, BStr>, Utf8E
4545 }
4646}
4747
48- /// Convert the given path either into its raw bytes on unix or its UTF8 encoded counterpart on windows .
48+ /// Convert the given path either into its raw bytes on Unix or its UTF-8 encoded counterpart on Windows .
4949///
50- /// On windows , if the source Path contains ill-formed, lone surrogates, the UTF-8 conversion will fail
50+ /// On Windows , if the source ` Path`` contains ill-formed, lone surrogates, the UTF-8 conversion will fail
5151/// causing `Utf8Error` to be returned.
5252pub fn try_into_bstr < ' a > ( path : impl Into < Cow < ' a , Path > > ) -> Result < Cow < ' a , BStr > , Utf8Error > {
5353 let path = path. into ( ) ;
@@ -86,7 +86,7 @@ pub fn try_into_bstr<'a>(path: impl Into<Cow<'a, Path>>) -> Result<Cow<'a, BStr>
8686 Ok ( path_str)
8787}
8888
89- /// Similar to [`try_into_bstr()`] but **panics** if malformed surrogates are encountered on windows .
89+ /// Similar to [`try_into_bstr()`] but **panics** if malformed surrogates are encountered on Windows .
9090pub fn into_bstr < ' a > ( path : impl Into < Cow < ' a , Path > > ) -> Cow < ' a , BStr > {
9191 try_into_bstr ( path) . expect ( "prefix path doesn't contain ill-formed UTF-8" )
9292}
@@ -101,11 +101,11 @@ pub fn join_bstr_unix_pathsep<'a, 'b>(base: impl Into<Cow<'a, BStr>>, path: impl
101101 base
102102}
103103
104- /// Given `input` bytes, produce a `Path` from them ignoring encoding entirely if on unix .
104+ /// Given `input` bytes, produce a `Path` from them ignoring encoding entirely if on Unix .
105105///
106- /// On windows , the input is required to be valid UTF-8, which is guaranteed if we wrote it before. There are some potential
107- /// git versions and windows installation which produce mal-formed UTF-16 if certain emojies are in the path. It's as rare as
108- /// it sounds, but possible.
106+ /// On Windows , the input is required to be valid UTF-8, which is guaranteed if we wrote it before.
107+ /// There are some potential Git versions and Windows installations which produce malformed UTF-16
108+ /// if certain emojis are in the path. It's as rare as it sounds, but possible.
109109pub fn try_from_byte_slice ( input : & [ u8 ] ) -> Result < & Path , Utf8Error > {
110110 #[ cfg( unix) ]
111111 let p = {
@@ -131,7 +131,7 @@ pub fn try_from_bstr<'a>(input: impl Into<Cow<'a, BStr>>) -> Result<Cow<'a, Path
131131 }
132132}
133133
134- /// Similar to [`try_from_bstr()`], but **panics** if malformed surrogates are encountered on windows .
134+ /// Similar to [`try_from_bstr()`], but **panics** if malformed surrogates are encountered on Windows .
135135pub fn from_bstr < ' a > ( input : impl Into < Cow < ' a , BStr > > ) -> Cow < ' a , Path > {
136136 try_from_bstr ( input) . expect ( "prefix path doesn't contain ill-formed UTF-8" )
137137}
@@ -205,7 +205,8 @@ pub fn to_native_separators<'a>(path: impl Into<Cow<'a, BStr>>) -> Cow<'a, BStr>
205205 p
206206}
207207
208- /// Convert paths with slashes to backslashes on windows and do nothing on unix, but **panics** if malformed surrogates are encountered on windows.
208+ /// Convert paths with slashes to backslashes on Windows and do nothing on Unix,
209+ /// but **panic** if unpaired surrogates are encountered on Windows.
209210pub fn to_native_path_on_windows < ' a > ( path : impl Into < Cow < ' a , BStr > > ) -> Cow < ' a , std:: path:: Path > {
210211 #[ cfg( not( windows) ) ]
211212 {
@@ -217,47 +218,52 @@ pub fn to_native_path_on_windows<'a>(path: impl Into<Cow<'a, BStr>>) -> Cow<'a,
217218 }
218219}
219220
220- /// Replaces windows path separators with slashes, but only do so on windows .
221+ /// Replace Windows path separators with slashes, but only do so on Windows .
221222pub fn to_unix_separators_on_windows < ' a > ( path : impl Into < Cow < ' a , BStr > > ) -> Cow < ' a , BStr > {
222223 #[ cfg( windows) ]
223224 {
224- replace ( path, b'\\' , b'/' )
225+ to_unix_separators ( path)
225226 }
226227 #[ cfg( not( windows) ) ]
227228 {
228229 path. into ( )
229230 }
230231}
231232
232- /// Replaces windows path separators with slashes, unconditionally.
233+ /// Replace Windows path separators with slashes, which typically resembles a Unix path , unconditionally.
233234///
234235/// **Note** Do not use these and prefer the conditional versions of this method.
235236// TODO: use https://lib.rs/crates/path-slash to handle escapes
236237pub fn to_unix_separators < ' a > ( path : impl Into < Cow < ' a , BStr > > ) -> Cow < ' a , BStr > {
237238 replace ( path, b'\\' , b'/' )
238239}
239240
240- /// Find backslashes and replace them with slashes, which typically resembles a unix path , unconditionally.
241+ /// Find slashes and replace them with backslashes , unconditionally.
241242///
242243/// **Note** Do not use these and prefer the conditional versions of this method.
243244// TODO: use https://lib.rs/crates/path-slash to handle escapes
244245pub fn to_windows_separators < ' a > ( path : impl Into < Cow < ' a , BStr > > ) -> Cow < ' a , BStr > {
245246 replace ( path, b'/' , b'\\' )
246247}
247248
248- /// Resolve relative components virtually without accessing the file system, e.g. turn `a/./b/c/.././..` into `a`,
249- /// without keeping intermediate `..` and `/a/../b/..` becomes `/`.
250- /// If the input path was relative and ends up being the `current_dir`, `.` is returned instead of the full path to `current_dir`.
251- /// Note that single `.` components as well as duplicate separators are left untouched.
249+ /// Resolve relative components virtually, eliminating intermediate `..` without accessing the filesystem.
252250///
253- /// This is particularly useful when manipulating paths that are based on user input, and not resolving intermediate
254- /// symlinks keeps the path similar to what the user provided. If that's not desirable, use `[realpath()][crate::realpath()`
255- /// instead.
251+ /// For example, this turns `a/./b/c/.././..` into `a`, and turns `/a/../b/..` into `/`.
256252///
257- /// Note that we might access the `current_dir` if we run out of path components to pop off, which is expected to be absolute
258- /// as typical return value of `std::env::current_dir()` or `gix_fs::current_dir(…)` when `core.precomposeUnicode` is known.
259- /// As a `current_dir` like `/c` can be exhausted by paths like `../../r`, `None` will be returned to indicate the inability
260- /// to produce a logically consistent path.
253+ /// If the input path was relative and ends up being the `current_dir`, `.` is returned instead of
254+ /// the full path to `current_dir`.
255+ ///
256+ /// Single `.` components as well as duplicate separators are left untouched.
257+ ///
258+ /// This is particularly useful when manipulating paths that are based on user input, and not
259+ /// resolving intermediate symlinks keeps the path similar to what the user provided. If that's not
260+ /// desirable, use `[realpath()][crate::realpath()` instead.
261+ ///
262+ /// Note that we might access the `current_dir` if we run out of path components to pop off, which
263+ /// is expected to be absolute as typical return value of `std::env::current_dir()` or
264+ /// `gix_fs::current_dir(…)` when `core.precomposeUnicode` is known. As a `current_dir` like `/c`
265+ /// can be exhausted by paths like `../../r`, `None` will be returned to indicate the inability to
266+ /// produce a logically consistent path.
261267pub fn normalize < ' a > ( path : Cow < ' a , Path > , current_dir : & Path ) -> Option < Cow < ' a , Path > > {
262268 use std:: path:: Component :: ParentDir ;
263269
@@ -290,14 +296,16 @@ pub fn normalize<'a>(path: Cow<'a, Path>, current_dir: &Path) -> Option<Cow<'a,
290296 . into ( )
291297}
292298
293- /// Rebuild the worktree-relative `relative_path` to be relative to `prefix`, which is the worktree-relative
294- /// path equivalent to the position of the user, or current working directory.
299+ /// Rebuild the worktree-relative `relative_path` to be relative to `prefix`, which is the
300+ /// worktree-relative path equivalent to the position of the user, or current working directory.
301+ ///
295302/// This is a no-op if `prefix` is empty.
296303///
297- /// Note that both `relative_path` and `prefix` are assumed to be [normalized](normalize()), and failure to do so
298- /// will lead to incorrect results.
304+ /// Note that both `relative_path` and `prefix` are assumed to be [normalized](normalize()), and
305+ /// failure to do so will lead to incorrect results.
299306///
300- /// Note that both input paths are expected to be equal in terms of case too, as comparisons will be case-sensitive.
307+ /// Note that both input paths are expected to be equal in terms of case too, as comparisons will
308+ /// be case-sensitive.
301309pub fn relativize_with_prefix < ' a > ( relative_path : & ' a Path , prefix : & Path ) -> Cow < ' a , Path > {
302310 if prefix. as_os_str ( ) . is_empty ( ) {
303311 return Cow :: Borrowed ( relative_path) ;
0 commit comments