@ -18,25 +18,33 @@ pub struct Install {
pub version : Option < UserVersion > ,
pub version : Option < UserVersion > ,
/// Install latest LTS
/// Install latest LTS
#[ clap(long, conflicts_with = " version " ) ]
#[ clap(long, conflicts_with_all = & [ " version " , " latest " ] ) ]
pub lts : bool ,
pub lts : bool ,
/// Install latest version
#[ clap(long, conflicts_with_all = & [ " version " , " lts " ] ) ]
pub latest : bool ,
}
}
impl Install {
impl Install {
fn version ( self ) -> Result < Option < UserVersion > , Error > {
fn version ( self ) -> Result < Option < UserVersion > , Error > {
match self {
match self {
Self {
version : Some ( _ ) ,
lts : true ,
} = > Err ( Error ::TooManyVersionsProvided ) ,
Self {
Self {
version : v ,
version : v ,
lts : false ,
lts : false ,
latest : false ,
} = > Ok ( v ) ,
} = > Ok ( v ) ,
Self {
Self {
version : None ,
version : None ,
lts : true ,
lts : true ,
latest : false ,
} = > Ok ( Some ( UserVersion ::Full ( Version ::Lts ( LtsType ::Latest ) ) ) ) ,
} = > Ok ( Some ( UserVersion ::Full ( Version ::Lts ( LtsType ::Latest ) ) ) ) ,
Self {
version : None ,
lts : false ,
latest : true ,
} = > Ok ( Some ( UserVersion ::Full ( Version ::Latest ) ) ) ,
_ = > Err ( Error ::TooManyVersionsProvided ) ,
}
}
}
}
}
}
@ -74,6 +82,21 @@ impl super::command::Command for Install {
) ;
) ;
picked_version
picked_version
}
}
UserVersion ::Full ( Version ::Latest ) = > {
let available_versions : Vec < _ > = remote_node_index ::list ( & config . node_dist_mirror )
. map_err ( | source | Error ::CantListRemoteVersions { source } ) ? ;
let picked_version = available_versions
. last ( )
. ok_or ( Error ::CantFindLatest ) ?
. version
. clone ( ) ;
debug ! (
"Resolved {} into Node version {}" ,
Version ::Latest . v_str ( ) . cyan ( ) ,
picked_version . v_str ( ) . cyan ( )
) ;
picked_version
}
current_version = > {
current_version = > {
let available_versions : Vec < _ > = remote_node_index ::list ( & config . node_dist_mirror )
let available_versions : Vec < _ > = remote_node_index ::list ( & config . node_dist_mirror )
. map_err ( | source | Error ::CantListRemoteVersions { source } ) ?
. map_err ( | source | Error ::CantListRemoteVersions { source } ) ?
@ -153,6 +176,8 @@ pub enum Error {
CantFindNodeVersion { requested_version : UserVersion } ,
CantFindNodeVersion { requested_version : UserVersion } ,
#[ error( " Can't find relevant LTS named {} " , lts_type) ]
#[ error( " Can't find relevant LTS named {} " , lts_type) ]
CantFindRelevantLts { lts_type : crate ::lts ::LtsType } ,
CantFindRelevantLts { lts_type : crate ::lts ::LtsType } ,
#[ error( " Can't find any versions in the upstream version index. " ) ]
CantFindLatest ,
#[ error( " The requested version is not installable: {} " , version.v_str()) ]
#[ error( " The requested version is not installable: {} " , version.v_str()) ]
UninstallableVersion { version : Version } ,
UninstallableVersion { version : Version } ,
#[ error( " Too many versions provided. Please don't use --lts with a version string. " ) ]
#[ error( " Too many versions provided. Please don't use --lts with a version string. " ) ]
@ -175,6 +200,7 @@ mod tests {
Install {
Install {
version : UserVersion ::from_str ( "12.0.0" ) . ok ( ) ,
version : UserVersion ::from_str ( "12.0.0" ) . ok ( ) ,
lts : false ,
lts : false ,
latest : false ,
}
}
. apply ( & config )
. apply ( & config )
. expect ( "Can't install" ) ;
. expect ( "Can't install" ) ;
@ -190,4 +216,31 @@ mod tests {
. ok ( )
. ok ( )
) ;
) ;
}
}
#[ test ]
fn test_install_latest ( ) {
let base_dir = tempfile ::tempdir ( ) . unwrap ( ) ;
let config = FnmConfig ::default ( ) . with_base_dir ( Some ( base_dir . path ( ) . to_path_buf ( ) ) ) ;
Install {
version : None ,
lts : false ,
latest : true ,
}
. apply ( & config )
. expect ( "Can't install" ) ;
let available_versions : Vec < _ > =
remote_node_index ::list ( & config . node_dist_mirror ) . expect ( "Can't get node version list" ) ;
let latest_version = available_versions . last ( ) . unwrap ( ) . version . clone ( ) ;
assert! ( config . installations_dir ( ) . exists ( ) ) ;
assert! ( config
. installations_dir ( )
. join ( latest_version . to_string ( ) )
. join ( "installation" )
. canonicalize ( )
. unwrap ( )
. exists ( ) ) ;
}
}
}