Skip to content

Commit 205f1d9

Browse files
committed
refactor(hardlink): move DeviceNumber into device module, add dev to error types
- Move DeviceNumber from device_number.rs into device.rs alongside DeviceBoundary, mirroring the InodeNumber-in-inode.rs pattern - Add dev: DeviceNumber to SizeConflictError and NumberOfLinksConflictError so error messages identify the exact (inode, device) pair https://claude.ai/code/session_01QP9wZyoZcGmJsEsA66ZRok
1 parent 0058648 commit 205f1d9

9 files changed

Lines changed: 41 additions & 41 deletions

File tree

src/device.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
use derive_more::{Display, From, Into, LowerHex, Octal, UpperHex};
2+
3+
#[cfg(feature = "json")]
4+
use serde::{Deserialize, Serialize};
5+
16
/// Whether to cross device boundary into a different filesystem.
27
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
38
pub enum DeviceBoundary {
@@ -15,3 +20,22 @@ impl DeviceBoundary {
1520
}
1621
}
1722
}
23+
24+
/// The device number of a filesystem.
25+
#[derive(
26+
Debug, Display, LowerHex, UpperHex, Octal, Clone, Copy, PartialEq, Eq, Hash, From, Into,
27+
)]
28+
#[cfg_attr(feature = "json", derive(Deserialize, Serialize))]
29+
pub struct DeviceNumber(u64);
30+
31+
/// POSIX-exclusive functions.
32+
#[cfg(unix)]
33+
impl DeviceNumber {
34+
/// Get device number of a [`std::fs::Metadata`].
35+
#[inline]
36+
pub fn get(stats: &std::fs::Metadata) -> Self {
37+
use pipe_trait::Pipe;
38+
use std::os::unix::fs::MetadataExt;
39+
stats.dev().pipe(DeviceNumber)
40+
}
41+
}

src/device_number.rs

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/hardlink/aware.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use super::{
44
};
55
use crate::{
66
data_tree::DataTree,
7-
device_number::DeviceNumber,
7+
device::DeviceNumber,
88
inode::InodeNumber,
99
os_string_display::OsStringDisplay,
1010
reporter::{event::HardlinkDetection, Event, Reporter},

src/hardlink/hardlink_list.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub use summary::Summary;
99
pub use Reflection as HardlinkListReflection;
1010
pub use Summary as SharedLinkSummary;
1111

12-
use crate::{device_number::DeviceNumber, hardlink::LinkPathList, inode::InodeNumber, size};
12+
use crate::{device::DeviceNumber, hardlink::LinkPathList, inode::InodeNumber, size};
1313
use dashmap::DashMap;
1414
use derive_more::{Display, Error};
1515
use smart_default::SmartDefault;
@@ -78,31 +78,27 @@ impl<Size> HardlinkList<Size> {
7878
}
7979
}
8080

81-
/// Error that occurs when a different size was detected for the same [`ino`][ino].
82-
///
83-
/// <!-- Should have been `std::os::unix::fs::MetadataExt::ino` but it would error on Windows -->
84-
/// [ino]: https://doc.rust-lang.org/std/os/unix/fs/trait.MetadataExt.html#tymethod.ino
81+
/// Error that occurs when a different size was detected for the same inode.
8582
#[derive(Debug, Display, Error)]
8683
#[cfg_attr(test, derive(PartialEq, Eq))]
8784
#[display(bound(Size: Debug))]
88-
#[display("Size for inode {ino} changed from {recorded:?} to {detected:?}")]
85+
#[display("Size for inode {ino} on device {dev} changed from {recorded:?} to {detected:?}")]
8986
pub struct SizeConflictError<Size> {
9087
pub ino: InodeNumber,
88+
pub dev: DeviceNumber,
9189
pub recorded: Size,
9290
pub detected: Size,
9391
}
9492

