Skip to content

Commit

Permalink
Auto merge of rust-lang#85747 - maxwase:path-symlinks-methods, r=m-ou-se
Browse files Browse the repository at this point in the history
Path methods — symlinks improvement

This PR adds symlink method for the `Path`.

Tracking issue: rust-lang#85748
For the discussion you can see [internals topic](https://internals.rust-lang.org/t/path-methods-symlinks-improvement/14776)

P.S.
I'm not fully sure about `stable` attribute, correct me if I'm wrong.
  • Loading branch information
bors committed Jun 18, 2021
2 parents 312b894 + 01435fc commit 88ba8ad
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 0 deletions.
26 changes: 26 additions & 0 deletions library/std/src/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1007,6 +1007,32 @@ impl Metadata {
self.file_type().is_file()
}

/// Returns `true` if this metadata is for a symbolic link.
///
/// # Examples
///
#[cfg_attr(unix, doc = "```no_run")]
#[cfg_attr(not(unix), doc = "```ignore")]
/// #![feature(is_symlink)]
/// use std::fs;
/// use std::path::Path;
/// use std::os::unix::fs::symlink;
///
/// fn main() -> std::io::Result<()> {
/// let link_path = Path::new("link");
/// symlink("/origin_does_not_exists/", link_path)?;
///
/// let metadata = fs::symlink_metadata(link_path)?;
///
/// assert!(metadata.is_symlink());
/// Ok(())
/// }
/// ```
#[unstable(feature = "is_symlink", issue = "85748")]
pub fn is_symlink(&self) -> bool {
self.file_type().is_symlink()
}

/// Returns the size of the file, in bytes, this metadata is for.
///
/// # Examples
Expand Down
26 changes: 26 additions & 0 deletions library/std/src/path.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2592,6 +2592,32 @@ impl Path {
fs::metadata(self).map(|m| m.is_dir()).unwrap_or(false)
}

/// Returns true if the path exists on disk and is pointing at a symbolic link.
///
/// This function will not traverse symbolic links.
/// In case of a broken symbolic link this will also return true.
///
/// If you cannot access the directory containing the file, e.g., because of a
/// permission error, this will return false.
///
/// # Examples
///
#[cfg_attr(unix, doc = "```no_run")]
#[cfg_attr(not(unix), doc = "```ignore")]
/// #![feature(is_symlink)]
/// use std::path::Path;
/// use std::os::unix::fs::symlink;
///
/// let link_path = Path::new("link");
/// symlink("/origin_does_not_exists/", link_path).unwrap();
/// assert_eq!(link_path.is_symlink(), true);
/// assert_eq!(link_path.exists(), false);
/// ```
#[unstable(feature = "is_symlink", issue = "85748")]
pub fn is_symlink(&self) -> bool {
fs::symlink_metadata(self).map(|m| m.is_symlink()).unwrap_or(false)
}

/// Converts a [`Box<Path>`](Box) into a [`PathBuf`] without copying or
/// allocating.
#[stable(feature = "into_boxed_path", since = "1.20.0")]
Expand Down

0 comments on commit 88ba8ad

Please sign in to comment.