fix case where the iterator recursion would blow the stack
This commit is contained in:
parent
272be2db74
commit
94095c21e1
@ -288,7 +288,6 @@ fn does_file_need_updating(file_info: &FileInfoReply, patch_file_lookup: &HashMa
|
||||
struct SendFileIterator {
|
||||
done: bool,
|
||||
file_iter: Box<dyn Iterator<Item = PatchTreeIterItem>>,
|
||||
file_ids_to_update: HashSet<u32>,
|
||||
patch_file_lookup: HashMap<u32, PatchFile>,
|
||||
current_file: Option<io::BufReader<fs::File>>,
|
||||
chunk_num: u32,
|
||||
@ -303,9 +302,15 @@ impl SendFileIterator {
|
||||
|
||||
SendFileIterator {
|
||||
done: false,
|
||||
file_ids_to_update: file_ids_to_update,
|
||||
patch_file_lookup: state.patch_file_lookup.clone(),
|
||||
file_iter: Box::new(state.patch_file_tree.flatten().into_iter()),
|
||||
file_iter: Box::new(state.patch_file_tree.flatten().into_iter().filter(move |file| {
|
||||
match file {
|
||||
PatchTreeIterItem::File(path, id) => {
|
||||
file_ids_to_update.contains(&id)
|
||||
},
|
||||
_ => true,
|
||||
}
|
||||
})),
|
||||
current_file: None,
|
||||
chunk_num: 0,
|
||||
}
|
||||
@ -350,16 +355,11 @@ impl Iterator for SendFileIterator {
|
||||
Some(SendPatchPacket::ChangeDirectory(ChangeDirectory::new(path.to_str().unwrap())))
|
||||
},
|
||||
PatchTreeIterItem::File(path, id) => {
|
||||
if self.file_ids_to_update.contains(&id) {
|
||||
let patch_file = self.patch_file_lookup.get(&id).unwrap();
|
||||
let file = fs::File::open(&patch_file.path).unwrap();
|
||||
let size = file.metadata().unwrap().len();
|
||||
self.current_file = Some(io::BufReader::new(file));
|
||||
Some(SendPatchPacket::StartFileSend(StartFileSend::new(path.to_str().unwrap(), size as u32, id)))
|
||||
}
|
||||
else {
|
||||
self.next()
|
||||
}
|
||||
let patch_file = self.patch_file_lookup.get(&id).unwrap();
|
||||
let file = fs::File::open(&patch_file.path).unwrap();
|
||||
let size = file.metadata().unwrap().len();
|
||||
self.current_file = Some(io::BufReader::new(file));
|
||||
Some(SendPatchPacket::StartFileSend(StartFileSend::new(path.to_str().unwrap(), size as u32, id)))
|
||||
},
|
||||
PatchTreeIterItem::UpDirectory => {
|
||||
Some(SendPatchPacket::UpOneDirectory(UpOneDirectory {}))
|
||||
@ -409,4 +409,4 @@ pub fn load_motd() -> String {
|
||||
motd = m.clone();
|
||||
}
|
||||
motd
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user