95-
/// Error that occurs when a different [`nlink`][nlink] was detected for the same [`ino`][ino].
96-
///
97-
/// <!-- Should have been `std::os::unix::fs::MetadataExt::nlink` but it would error on Windows -->
98-
/// [nlink]: https://doc.rust-lang.org/std/os/unix/fs/trait.MetadataExt.html#tymethod.nlink
99-
/// <!-- Should have been `std::os::unix::fs::MetadataExt::ino` but it would error on Windows -->
100-
/// [ino]: https://doc.rust-lang.org/std/os/unix/fs/trait.MetadataExt.html#tymethod.ino
93+
/// Error that occurs when a different number of links was detected for the same inode.
10194
#[derive(Debug, Display, Error)]
10295
#[cfg_attr(test, derive(PartialEq, Eq))]
103-
#[display("Number of links of inode {ino} changed from {recorded:?} to {detected:?}")]
96+
#[display(
97+
"Number of links of inode {ino} on device {dev} changed from {recorded:?} to {detected:?}"
98+
)]
10499
pub struct NumberOfLinksConflictError {
105100
pub ino: InodeNumber,
101+
pub dev: DeviceNumber,
106102
pub recorded: u64,
107103
pub detected: u64,
108104
}
@@ -139,6 +135,7 @@ where
139135
if size != recorded.size {
140136
assertions = Err(AddError::SizeConflict(SizeConflictError {
141137
ino,
138+
dev,
142139
recorded: recorded.size,
143140
detected: size,
144141
}));
@@ -149,6 +146,7 @@ where
149146
assertions = Err(AddError::NumberOfLinksConflict(
150147
NumberOfLinksConflictError {
151148
ino,
149+
dev,
152150
recorded: recorded.links,
153151
detected: links,
154152
},

src/hardlink/hardlink_list/iter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use super::{HardlinkList, InodeKey, Value};
2-
use crate::{device_number::DeviceNumber, hardlink::LinkPathList, inode::InodeNumber};
2+
use crate::{device::DeviceNumber, hardlink::LinkPathList, inode::InodeNumber};
33
use dashmap::{iter::Iter as DashIter, mapref::multiple::RefMulti};
44
use pipe_trait::Pipe;
55

src/hardlink/hardlink_list/reflection.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use super::{HardlinkList, InodeKey, Value};
2-
use crate::{device_number::DeviceNumber, hardlink::LinkPathListReflection, inode::InodeNumber};
2+
use crate::{device::DeviceNumber, hardlink::LinkPathListReflection, inode::InodeNumber};
33
use dashmap::DashMap;
44
use derive_more::{Display, Error, Into, IntoIterator};
55
use into_sorted::IntoSortedUnstable;

src/hardlink/hardlink_list/test.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ fn detect_size_change() {
127127
.expect_err("add the second path");
128128
let expected = AddError::SizeConflict(SizeConflictError {
129129
ino: 123.into(),
130+
dev: 0.into(),
130131
recorded: 100.into(),
131132
detected: 110.into(),
132133
});
@@ -143,6 +144,7 @@ fn detect_number_of_links_change() {
143144
.expect_err("add the second path");
144145
let expected = AddError::NumberOfLinksConflict(NumberOfLinksConflictError {
145146
ino: 123.into(),
147+
dev: 0.into(),
146148
recorded: 1,
147149
detected: 2,
148150
});

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ pub use clap_utilities;
4141
pub mod bytes_format;
4242
pub mod data_tree;
4343
pub mod device;
44-
pub mod device_number;
4544
pub mod fs_tree_builder;
4645
pub mod get_size;
4746
pub mod hardlink;

tests/_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ pub fn read_inode_number(path: &Path) -> u64 {
586586

587587
/// Read [dev](std::os::unix::fs::MetadataExt::dev) of a path.
588588
#[cfg(unix)]
589-
pub fn read_device_number(path: &Path) -> parallel_disk_usage::device_number::DeviceNumber {
589+
pub fn read_device_number(path: &Path) -> parallel_disk_usage::device::DeviceNumber {
590590
use std::os::unix::fs::MetadataExt;
591591
path.pipe(symlink_metadata)
592592
.unwrap_or_else(|error| panic!("Can't read metadata at {path:?}: {error}"))

0 commit comments

Comments
 (0)