write some stupid stuff using unlimited scoped threads

This commit is contained in:
Quaternions 2024-01-11 16:06:12 -08:00
parent def0d1a69a
commit c3ca545119

View File

@ -427,7 +427,7 @@ fn sanitize<'a>(s:&'a str)->std::borrow::Cow<'a,str>{
lazy_regex::regex!(r"[^a-zA-Z0-9._-]").replace_all(s,"_") lazy_regex::regex!(r"[^a-zA-Z0-9._-]").replace_all(s,"_")
} }
async fn write_item(dom:&rbx_dom_weak::WeakDom,mut file:std::path::PathBuf,node:&TreeNode,node_name_override:String,write_models:bool,write_scripts:bool)->AResult<()>{ fn write_item(dom:&rbx_dom_weak::WeakDom,mut file:std::path::PathBuf,node:&TreeNode,node_name_override:String,write_models:bool,write_scripts:bool)->AResult<()>{
file.push(sanitize(node_name_override.as_str()).as_ref()); file.push(sanitize(node_name_override.as_str()).as_ref());
match node.class{ match node.class{
Class::Folder=>(), Class::Folder=>(),
@ -611,10 +611,10 @@ async fn write_files(config:WriteConfig,mut context:DecompiledContext)->AResult<
tokio::fs::write(file,serde_json::to_string(&properties)?).await?; tokio::fs::write(file,serde_json::to_string(&properties)?).await?;
} }
//write item in subfolder //write item in subfolder
write_queue.push(write_item(&context.dom,subfolder,node,name_override.clone(),config.write_models,config.write_scripts)); write_queue.push((subfolder,node,name_override.clone()));
}else{ }else{
//write item //write item
write_queue.push(write_item(&context.dom,folder.clone(),node,name_override.clone(),config.write_models,config.write_scripts)); write_queue.push((folder.clone(),node,name_override.clone()));
} }
//queue item to be deleted from dom after child objects are handled (stack is popped from the back) //queue item to be deleted from dom after child objects are handled (stack is popped from the back)
match node.class{ match node.class{
@ -637,9 +637,17 @@ async fn write_files(config:WriteConfig,mut context:DecompiledContext)->AResult<
} }
//run the async //run the async
for result in futures::future::join_all(write_queue).await{ std::thread::scope(|s|{
result?; let threads:Vec<std::thread::ScopedJoinHandle<'_,AResult<()>>>=write_queue.into_iter().map(|(write_path,node,node_name_override)|
} s.spawn(||write_item(&context.dom,write_path,node,node_name_override,config.write_models,config.write_scripts))
).collect();
for thread in threads{
match thread.join(){
Ok(_)=>(),
Err(e)=>println!("thread error: {:?}",e),
}
}
});
//run the destroy //run the destroy
for destroy_ref in destroy_queue{ for destroy_ref in destroy_queue{
@ -697,8 +705,8 @@ struct WriteCommitConfig{
write_scripts:bool, write_scripts:bool,
} }
async fn write_commit(config:WriteCommitConfig,b:AResult<(AssetVersion,DecompiledContext)>,repo:&git2::Repository)->AResult<()>{ async fn write_commit(config:WriteCommitConfig,b:Result<AResult<(AssetVersion,DecompiledContext)>,tokio::task::JoinError>,repo:&git2::Repository)->AResult<()>{
let (asset_version,context)=b?; let (asset_version,context)=b??;
//clean output dir //clean output dir
{ {
@ -780,21 +788,20 @@ async fn decompile_history_into_git(config:DecompileHistoryConfig)->AResult<()>{
let asset_id_string=config.asset_id.to_string(); let asset_id_string=config.asset_id.to_string();
futures::stream::iter(asset_list) futures::stream::iter(asset_list)
.map(|asset_version|{ .map(|asset_version|{
let client=&client; let client=client.clone();
let cookie=config.cookie.as_str(); let cookie=config.cookie.clone();
let asset_id_str=asset_id_string.as_str(); let asset_id_str=asset_id_string.clone();
async move{ tokio::task::spawn(async move{
let resp=download_asset_version(client,cookie,asset_id_str,asset_version.assetVersionNumber.to_string().as_str()).await?; let resp=download_asset_version(&client,cookie.as_str(),asset_id_str.as_str(),asset_version.assetVersionNumber.to_string().as_str()).await?;
let contents=match maybe_gzip_decode(std::io::Cursor::new(resp.bytes().await?))?{ let contents=match maybe_gzip_decode(std::io::Cursor::new(resp.bytes().await?))?{
ReaderType::GZip(readable)=>generate_decompiled_context(readable)?, ReaderType::GZip(readable)=>generate_decompiled_context(readable)?,
ReaderType::Raw(readable)=>generate_decompiled_context(readable)?, ReaderType::Raw(readable)=>generate_decompiled_context(readable)?,
}; };
Ok::<_,anyhow::Error>((asset_version,contents))
Ok((asset_version,contents)) })
}
}) })
.buffered(CONCURRENT_REQUESTS) .buffered(CONCURRENT_REQUESTS)
.for_each(|b:AResult<_>|async{ .for_each(|join_handle_result|async{
match write_commit(WriteCommitConfig{ match write_commit(WriteCommitConfig{
git_committer_name:config.git_committer_name.clone(), git_committer_name:config.git_committer_name.clone(),
git_committer_email:config.git_committer_email.clone(), git_committer_email:config.git_committer_email.clone(),
@ -802,7 +809,7 @@ async fn decompile_history_into_git(config:DecompileHistoryConfig)->AResult<()>{
write_template:config.write_template, write_template:config.write_template,
write_models:config.write_models, write_models:config.write_models,
write_scripts:config.write_scripts, write_scripts:config.write_scripts,
},b,&repo).await{ },join_handle_result,&repo).await{
Ok(())=>(), Ok(())=>(),
Err(e)=>println!("download/unzip/decompile/write/commit error: {}",e), Err(e)=>println!("download/unzip/decompile/write/commit error: {}",e),
} }