From a99093624ff0ef465a46e3b84f00d8b9d7c88e32 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Tue, 26 Jan 2021 16:28:12 +0100 Subject: [PATCH] Updated to 0.15.0-rc1 CLI and 12.x snapshot `clangd`. Signed-off-by: Akos Kitta --- arduino-ide-extension/package.json | 5 +-- arduino-ide-extension/scripts/download-ls.js | 36 ++++++++-------- arduino-ide-extension/scripts/downloader.js | 10 +++-- .../scripts/generate-protocol.js | 42 +++++++++++++++---- .../src/node/executable-service-impl.ts | 3 +- .../src/test/node/exec-util.test.ts | 2 +- 6 files changed, 61 insertions(+), 37 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 61681a37..dc7416ed 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -120,10 +120,7 @@ ], "arduino": { "cli": { - "version": { - "owner": "arduino", - "repo": "arduino-cli" - } + "version": "0.15.0-rc1" } } } diff --git a/arduino-ide-extension/scripts/download-ls.js b/arduino-ide-extension/scripts/download-ls.js index 89b0a139..0d2bfdc0 100755 --- a/arduino-ide-extension/scripts/download-ls.js +++ b/arduino-ide-extension/scripts/download-ls.js @@ -6,7 +6,7 @@ (() => { const DEFAULT_ALS_VERSION = 'nightly'; - const DEFAULT_CLANGD_VERSION = '9.0.0'; + const DEFAULT_CLANGD_VERSION = 'snapshot_20210124'; const path = require('path'); const shell = require('shelljs'); @@ -22,7 +22,7 @@ .option('clangd-version', { alias: 'cv', default: DEFAULT_CLANGD_VERSION, - choices: ['8.0.1', '9.0.0'], + choices: ['snapshot_20210124'], describe: `The version of 'clangd' to download. Defaults to ${DEFAULT_CLANGD_VERSION}.` }) .option('force-download', { @@ -38,35 +38,35 @@ const { platform, arch } = process; const build = path.join(__dirname, '..', 'build'); - const alsTarget = path.join(build, `arduino-language-server${platform === 'win32' ? '.exe' : ''}`); + const lsExecutablePath = path.join(build, `arduino-language-server${platform === 'win32' ? '.exe' : ''}`); - let clangdTarget, alsSuffix, clangdSuffix; + let clangdExecutablePath, lsSuffix, clangdPrefix; switch (platform) { case 'darwin': - clangdTarget = path.join(build, 'bin', 'clangd') - alsSuffix = 'Darwin_amd64.zip'; - clangdSuffix = 'macos.zip'; + clangdExecutablePath = path.join(build, 'bin', 'clangd') + lsSuffix = 'macOS_amd64.zip'; + clangdPrefix = 'mac'; break; case 'linux': - clangdTarget = path.join(build, 'bin', 'clangd') - alsSuffix = 'Linux_amd64.zip'; - clangdSuffix = 'linux.zip' + clangdExecutablePath = path.join(build, 'bin', 'clangd') + lsSuffix = 'Linux_amd64.zip'; + clangdPrefix = 'linux' break; case 'win32': - clangdTarget = path.join(build, 'clangd.exe') - alsSuffix = 'Windows_NT_amd64.zip'; - clangdSuffix = 'windows.zip'; + clangdExecutablePath = path.join(build, 'bin', 'clangd.exe') + lsSuffix = 'Windows_amd64.zip'; + clangdPrefix = 'windows'; break; } - if (!alsSuffix) { + if (!lsSuffix) { shell.echo(`The arduino-language-server is not available for ${platform} ${arch}.`); shell.exit(1); } - const alsUrl = `https://downloads.arduino.cc/arduino-language-server/${alsVersion === 'nightly' ? 'nightly/arduino-language-server' : 'arduino-language-server_' + alsVersion}_${alsSuffix}`; - downloader.downloadUnzipAll(alsUrl, build, alsTarget, force); + const alsUrl = `https://downloads.arduino.cc/arduino-language-server/${alsVersion === 'nightly' ? 'nightly/arduino-language-server' : 'arduino-language-server_' + alsVersion}_${lsSuffix}`; + downloader.downloadUnzipAll(alsUrl, build, lsExecutablePath, force); - const clangdUrl = `https://downloads.arduino.cc/arduino-language-server/clangd/clangd_${clangdVersion}_${clangdSuffix}`; - downloader.downloadUnzipAll(clangdUrl, build, clangdTarget, force); + const clangdUrl = `https://downloads.arduino.cc/arduino-language-server/clangd/clangd-${clangdPrefix}-${clangdVersion}.zip`; + downloader.downloadUnzipAll(clangdUrl, build, clangdExecutablePath, force, { strip: 1 }); // `strip`: the new clangd (12.x) is zipped into a folder, so we have to strip the outmost folder. })(); diff --git a/arduino-ide-extension/scripts/downloader.js b/arduino-ide-extension/scripts/downloader.js index 2556ff5b..6e81d480 100644 --- a/arduino-ide-extension/scripts/downloader.js +++ b/arduino-ide-extension/scripts/downloader.js @@ -79,7 +79,7 @@ exports.downloadUnzipFile = async (url, targetFile, filePrefix, force = false) = * @param targetFile {string} Path to the main file expected after decompressing * @param force {boolean} Whether to download even if the target file exists */ -exports.downloadUnzipAll = async (url, targetDir, targetFile, force) => { +exports.downloadUnzipAll = async (url, targetDir, targetFile, force, decompressOptions = undefined) => { if (fs.existsSync(targetFile) && !force) { shell.echo(`Skipping download because file already exists: ${targetFile}`); return; @@ -96,12 +96,16 @@ exports.downloadUnzipAll = async (url, targetDir, targetFile, force) => { shell.echo(`<<< Download succeeded.`); shell.echo('>>> Decompressing...'); - const files = await decompress(data, targetDir, { + let options = { plugins: [ unzip(), untargz() ] - }); + }; + if (decompressOptions) { + options = Object.assign(options, decompressOptions) + } + const files = await decompress(data, targetDir, options); if (files.length === 0) { shell.echo('Error ocurred while decompressing the archive.'); shell.exit(1); diff --git a/arduino-ide-extension/scripts/generate-protocol.js b/arduino-ide-extension/scripts/generate-protocol.js index 76ddafdd..ca51d6d7 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -66,24 +66,48 @@ const { platform } = process; const build = path.join(__dirname, '..', 'build'); const cli = path.join(build, `arduino-cli${platform === 'win32' ? '.exe' : ''}`); - const jsonVersion = shell.exec(`${cli} version --format json`).trim(); - if (!jsonVersion) { + const versionJson = shell.exec(`${cli} version --format json`).trim(); + if (!versionJson) { shell.echo(`Could not retrieve the CLI version from ${cli}.`); shell.exit(1); } - const version = JSON.parse(jsonVersion).VersionString; - if (version && version !== '0.0.0-git') { // 0.0.0-git is the version of the CLI when built manually and not downloaded as a releases/nightly. - shell.echo(`>>> Checking out version: ${version}...`); - if (shell.exec(`git -C ${repository} checkout ${version} -b ${version}`).code !== 0) { + // As of today (28.01.2021), the `VersionString` can be one of the followings: + // - `nightly-YYYYMMDD` stands for the nightly build, we use the , the `commitish` from the `package.json` to check out the code. + // - `0.0.0-git` for local builds, we use the `commitish` from the `package.json` to check out the code and generate the APIs. + // - `git-snapshot` for local build executed via `task build`. We do not do this. + // - rest, we assume it is a valid semver and has the corresponding tagged code, we use the tag to generate the APIs from the `proto` files. + /* + { + "Application": "arduino-cli", + "VersionString": "nightly-20210126", + "Commit": "079bb6c6", + "Status": "alpha", + "Date": "2021-01-26T01:46:31Z" + } + */ + const versionObject = JSON.parse(versionJson); + const version = versionObject.VersionString; + if (version && !version.startsWith('nightly-') && version !== '0.0.0-git' && version !== 'git-snapshot') { + shell.echo(`>>> Checking out tagged version: '${version}'...`); + shell.exec(`git -C ${repository} fetch --all --tags`); + if (shell.exec(`git -C ${repository} checkout tags/${version} -b ${version}`).code !== 0) { shell.exit(1); } - shell.echo(`<<< Checked out version: ${commitish}.`); + shell.echo(`<<< Checked out tagged version: '${commitish}'.`); } else if (commitish) { - shell.echo(`>>> Checking out commitish: ${commitish}...`); + shell.echo(`>>> Checking out commitish from 'package.json': '${commitish}'...`); if (shell.exec(`git -C ${repository} checkout ${commitish}`).code !== 0) { shell.exit(1); } - shell.echo(`<<< Checked out commitish: ${commitish}.`); + shell.echo(`<<< Checked out commitish from 'package.json': '${commitish}'.`); + } else if (versionObject.Commit) { + shell.echo(`>>> Checking out commitish from the CLI: '${versionObject.Commit}'...`); + if (shell.exec(`git -C ${repository} checkout ${versionObject.Commit}`).code !== 0) { + shell.exit(1); + } + shell.echo(`<<< Checked out commitish from the CLI: '${versionObject.Commit}'.`); + } else { + shell.echo(`WARN: no 'git checkout'. Generating from the HEAD revision.`); } shell.echo('>>> Generating TS/JS API from:'); diff --git a/arduino-ide-extension/src/node/executable-service-impl.ts b/arduino-ide-extension/src/node/executable-service-impl.ts index e54b583e..8a5b3d22 100644 --- a/arduino-ide-extension/src/node/executable-service-impl.ts +++ b/arduino-ide-extension/src/node/executable-service-impl.ts @@ -1,4 +1,3 @@ -import * as os from 'os'; import { injectable, inject } from 'inversify'; import { ILogger } from '@theia/core/lib/common/logger'; import { FileUri } from '@theia/core/lib/node/file-uri'; @@ -14,7 +13,7 @@ export class ExecutableServiceImpl implements ExecutableService { async list(): Promise<{ clangdUri: string, cliUri: string, lsUri: string }> { const [ls, clangd, cli] = await Promise.all([ getExecPath('arduino-language-server', this.onError.bind(this)), - getExecPath('clangd', this.onError.bind(this), undefined, os.platform() !== 'win32'), + getExecPath('clangd', this.onError.bind(this), undefined, true), getExecPath('arduino-cli', this.onError.bind(this)) ]); return { diff --git a/arduino-ide-extension/src/test/node/exec-util.test.ts b/arduino-ide-extension/src/test/node/exec-util.test.ts index 37c9455c..fb2ff973 100644 --- a/arduino-ide-extension/src/test/node/exec-util.test.ts +++ b/arduino-ide-extension/src/test/node/exec-util.test.ts @@ -19,7 +19,7 @@ describe('getExecPath', () => { }); it('should resolve clangd', async () => { - const actual = await getExecPath('clangd', onError, '--version', os.platform() !== 'win32'); + const actual = await getExecPath('clangd', onError, '--version', true); const expected = os.platform() === 'win32' ? '\\clangd.exe' : '/clangd'; expect(actual).to.endsWith(expected); });