diff --git a/src/main.rs b/src/main.rs index f1e976e..b506e27 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,7 +30,7 @@ static USAGE: &'static str = " Usage: zvault init [--bundle-size SIZE] [--chunker METHOD] [--chunk-size SIZE] [--compression COMPRESSION] zvault backup [--full] - zvault restore + zvault restore [] zvault check [--full] zvault backups zvault info @@ -68,6 +68,8 @@ struct Args { arg_repo: Option, arg_path: Option, + arg_src: Option, + arg_dst: Option, arg_backup: Option, flag_full: bool, @@ -188,7 +190,13 @@ fn main() { } if args.cmd_restore { - repo.restore_backup(&backup, &args.arg_path.unwrap()).unwrap(); + let dst = args.arg_dst.unwrap(); + if let Some(src) = args.arg_src { + let inode = repo.get_backup_inode(&backup, src).unwrap(); + repo.restore_inode_tree(inode, &dst).unwrap(); + } else { + repo.restore_backup(&backup, &dst).unwrap(); + } return } diff --git a/src/repository/backup.rs b/src/repository/backup.rs index ad8aa6c..378f8e0 100644 --- a/src/repository/backup.rs +++ b/src/repository/backup.rs @@ -72,9 +72,9 @@ impl Repository { Ok(try!(msgpack::encode_to_stream(backup, &mut file))) } - pub fn restore_backup>(&mut self, backup: &Backup, path: P) -> Result<(), RepositoryError> { + pub fn restore_inode_tree>(&mut self, inode: Inode, path: P) -> Result<(), RepositoryError> { let mut queue = VecDeque::new(); - queue.push_back((path.as_ref().to_owned(), try!(self.get_inode(&backup.root)))); + queue.push_back((path.as_ref().to_owned(), inode)); while let Some((path, inode)) = queue.pop_front() { try!(self.save_inode_at(&inode, &path)); if inode.file_type == FileType::Directory { @@ -88,6 +88,12 @@ impl Repository { Ok(()) } + #[inline] + pub fn restore_backup>(&mut self, backup: &Backup, path: P) -> Result<(), RepositoryError> { + let inode = try!(self.get_inode(&backup.root)); + self.restore_inode_tree(inode, path) + } + #[allow(dead_code)] pub fn create_full_backup>(&mut self, path: P) -> Result { let mut scan_stack = vec![path.as_ref().to_owned()];