diff --git a/src/bin/clone.rs b/src/bin/clone.rs index 2854b77e5a..779151ad73 100644 --- a/src/bin/clone.rs +++ b/src/bin/clone.rs @@ -115,13 +115,18 @@ fn main() { let size_old = fs_old.header.size(); let free_old = fs_old.allocator().free() * redoxfs::BLOCK_SIZE; let used_old = size_old - free_old; - match clone(&mut fs_old, &mut fs, |used| { - eprint!( - "{}%: {} MB/{} MB\r", - (used * 100) / used_old, - used / 1000 / 1000, - used_old / 1000 / 1000 - ); + let mut last_percent = 0; + match clone(&mut fs_old, &mut fs, move |used| { + let percent = (used * 100) / used_old; + if percent != last_percent { + eprint!( + "{}%: {} MB/{} MB\r", + percent, + used / 1000 / 1000, + used_old / 1000 / 1000 + ); + last_percent = percent; + } }) { Ok(()) => (), Err(err) => { diff --git a/src/clone.rs b/src/clone.rs index 5d3c85ea28..3629db6916 100644 --- a/src/clone.rs +++ b/src/clone.rs @@ -10,13 +10,13 @@ fn syscall_err(err: syscall::Error) -> io::Error { } //TODO: handle hard links -pub fn clone_at( +fn clone_at( tx_old: &mut Transaction, parent_ptr_old: TreePtr, fs: &mut FileSystem, parent_ptr: TreePtr, buf: &mut [u8], - progress: &F, + progress: &mut F, ) -> syscall::Result<()> { let mut entries = Vec::new(); tx_old.child_nodes(parent_ptr_old, &mut entries)?; @@ -66,10 +66,10 @@ pub fn clone_at( Ok(()) } -pub fn clone( +pub fn clone( fs_old: &mut FileSystem, fs: &mut FileSystem, - progress: F, + mut progress: F, ) -> syscall::Result<()> { fs_old.tx(|tx_old| { // Clone at root node @@ -80,7 +80,7 @@ pub fn clone( fs, TreePtr::root(), &mut buf, - &progress, + &mut progress, )?; fs.tx(|tx| { diff --git a/src/lib.rs b/src/lib.rs index 1f50fa976f..82b9c01f4c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,7 +28,7 @@ pub use self::block::{ BlockAddr, BlockData, BlockLevel, BlockList, BlockMeta, BlockPtr, BlockRaw, BlockTrait, }; #[cfg(feature = "std")] -pub use self::clone::{clone, clone_at}; +pub use self::clone::clone; pub use self::dir::{DirEntry, DirList}; pub use self::disk::*; pub use self::filesystem::FileSystem;