@@ -2,6 +2,7 @@ use crate::prelude::*;
22use crate :: run:: instruments:: Instruments ;
33use url:: Url ;
44
5+ use crate :: run:: run_environment:: RepositoryProvider ;
56use crate :: run:: RunArgs ;
67
78use super :: RunnerMode ;
@@ -10,6 +11,7 @@ use super::RunnerMode;
1011pub struct Config {
1112 pub upload_url : Url ,
1213 pub token : Option < String > ,
14+ pub repository_override : Option < RepositoryOverride > ,
1315 pub working_directory : Option < String > ,
1416 pub command : String ,
1517
@@ -20,6 +22,13 @@ pub struct Config {
2022 pub skip_setup : bool ,
2123}
2224
25+ #[ derive( Debug , PartialEq , Clone ) ]
26+ pub struct RepositoryOverride {
27+ pub owner : String ,
28+ pub repository : String ,
29+ pub repository_provider : RepositoryProvider ,
30+ }
31+
2332impl Config {
2433 pub fn set_token ( & mut self , token : Option < String > ) {
2534 self . token = token;
@@ -33,6 +42,7 @@ impl Config {
3342 Self {
3443 upload_url : Url :: parse ( DEFAULT_UPLOAD_URL ) . unwrap ( ) ,
3544 token : None ,
45+ repository_override : None ,
3646 working_directory : None ,
3747 command : "" . into ( ) ,
3848 mode : RunnerMode :: Instrumentation ,
@@ -52,9 +62,22 @@ impl TryFrom<RunArgs> for Config {
5262 let raw_upload_url = args. upload_url . unwrap_or_else ( || DEFAULT_UPLOAD_URL . into ( ) ) ;
5363 let upload_url = Url :: parse ( & raw_upload_url)
5464 . map_err ( |e| anyhow ! ( "Invalid upload URL: {}, {}" , raw_upload_url, e) ) ?;
65+
5566 Ok ( Self {
5667 upload_url,
5768 token : args. token ,
69+ repository_override : args
70+ . repository
71+ . map ( |respository_and_owner| -> Result < RepositoryOverride > {
72+ let ( owner, repository) =
73+ extract_owner_and_repository_from_arg ( & respository_and_owner) ?;
74+ Ok ( RepositoryOverride {
75+ owner,
76+ repository,
77+ repository_provider : args. provider . unwrap_or_default ( ) ,
78+ } )
79+ } )
80+ . transpose ( ) ?,
5881 working_directory : args. working_directory ,
5982 mode : args. mode ,
6083 instruments,
@@ -65,6 +88,13 @@ impl TryFrom<RunArgs> for Config {
6588 }
6689}
6790
91+ fn extract_owner_and_repository_from_arg ( owner_and_repository : & str ) -> Result < ( String , String ) > {
92+ let ( owner, repository) = owner_and_repository
93+ . split_once ( '/' )
94+ . context ( "Invalid owner/repository format" ) ?;
95+ Ok ( ( owner. to_string ( ) , repository. to_string ( ) ) )
96+ }
97+
6898#[ cfg( test) ]
6999mod tests {
70100 use crate :: run:: instruments:: MongoDBConfig ;
@@ -76,6 +106,8 @@ mod tests {
76106 let config = Config :: try_from ( RunArgs {
77107 upload_url : None ,
78108 token : None ,
109+ repository : None ,
110+ provider : None ,
79111 working_directory : None ,
80112 mode : RunnerMode :: Instrumentation ,
81113 instruments : vec ! [ ] ,
@@ -87,6 +119,7 @@ mod tests {
87119 . unwrap ( ) ;
88120 assert_eq ! ( config. upload_url, Url :: parse( DEFAULT_UPLOAD_URL ) . unwrap( ) ) ;
89121 assert_eq ! ( config. token, None ) ;
122+ assert_eq ! ( config. repository_override, None ) ;
90123 assert_eq ! ( config. working_directory, None ) ;
91124 assert_eq ! ( config. instruments, Instruments { mongodb: None } ) ;
92125 assert ! ( !config. skip_upload) ;
@@ -99,6 +132,8 @@ mod tests {
99132 let config = Config :: try_from ( RunArgs {
100133 upload_url : Some ( "https://example.com/upload" . into ( ) ) ,
101134 token : Some ( "token" . into ( ) ) ,
135+ repository : Some ( "owner/repo" . into ( ) ) ,
136+ provider : Some ( RepositoryProvider :: GitLab ) ,
102137 working_directory : Some ( "/tmp" . into ( ) ) ,
103138 mode : RunnerMode :: Instrumentation ,
104139 instruments : vec ! [ "mongodb" . into( ) ] ,
@@ -114,6 +149,14 @@ mod tests {
114149 Url :: parse( "https://example.com/upload" ) . unwrap( )
115150 ) ;
116151 assert_eq ! ( config. token, Some ( "token" . into( ) ) ) ;
152+ assert_eq ! (
153+ config. repository_override,
154+ Some ( RepositoryOverride {
155+ owner: "owner" . into( ) ,
156+ repository: "repo" . into( ) ,
157+ repository_provider: RepositoryProvider :: GitLab ,
158+ } )
159+ ) ;
117160 assert_eq ! ( config. working_directory, Some ( "/tmp" . into( ) ) ) ;
118161 assert_eq ! (
119162 config. instruments,
@@ -127,4 +170,18 @@ mod tests {
127170 assert ! ( config. skip_setup) ;
128171 assert_eq ! ( config. command, "cargo codspeed bench" ) ;
129172 }
173+
174+ #[ test]
175+ fn test_extract_owner_and_repository_from_arg ( ) {
176+ let owner_and_repository = "CodSpeedHQ/runner" ;
177+ let ( owner, repository) =
178+ extract_owner_and_repository_from_arg ( owner_and_repository) . unwrap ( ) ;
179+ assert_eq ! ( owner, "CodSpeedHQ" ) ;
180+ assert_eq ! ( repository, "runner" ) ;
181+
182+ let owner_and_repository = "CodSpeedHQ_runner" ;
183+
184+ let result = extract_owner_and_repository_from_arg ( owner_and_repository) ;
185+ assert ! ( result. is_err( ) ) ;
186+ }
130187}
0 commit comments