Implement fs_native_path - #108981
Conversation
|
(rustbot has picked a reviewer for you, use r? to override) |
|
Hey! It looks like you've submitted a new PR for the library teams! If this PR contains changes to any Examples of
The Miri subtree was changed cc @rust-lang/miri |
Yes, I mentioned as much. However, this is more than a slight refactoring in some cases. Like you said, |
|
I should do a crater run. There's at least a possibility that some weird inference thing may break this, which would be a blocker. |
This comment was marked as outdated.
This comment was marked as outdated.
|
Oops, right @bors try |
|
⌛ Trying commit 1b5d6cd355deacecbb236cbc553cfc988ec1ed62 with merge 1648938e809d7a7838c36282edd641ee0a4f137f... |
|
☀️ Try build successful - checks-actions |
|
@craterbot check |
|
👌 Experiment ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more |
|
🚧 Experiment ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more |
|
🎉 Experiment
|
|
5 regressions and 3 fixes but none of them look relevant. So it seems like the public trait in this PR wouldn't break anything inference wise. |
|
Unless I'm mistaken , this looks a purely T-libs patch so I'll remove the T-compiler @rustbot label -T-compiler |
|
Oops yes, sorry. I think that was a left over auto-label. |
There was a problem hiding this comment.
So is the only remaining work after this PR to swap these to with_native_path? That's exciting!
There was a problem hiding this comment.
Yeah, that's the idea! It may not be trivial in all cases though so I've left that for follow up PRs.
cfc57ac to
308e304
Compare
This comment has been minimized.
This comment has been minimized.
| #[unstable(feature = "fs_native_path", issue = "108979")] | ||
| impl NativePathExt for NativePath { | ||
| fn from_wide(wide: &[u16]) -> &NativePath { | ||
| assert_eq!(crate::sys::unrolled_find_u16s(0, wide), Some(wide.len().saturating_sub(1))); |
There was a problem hiding this comment.
Add a user-friendly panic message for when assert fails.
| /// These types include [`Path`], [`OsStr`] and [`str`] as well as their owned | ||
| /// counterparts [`PathBuf`], [`OsString`] and [`String`]. | ||
| /// | ||
| /// You can also implement you own [`AsRef<Path>`] for your own types and they'll |
There was a problem hiding this comment.
| /// You can also implement you own [`AsRef<Path>`] for your own types and they'll | |
| /// You can also implement [`AsRef<Path>`] for your own types and they'll |
| @@ -325,14 +377,17 @@ fn cstr(path: &Path) -> io::Result<CString> { | |||
|
|
|||
| impl File { | |||
| pub fn open(path: &Path, opts: &OpenOptions) -> io::Result<File> { | |||
There was a problem hiding this comment.
This still still inconsistent: why is open kept in some targets but removed in other? I would expect everything to use open_native only and for open to be removed (or possible just change the signature of open to take native path).
|
|
||
| impl File { | ||
| pub fn open(path: &Path, opts: &OpenOptions) -> io::Result<File> { | ||
| pub(super) fn open(path: &Path, opts: &OpenOptions) -> io::Result<File> { |
And replace `AsRef<Path>` with the `AsPath` trait.
This comment has been minimized.
This comment has been minimized.
|
☔ The latest upstream changes (presumably #122256) made this pull request unmergeable. Please resolve the merge conflicts. |
| p | ||
| ); | ||
| return Err(io::Error::new(io::ErrorKind::Uncategorized, msg)); | ||
| fn open_parent(p: &CStr) -> io::Result<(ManuallyDrop<WasiFd>, PathBuf)> { |
There was a problem hiding this comment.
This should return a CString to avoid another conversion in open_at.
| @@ -563,7 +563,9 @@ pub fn symlink<P: AsRef<Path>, U: AsRef<Path>>( | |||
| /// This is a convenience API similar to `std::os::unix::fs::symlink` and | |||
| /// `std::os::windows::fs::symlink_file` and `std::os::windows::fs::symlink_dir`. | |||
| pub fn symlink_path<P: AsRef<Path>, U: AsRef<Path>>(old_path: P, new_path: U) -> io::Result<()> { | |||
There was a problem hiding this comment.
Should these methods be updated to use AsPath instead?
| /// These types include [`Path`], [`OsStr`] and [`str`] as well as their owned | ||
| /// counterparts [`PathBuf`], [`OsString`] and [`String`]. | ||
| /// | ||
| /// You can also implement you own [`AsRef<Path>`] for your own types and they'll |
| dir.unlink_file(osstr2str(file.as_ref())?) | ||
| } | ||
|
|
||
| pub fn rename(old: &Path, new: &Path) -> io::Result<()> { |
There was a problem hiding this comment.
Why is only one changed to CStr but not both? In fact shouldn't all &Path in this file be changed?
| @@ -1132,16 +1186,16 @@ pub fn rmdir(p: &Path) -> io::Result<()> { | |||
| } | |||
There was a problem hiding this comment.
Shouldn't all the methods above (rename, unlink, rmdir, etc) also be switched to NativePath?
|
@rustbot author |
|
@ChrisDenton any updates on this? thanks |
Sorry, I've been quite busy lately and this PR is very prone to breakage. I hope to get back to it sometime this month but there are a higher priority things on my todo list that I'd like to get done first. |
|
ping from triage - can you post your status on this PR? There hasn't been an update in a few months. Thanks! |
|
Ping from triage: I'm closing this due to inactivity, Please reopen when you are ready to continue with this. @rustbot label: +S-inactive |
View all comments
Implements the
fs_native_pathfeature. See also rust-lang/libs-team#62.Internal changes
Ultimately, I'd envision that Unix filesystem functions (for example) would simply take either an
&CStror maybe an internal&PosixPathtype with relevant helper methods. However, as much as I'd love to transition immediately, I think it's more prudent to take it slower. If nothing else it'll be easier on reviewers. So this PR just moves the responsibility for creating concrete types intosys::fswhile touching as little existing code as possible, which should then allow platforms to make changes at their own pace.