fix: windows path canonicalization

use these
- expand_tilde
- dunce::canonicalize
This commit is contained in:
qwjyh 2024-03-15 20:54:26 +09:00
parent 26fbea5d3a
commit 4f0d725b52
4 changed files with 29 additions and 6 deletions

7
Cargo.lock generated
View file

@ -331,6 +331,12 @@ version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
[[package]]
name = "dunce"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
[[package]] [[package]]
name = "dyn-clone" name = "dyn-clone"
version = "1.0.17" version = "1.0.17"
@ -1433,6 +1439,7 @@ dependencies = [
"clap", "clap",
"clap-verbosity-flag", "clap-verbosity-flag",
"dirs", "dirs",
"dunce",
"env_logger", "env_logger",
"git2", "git2",
"inquire", "inquire",

View file

@ -15,6 +15,7 @@ env_logger = "0.10.0"
inquire = "0.6.2" inquire = "0.6.2"
git2 = "0.17.2" git2 = "0.17.2"
dirs = "5.0" dirs = "5.0"
dunce = "1.0.4"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_yaml = "0.9" serde_yaml = "0.9"
byte-unit = "4.0.19" byte-unit = "4.0.19"

View file

@ -1,17 +1,19 @@
use std::{ use std::{
collections::HashMap, collections::HashMap,
io::{self, stdout, Write}, 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 git2::Repository;
use unicode_width::UnicodeWidthStr; use unicode_width::UnicodeWidthStr;
use crate::{ use crate::{
add_and_commit, add_and_commit,
backups::{ backups::{
self, Backup, BackupCommand, BackupCommandExt, BackupTarget, Backups, ExternallyInvoked, self, Backup, BackupCommand, BackupCommandExt, BackupLog, BackupResult, BackupTarget,
Backups, ExternallyInvoked,
}, },
cmd_args::BackupAddCommands, cmd_args::BackupAddCommands,
devices::{self, Device}, devices::{self, Device},
@ -28,6 +30,10 @@ pub(crate) fn cmd_backup_add(
config_dir: &PathBuf, config_dir: &PathBuf,
storages: &Storages, storages: &Storages,
) -> Result<()> { ) -> 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 device = devices::get_device(&config_dir)?;
let new_backup = new_backup(name, src, dest, cmd, &device, storages)?; let new_backup = new_backup(name, src, dest, cmd, &device, storages)?;
let new_backup_name = new_backup.name().clone(); let new_backup_name = new_backup.name().clone();
@ -124,7 +130,7 @@ mod test {
.join("mnt") .join("mnt")
.join("different"), .join("different"),
&device, &device,
)); ));
let mut storages = Storages::new(); let mut storages = Storages::new();
storages.add(storage1)?; storages.add(storage1)?;
storages.add(storage2)?; storages.add(storage2)?;

View file

@ -7,6 +7,7 @@ use std::{
use anyhow::{anyhow, Context, Result}; use anyhow::{anyhow, Context, Result};
use byte_unit::Byte; use byte_unit::Byte;
use dunce::canonicalize;
use git2::Repository; use git2::Repository;
use inquire::{Confirm, CustomType, Text}; use inquire::{Confirm, CustomType, Text};
use unicode_width::{self, UnicodeWidthStr}; use unicode_width::{self, UnicodeWidthStr};
@ -21,6 +22,7 @@ use crate::{
physical_drive_partition::{self, PhysicalDrivePartition}, physical_drive_partition::{self, PhysicalDrivePartition},
Storage, StorageExt, StorageType, Storages, Storage, StorageExt, StorageType, Storages,
}, },
util,
}; };
pub(crate) fn cmd_storage_add( pub(crate) fn cmd_storage_add(
@ -46,7 +48,11 @@ pub(crate) fn cmd_storage_add(
let storage = if use_sysinfo { let storage = if use_sysinfo {
physical_drive_partition::select_physical_storage(name, device)? physical_drive_partition::select_physical_storage(name, device)?
} else { } 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); println!("storage: {}: {:?}", storage.name(), storage);
Storage::PhysicalStorage(storage) Storage::PhysicalStorage(storage)
@ -70,7 +76,8 @@ pub(crate) fn cmd_storage_add(
} }
trace!("SubDirectory arguments: path: {:?}", path); trace!("SubDirectory arguments: path: {:?}", path);
// Nightly feature std::path::absolute // Nightly feature std::path::absolute
let path = path.canonicalize()?; trace!("Canonicalize path: {:?}", path);
let path = canonicalize(util::expand_tilde(path))?;
trace!("canonicalized: path: {:?}", path); trace!("canonicalized: path: {:?}", path);
let storage = directory::Directory::try_from_device_path( let storage = directory::Directory::try_from_device_path(
@ -91,6 +98,8 @@ pub(crate) fn cmd_storage_add(
name name
)); ));
} }
trace!("Canonicalize path: {:?}", path);
let path = canonicalize(util::expand_tilde(path))?;
let storage = storages::online_storage::OnlineStorage::new( let storage = storages::online_storage::OnlineStorage::new(
name, provider, capacity, alias, path, &device, name, provider, capacity, alias, path, &device,
); );