@@ -46,7 +46,7 @@ async fn run_skills(args: SkillsArgs) -> Result<()> {
4646
4747async fn run_local ( cmd : LocalCommands ) -> Result < ( ) > {
4848 match cmd {
49- LocalCommands :: Install { version } => install ( & version) . await ,
49+ LocalCommands :: Install { version, force } => install ( & version, force ) . await ,
5050 LocalCommands :: List { remote } => {
5151 if remote {
5252 list_available ( ) . await
@@ -73,12 +73,21 @@ async fn run_local(cmd: LocalCommands) -> Result<()> {
7373 }
7474}
7575
76- async fn install ( version_spec : & str ) -> Result < ( ) > {
77- println ! ( "Resolving version {}..." , version_spec) ;
78- let entry = version_manager:: resolve_version ( version_spec) . await ?;
79- println ! ( "Resolved to version {} ({})" , entry. version, entry. channel) ;
76+ async fn install ( version_spec : & str , force : bool ) -> Result < ( ) > {
77+ let spec = version_manager:: parse_version_spec ( version_spec) ?;
78+ let platform = version_manager:: platform:: Platform :: detect ( ) ?;
79+
80+ eprintln ! ( "Resolving {}..." , spec) ;
81+ let resolved = version_manager:: resolve:: resolve ( & spec, & platform) . await ?;
82+
83+ let version = version_manager:: install:: install_resolved ( & resolved, & platform, force) . await ?;
84+
85+ // If this is the first installed version, set it as default
86+ if version_manager:: get_default_version ( ) . is_err ( ) {
87+ version_manager:: set_default_version ( & version) ?;
88+ eprintln ! ( "Set as default version" ) ;
89+ }
8090
81- version_manager:: install_version ( & entry. version , entry. channel ) . await ?;
8291 Ok ( ( ) )
8392}
8493
@@ -105,8 +114,8 @@ fn list_installed() -> Result<()> {
105114}
106115
107116async fn list_available ( ) -> Result < ( ) > {
108- println ! ( "Fetching available versions..." ) ;
109- let versions = version_manager:: list_available_versions ( ) . await ?;
117+ eprintln ! ( "Checking available versions on builds.clickhouse.com ..." ) ;
118+ let versions = version_manager:: list_available_versions_from_builds ( ) . await ?;
110119
111120 if versions. is_empty ( ) {
112121 println ! ( "No versions available" ) ;
@@ -115,36 +124,47 @@ async fn list_available() -> Result<()> {
115124
116125 let installed = version_manager:: list_installed_versions ( ) . unwrap_or_default ( ) ;
117126
118- println ! ( "Available versions:" ) ;
119- for entry in versions. iter ( ) . take ( 20 ) {
120- if installed. contains ( & entry. version ) {
121- println ! ( " {} [{}] (installed)" , entry. version, entry. channel) ;
127+ println ! ( "Available versions (builds.clickhouse.com):" ) ;
128+ for v in & versions {
129+ // Check if any installed version matches this minor
130+ let prefix = format ! ( "{}." , v) ;
131+ let is_installed = installed. iter ( ) . any ( |iv| iv. starts_with ( & prefix) || iv == v) ;
132+ if is_installed {
133+ println ! ( " {} (installed)" , v) ;
122134 } else {
123- println ! ( " {} [{}] " , entry . version , entry . channel ) ;
135+ println ! ( " {}" , v ) ;
124136 }
125137 }
126-
127- if versions. len ( ) > 20 {
128- println ! ( " ... and {} more" , versions. len( ) - 20 ) ;
129- }
138+ println ! ( ) ;
139+ println ! ( "Install with: clickhousectl local install <version>" ) ;
140+ println ! ( "For exact patch versions, use: clickhousectl local install 25.12.9.61" ) ;
130141
131142 Ok ( ( ) )
132143}
133144
134145async fn use_version ( version_spec : & str ) -> Result < ( ) > {
135- println ! ( "Resolving version {}..." , version_spec) ;
136- let entry = version_manager:: resolve_version ( version_spec) . await ?;
137- let version = & entry. version ;
138-
139- // Install if not already installed
140- let installed = version_manager:: list_installed_versions ( ) ?;
141- if !installed. contains ( version) {
142- println ! ( "Version {} not installed, installing..." , version) ;
143- version_manager:: install_version ( version, entry. channel ) . await ?;
144- }
146+ let spec = version_manager:: parse_version_spec ( version_spec) ?;
147+ let platform = version_manager:: platform:: Platform :: detect ( ) ?;
148+
149+ eprintln ! ( "Resolving {}..." , spec) ;
150+ let resolved = version_manager:: resolve:: resolve ( & spec, & platform) . await ?;
151+
152+ // If exact version is known, check if already installed
153+ let version = if let Some ( ref v) = resolved. exact_version {
154+ let installed = version_manager:: list_installed_versions ( ) ?;
155+ if installed. contains ( v) {
156+ v. clone ( )
157+ } else {
158+ eprintln ! ( "Version {} not installed, installing..." , v) ;
159+ version_manager:: install:: install_resolved ( & resolved, & platform, false ) . await ?
160+ }
161+ } else {
162+ // Version not known upfront (builds source) — install will detect it
163+ version_manager:: install:: install_resolved ( & resolved, & platform, false ) . await ?
164+ } ;
145165
146- version_manager:: set_default_version ( version) ?;
147- println ! ( "Default version set to {}" , version) ;
166+ version_manager:: set_default_version ( & version) ?;
167+ eprintln ! ( "Default version set to {}" , version) ;
148168 Ok ( ( ) )
149169}
150170
0 commit comments