@@ -2,7 +2,6 @@ use std::path::PathBuf;
22
33use anyhow:: Result ;
44use ghastoolkit:: Repository ;
5- use ghastoolkit:: codeql:: CodeQLExtractor ;
65use octocrab:: models:: repos:: { Asset , Release } ;
76
87async fn fetch_releases ( client : & octocrab:: Octocrab , repository : & Repository ) -> Result < Release > {
@@ -32,31 +31,57 @@ async fn fetch_releases(client: &octocrab::Octocrab, repository: &Repository) ->
3231pub async fn fetch_extractor (
3332 client : & octocrab:: Octocrab ,
3433 repository : & Repository ,
34+ attest : bool ,
3535 output : & PathBuf ,
36- ) -> Result < CodeQLExtractor > {
37- let release = fetch_releases ( client, repository) . await ?;
38-
39- let Some ( release_asset) = release. assets . iter ( ) . find ( |a| a. name . ends_with ( ".tar.gz" ) ) else {
40- return Err ( anyhow:: anyhow!( "No asset found" ) ) ;
41- } ;
42- log:: info!( "Asset URL :: {}" , release_asset. browser_download_url) ;
43-
44- let asset: Asset = client. get ( release_asset. url . clone ( ) , None :: < & ( ) > ) . await ?;
45-
36+ ) -> Result < PathBuf > {
4637 let extractor_tarball = output. join ( "extractor.tar.gz" ) ;
47- let extractor_path = output. join ( "extractor-pack" ) . join ( "codeql-extractor.yml" ) ;
38+ let extractor_pack = output. join ( "extractor-pack" ) ;
39+ let extractor_path = extractor_pack. join ( "codeql-extractor.yml" ) ;
4840
4941 let toolcache = ghactions:: ToolCache :: new ( ) ;
5042
5143 if !extractor_tarball. exists ( ) {
5244 log:: info!( "Downloading asset to {:?}" , extractor_tarball) ;
5345
46+ let release = fetch_releases ( client, repository) . await ?;
47+
48+ let Some ( release_asset) = release. assets . iter ( ) . find ( |a| a. name . ends_with ( ".tar.gz" ) )
49+ else {
50+ return Err ( anyhow:: anyhow!( "No asset found" ) ) ;
51+ } ;
52+ log:: info!( "Asset URL :: {}" , release_asset. browser_download_url) ;
53+
54+ let asset: Asset = client. get ( release_asset. url . clone ( ) , None :: < & ( ) > ) . await ?;
55+
5456 toolcache. download_asset ( & asset, & extractor_tarball) . await ?;
5557 }
5658
57- if extractor_path. exists ( ) {
58- log:: info!( "Removing existing asset {:?}" , extractor_path) ;
59- std:: fs:: remove_dir_all ( & extractor_path) ?;
59+ if attest {
60+ log:: info!( "Attesting asset {:?}" , extractor_tarball) ;
61+
62+ let output = tokio:: process:: Command :: new ( "gh" )
63+ . arg ( "attestation" )
64+ . arg ( "verify" )
65+ . arg ( "--owner" )
66+ . arg ( repository. owner ( ) )
67+ . arg ( & extractor_tarball)
68+ . output ( )
69+ . await ?;
70+
71+ if !output. status . success ( ) {
72+ return Err ( anyhow:: anyhow!(
73+ "Attestation failed: {}" ,
74+ String :: from_utf8_lossy( & output. stderr)
75+ ) ) ;
76+ }
77+ log:: info!( "Attestation successful" ) ;
78+ } else {
79+ log:: info!( "No attestation requested" ) ;
80+ }
81+
82+ if extractor_pack. exists ( ) {
83+ log:: info!( "Removing existing asset {:?}" , extractor_pack) ;
84+ std:: fs:: remove_dir_all ( & extractor_pack) ?;
6085 }
6186
6287 log:: info!( "Extracting asset to {:?}" , extractor_path) ;
@@ -68,8 +93,5 @@ pub async fn fetch_extractor(
6893 return Err ( anyhow:: anyhow!( "Extractor not found" ) ) ;
6994 }
7095
71- log:: info!( "Loading CodeQL Extractor from {:?}" , extractor_path) ;
72- let extractor = CodeQLExtractor :: load_path ( extractor_path) ?;
73-
74- Ok ( extractor)
96+ Ok ( extractor_path. canonicalize ( ) ?)
7597}
0 commit comments