diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 091f3af..6a74c10 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -88,6 +88,13 @@ jobs: - name: Install dependencies run: | ${{ matrix.packages_install }} + - name: Update Rust toolchain to current stable + shell: bash + run: | + if command -v rustup > /dev/null 2>&1; then + rustup update stable + rustup default stable + fi - name: Build artifacts run: | # Actually do builds and make zips and whatnot diff --git a/src/sync/import_takeout/walk.rs b/src/sync/import_takeout/walk.rs index ab6e273..6832a48 100644 --- a/src/sync/import_takeout/walk.rs +++ b/src/sync/import_takeout/walk.rs @@ -7,27 +7,10 @@ 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, @@ -76,7 +59,7 @@ pub fn walk(root: &Path) -> io::Result { pub fn walk_with_logger(root: &Path, logger: Logger) -> io::Result { let mut result = WalkResult::default(); - let mut visited: HashSet<(u64, u64)> = HashSet::new(); + let mut visited: HashSet = HashSet::new(); walk_dir(root, &mut result, &mut visited, logger)?; result.files.sort_by(|a, b| a.path.cmp(&b.path)); Ok(result) @@ -85,12 +68,11 @@ pub fn walk_with_logger(root: &Path, logger: Logger) -> io::Result { fn walk_dir( dir: &Path, result: &mut WalkResult, - visited: &mut HashSet<(u64, u64)>, + visited: &mut HashSet, logger: Logger, ) -> io::Result<()> { - let metadata = fs::metadata(dir)?; - let key = fingerprint(&metadata); - if !visited.insert(key) { + let canonical = fs::canonicalize(dir)?; + if !visited.insert(canonical) { result.symlink_cycles += 1; logger.warn(&format!( "takeout walk: symlink cycle broken at {dir:?} (target already visited)"