@@ -40,14 +40,15 @@ pub async fn run(args: SetupArgs) -> Result<ExitCode> {
4040 } ;
4141
4242 // Non-interactive install of specified items
43- run_setup_items ( & items, args. force , args. java_version , args. channel ) . await
43+ run_setup_items ( & items, args. force , args. java_version , args. karate_version , args . channel ) . await
4444}
4545
4646/// Non-interactive setup of specified items.
4747async fn run_setup_items (
4848 items : & HashSet < String > ,
4949 force : bool ,
5050 java_version : Option < String > ,
51+ version_override : Option < String > ,
5152 channel_override : Option < String > ,
5253) -> Result < ExitCode > {
5354 let platform = Platform :: detect ( ) ?;
@@ -129,14 +130,27 @@ async fn run_setup_items(
129130 style( format!( "[{}/{}]" , step, total_steps) ) . bold( ) . dim( )
130131 ) ;
131132
132- let existing_jar = find_karate_jar ( & paths. dist ) ;
133- if existing_jar. is_some ( ) && !force {
134- println ! ( " {} Karate JAR already installed" , style( "✓" ) . green( ) ) ;
133+ // If a specific version is requested, check for that version; otherwise check for any JAR
134+ let should_download = if let Some ( ref ver) = version_override {
135+ let target_jar = paths. dist . join ( format ! ( "karate-{}.jar" , ver) ) ;
136+ if target_jar. exists ( ) && !force {
137+ println ! ( " {} Karate {} already installed" , style( "✓" ) . green( ) , ver) ;
138+ false
139+ } else {
140+ true
141+ }
135142 } else {
136- if force && existing_jar. is_some ( ) {
137- println ! ( " {} Force mode: re-downloading JAR" , style( "!" ) . yellow( ) ) ;
143+ let existing_jar = find_karate_jar ( & paths. dist ) ;
144+ if existing_jar. is_some ( ) && !force {
145+ println ! ( " {} Karate JAR already installed" , style( "✓" ) . green( ) ) ;
146+ false
147+ } else {
148+ if force { println ! ( " {} Force mode: re-downloading JAR" , style( "!" ) . yellow( ) ) ; }
149+ true
138150 }
139- download_karate_jar ( & paths, channel_override. as_deref ( ) ) . await ?;
151+ } ;
152+ if should_download {
153+ download_karate_jar ( & paths, version_override. as_deref ( ) , channel_override. as_deref ( ) ) . await ?;
140154 }
141155 println ! ( ) ;
142156 }
@@ -208,7 +222,7 @@ async fn run_setup_wizard() -> Result<ExitCode> {
208222 if existing_jar. is_some ( ) {
209223 println ! ( " {} Karate JAR already installed" , style( "✓" ) . green( ) ) ;
210224 } else {
211- download_karate_jar ( & paths, None ) . await ?;
225+ download_karate_jar ( & paths, None , None ) . await ?;
212226 }
213227
214228 println ! ( ) ;
@@ -257,7 +271,7 @@ async fn download_jre(platform: &Platform, paths: &KaratePaths, java_version: u8
257271}
258272
259273/// Download Karate JAR using manifest from karate.sh
260- async fn download_karate_jar ( paths : & KaratePaths , channel_override : Option < & str > ) -> Result < ( ) > {
274+ async fn download_karate_jar ( paths : & KaratePaths , version_override : Option < & str > , channel_override : Option < & str > ) -> Result < ( ) > {
261275 // Load config to get channel and version preferences
262276 let config = load_merged_config ( ) ?;
263277 let channel = channel_override. unwrap_or ( & config. channel ) ;
@@ -273,9 +287,12 @@ async fn download_karate_jar(paths: &KaratePaths, channel_override: Option<&str>
273287 )
274288 } ) ?;
275289
276- // Determine version: use config if pinned, otherwise get latest from channel
277- let version = if config. karate_version != "latest" {
278- // User pinned a specific version
290+ // Determine version: CLI flag → config pin → latest from channel
291+ let version = if let Some ( v) = version_override {
292+ println ! ( " Requested version: {}" , style( v) . cyan( ) ) ;
293+ v. to_string ( )
294+ } else if config. karate_version != "latest" {
295+ // User pinned a specific version in config
279296 println ! (
280297 " Using pinned version: {}" ,
281298 style( & config. karate_version) . cyan( )
0 commit comments