You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
change: Get and set mode using std, still on open file descriptor
This replaces explicit `fstat` and `fchmod` calls (via `rustix`)
with `File::metadata` and `File::set_permissions`, respectively.
In practice, on Unix-like systems:
- `File::metadata` either:
* calls `fstat`, or
* calls `statx` in a way that causes it to operate similarly to
`fstat` (this is used on Linux, in versions with `statx`).
This is not explicitly documented, though calling `stat` or
`lstat`, or calling `statx` in a way that would cause it to
behave like `stat` or `lstat` rather than `fstat`, would not
preserve the documented behavior of `File::metadata`, which
operates on a `File` and does not take a path.
- `File::set_permissions` calls `fchmod`.
This is explicitly documented and `fchmod` is listed as an alias
for documentation purposes. But it is noted as an implementation
detail that may change without warning. However, calling `chmod`
or `lchmod` would not preserve the documented behavior of
`File::set_permissions`, which (like `File::metadata`) operates
on a file and does not take a path.
While these details can, in principle, change without warning, per
https://doc.rust-lang.org/stable/std/io/index.html#platform-specific-behavior,
to preserve the documented semantics of operating on the file
referenced by the file descriptor, it seems like the behavior would
still have to be correct for our use. In our use here, what matters
is that we use the file descriptor and not the path.
The change in this commit intends to maintain the effect of GitoxideLabs#1803
without requiring `gix-worktree-state` to depend directly on
`rustix`, and to benefit from the standard library's slightly
higher level interface where modes are treated as `u32` even on
operating systems where they are different (e.g. `u16` on macOS).
Importantly, this continues to differ from the behavior
before GitoxideLabs#1803 of using functions that operated on paths.
The current general correspondence between Rust `std`, POSIX
functions, and `statx`, where the rightmost three columns describe
`statx` calls, is:
| std::fs::* | POSIX | fd | path | flags |
|------------------|-------|----------|------|---------------------|
| metadata | stat | AT_FDCWD | path | |
| symlink_metadata | lstat | AT_FDCWD | path | AT_SYMLINK_NOFOLLOW |
| File::metadata | fstat | file | "" | AT_EMPTY_PATH |
It may be that some uses of `rustix::fs` can be similarly replaced
in `gix_fs`, but this commit does not include any such changes.
0 commit comments