11use crate :: commands:: install;
22use crate :: configrc:: { rc_get_with_fix, rc_update} ;
33use crate :: consts:: {
4- DVM_CONFIGRC_KEY_DENO_VERSION , DVM_CONFIGRC_KEY_REGISTRY_BINARY , DVM_VERSION_CANARY , DVM_VERSION_LATEST ,
5- DVM_VERSION_SYSTEM , REGISTRY_OFFICIAL ,
4+ DVM_CONFIGRC_KEY_DENO_VERSION , DVM_CONFIGRC_KEY_REGISTRY_VERSION , DVM_VERSION_CANARY , DVM_VERSION_LATEST ,
5+ DVM_VERSION_LTS , DVM_VERSION_SYSTEM , REGISTRY_LIST_OFFICIAL ,
66} ;
77use crate :: deno_bin_path;
88use crate :: meta:: DvmMeta ;
99use crate :: utils:: { best_version, deno_canary_path, deno_version_path, prompt_request, run_with_spinner, update_stub} ;
1010use crate :: utils:: { is_exact_version, load_dvmrc} ;
1111use crate :: version:: remote_versions;
12- use crate :: version:: { get_latest_version , VersionArg } ;
12+ use crate :: version:: { get_latest_lts_version , get_latest_remote_version , VersionArg } ;
1313use anyhow:: Result ;
14- use semver:: Version ;
14+ use semver:: { Version , VersionReq } ;
1515use std:: fs;
1616use std:: path:: Path ;
1717use std:: process:: Command ;
1818
1919/// using a tag or a specific version
2020pub fn exec ( meta : & mut DvmMeta , version : Option < String > , write_local : bool ) -> Result < ( ) > {
21- let rc_binary_url =
22- rc_get_with_fix ( DVM_CONFIGRC_KEY_REGISTRY_BINARY ) . unwrap_or_else ( |_| REGISTRY_OFFICIAL . to_string ( ) ) ;
21+ let rc_version_url =
22+ rc_get_with_fix ( DVM_CONFIGRC_KEY_REGISTRY_VERSION ) . unwrap_or_else ( |_| REGISTRY_LIST_OFFICIAL . to_string ( ) ) ;
2323
24- let version_req: VersionArg ;
25- if let Some ( ref version) = version {
24+ let version_req = if let Some ( ref version) = version {
2625 if version == & DVM_VERSION_CANARY . to_string ( ) {
2726 let canary_path = deno_canary_path ( ) ;
2827 if !canary_path. exists ( ) {
@@ -40,12 +39,14 @@ pub fn exec(meta: &mut DvmMeta, version: Option<String>, write_local: bool) -> R
4039 std:: fs:: remove_file ( deno_bin_path ( ) ) . unwrap ( ) ;
4140 println ! ( "Deno that was previously installed on your system will be activated now." ) ;
4241 return Ok ( ( ) ) ;
43- }
44-
45- if is_exact_version ( version) {
46- version_req = VersionArg :: Exact ( Version :: parse ( version) . unwrap ( ) ) ;
42+ } else if version == DVM_VERSION_LTS {
43+ VersionArg :: Lts
44+ } else if version == DVM_VERSION_LATEST {
45+ VersionArg :: Range ( VersionReq :: parse ( "*" ) . unwrap ( ) )
46+ } else if is_exact_version ( version) {
47+ VersionArg :: Exact ( Version :: parse ( version) . unwrap ( ) )
4748 } else if meta. has_alias ( version) {
48- version_req = meta. resolve_version_req ( version) ;
49+ meta. resolve_version_req ( version)
4950 } else {
5051 // dvm will reject for using semver range directly now.
5152 eprintln ! (
@@ -56,23 +57,29 @@ pub fn exec(meta: &mut DvmMeta, version: Option<String>, write_local: bool) -> R
5657 }
5758 } else {
5859 println ! ( "No version input detect, try to use version in .dvmrc file" ) ;
59- version_req = load_dvmrc ( ) ;
60+ let version_req = load_dvmrc ( ) ;
6061 println ! ( "Using semver range: {}" , version_req) ;
61- }
62+ version_req
63+ } ;
6264
63- let used_version = if version_req. to_string ( ) == "*" {
64- println ! ( "Checking for latest version" ) ;
65- let version = get_latest_version ( & rc_binary_url) . expect ( "Get latest version failed" ) ;
66- println ! ( "The latest version is v{}" , version) ;
67- version
68- } else {
69- match version_req {
70- VersionArg :: Exact ( ref v) => v. clone ( ) ,
71- VersionArg :: Range ( ref r) => {
72- println ! ( "Fetching version list" ) ;
73- let versions = remote_versions ( ) . expect ( "Fetching version list failed." ) ;
74- best_version ( versions. iter ( ) . map ( AsRef :: as_ref) , r. clone ( ) ) . unwrap ( )
75- }
65+ let used_version = match & version_req {
66+ VersionArg :: Lts => {
67+ println ! ( "Checking for latest LTS version" ) ;
68+ let version = get_latest_lts_version ( ) ?;
69+ println ! ( "The latest LTS version is v{}" , version) ;
70+ version
71+ }
72+ VersionArg :: Range ( r) if r. to_string ( ) == "*" => {
73+ println ! ( "Checking for latest version" ) ;
74+ let version = get_latest_remote_version ( & rc_version_url) ?;
75+ println ! ( "The latest version is v{}" , version) ;
76+ version
77+ }
78+ VersionArg :: Exact ( v) => v. clone ( ) ,
79+ VersionArg :: Range ( r) => {
80+ println ! ( "Fetching version list" ) ;
81+ let versions = remote_versions ( ) . expect ( "Fetching version list failed." ) ;
82+ best_version ( versions. iter ( ) . map ( AsRef :: as_ref) , r. clone ( ) ) . unwrap ( )
7683 }
7784 } ;
7885
0 commit comments