Rollup merge of #126428 - kpreid:absolute, r=jhpratt

Polish `std::path::absolute` documentation.

These changes bring it closer to other standard library documentation and, in particular, `std::fs::canonicalize`, which it will often be compared with.

* Add `# Platform-specific behavior` section, with content moved from Examples section.
* Create `# Errors` section.
* Phrase error description to allow future platforms to have new syntactic errors, rather than only emptiness.
* Add missing commas.
* Indent example code 4 spaces.
This commit is contained in:
Matthias Krüger 2024-06-15 14:40:49 +02:00 committed by GitHub
commit a2249027cd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 39 additions and 28 deletions

View File

@ -2302,7 +2302,7 @@ pub fn read_link<P: AsRef<Path>>(path: P) -> io::Result<PathBuf> {
/// ///
/// This function currently corresponds to the `realpath` function on Unix /// This function currently corresponds to the `realpath` function on Unix
/// and the `CreateFile` and `GetFinalPathNameByHandle` functions on Windows. /// and the `CreateFile` and `GetFinalPathNameByHandle` functions on Windows.
/// Note that, this [may change in the future][changes]. /// Note that this [may change in the future][changes].
/// ///
/// On Windows, this converts the path to use [extended length path][path] /// On Windows, this converts the path to use [extended length path][path]
/// syntax, which allows your program to use longer path names, but means you /// syntax, which allows your program to use longer path names, but means you

View File

@ -3345,14 +3345,33 @@ fn description(&self) -> &str {
/// Makes the path absolute without accessing the filesystem. /// Makes the path absolute without accessing the filesystem.
/// ///
/// If the path is relative, the current directory is used as the base directory. /// If the path is relative, the current directory is used as the base directory.
/// All intermediate components will be resolved according to platforms-specific /// All intermediate components will be resolved according to platform-specific
/// rules but unlike [`canonicalize`][crate::fs::canonicalize] this does not /// rules, but unlike [`canonicalize`][crate::fs::canonicalize], this does not
/// resolve symlinks and may succeed even if the path does not exist. /// resolve symlinks and may succeed even if the path does not exist.
/// ///
/// If the `path` is empty or getting the /// If the `path` is empty or getting the
/// [current directory][crate::env::current_dir] fails then an error will be /// [current directory][crate::env::current_dir] fails, then an error will be
/// returned. /// returned.
/// ///
/// # Platform-specific behavior
///
/// On POSIX platforms, the path is resolved using [POSIX semantics][posix-semantics],
/// except that it stops short of resolving symlinks. This means it will keep `..`
/// components and trailing slashes.
///
/// On Windows, for verbatim paths, this will simply return the path as given. For other
/// paths, this is currently equivalent to calling
/// [`GetFullPathNameW`][windows-path].
///
/// Note that these [may change in the future][changes].
///
/// # Errors
///
/// This function may return an error in the following situations:
///
/// * If `path` is syntactically invalid; in particular, if it is empty.
/// * If getting the [current directory][crate::env::current_dir] fails.
///
/// # Examples /// # Examples
/// ///
/// ## POSIX paths /// ## POSIX paths
@ -3360,50 +3379,42 @@ fn description(&self) -> &str {
/// ``` /// ```
/// # #[cfg(unix)] /// # #[cfg(unix)]
/// fn main() -> std::io::Result<()> { /// fn main() -> std::io::Result<()> {
/// use std::path::{self, Path}; /// use std::path::{self, Path};
/// ///
/// // Relative to absolute /// // Relative to absolute
/// let absolute = path::absolute("foo/./bar")?; /// let absolute = path::absolute("foo/./bar")?;
/// assert!(absolute.ends_with("foo/bar")); /// assert!(absolute.ends_with("foo/bar"));
/// ///
/// // Absolute to absolute /// // Absolute to absolute
/// let absolute = path::absolute("/foo//test/.././bar.rs")?; /// let absolute = path::absolute("/foo//test/.././bar.rs")?;
/// assert_eq!(absolute, Path::new("/foo/test/../bar.rs")); /// assert_eq!(absolute, Path::new("/foo/test/../bar.rs"));
/// Ok(()) /// Ok(())
/// } /// }
/// # #[cfg(not(unix))] /// # #[cfg(not(unix))]
/// # fn main() {} /// # fn main() {}
/// ``` /// ```
/// ///
/// The path is resolved using [POSIX semantics][posix-semantics] except that
/// it stops short of resolving symlinks. This means it will keep `..`
/// components and trailing slashes.
///
/// ## Windows paths /// ## Windows paths
/// ///
/// ``` /// ```
/// # #[cfg(windows)] /// # #[cfg(windows)]
/// fn main() -> std::io::Result<()> { /// fn main() -> std::io::Result<()> {
/// use std::path::{self, Path}; /// use std::path::{self, Path};
/// ///
/// // Relative to absolute /// // Relative to absolute
/// let absolute = path::absolute("foo/./bar")?; /// let absolute = path::absolute("foo/./bar")?;
/// assert!(absolute.ends_with(r"foo\bar")); /// assert!(absolute.ends_with(r"foo\bar"));
/// ///
/// // Absolute to absolute /// // Absolute to absolute
/// let absolute = path::absolute(r"C:\foo//test\..\./bar.rs")?; /// let absolute = path::absolute(r"C:\foo//test\..\./bar.rs")?;
/// ///
/// assert_eq!(absolute, Path::new(r"C:\foo\bar.rs")); /// assert_eq!(absolute, Path::new(r"C:\foo\bar.rs"));
/// Ok(()) /// Ok(())
/// } /// }
/// # #[cfg(not(windows))] /// # #[cfg(not(windows))]
/// # fn main() {} /// # fn main() {}
/// ``` /// ```
/// ///
/// For verbatim paths this will simply return the path as given. For other
/// paths this is currently equivalent to calling
/// [`GetFullPathNameW`][windows-path].
///
/// Note that this [may change in the future][changes]. /// Note that this [may change in the future][changes].
/// ///
/// [changes]: io#platform-specific-behavior /// [changes]: io#platform-specific-behavior