path: Move is_absolute check to sys::path
I am working on fs support for UEFI [0], which similar to windows has prefix components, but is not quite same as Windows. It also seems that Prefix is tied closely to Windows and cannot really be extended [1]. This PR just tries to remove coupling between Prefix and absolute path checking to allow platforms to provide there own implementation to check if a path is absolute or not. I am not sure if any platform other than windows currently uses Prefix, so I have kept the path.prefix().is_some() check in most cases. [0]: https://github.com/rust-lang/rust/pull/135368 [1]: https://github.com/rust-lang/rust/issues/52331#issuecomment-2492796137 Signed-off-by: Ayush Singh <ayush@beagleboard.org>
This commit is contained in:
parent
12445e0b2c
commit
1107382a18
5 changed files with 27 additions and 11 deletions
|
@ -298,7 +298,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
// Detect scheme on Redox
|
// Detect scheme on Redox
|
||||||
fn has_redox_scheme(s: &[u8]) -> bool {
|
pub(crate) fn has_redox_scheme(s: &[u8]) -> bool {
|
||||||
cfg!(target_os = "redox") && s.contains(&b':')
|
cfg!(target_os = "redox") && s.contains(&b':')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2155,7 +2155,7 @@ impl Path {
|
||||||
unsafe { Path::new(OsStr::from_encoded_bytes_unchecked(s)) }
|
unsafe { Path::new(OsStr::from_encoded_bytes_unchecked(s)) }
|
||||||
}
|
}
|
||||||
// The following (private!) function reveals the byte encoding used for OsStr.
|
// The following (private!) function reveals the byte encoding used for OsStr.
|
||||||
fn as_u8_slice(&self) -> &[u8] {
|
pub(crate) fn as_u8_slice(&self) -> &[u8] {
|
||||||
self.inner.as_encoded_bytes()
|
self.inner.as_encoded_bytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2323,14 +2323,7 @@ impl Path {
|
||||||
#[must_use]
|
#[must_use]
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
pub fn is_absolute(&self) -> bool {
|
pub fn is_absolute(&self) -> bool {
|
||||||
if cfg!(target_os = "redox") {
|
sys::path::is_absolute(self)
|
||||||
// FIXME: Allow Redox prefixes
|
|
||||||
self.has_root() || has_redox_scheme(self.as_u8_slice())
|
|
||||||
} else {
|
|
||||||
self.has_root()
|
|
||||||
&& (cfg!(any(unix, target_os = "hermit", target_os = "wasi"))
|
|
||||||
|| self.prefix().is_some())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if the `Path` is relative, i.e., not absolute.
|
/// Returns `true` if the `Path` is relative, i.e., not absolute.
|
||||||
|
@ -2353,7 +2346,7 @@ impl Path {
|
||||||
!self.is_absolute()
|
!self.is_absolute()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prefix(&self) -> Option<Prefix<'_>> {
|
pub(crate) fn prefix(&self) -> Option<Prefix<'_>> {
|
||||||
self.components().prefix
|
self.components().prefix
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,3 +23,7 @@ pub const MAIN_SEP: char = '/';
|
||||||
pub(crate) fn absolute(_path: &Path) -> io::Result<PathBuf> {
|
pub(crate) fn absolute(_path: &Path) -> io::Result<PathBuf> {
|
||||||
unsupported()
|
unsupported()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn is_absolute(path: &Path) -> bool {
|
||||||
|
path.has_root() && path.prefix().is_some()
|
||||||
|
}
|
||||||
|
|
|
@ -60,3 +60,14 @@ pub(crate) fn absolute(path: &Path) -> io::Result<PathBuf> {
|
||||||
|
|
||||||
Ok(normalized)
|
Ok(normalized)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn is_absolute(path: &Path) -> bool {
|
||||||
|
if cfg!(target_os = "redox") {
|
||||||
|
// FIXME: Allow Redox prefixes
|
||||||
|
path.has_root() || crate::path::has_redox_scheme(path.as_u8_slice())
|
||||||
|
} else if cfg!(any(unix, target_os = "hermit", target_os = "wasi")) {
|
||||||
|
path.has_root()
|
||||||
|
} else {
|
||||||
|
path.has_root() && path.prefix().is_some()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -24,3 +24,7 @@ pub const MAIN_SEP: char = '\\';
|
||||||
pub(crate) fn absolute(_path: &Path) -> io::Result<PathBuf> {
|
pub(crate) fn absolute(_path: &Path) -> io::Result<PathBuf> {
|
||||||
unsupported()
|
unsupported()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn is_absolute(path: &Path) -> bool {
|
||||||
|
path.has_root() && path.prefix().is_some()
|
||||||
|
}
|
||||||
|
|
|
@ -346,3 +346,7 @@ pub(crate) fn absolute(path: &Path) -> io::Result<PathBuf> {
|
||||||
os2path,
|
os2path,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn is_absolute(path: &Path) -> bool {
|
||||||
|
path.has_root() && path.prefix().is_some()
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue