-
Notifications
You must be signed in to change notification settings - Fork 13.9k
Implement fs_native_path
#108981
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, didn't read the description properly
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. |
library/std/src/sys/unix/fs.rs
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, that's the idea! It may not be trivial in all cases though so I've left that for follow up PRs.
|
@Amanieu Given the recent restructuring and other changes in std, rebasing simplified things a lot. In addition I applied your suggest to simplify the trait. |
This comment has been minimized.
This comment has been minimized.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| /// 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reminder to address this typo.
library/std/src/sys/pal/solid/fs.rs
Outdated
| } | ||
|
|
||
| impl File { | ||
| pub fn open(path: &Path, opts: &OpenOptions) -> io::Result<File> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same here.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should return a CString to avoid another conversion in open_at.
| /// | ||
| /// 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reminder to address this typo.
| dir.unlink_file(osstr2str(file.as_ref())?) | ||
| } | ||
|
|
||
| pub fn rename(old: &Path, new: &Path) -> io::Result<()> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is only one changed to CStr but not both? In fact shouldn't all &Path in this file be changed?
| let p = maybe_verbatim(p)?; | ||
| cvt(unsafe { c::RemoveDirectoryW(p.as_ptr()) })?; | ||
| Ok(()) | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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! |
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.