1
1
import * as child_process from 'child_process' ;
2
2
import * as fs from 'fs' ;
3
3
import * as https from 'https' ;
4
+ import * as os from 'os' ;
4
5
import * as path from 'path' ;
5
6
import { env , ExtensionContext , ProgressLocation , Uri , window , WorkspaceFolder } from 'vscode' ;
6
7
import { downloadFile , executableExists , userAgentHeader } from './utils' ;
@@ -18,7 +19,7 @@ interface IAsset {
18
19
}
19
20
20
21
// On Windows the executable needs to be stored somewhere with an .exe extension
21
- const exeExtension = process . platform === 'win32' ? '.exe' : '' ;
22
+ const exeExt = process . platform === 'win32' ? '.exe' : '' ;
22
23
23
24
class MissingToolError extends Error {
24
25
public readonly tool : string ;
@@ -57,6 +58,17 @@ class MissingToolError extends Error {
57
58
}
58
59
}
59
60
61
+ // tslint:disable-next-line: max-classes-per-file
62
+ class NoBinariesError extends Error {
63
+ constructor ( hlsVersion : string , ghcVersion ?: string ) {
64
+ if ( ghcVersion ) {
65
+ super ( `haskell-language-server ${ hlsVersion } for GHC ${ ghcVersion } is not available on ${ os . type ( ) } ` ) ;
66
+ } else {
67
+ super ( `haskell-language-server ${ hlsVersion } is not available on ${ os . type ( ) } ` ) ;
68
+ }
69
+ }
70
+ }
71
+
60
72
/** Works out what the project's ghc version is, downloading haskell-language-server-wrapper
61
73
* if needed. Returns null if there was an error in either downloading the wrapper or
62
74
* in working out the ghc version
@@ -97,7 +109,7 @@ async function getProjectGhcVersion(context: ExtensionContext, dir: string, rele
97
109
98
110
// Otherwise search to see if we previously downloaded the wrapper
99
111
100
- const wrapperName = `haskell-language-server-wrapper-${ release . tag_name } -${ process . platform } ${ exeExtension } ` ;
112
+ const wrapperName = `haskell-language-server-wrapper-${ release . tag_name } -${ process . platform } ${ exeExt } ` ;
101
113
const downloadedWrapper = path . join ( context . globalStoragePath , wrapperName ) ;
102
114
103
115
if ( executableExists ( downloadedWrapper ) ) {
@@ -109,14 +121,14 @@ async function getProjectGhcVersion(context: ExtensionContext, dir: string, rele
109
121
const githubOS = getGithubOS ( ) ;
110
122
if ( githubOS === null ) {
111
123
// Don't have any binaries available for this platform
112
- throw Error ( `Couldn't find any haskell-language-server-wrapper binaries for ${ process . platform } ` ) ;
124
+ throw new NoBinariesError ( release . tag_name ) ;
113
125
}
114
126
115
- const assetName = `haskell-language-server-wrapper-${ githubOS } ${ exeExtension } .gz ` ;
116
- const wrapperAsset = release . assets . find ( ( x ) => x . name === assetName ) ;
127
+ const assetName = `haskell-language-server-wrapper-${ githubOS } ${ exeExt } ` ;
128
+ const wrapperAsset = release . assets . find ( ( x ) => x . name . startsWith ( assetName ) ) ;
117
129
118
130
if ( ! wrapperAsset ) {
119
- throw Error ( `Couldn't find any ${ assetName } binaries for release ${ release . tag_name } ` ) ;
131
+ throw new NoBinariesError ( release . tag_name ) ;
120
132
}
121
133
122
134
await downloadFile (
@@ -186,23 +198,25 @@ export async function downloadHaskellLanguageServer(
186
198
} else {
187
199
await window . showErrorMessage ( error . message ) ;
188
200
}
201
+ } else if ( error instanceof NoBinariesError ) {
202
+ window . showInformationMessage ( error . message ) ;
189
203
} else {
190
204
// We couldn't figure out the right ghc version to download
191
205
window . showErrorMessage ( `Couldn't figure out what GHC version the project is using:\n${ error . message } ` ) ;
192
206
}
193
207
return null ;
194
208
}
195
209
196
- const assetName = `haskell-language-server-${ githubOS } -${ ghcVersion } ${ exeExtension } .gz` ;
197
- const asset = release ?. assets . find ( ( x ) => x . name === assetName ) ;
210
+ // When searching for binaries, use startsWith because the compression may differ
211
+ // between .zip and .gz
212
+ const assetName = `haskell-language-server-${ githubOS } -${ ghcVersion } ${ exeExt } ` ;
213
+ const asset = release ?. assets . find ( ( x ) => x . name . startsWith ( assetName ) ) ;
198
214
if ( ! asset ) {
199
- window . showErrorMessage (
200
- `Couldn't find any pre-built haskell-language-server binaries for ${ githubOS } and ${ ghcVersion } `
201
- ) ;
215
+ window . showInformationMessage ( new NoBinariesError ( release . tag_name , ghcVersion ) . message ) ;
202
216
return null ;
203
217
}
204
218
205
- const serverName = `haskell-language-server-${ release . tag_name } -${ process . platform } -${ ghcVersion } ${ exeExtension } ` ;
219
+ const serverName = `haskell-language-server-${ release . tag_name } -${ process . platform } -${ ghcVersion } ${ exeExt } ` ;
206
220
const binaryDest = path . join ( context . globalStoragePath , serverName ) ;
207
221
208
222
const title = `Downloading haskell-language-server ${ release . tag_name } for GHC ${ ghcVersion } ` ;
0 commit comments