import * as http from 'http'; import * as https from 'https'; import * as vscode from 'vscode'; import * as os from 'os'; import { exec } from 'child_process'; import * as path from 'path'; const { generateKeyPairSync, } = require('node:crypto') const axios = require('axios'); const cheerio = require('cheerio'); export function isWindows(): boolean { return os.platform() === 'win32'; } export function isLinux(): boolean { return os.platform() === 'linux'; } export function isMacOS(): boolean { return os.platform() === 'darwin'; } export function fetch(url: string): Promise { // determine the library to use (based on the url protocol) const lib = url.startsWith('https://') ? https : http; return new Promise((resolve, reject) => { lib.get(url, (response) => { // make sure the status code is 200 if (response.statusCode !== 200) { reject(new Error(`Failed to load page, status code: ${response.statusCode}`)); return; } let data = ''; response.on('data', (chunk) => { data += chunk; }); response.on('end', () => { resolve(data); }); }).on('error', (err) => { reject(err); }); }); } export const Sleep = (ms: number) => { return new Promise(resolve => setTimeout(resolve, ms)) } export async function getVsCodeCommitId(): Promise { if (isLinux() || isMacOS()) { return new Promise((resolve) => { exec('code --version', (error, stdout, stderr) => { if (error) { console.error('Error occurred:' + error.message); resolve(""); return; } if (stderr) { console.error('Error output:' + stderr); resolve(""); return; } const lines = stdout.trim().split('\n'); if (lines.length > 1) { const commitId = lines[1]; // 第二行是 commit ID resolve(commitId); } else { console.error('Unexpected output format:' + stdout); resolve(""); return; } }); }) } else { // 获取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(); return commitHash } catch (error) { console.error('Failed to get commit id: ' + error) return "" } } } export function getDevstarDomain(): string | undefined { // 从用户配置中读取 return vscode.workspace.getConfiguration('devstar').get('devstarDomain') } export async function showErrorNotification(message: string): Promise { const selection = await vscode.window.showErrorMessage(message, 'Open Console', 'Report a problem',); if (selection === 'Open Console') { vscode.commands.executeCommand('workbench.action.toggleDevTools'); } else if (selection === 'Report a problem') { vscode.commands.executeCommand('vscode.open', vscode.Uri.parse('https://gitee.com/SuperIDE/DevStar/issues')); } }