From bdf708597dd14886a8199764b8e46ec2763d4711 Mon Sep 17 00:00:00 2001 From: Levi Yan Date: Wed, 8 Jan 2025 18:36:59 +0800 Subject: [PATCH] fix: cannot execute `code --version` in windows and linux --- package.json | 2 + src/remote-container.ts | 87 +++++++++++++++++++---------------------- src/utils.ts | 48 ++++++++++++----------- 3 files changed, 68 insertions(+), 69 deletions(-) diff --git a/package.json b/package.json index a9760a3..bf9b42d 100644 --- a/package.json +++ b/package.json @@ -102,6 +102,8 @@ "format": "eslint src --ext ts" }, "dependencies": { + "axios": "^1.7.9", + "cheerio": "^1.0.0", "fs-plus": "~3.1.1", "node-ssh": "^13.2.0", "sshpk": "^1.18.0" diff --git a/src/remote-container.ts b/src/remote-container.ts index baf77ff..295fc6d 100644 --- a/src/remote-container.ts +++ b/src/remote-container.ts @@ -28,7 +28,6 @@ export default class RemoteContainer { cancellable: false }, async (progress) => { try { - if (password === undefined) { // connect with key await ssh.connect({ @@ -40,26 +39,28 @@ export default class RemoteContainer { progress.report({ message: "连接成功,开始安装" }); // install vscode-server and devstar extension - const vscodeCommitId = await utils.getVsCodeCommitId(); - const vscodeServerUrl = `https://vscode.download.prss.microsoft.com/dbazure/download/stable/${vscodeCommitId}/vscode-server-linux-x64.tar.gz` - const installVscodeServerScript = ` - mkdir -p ~/.vscode-server/bin/${vscodeCommitId} && \\ - if [ "$(ls -A ~/.vscode-server/bin/${vscodeCommitId})" ]; then - ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar - else - wget ${vscodeServerUrl} -O vscode-server-linux-x64.tar.gz && \\ - mv vscode-server-linux-x64.tar.gz ~/.vscode-server/bin/${vscodeCommitId} && \\ - cd ~/.vscode-server/bin/${vscodeCommitId} && \\ - tar -xvzf vscode-server-linux-x64.tar.gz --strip-components 1 && \\ - rm vscode-server-linux-x64.tar.gz && \\ - ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar - fi - `; - await ssh.execCommand(installVscodeServerScript); - console.log("vscode-server and extension installed"); - vscode.window.showInformationMessage('安装完成!'); + const vscodeCommitId = await utils.getVsCodeCommitId() + if ("" != vscodeCommitId) { + const vscodeServerUrl = `https://vscode.download.prss.microsoft.com/dbazure/download/stable/${vscodeCommitId}/vscode-server-linux-x64.tar.gz` + const installVscodeServerScript = ` + mkdir -p ~/.vscode-server/bin/${vscodeCommitId} && \\ + if [ "$(ls -A ~/.vscode-server/bin/${vscodeCommitId})" ]; then + ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar + else + wget ${vscodeServerUrl} -O vscode-server-linux-x64.tar.gz && \\ + mv vscode-server-linux-x64.tar.gz ~/.vscode-server/bin/${vscodeCommitId} && \\ + cd ~/.vscode-server/bin/${vscodeCommitId} && \\ + tar -xvzf vscode-server-linux-x64.tar.gz --strip-components 1 && \\ + rm vscode-server-linux-x64.tar.gz && \\ + ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar + fi + `; + await ssh.execCommand(installVscodeServerScript); + console.log("vscode-server and extension installed"); + vscode.window.showInformationMessage('安装完成!'); + } - await ssh.dispose(); + await ssh.dispose(); } else { // connect with password (deprecate in future) await ssh.connect({ @@ -71,35 +72,27 @@ export default class RemoteContainer { progress.report({ message: "连接成功,开始安装" }); // install vscode-server and devstar extension - const vscodeCommitId = await utils.getVsCodeCommitId(); - const vscodeServerUrl = `https://vscode.download.prss.microsoft.com/dbazure/download/stable/${vscodeCommitId}/vscode-server-linux-x64.tar.gz` - const installVscodeServerScript = ` - mkdir -p ~/.vscode-server/bin/${vscodeCommitId} && \\ - if [ "$(ls -A ~/.vscode-server/bin/${vscodeCommitId})" ]; then - ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar - else - wget ${vscodeServerUrl} -O vscode-server-linux-x64.tar.gz && \\ - mv vscode-server-linux-x64.tar.gz ~/.vscode-server/bin/${vscodeCommitId} && \\ - cd ~/.vscode-server/bin/${vscodeCommitId} && \\ - tar -xvzf vscode-server-linux-x64.tar.gz --strip-components 1 && \\ - rm vscode-server-linux-x64.tar.gz && \\ - ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar - fi - `; - await ssh.execCommand(installVscodeServerScript); - console.log("vscode-server and extension installed"); - vscode.window.showInformationMessage('安装完成!'); - - // add the public key to the remote authorized_keys - if (!utils.existDefaultPublicKey() || !utils.existDefaultPrivateKey()) { - // if there is no public key, generate one - utils.createSSHKey() + const vscodeCommitId = await utils.getVsCodeCommitId() + if ("" != vscodeCommitId) { + const vscodeServerUrl = `https://vscode.download.prss.microsoft.com/dbazure/download/stable/${vscodeCommitId}/vscode-server-linux-x64.tar.gz` + const installVscodeServerScript = ` + mkdir -p ~/.vscode-server/bin/${vscodeCommitId} && \\ + if [ "$(ls -A ~/.vscode-server/bin/${vscodeCommitId})" ]; then + ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar + else + wget ${vscodeServerUrl} -O vscode-server-linux-x64.tar.gz && \\ + mv vscode-server-linux-x64.tar.gz ~/.vscode-server/bin/${vscodeCommitId} && \\ + cd ~/.vscode-server/bin/${vscodeCommitId} && \\ + tar -xvzf vscode-server-linux-x64.tar.gz --strip-components 1 && \\ + rm vscode-server-linux-x64.tar.gz && \\ + ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar + fi + `; + await ssh.execCommand(installVscodeServerScript); + console.log("vscode-server and extension installed"); + vscode.window.showInformationMessage('安装完成!'); } - const publicKey = utils.getDefaultPublicKey(); - await ssh.execCommand(`mkdir -p ~/.ssh && echo '${publicKey}' >> ~/.ssh/authorized_keys`); - console.log('Public key added to remote authorized_keys'); - await ssh.dispose(); } diff --git a/src/utils.ts b/src/utils.ts index deb8b0c..c07ac59 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,13 +1,14 @@ -import { exec } from 'child_process'; import * as http from 'http'; import * as https from 'https'; import * as fs from 'fs'; import * as path from 'path'; import * as os from 'os'; -import { BlobOptions } from 'buffer'; +import * as vscode from 'vscode'; const { generateKeyPairSync, } = require('node:crypto') +const axios = require('axios'); +const cheerio = require('cheerio'); export function fetch(url: string): Promise { // determine the library to use (based on the url protocol) @@ -38,26 +39,29 @@ export const Sleep = (ms: number) => { return new Promise(resolve => setTimeout(resolve, ms)) } -export function getVsCodeCommitId(): Promise { - return new Promise((resolve, reject) => { - exec('code --version', (error, stdout, stderr) => { - if (error) { - reject('Error occurred:' + error.message); - return; - } - if (stderr) { - reject('Error output:' + stderr); - return; - } - const lines = stdout.trim().split('\n'); - if (lines.length > 1) { - const commitId = lines[1]; // 第二行是 commit ID - resolve(commitId); - } else { - reject('Unexpected output format:' + stdout); - } - }); - }) +export async function getVsCodeCommitId(): Promise { + // 获取vscode version + const version = vscode.version + + // 根据version提取相应的release页面中的commitid + try{ + const { data } = await axios.get(`https://github.com/microsoft/vscode/releases/tag/${version}`); + + // Load the HTML into cheerio + const $ = cheerio.load(data); + // Find the tag with the 'data-hovercard-type="commit"' attribute + const commitLink = $('a[data-hovercard-type="commit"]'); + // Extract the href attribute and commit hash + const href = commitLink.attr('href'); // href example: /microsoft/vscode/commit/fabdb6a30b49f79a7aba0f2ad9df9b399473380f + const commitHash = href.split('/').pop(); + + console.log('Commit Hash:', commitHash); + + return commitHash + } catch(error) { + console.error('Failed to get commit id: ' + error) + return "" + } } export function getDefaultPrivateKeyPath(): string {