7 Commits

Author SHA1 Message Date
bbba21392b diff
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-09 03:00:59 -07:00
dc707f48ae err 2025-07-09 03:00:59 -07:00
e9ff73bbfb sig 2025-07-09 03:00:59 -07:00
618cb34523 gitoxide not ready yet 2025-07-09 02:40:59 -07:00
facb8dfc8c wip 2025-07-09 02:40:03 -07:00
1f9aa708b0 switch to gix 2025-07-09 02:37:43 -07:00
9541e69ed1 switch to gitoxide 2025-07-09 02:36:09 -07:00
3 changed files with 1417 additions and 64 deletions

1414
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@ edition = "2021"
anyhow = "1.0.75" anyhow = "1.0.75"
clap = { version = "4.4.2", features = ["derive"] } clap = { version = "4.4.2", features = ["derive"] }
futures = "0.3.30" futures = "0.3.30"
git2 = "0.20.0" gix = "0.72.1"
lazy-regex = "3.1.0" lazy-regex = "3.1.0"
rbx_asset = { path = "rbx_asset" } rbx_asset = { path = "rbx_asset" }
rbx_binary = "1.0.0" rbx_binary = "1.0.0"

View File

@@ -1463,7 +1463,7 @@ struct WriteCommitConfig{
write_scripts:bool, write_scripts:bool,
} }
async fn write_commit(config:WriteCommitConfig,b:Result<AResult<(AssetVersion,rox_compiler::DecompiledContext)>,tokio::task::JoinError>,repo:&git2::Repository)->AResult<()>{ async fn write_commit(config:WriteCommitConfig,b:Result<AResult<(AssetVersion,rox_compiler::DecompiledContext)>,tokio::task::JoinError>,repo:&gix::Repository)->AResult<()>{
let (asset_version,context)=b??; let (asset_version,context)=b??;
println!("writing files for version {}",asset_version.assetVersionNumber); println!("writing files for version {}",asset_version.assetVersionNumber);
@@ -1494,12 +1494,17 @@ async fn write_commit(config:WriteCommitConfig,b:Result<AResult<(AssetVersion,ro
write_scripts:config.write_scripts, write_scripts:config.write_scripts,
}).await?; }).await?;
let date=asset_version.created; let time=gix::date::Time::new(asset_version.created.timestamp(),0);
//let sig=repo.signature()?; //this pulls default name and email let sig=gix::actor::Signature{
let sig=git2::Signature::new(config.git_committer_name.as_str(),config.git_committer_email.as_str(),&git2::Time::new(date.timestamp(),0)).unwrap(); name:config.git_committer_name.into(),
email:config.git_committer_email.into(),
time,
};
let tree_id={ let tree_id={
let mut tree_index = repo.index()?; let mut tree_index = repo.index()?;
match tree_index.add_all(std::iter::once("*"),git2::IndexAddOption::DEFAULT,None){ tree.index()?.
tree.peel_to_entry(path);
match tree_index.add_all(std::iter::once("*"),gix::IndexAddOption::DEFAULT,None){
Ok(_)=>(), Ok(_)=>(),
Err(e)=>println!("tree_index.add_all error: {}",e), Err(e)=>println!("tree_index.add_all error: {}",e),
} }
@@ -1510,34 +1515,38 @@ async fn write_commit(config:WriteCommitConfig,b:Result<AResult<(AssetVersion,ro
tree_index.write()?; tree_index.write()?;
tree_index.write_tree()? tree_index.write_tree()?
}; };
let tree=repo.find_tree(tree_id)?; let tree=repo.tree(tree_id)?;
let mut parents=Vec::new(); let mut parents=Vec::new();
match repo.head(){ match repo.head_commit(){
Ok(reference)=>{ Ok(commit)=>{
let commit=reference.peel_to_commit()?;
//test tree against commit tree to see if there is any changes //test tree against commit tree to see if there is any changes
let commit_tree=commit.tree()?; let commit_tree=commit.tree()?;
let diff=repo.diff_tree_to_tree(Some(&commit_tree),Some(&tree),None)?; let diff=repo.diff_tree_to_tree(Some(&commit_tree),Some(&tree),None)?;
if diff.get_delta(0).is_none(){ if diff.is_empty(){
println!("no changes"); println!("no changes");
return Ok(()); return Ok(());
} }
parents.push(commit); parents.push(commit.id());
}, },
Err(e)=>println!("repo head error {:?}",e), //If the repo head is not found, great, continue and make the first commit
Err(gix::reference::head_commit::Error::Head(gix::reference::find::existing::Error::NotFound{..}))=>(),
//for other errors
Err(e)=>Err(e)?,
}; };
repo.commit( let mut timebuf=gix::date::parse::TimeBuf::default();
Some("HEAD"),//update_ref let sig_ref=sig.to_ref(&mut timebuf);
&sig,//author
&sig,//commiter repo.commit_as(
&format!("v{}", asset_version.assetVersionNumber),//message sig_ref,//commiter
sig_ref,//author
"HEAD",
&format!("v{}",asset_version.assetVersionNumber),//message
&tree,//tree (basically files) &tree,//tree (basically files)
parents.iter().collect::<Vec<&git2::Commit<'_>>>().as_slice(),//parents parents,//parents
)?; )?;
//commit //commit
@@ -1561,7 +1570,14 @@ async fn decompile_history_into_git(config:DecompileHistoryConfig)->AResult<()>{
versions_path.push("versions.json"); versions_path.push("versions.json");
let asset_list:Vec<AssetVersion>=serde_json::from_reader(std::fs::File::open(versions_path)?)?; let asset_list:Vec<AssetVersion>=serde_json::from_reader(std::fs::File::open(versions_path)?)?;
let repo=git2::Repository::init(config.output_folder.as_path())?; let repo=gix::discover(gix::create::into(
config.output_folder.as_path(),
gix::create::Kind::Bare,
gix::create::Options{
destination_must_be_empty:true,
fs_capabilities:None
}
)?)?;
//decompile all versions //decompile all versions
futures::stream::iter(asset_list.into_iter() futures::stream::iter(asset_list.into_iter()
@@ -1611,7 +1627,14 @@ async fn download_and_decompile_history_into_git(config:DownloadAndDecompileHist
//poll paged list of all asset versions //poll paged list of all asset versions
let asset_list=get_version_history(&context,config.asset_id).await?; let asset_list=get_version_history(&context,config.asset_id).await?;
let repo=git2::Repository::init(config.output_folder.clone())?; let repo=gix::discover(gix::create::into(
config.output_folder.as_path(),
gix::create::Kind::Bare,
gix::create::Options{
destination_must_be_empty:true,
fs_capabilities:None
}
)?)?;
//download all versions //download all versions
let asset_id=config.asset_id; let asset_id=config.asset_id;