|
|
@ -60,18 +60,30 @@ where I: IntoIterator<Item = T>,
|
|
|
|
let (tx, rx) = handle::spawn_with_cancel(Default::default(), cancel);
|
|
|
|
let (tx, rx) = handle::spawn_with_cancel(Default::default(), cancel);
|
|
|
|
let renamer = tokio::spawn(async move {
|
|
|
|
let renamer = tokio::spawn(async move {
|
|
|
|
use futures::prelude::*;
|
|
|
|
use futures::prelude::*;
|
|
|
|
rx.for_each_concurrent(4, |(path, hash)| async move
|
|
|
|
// XXX: Renameing concurrently is dangerous
|
|
|
|
|
|
|
|
rx.for_each(|(path, hash)| async move
|
|
|
|
{
|
|
|
|
{
|
|
|
|
match hash {
|
|
|
|
match hash {
|
|
|
|
Ok(hash) => {
|
|
|
|
Ok(hash) => {
|
|
|
|
let new_name = path.parent().unwrap().join(hash.to_hex_string());
|
|
|
|
let new_name = {
|
|
|
|
|
|
|
|
let name = path.parent().unwrap().join(hash.to_hex_string());
|
|
|
|
|
|
|
|
if let Some(ext) = path.extension() {
|
|
|
|
|
|
|
|
name.with_extension(ext)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
name
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
if let Err(_) = tokio::spawn(async move {
|
|
|
|
if let Err(_) = tokio::spawn(async move {
|
|
|
|
|
|
|
|
if !new_name.exists() {
|
|
|
|
match fs::rename(&path, &new_name).await
|
|
|
|
match fs::rename(&path, &new_name).await
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Ok(_) => println!("[.] {:?} -> {:?}", path, new_name),
|
|
|
|
Ok(_) => println!("[.] {:?} -> {:?}", path, new_name),
|
|
|
|
Err(err) => println!("[!] {:?}: {}", path, err),
|
|
|
|
Err(err) => println!("[!] {:?}: {}", path, err),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}).await {
|
|
|
|
} else {
|
|
|
|
|
|
|
|
eprintln!("[w] file exists {:?}", new_name);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}).await { //XXX: No need to spawn here at all.
|
|
|
|
eprintln!("[!] panic: rename");
|
|
|
|
eprintln!("[!] panic: rename");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|