From 4f0d725b526d66da270baa4ea7eb04066e58075a Mon Sep 17 00:00:00 2001 From: qwjyh Date: Fri, 15 Mar 2024 20:54:26 +0900 Subject: [PATCH] fix: windows path canonicalization use these - expand_tilde - dunce::canonicalize --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + src/cmd_backup.rs | 14 ++++++++++---- src/cmd_storage.rs | 13 +++++++++++-- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c3dcee..bae6737 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -331,6 +331,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + [[package]] name = "dyn-clone" version = "1.0.17" @@ -1433,6 +1439,7 @@ dependencies = [ "clap", "clap-verbosity-flag", "dirs", + "dunce", "env_logger", "git2", "inquire", diff --git a/Cargo.toml b/Cargo.toml index d33d1cd..f65ec6a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ env_logger = "0.10.0" inquire = "0.6.2" git2 = "0.17.2" dirs = "5.0" +dunce = "1.0.4" serde = { version = "1.0", features = ["derive"] } serde_yaml = "0.9" byte-unit = "4.0.19" diff --git a/src/cmd_backup.rs b/src/cmd_backup.rs index 0809a78..e8a360a 100644 --- a/src/cmd_backup.rs +++ b/src/cmd_backup.rs @@ -1,17 +1,19 @@ use std::{ collections::HashMap, io::{self, stdout, Write}, - path::PathBuf, + path::{PathBuf, self}, }; -use anyhow::{anyhow, Context, Result}; +use anyhow::{anyhow, Context, Result, Ok}; +use dunce::canonicalize; use git2::Repository; use unicode_width::UnicodeWidthStr; use crate::{ add_and_commit, backups::{ - self, Backup, BackupCommand, BackupCommandExt, BackupTarget, Backups, ExternallyInvoked, + self, Backup, BackupCommand, BackupCommandExt, BackupLog, BackupResult, BackupTarget, + Backups, ExternallyInvoked, }, cmd_args::BackupAddCommands, devices::{self, Device}, @@ -28,6 +30,10 @@ pub(crate) fn cmd_backup_add( config_dir: &PathBuf, storages: &Storages, ) -> Result<()> { + trace!("Canonicalize path: {:?}", src); + let src = canonicalize(util::expand_tilde(src)?)?; + trace!("Canonicalize path: {:?}", dest); + let dest = canonicalize(util::expand_tilde(dest)?)?; let device = devices::get_device(&config_dir)?; let new_backup = new_backup(name, src, dest, cmd, &device, storages)?; let new_backup_name = new_backup.name().clone(); @@ -124,7 +130,7 @@ mod test { .join("mnt") .join("different"), &device, - )); + )); let mut storages = Storages::new(); storages.add(storage1)?; storages.add(storage2)?; diff --git a/src/cmd_storage.rs b/src/cmd_storage.rs index ce76d9f..304b1bd 100644 --- a/src/cmd_storage.rs +++ b/src/cmd_storage.rs @@ -7,6 +7,7 @@ use std::{ use anyhow::{anyhow, Context, Result}; use byte_unit::Byte; +use dunce::canonicalize; use git2::Repository; use inquire::{Confirm, CustomType, Text}; use unicode_width::{self, UnicodeWidthStr}; @@ -21,6 +22,7 @@ use crate::{ physical_drive_partition::{self, PhysicalDrivePartition}, Storage, StorageExt, StorageType, Storages, }, + util, }; pub(crate) fn cmd_storage_add( @@ -46,7 +48,11 @@ pub(crate) fn cmd_storage_add( let storage = if use_sysinfo { physical_drive_partition::select_physical_storage(name, device)? } else { - manually_construct_physical_drive_partition(name, path.unwrap(), &device)? + manually_construct_physical_drive_partition( + name, + canonicalize(util::expand_tilde(path.unwrap()))?, + &device, + )? }; println!("storage: {}: {:?}", storage.name(), storage); Storage::PhysicalStorage(storage) @@ -70,7 +76,8 @@ pub(crate) fn cmd_storage_add( } trace!("SubDirectory arguments: path: {:?}", path); // Nightly feature std::path::absolute - let path = path.canonicalize()?; + trace!("Canonicalize path: {:?}", path); + let path = canonicalize(util::expand_tilde(path))?; trace!("canonicalized: path: {:?}", path); let storage = directory::Directory::try_from_device_path( @@ -91,6 +98,8 @@ pub(crate) fn cmd_storage_add( name )); } + trace!("Canonicalize path: {:?}", path); + let path = canonicalize(util::expand_tilde(path))?; let storage = storages::online_storage::OnlineStorage::new( name, provider, capacity, alias, path, &device, );