From e4dc6767ffb1c025eac3b4d2e424696676c34fea Mon Sep 17 00:00:00 2001 From: Maurus Decimus <11444311+mdecimus@users.noreply.github.com> Date: Sat, 30 May 2026 08:26:19 +0200 Subject: [PATCH] ci: pin rust toolchain and make takeout walker compile on windows --- rust-toolchain.toml | 2 ++ src/sync/import_takeout/walk.rs | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 rust-toolchain.toml diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..292fe49 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "stable" diff --git a/src/sync/import_takeout/walk.rs b/src/sync/import_takeout/walk.rs index 44fb4cb..ab6e273 100644 --- a/src/sync/import_takeout/walk.rs +++ b/src/sync/import_takeout/walk.rs @@ -7,11 +7,27 @@ use std::collections::HashSet; use std::fs; use std::io; +#[cfg(unix)] use std::os::unix::fs::MetadataExt; +#[cfg(windows)] +use std::os::windows::fs::MetadataExt; use std::path::{Path, PathBuf}; use crate::logging::Logger; +#[cfg(unix)] +fn fingerprint(metadata: &fs::Metadata) -> (u64, u64) { + (metadata.dev(), metadata.ino()) +} + +#[cfg(windows)] +fn fingerprint(metadata: &fs::Metadata) -> (u64, u64) { + ( + u64::from(metadata.volume_serial_number().unwrap_or(0)), + metadata.file_index().unwrap_or(0), + ) +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum FileKind { Mbox, @@ -73,7 +89,7 @@ fn walk_dir( logger: Logger, ) -> io::Result<()> { let metadata = fs::metadata(dir)?; - let key = (metadata.dev(), metadata.ino()); + let key = fingerprint(&metadata); if !visited.insert(key) { result.symlink_cycles += 1; logger.warn(&format!( @@ -148,6 +164,7 @@ fn classify(path: &Path) -> Option { mod tests { use super::*; use std::fs; + #[cfg(unix)] use std::os::unix::fs::symlink; use tempfile::TempDir; @@ -236,6 +253,7 @@ mod tests { assert_eq!(r.by_kind(FileKind::Vcf).count(), 0); } + #[cfg(unix)] #[test] fn symlink_to_directory_is_followed_once_not_infinitely() { let td = TempDir::new().unwrap(); @@ -246,6 +264,7 @@ mod tests { assert_eq!(r.files.len(), 1); } + #[cfg(unix)] #[test] fn symlink_cycle_is_broken() { let td = TempDir::new().unwrap();