1+ //! CodeQL Extractor Fetcher
12use std:: { os:: unix:: fs:: PermissionsExt , path:: PathBuf } ;
2-
33use anyhow:: { Context , Result } ;
4- use ghactions_core:: { repository:: reference:: RepositoryReference as Repository , toolcache :: tool } ;
4+ use ghactions_core:: repository:: reference:: RepositoryReference as Repository ;
55use octocrab:: models:: repos:: { Asset , Release } ;
66
77async fn fetch_releases ( client : & octocrab:: Octocrab , repository : & Repository ) -> Result < Release > {
@@ -35,32 +35,51 @@ pub async fn fetch_extractor(
3535 output : & PathBuf ,
3636) -> Result < PathBuf > {
3737 let extractor_tarball = output. join ( format ! ( "{}.tar.gz" , & repository. name) ) ;
38+ let extractor_zip = output. join ( format ! ( "{}.zip" , & repository. name) ) ;
39+
3840 log:: debug!( "Extractor Tarball :: {extractor_tarball:?}" ) ;
3941 let extractor_pack = output. join ( & repository. name ) ;
4042
4143 log:: info!( "Extractor Path :: {extractor_pack:?}" ) ;
4244
4345 let toolcache = ghactions:: ToolCache :: new ( ) ;
4446
45- if !extractor_tarball. exists ( ) {
47+ let extractor_archive = if !extractor_tarball. exists ( ) && !extractor_zip . exists ( ) {
4648 log:: info!( "Downloading asset to {extractor_tarball:?}" ) ;
4749
4850 let release = fetch_releases ( client, repository) . await ?;
4951
50- let Some ( release_asset) = release. assets . iter ( ) . find ( |a| a. name . ends_with ( ".tar.gz" ) )
51- else {
52- return Err ( anyhow:: anyhow!( "No asset found" ) ) ;
52+ let ( release_asset, file_format) = match release. assets . iter ( ) . find ( |a| a. name . ends_with ( ".tar.gz" ) || a. name . ends_with ( ".zip" ) ) {
53+ Some ( asset) if asset. name . ends_with ( ".tar.gz" ) => ( asset, "tar" ) ,
54+ Some ( asset) if asset. name . ends_with ( ".zip" ) => ( asset, "zip" ) ,
55+ _ => {
56+ return Err ( anyhow:: anyhow!( "No suitable asset found for extractor" ) ) ;
57+ }
5358 } ;
5459 log:: info!( "Asset URL :: {}" , release_asset. browser_download_url) ;
5560
5661 let asset: Asset = client. get ( release_asset. url . clone ( ) , None :: < & ( ) > ) . await ?;
5762
63+
64+ let extractor_archive = if file_format == "tar" {
65+ extractor_tarball. clone ( )
66+ } else {
67+ extractor_zip. clone ( )
68+ } ;
69+
5870 toolcache
59- . download_asset ( & asset, & extractor_tarball )
71+ . download_asset ( & asset, & extractor_archive )
6072 . await
6173 . context ( format ! ( "Extractor Archive: {extractor_tarball:?}" ) )
6274 . context ( "Failed to download extractor" ) ?;
63- }
75+ extractor_archive
76+ } else {
77+ if extractor_tarball. exists ( ) {
78+ extractor_tarball. clone ( )
79+ } else {
80+ extractor_zip. clone ( )
81+ }
82+ } ;
6483
6584 if attest {
6685 log:: info!( "Attesting asset {extractor_tarball:?}" ) ;
@@ -85,11 +104,13 @@ pub async fn fetch_extractor(
85104 log:: info!( "No attestation requested" ) ;
86105 }
87106
107+ log:: debug!( "Extractor Archive :: {extractor_archive:?}" ) ;
108+
88109 if !extractor_pack. exists ( ) {
89110 log:: info!( "Extracting asset to {extractor_pack:?}" ) ;
90111
91112 toolcache
92- . extract_archive ( & extractor_tarball , & extractor_pack)
113+ . extract_archive ( & extractor_archive , & extractor_pack)
93114 . await
94115 . context ( format ! ( "Extractor Archive: {extractor_tarball:?}" ) )
95116 . context ( "Failed to extract extractor" ) ?;
@@ -103,6 +124,7 @@ pub async fn fetch_extractor(
103124 ) ? {
104125 match glob {
105126 Ok ( path) => {
127+ // TODO: Load and check the extractor configuration
106128 log:: debug!( "Extractor Path :: {path:?}" ) ;
107129 let full_path = path. parent ( ) . unwrap ( ) . to_path_buf ( ) . canonicalize ( ) ?;
108130 // Linux and Macos
0 commit comments