1
- const https = require ( ' https' )
2
- const _ = require ( ' underscore-plus' )
1
+ const https = require ( " https" )
2
+ const _ = require ( " underscore-plus" )
3
3
4
4
const datedNightlyHasRlsCache = new Map ( )
5
5
const DATED_REGEX = / ( ^ [ ^ - ] + ) - ( \d { 4 , } - \d { 2 } - \d { 2 } ) $ /
6
6
7
7
/**
8
- * @param {string } manifest toml
9
- * @return {boolean }
8
+ * @param {string } manifest Toml
9
+ * @returns {boolean }
10
10
*/
11
11
function manifest_includes_rls ( manifest ) {
12
- return manifest . includes ( ' rls-preview' ) && ! manifest . includes ( '[pkg.rls-preview]\nversion = ""' )
12
+ return manifest . includes ( " rls-preview" ) && ! manifest . includes ( '[pkg.rls-preview]\nversion = ""' )
13
13
}
14
14
15
15
/**
16
- * @param {Date| string } date
17
- * @param {string= } channel defaults to `nightly`
18
- * @return {Promise<string> } toolchain name
16
+ * @param {Date | string } date
17
+ * @param {string } [ channel] Defaults to `nightly`
18
+ * @returns {Promise<string> } Toolchain name
19
19
*/
20
- async function checkDatedDistHasRls ( date , channel = ' nightly' ) {
21
- const dateString = _ . isString ( date ) ? date : date . toISOString ( ) . split ( 'T' ) [ 0 ]
20
+ async function checkDatedDistHasRls ( date , channel = " nightly" ) {
21
+ const dateString = _ . isString ( date ) ? date : date . toISOString ( ) . split ( "T" ) [ 0 ]
22
22
const cacheKey = `${ channel } -${ dateString } `
23
23
24
- let fetch = datedNightlyHasRlsCache . get ( cacheKey ) || new Promise ( ( resolve , reject ) => {
25
- https . get ( `https://static.rust-lang.org/dist/${ dateString } /channel-rust-${ channel } .toml` , res => {
26
- if ( res . statusCode !== 200 ) {
27
- return reject ( new Error ( `Failed, status: ${ res . statusCode } ` ) )
28
- }
29
- res . setEncoding ( "utf8" )
30
- let body = ""
31
- res . on ( "data" , data => {
32
- body += data
33
- if ( manifest_includes_rls ( body ) ) resolve ( cacheKey )
24
+ let fetch =
25
+ datedNightlyHasRlsCache . get ( cacheKey ) ||
26
+ new Promise ( ( resolve , reject ) => {
27
+ https
28
+ . get ( `https://static.rust-lang.org/dist/${ dateString } /channel-rust-${ channel } .toml` , ( res ) => {
29
+ if ( res . statusCode !== 200 ) {
30
+ return reject ( new Error ( `Failed, status: ${ res . statusCode } ` ) )
31
+ }
32
+ res . setEncoding ( "utf8" )
33
+ let body = ""
34
+ res . on ( "data" , ( data ) => {
35
+ body += data
36
+ if ( manifest_includes_rls ( body ) ) resolve ( cacheKey )
37
+ } )
38
+ res . on ( "end" , ( ) => reject ( new Error ( "no 'rls-preview'" ) ) )
34
39
} )
35
- res . on ( "end" , ( ) => reject ( new Error ( "no 'rls-preview'" ) ) )
36
- } )
37
- . on ( "error" , e => {
38
- datedNightlyHasRlsCache . delete ( cacheKey )
39
- reject ( e )
40
- } )
41
- } )
40
+ . on ( "error" , ( e ) => {
41
+ datedNightlyHasRlsCache . delete ( cacheKey )
42
+ reject ( e )
43
+ } )
44
+ } )
42
45
43
46
if ( ! datedNightlyHasRlsCache . has ( cacheKey ) ) {
44
47
datedNightlyHasRlsCache . set ( cacheKey , fetch )
@@ -48,77 +51,80 @@ async function checkDatedDistHasRls(date, channel='nightly') {
48
51
}
49
52
50
53
/**
51
- * @param {string= } channel defaults to `nightly`
52
- * @return {Promise<string> } latest channel dated version with rls-preview
54
+ * @param {string } [ channel] Defaults to `nightly`
55
+ * @returns {Promise<string> } Latest channel dated version with rls-preview
53
56
*/
54
57
async function fetchLatestDatedDistWithRls ( channel ) {
55
58
const aDayMillis = 24 * 60 * 60 * 1000
56
59
const minDate = new Date ( Date . now ( ) - 30 * aDayMillis )
57
60
58
- const check = day => {
59
- return checkDatedDistHasRls ( day , channel )
60
- . catch ( e => {
61
- if ( e && e . code === 'ENOTFOUND' ) throw e
61
+ const check = ( day ) => {
62
+ return checkDatedDistHasRls ( day , channel ) . catch ( ( e ) => {
63
+ if ( e && e . code === "ENOTFOUND" ) throw e
62
64
63
- const yesterday = new Date ( day - aDayMillis )
64
- if ( yesterday >= minDate ) return check ( yesterday )
65
- else throw new Error ( "No nightly with 'rls-preview'" )
66
- } )
65
+ const yesterday = new Date ( day - aDayMillis )
66
+ if ( yesterday >= minDate ) return check ( yesterday )
67
+ else throw new Error ( "No nightly with 'rls-preview'" )
68
+ } )
67
69
}
68
70
69
71
return check ( new Date ( ) )
70
72
}
71
73
72
74
/**
73
- * @param {string } arg.toolchain toolchain to check
74
- * @param {string } [arg.currentVersion] current installed rustc version
75
- * @return {Promise<?string> } new version of update available (falsy otherwise)
75
+ * @param {string } arg.toolchain Toolchain to check
76
+ * @param {string } [arg.currentVersion] Current installed rustc version
77
+ * @returns {Promise<?string> } New version of update available (falsy otherwise)
76
78
*/
77
- async function fetchLatestDist ( { toolchain, currentVersion= "none" } ) {
79
+ async function fetchLatestDist ( { toolchain, currentVersion = "none" } ) {
78
80
return new Promise ( ( resolve , reject ) => {
79
- https . get ( `https://static.rust-lang.org/dist/channel-rust-${ toolchain } .toml` , res => {
80
- if ( res . statusCode !== 200 ) {
81
- return reject ( new Error ( `check for toolchain update failed, status: ${ res . statusCode } ` ) )
82
- }
81
+ https
82
+ . get ( `https://static.rust-lang.org/dist/channel-rust-${ toolchain } .toml` , ( res ) => {
83
+ if ( res . statusCode !== 200 ) {
84
+ return reject ( new Error ( `check for toolchain update failed, status: ${ res . statusCode } ` ) )
85
+ }
83
86
84
- res . setEncoding ( "utf8" )
85
- let body = ""
86
- res . on ( "data" , data => body += data )
87
- res . on ( "end" , ( ) => {
88
- // use a subsection as toml is slow to parse fully
89
- let rustcInfo = body . match ( / ( \[ p k g \. r u s t c \] [ ^ [ ] * ) / m)
90
- if ( ! rustcInfo ) return reject ( new Error ( 'could not split channel toml output' ) )
91
- let rustcVersion = require ( 'toml' ) . parse ( rustcInfo [ 1 ] ) . pkg . rustc . version . trim ( )
92
- resolve (
93
- ! currentVersion . trim ( ) . endsWith ( rustcVersion )
94
- && manifest_includes_rls ( body )
95
- && `rustc ${ rustcVersion } `
96
- )
87
+ res . setEncoding ( "utf8" )
88
+ let body = ""
89
+ res . on ( "data" , ( data ) => ( body += data ) )
90
+ res . on ( "end" , ( ) => {
91
+ // use a subsection as toml is slow to parse fully
92
+ let rustcInfo = body . match ( / ( \[ p k g \. r u s t c \] [ ^ [ ] * ) / m)
93
+ if ( ! rustcInfo ) return reject ( new Error ( "could not split channel toml output" ) )
94
+ let rustcVersion = require ( "toml" ) . parse ( rustcInfo [ 1 ] ) . pkg . rustc . version . trim ( )
95
+ resolve (
96
+ ! currentVersion . trim ( ) . endsWith ( rustcVersion ) && manifest_includes_rls ( body ) && `rustc ${ rustcVersion } `
97
+ )
98
+ } )
99
+ } )
100
+ . on ( "error" , ( e ) => {
101
+ console . warn ( "ide-rust: check for updates failed" , e )
102
+ resolve ( )
97
103
} )
98
- } )
99
- . on ( "error" , e => {
100
- console . warn ( "ide-rust: check for updates failed" , e )
101
- resolve ( )
102
- } )
103
104
} )
104
105
}
105
106
106
107
/**
107
108
* Check a toolchain has rls, this can be done before installing
109
+ *
108
110
* @param {string } toolchain
109
- * @return {Promise<boolean> }
111
+ * @returns {Promise<boolean> }
110
112
*/
111
113
async function checkHasRls ( toolchain ) {
112
114
let dated = toolchain . match ( DATED_REGEX )
113
115
if ( dated ) {
114
- return checkDatedDistHasRls ( dated [ 2 ] , dated [ 1 ] ) . then ( ( ) => true ) . catch ( ( ) => false )
116
+ return checkDatedDistHasRls ( dated [ 2 ] , dated [ 1 ] )
117
+ . then ( ( ) => true )
118
+ . catch ( ( ) => false )
115
119
}
116
- return fetchLatestDist ( { toolchain } ) . then ( v => ! ! v ) . catch ( ( ) => false )
120
+ return fetchLatestDist ( { toolchain } )
121
+ . then ( ( v ) => ! ! v )
122
+ . catch ( ( ) => false )
117
123
}
118
124
119
125
/**
120
- * @param {string } channel ie nightly, beta, stable
121
- * @return {Promise<string> } latest channel dated version with rls-preview or the channel itself if ok
126
+ * @param {string } channel Ie nightly, beta, stable
127
+ * @returns {Promise<string> } Latest channel dated version with rls-preview or the channel itself if ok
122
128
*/
123
129
async function suggestChannelOrDated ( channel ) {
124
130
let latestDatedPromise = fetchLatestDatedDistWithRls ( channel )
0 commit comments