@@ -29,6 +29,8 @@ use tracing::{debug, instrument, warn};
2929
3030const GITHUB_API_VERSION_HEADER : & str = "X-GitHub-Api-Version" ;
3131const GITHUB_API_VERSION : & str = "2022-11-28" ;
32+ pub const DEFAULT_RELEASES_URL : & str =
33+ "https://api.github.com/repos/theseus-rs/postgresql-binaries/releases" ;
3234
3335lazy_static ! {
3436 static ref GITHUB_TOKEN : Option <String > = match std:: env:: var( "GITHUB_TOKEN" ) {
@@ -103,14 +105,13 @@ fn reqwest_client() -> ClientWithMiddleware {
103105/// Gets a release from GitHub for a given [version](Version) of PostgreSQL. If a release for the
104106/// [version](Version) is not found, then a [ReleaseNotFound] error is returned.
105107#[ instrument( level = "debug" ) ]
106- async fn get_release ( version : & Version ) -> Result < Release > {
107- let url = "https://api.github.com/repos/theseus-rs/postgresql-binaries/releases" ;
108+ async fn get_release ( releases_url : & str , version : & Version ) -> Result < Release > {
108109 let client = reqwest_client ( ) ;
109110
110111 debug ! ( "Attempting to locate release for version {version}" ) ;
111112
112113 if version. minor . is_some ( ) && version. release . is_some ( ) {
113- let request = client. get ( format ! ( "{url }/tags/{version}" ) ) ;
114+ let request = client. get ( format ! ( "{releases_url }/tags/{version}" ) ) ;
114115 let response = request. send ( ) . await ?. error_for_status ( ) ?;
115116 let release = response. json :: < Release > ( ) . await ?;
116117
@@ -123,7 +124,7 @@ async fn get_release(version: &Version) -> Result<Release> {
123124
124125 loop {
125126 let request = client
126- . get ( url )
127+ . get ( releases_url )
127128 . query ( & [ ( "page" , page. to_string ( ) . as_str ( ) ) , ( "per_page" , "100" ) ] ) ;
128129 let response = request. send ( ) . await ?. error_for_status ( ) ?;
129130 let response_releases = response. json :: < Vec < Release > > ( ) . await ?;
@@ -169,8 +170,8 @@ async fn get_release(version: &Version) -> Result<Release> {
169170/// specified, then the latest version is returned. If a release for the [version](Version) is not found, then a
170171/// [ReleaseNotFound] error is returned.
171172#[ instrument( level = "debug" ) ]
172- pub async fn get_version ( version : & Version ) -> Result < Version > {
173- let release = get_release ( version) . await ?;
173+ pub async fn get_version ( releases_url : & str , version : & Version ) -> Result < Version > {
174+ let release = get_release ( releases_url , version) . await ?;
174175 Version :: from_str ( & release. tag_name )
175176}
176177
@@ -181,8 +182,12 @@ pub async fn get_version(version: &Version) -> Result<Version> {
181182///
182183/// Two assets are returned. The first [asset](Asset) is the archive, and the second [asset](Asset) is the archive hash.
183184#[ instrument( level = "debug" , skip( target) ) ]
184- async fn get_asset < S : AsRef < str > > ( version : & Version , target : S ) -> Result < ( Version , Asset , Asset ) > {
185- let release = get_release ( version) . await ?;
185+ async fn get_asset < S : AsRef < str > > (
186+ releases_url : & str ,
187+ version : & Version ,
188+ target : S ,
189+ ) -> Result < ( Version , Asset , Asset ) > {
190+ let release = get_release ( releases_url, version) . await ?;
186191 let asset_version = Version :: from_str ( & release. tag_name ) ?;
187192 let mut asset: Option < Asset > = None ;
188193 let mut asset_hash: Option < Asset > = None ;
@@ -213,8 +218,8 @@ async fn get_asset<S: AsRef<str>>(version: &Version, target: S) -> Result<(Versi
213218///
214219/// Returns the archive version and bytes.
215220#[ instrument]
216- pub async fn get_archive ( version : & Version ) -> Result < ( Version , Bytes ) > {
217- get_archive_for_target ( version, target_triple:: TARGET ) . await
221+ pub async fn get_archive ( releases_url : & str , version : & Version ) -> Result < ( Version , Bytes ) > {
222+ get_archive_for_target ( releases_url , version, target_triple:: TARGET ) . await
218223}
219224
220225/// Gets the archive for a given [version](Version) of PostgreSQL and
@@ -226,10 +231,11 @@ pub async fn get_archive(version: &Version) -> Result<(Version, Bytes)> {
226231#[ allow( clippy:: cast_precision_loss) ]
227232#[ instrument( level = "debug" , skip( target) ) ]
228233pub async fn get_archive_for_target < S : AsRef < str > > (
234+ releases_url : & str ,
229235 version : & Version ,
230236 target : S ,
231237) -> Result < ( Version , Bytes ) > {
232- let ( asset_version, asset, asset_hash) = get_asset ( version, target) . await ?;
238+ let ( asset_version, asset, asset_hash) = get_asset ( releases_url , version, target) . await ?;
233239
234240 debug ! (
235241 "Downloading archive hash {}" ,
@@ -436,21 +442,22 @@ mod tests {
436442
437443 #[ test( tokio:: test) ]
438444 async fn test_get_release ( ) -> Result < ( ) > {
439- let _ = get_release ( & VERSION ) . await ?;
445+ let _ = get_release ( DEFAULT_RELEASES_URL , & VERSION ) . await ?;
440446 Ok ( ( ) )
441447 }
442448
443449 #[ test( tokio:: test) ]
444450 async fn test_get_release_version_not_found ( ) -> Result < ( ) > {
445- let release = get_release ( & INVALID_VERSION ) . await ;
451+ let release = get_release ( DEFAULT_RELEASES_URL , & INVALID_VERSION ) . await ;
446452 assert ! ( release. is_err( ) ) ;
447453 Ok ( ( ) )
448454 }
449455
450456 #[ test( tokio:: test) ]
451457 async fn test_get_asset ( ) -> Result < ( ) > {
452458 let target_triple = "x86_64-unknown-linux-musl" . to_string ( ) ;
453- let ( asset_version, asset, asset_hash) = get_asset ( & VERSION , & target_triple) . await ?;
459+ let ( asset_version, asset, asset_hash) =
460+ get_asset ( DEFAULT_RELEASES_URL , & VERSION , & target_triple) . await ?;
454461 assert ! ( asset_version. matches( & VERSION ) ) ;
455462 assert ! ( asset. name. contains( & target_triple) ) ;
456463 assert ! ( asset_hash. name. contains( & target_triple) ) ;
@@ -462,15 +469,15 @@ mod tests {
462469 #[ test( tokio:: test) ]
463470 async fn test_get_asset_version_not_found ( ) -> Result < ( ) > {
464471 let target_triple = "x86_64-unknown-linux-musl" . to_string ( ) ;
465- let result = get_asset ( & INVALID_VERSION , & target_triple) . await ;
472+ let result = get_asset ( DEFAULT_RELEASES_URL , & INVALID_VERSION , & target_triple) . await ;
466473 assert ! ( result. is_err( ) ) ;
467474 Ok ( ( ) )
468475 }
469476
470477 #[ test( tokio:: test) ]
471478 async fn test_get_asset_target_not_found ( ) -> Result < ( ) > {
472479 let target_triple = "wasm64-unknown-unknown" . to_string ( ) ;
473- let result = get_asset ( & VERSION , & target_triple) . await ;
480+ let result = get_asset ( DEFAULT_RELEASES_URL , & VERSION , & target_triple) . await ;
474481 assert ! ( result. is_err( ) ) ;
475482 Ok ( ( ) )
476483 }
0 commit comments