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 {
|
struct SendFileIterator {
|
||||||
done: bool,
|
done: bool,
|
||||||
file_iter: Box<dyn Iterator<Item = PatchTreeIterItem>>,
|
file_iter: Box<dyn Iterator<Item = PatchTreeIterItem>>,
|
||||||
file_ids_to_update: HashSet<u32>,
|
|
||||||
patch_file_lookup: HashMap<u32, PatchFile>,
|
patch_file_lookup: HashMap<u32, PatchFile>,
|
||||||
current_file: Option<io::BufReader<fs::File>>,
|
current_file: Option<io::BufReader<fs::File>>,
|
||||||
chunk_num: u32,
|
chunk_num: u32,
|
||||||
@ -303,9 +302,15 @@ impl SendFileIterator {
|
|||||||
|
|
||||||
SendFileIterator {
|
SendFileIterator {
|
||||||
done: false,
|
done: false,
|
||||||
file_ids_to_update: file_ids_to_update,
|
|
||||||
patch_file_lookup: state.patch_file_lookup.clone(),
|
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,
|
current_file: None,
|
||||||
chunk_num: 0,
|
chunk_num: 0,
|
||||||
}
|
}
|
||||||
@ -350,16 +355,11 @@ impl Iterator for SendFileIterator {
|
|||||||
Some(SendPatchPacket::ChangeDirectory(ChangeDirectory::new(path.to_str().unwrap())))
|
Some(SendPatchPacket::ChangeDirectory(ChangeDirectory::new(path.to_str().unwrap())))
|
||||||
},
|
},
|
||||||
PatchTreeIterItem::File(path, id) => {
|
PatchTreeIterItem::File(path, id) => {
|
||||||
if self.file_ids_to_update.contains(&id) {
|
let patch_file = self.patch_file_lookup.get(&id).unwrap();
|
||||||
let patch_file = self.patch_file_lookup.get(&id).unwrap();
|
let file = fs::File::open(&patch_file.path).unwrap();
|
||||||
let file = fs::File::open(&patch_file.path).unwrap();
|
let size = file.metadata().unwrap().len();
|
||||||
let size = file.metadata().unwrap().len();
|
self.current_file = Some(io::BufReader::new(file));
|
||||||
self.current_file = Some(io::BufReader::new(file));
|
Some(SendPatchPacket::StartFileSend(StartFileSend::new(path.to_str().unwrap(), size as u32, id)))
|
||||||
Some(SendPatchPacket::StartFileSend(StartFileSend::new(path.to_str().unwrap(), size as u32, id)))
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
self.next()
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
PatchTreeIterItem::UpDirectory => {
|
PatchTreeIterItem::UpDirectory => {
|
||||||
Some(SendPatchPacket::UpOneDirectory(UpOneDirectory {}))
|
Some(SendPatchPacket::UpOneDirectory(UpOneDirectory {}))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user