Skip to content

Commit f3dc83b

Browse files
authored
Merge pull request #1811 from EliahKagan/run-ci/fchmod-next
Get and set mode using std, still on open file descriptor
2 parents 79cb655 + 53ded78 commit f3dc83b

File tree

3 files changed

+13
-24
lines changed

3 files changed

+13
-24
lines changed

Cargo.lock

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gix-worktree-state/Cargo.toml

-6
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,3 @@ gix-filter = { version = "^0.17.0", path = "../gix-filter" }
2929
io-close = "0.3.7"
3030
thiserror = "2.0.0"
3131
bstr = { version = "1.3.0", default-features = false }
32-
33-
[target.'cfg(unix)'.dependencies]
34-
rustix = { version = "0.38.20", default-features = false, features = [
35-
"std",
36-
"fs",
37-
] }

gix-worktree-state/src/checkout/entry.rs

+13-17
Original file line numberDiff line numberDiff line change
@@ -298,9 +298,10 @@ pub(crate) fn finalize_entry(
298298
/// See `let_readers_execute` for the exact details of how the mode is transformed.
299299
#[cfg(unix)]
300300
fn set_executable(file: &std::fs::File) -> Result<(), std::io::Error> {
301-
let old_raw_mode = rustix::fs::fstat(file)?.st_mode;
302-
let new_mode = let_readers_execute(old_raw_mode);
303-
rustix::fs::fchmod(file, new_mode)?;
301+
use std::os::unix::fs::{MetadataExt, PermissionsExt};
302+
let old_mode = file.metadata()?.mode();
303+
let new_mode = let_readers_execute(old_mode);
304+
file.set_permissions(std::fs::Permissions::from_mode(new_mode))?;
304305
Ok(())
305306
}
306307

@@ -309,20 +310,16 @@ fn set_executable(file: &std::fs::File) -> Result<(), std::io::Error> {
309310
/// Currently this adds executable bits for whoever has read bits already. It doesn't use the umask.
310311
/// Set-user-ID and set-group-ID bits are unset for safety. The sticky bit is also unset.
311312
///
312-
/// This returns only mode bits, not file type. The return value can be passed to chmod or fchmod.
313-
#[cfg(unix)]
314-
fn let_readers_execute(mut raw_mode: rustix::fs::RawMode) -> rustix::fs::Mode {
315-
assert_eq!(
316-
raw_mode & 0o170000,
317-
0o100000,
318-
"bug in caller if not from a regular file"
319-
);
320-
raw_mode &= 0o777; // Clear type, non-rwx mode bits (setuid, setgid, sticky).
321-
raw_mode |= (raw_mode & 0o444) >> 2; // Let readers also execute.
322-
rustix::fs::Mode::from_bits(raw_mode).expect("all bits recognized")
313+
/// This returns only mode bits, not file type. The return value can be used in chmod or fchmod.
314+
#[cfg(any(unix, test))]
315+
fn let_readers_execute(mut mode: u32) -> u32 {
316+
assert_eq!(mode & 0o170000, 0o100000, "bug in caller if not from a regular file");
317+
mode &= 0o777; // Clear type, non-rwx mode bits (setuid, setgid, sticky).
318+
mode |= (mode & 0o444) >> 2; // Let readers also execute.
319+
mode
323320
}
324321

325-
#[cfg(all(test, unix))]
322+
#[cfg(test)]
326323
mod tests {
327324
#[test]
328325
fn let_readers_execute() {
@@ -372,8 +369,7 @@ mod tests {
372369
(0o106400, 0o500),
373370
(0o102462, 0o572),
374371
];
375-
for (st_mode, raw_expected) in cases {
376-
let expected = rustix::fs::Mode::from_bits(raw_expected).expect("expected mode is a mode");
372+
for (st_mode, expected) in cases {
377373
let actual = super::let_readers_execute(st_mode);
378374
assert_eq!(
379375
actual, expected,

0 commit comments

Comments
 (0)