@@ -155,6 +155,7 @@ impl ArtifactHubPkg {
155155 pub fn from_metadata (
156156 metadata : & Metadata ,
157157 version : & str ,
158+ gh_release_tag : Option < & str > ,
158159 created_at : OffsetDateTime ,
159160 questions : Option < & str > ,
160161 ) -> Result < Self > {
@@ -182,7 +183,7 @@ impl ArtifactHubPkg {
182183 let home_url = parse_home_url ( metadata_annots) ?;
183184 let containers_images = parse_containers_images ( metadata_annots, & semver_version) ?;
184185 let keywords = parse_keywords ( metadata_annots) ?;
185- let links = parse_links ( metadata_annots, & semver_version) ?;
186+ let links = parse_links ( metadata_annots, & semver_version, gh_release_tag ) ?;
186187 let install = parse_oci_url ( metadata_annots, & semver_version) ?. map ( compose_install) ;
187188 let maintainers = parse_maintainers ( metadata_annots) ?;
188189 let annotations = parse_annotations ( metadata_annots, metadata, questions) ?;
@@ -327,6 +328,7 @@ fn parse_keywords(metadata_annots: &BTreeMap<String, String>) -> Result<Option<V
327328fn parse_links (
328329 metadata_annots : & BTreeMap < String , String > ,
329330 version : & Version ,
331+ gh_release_tag : Option < & str > ,
330332) -> Result < Option < Vec < Link > > > {
331333 match metadata_annots. get ( KUBEWARDEN_ANNOTATION_POLICY_SOURCE ) {
332334 Some ( s) => {
@@ -336,11 +338,17 @@ fn parse_links(
336338 } ) ?;
337339 match policy_source. host_str ( ) == Some ( "github.com" ) {
338340 true => {
341+ let release = if let Some ( tag) = gh_release_tag {
342+ url:: form_urlencoded:: byte_serialize ( tag. as_bytes ( ) ) . collect :: < String > ( )
343+ } else {
344+ format ! ( "v{}" , version)
345+ } ;
346+
339347 let url = Url :: parse (
340348 format ! (
341- "{}/releases/download/v {}/policy.wasm" ,
349+ "{}/releases/download/{}/policy.wasm" ,
342350 policy_source. as_str( ) ,
343- version . to_string ( ) . as_str ( ) ,
351+ release
344352 )
345353 . as_str ( ) ,
346354 )
@@ -587,6 +595,7 @@ mod tests {
587595 let arthub = ArtifactHubPkg :: from_metadata (
588596 & Metadata :: default ( ) ,
589597 "0.2.1" ,
598+ None ,
590599 OffsetDateTime :: UNIX_EPOCH ,
591600 None ,
592601 ) ;
@@ -597,14 +606,20 @@ mod tests {
597606 annotations : Some ( BTreeMap :: from ( [ ] ) ) ,
598607 ..Default :: default ( )
599608 } ;
600- let arthub =
601- ArtifactHubPkg :: from_metadata ( & metadata, "0.2.1" , OffsetDateTime :: UNIX_EPOCH , None ) ;
609+ let arthub = ArtifactHubPkg :: from_metadata (
610+ & metadata,
611+ "0.2.1" ,
612+ None ,
613+ OffsetDateTime :: UNIX_EPOCH ,
614+ None ,
615+ ) ;
602616 assert_eq ! ( arthub. unwrap_err( ) , ArtifactHubError :: NoAnnotations ) ;
603617
604618 // check version is semver
605619 let arthub = ArtifactHubPkg :: from_metadata (
606620 & mock_metadata_with_minimum_required ( ) ,
607621 "not-semver" ,
622+ None ,
608623 OffsetDateTime :: UNIX_EPOCH ,
609624 None ,
610625 ) ;
@@ -618,8 +633,13 @@ mod tests {
618633 annotations : Some ( BTreeMap :: from ( [ ( String :: from ( "foo" ) , String :: from ( "bar" ) ) ] ) ) ,
619634 ..Default :: default ( )
620635 } ;
621- let arthub =
622- ArtifactHubPkg :: from_metadata ( & metadata, "0.2.1" , OffsetDateTime :: UNIX_EPOCH , Some ( "" ) ) ;
636+ let arthub = ArtifactHubPkg :: from_metadata (
637+ & metadata,
638+ "0.2.1" ,
639+ None ,
640+ OffsetDateTime :: UNIX_EPOCH ,
641+ Some ( "" ) ,
642+ ) ;
623643 assert_eq ! ( arthub. unwrap_err( ) , ArtifactHubError :: EmptyQuestionsUI ) ;
624644
625645 Ok ( ( ) )
@@ -681,7 +701,7 @@ mod tests {
681701 ) ] ) ;
682702
683703 assert_eq ! (
684- parse_links( & source_annot, & semver_version) . unwrap( ) ,
704+ parse_links( & source_annot, & semver_version, None ) . unwrap( ) ,
685705 Some ( vec![
686706 Link {
687707 name: ConstLinkName :: Policy ,
@@ -695,14 +715,30 @@ mod tests {
695715 ] )
696716 ) ;
697717 assert_eq ! (
698- parse_links( & source_annot_not_github, & semver_version) . unwrap( ) ,
718+ parse_links( & source_annot, & semver_version, Some ( "SomePolicy/v0.2.1" ) ) . unwrap( ) ,
719+ Some ( vec![
720+ Link {
721+ name: ConstLinkName :: Policy ,
722+ url: Url :: parse(
723+ "https://github.com/repo/releases/download/SomePolicy%2Fv0.2.1/policy.wasm"
724+ )
725+ . unwrap( ) ,
726+ } ,
727+ Link {
728+ name: ConstLinkName :: Source ,
729+ url: Url :: parse( "https://github.com/repo" ) . unwrap( ) ,
730+ }
731+ ] )
732+ ) ;
733+ assert_eq ! (
734+ parse_links( & source_annot_not_github, & semver_version, None ) . unwrap( ) ,
699735 Some ( vec![ Link {
700736 name: ConstLinkName :: Source ,
701737 url: Url :: parse( "https://notgithub.com/repo" ) . unwrap( ) ,
702738 } ] )
703739 ) ;
704740 assert ! ( matches!(
705- parse_links( & source_annot_badurl, & semver_version) . unwrap_err( ) ,
741+ parse_links( & source_annot_badurl, & semver_version, None ) . unwrap_err( ) ,
706742 ArtifactHubError :: MalformedURL { .. }
707743 ) ) ;
708744
@@ -795,6 +831,7 @@ mod tests {
795831 let artif = ArtifactHubPkg :: from_metadata (
796832 & mock_metadata_with_minimum_required ( ) ,
797833 "0.2.1" ,
834+ None ,
798835 OffsetDateTime :: UNIX_EPOCH ,
799836 None ,
800837 )
@@ -845,6 +882,7 @@ kwctl scaffold manifest -t ClusterAdmissionPolicy registry://ghcr.io/ocirepo/nam
845882 let artif = ArtifactHubPkg :: from_metadata (
846883 & mock_metadata_with_all ( ) ,
847884 "0.2.1" ,
885+ None ,
848886 OffsetDateTime :: UNIX_EPOCH ,
849887 Some ( "questions contents" ) ,
850888 )
0 commit comments