From 14567d9b1282d8f0b4bf8beca83832f6b52879d2 Mon Sep 17 00:00:00 2001 From: Henry Mercer Date: Tue, 1 Aug 2023 18:30:17 +0100 Subject: [PATCH] Log disk info throughout for debugging --- lib/setup-codeql.js | 65 +++--- lib/setup-codeql.js.map | 2 +- node_modules/.package-lock.json | 8 + node_modules/check-disk-space/LICENSE | 21 ++ node_modules/check-disk-space/README.md | 53 +++++ .../dist/check-disk-space.cjs | 210 ++++++++++++++++++ .../dist/check-disk-space.d.ts | 53 +++++ .../dist/check-disk-space.mjs | 203 +++++++++++++++++ node_modules/check-disk-space/package.json | 83 +++++++ package-lock.json | 9 + package.json | 1 + src/setup-codeql.ts | 90 +++++--- 12 files changed, 741 insertions(+), 57 deletions(-) create mode 100644 node_modules/check-disk-space/LICENSE create mode 100644 node_modules/check-disk-space/README.md create mode 100644 node_modules/check-disk-space/dist/check-disk-space.cjs create mode 100644 node_modules/check-disk-space/dist/check-disk-space.d.ts create mode 100644 node_modules/check-disk-space/dist/check-disk-space.mjs create mode 100644 node_modules/check-disk-space/package.json diff --git a/lib/setup-codeql.js b/lib/setup-codeql.js index 7e7af524c..827fd1441 100644 --- a/lib/setup-codeql.js +++ b/lib/setup-codeql.js @@ -31,6 +31,7 @@ const fs = __importStar(require("fs")); const path = __importStar(require("path")); const perf_hooks_1 = require("perf_hooks"); const toolcache = __importStar(require("@actions/tool-cache")); +const check_disk_space_1 = __importDefault(require("check-disk-space")); const del_1 = __importDefault(require("del")); const fast_deep_equal_1 = __importDefault(require("fast-deep-equal")); const semver = __importStar(require("semver")); @@ -88,14 +89,14 @@ function tryGetCodeQLCliVersionForRelease(release, logger) { return undefined; } else if (cliVersionsFromMarkerFiles.length === 0) { - logger.debug(`Failed to find the CodeQL CLI version for release ${release.tag_name}.`); + logger.info(`Failed to find the CodeQL CLI version for release ${release.tag_name}.`); return undefined; } return cliVersionsFromMarkerFiles[0]; } async function tryFindCliVersionDotcomOnly(tagName, logger) { try { - logger.debug(`Fetching the GitHub Release for the CodeQL bundle tagged ${tagName}.`); + logger.info(`Fetching the GitHub Release for the CodeQL bundle tagged ${tagName}.`); const apiClient = api.getApiClient(); const codeQLActionRepository = getCodeQLActionRepository(logger); const release = await apiClient.rest.repos.getReleaseByTag({ @@ -106,7 +107,7 @@ async function tryFindCliVersionDotcomOnly(tagName, logger) { return tryGetCodeQLCliVersionForRelease(release.data, logger); } catch (e) { - logger.debug(`Failed to find the CLI version for the CodeQL bundle tagged ${tagName}. ${(0, util_1.wrapError)(e).message}`); + logger.info(`Failed to find the CLI version for the CodeQL bundle tagged ${tagName}. ${(0, util_1.wrapError)(e).message}`); return undefined; } } @@ -181,7 +182,7 @@ async function getCodeQLBundleDownloadURL(tagName, apiDetails, variant, logger) function tryGetBundleVersionFromTagName(tagName, logger) { const match = tagName.match(/^codeql-bundle-(.*)$/); if (match === null || match.length < 2) { - logger.debug(`Could not determine bundle version from tag ${tagName}.`); + logger.info(`Could not determine bundle version from tag ${tagName}.`); return undefined; } return match[1]; @@ -189,7 +190,7 @@ function tryGetBundleVersionFromTagName(tagName, logger) { function tryGetTagNameFromUrl(url, logger) { const match = url.match(/\/(codeql-bundle-.*)\//); if (match === null || match.length < 2) { - logger.debug(`Could not determine tag name for URL ${url}.`); + logger.info(`Could not determine tag name for URL ${url}.`); return undefined; } return match[1]; @@ -204,7 +205,7 @@ function tryGetBundleVersionFromUrl(url, logger) { exports.tryGetBundleVersionFromUrl = tryGetBundleVersionFromUrl; function convertToSemVer(version, logger) { if (!semver.valid(version)) { - logger.debug(`Bundle version ${version} is not in SemVer format. Will treat it as pre-release 0.0.0-${version}.`); + logger.info(`Bundle version ${version} is not in SemVer format. Will treat it as pre-release 0.0.0-${version}.`); version = `0.0.0-${version}`; } const s = semver.clean(version); @@ -228,7 +229,7 @@ async function findOverridingToolsInCache(humanReadableVersion, logger) { .filter(({ folder }) => fs.existsSync(path.join(folder, "pinned-version"))); if (candidates.length === 1) { const candidate = candidates[0]; - logger.debug(`CodeQL tools version ${candidate.version} in toolcache overriding version ${humanReadableVersion}.`); + logger.info(`CodeQL tools version ${candidate.version} in toolcache overriding version ${humanReadableVersion}.`); return { codeqlFolder: candidate.folder, sourceType: "toolcache", @@ -236,10 +237,10 @@ async function findOverridingToolsInCache(humanReadableVersion, logger) { }; } else if (candidates.length === 0) { - logger.debug("Did not find any candidate pinned versions of the CodeQL tools in the toolcache."); + logger.info("Did not find any candidate pinned versions of the CodeQL tools in the toolcache."); } else { - logger.debug("Could not use CodeQL tools from the toolcache since more than one candidate pinned " + + logger.info("Could not use CodeQL tools from the toolcache since more than one candidate pinned " + "version was found in the toolcache."); } return undefined; @@ -301,7 +302,7 @@ async function getCodeQLSource(toolsInput, defaultCliVersion, apiDetails, varian tagName ?? url ?? "unknown"; - logger.debug("Attempting to obtain CodeQL tools. " + + logger.info("Attempting to obtain CodeQL tools. " + `CLI version: ${cliVersion ?? "unknown"}, ` + `bundle tag name: ${tagName ?? "unknown"}, ` + `URL: ${url ?? "unspecified"}.`); @@ -311,26 +312,26 @@ async function getCodeQLSource(toolsInput, defaultCliVersion, apiDetails, varian codeqlFolder = toolcache.find("CodeQL", cliVersion); // Fall back to matching `x.y.z-`. if (!codeqlFolder) { - logger.debug("Didn't find a version of the CodeQL tools in the toolcache with a version number " + + logger.info("Didn't find a version of the CodeQL tools in the toolcache with a version number " + `exactly matching ${cliVersion}.`); const allVersions = toolcache.findAllVersions("CodeQL"); - logger.debug(`Found the following versions of the CodeQL tools in the toolcache: ${JSON.stringify(allVersions)}.`); + logger.info(`Found the following versions of the CodeQL tools in the toolcache: ${JSON.stringify(allVersions)}.`); // If there is exactly one version of the CodeQL tools in the toolcache, and that version is // the form `x.y.z-`, then use it. const candidateVersions = allVersions.filter((version) => version.startsWith(`${cliVersion}-`)); if (candidateVersions.length === 1) { - logger.debug(`Exactly one version of the CodeQL tools starting with ${cliVersion} found in the ` + + logger.info(`Exactly one version of the CodeQL tools starting with ${cliVersion} found in the ` + "toolcache, using that."); codeqlFolder = toolcache.find("CodeQL", candidateVersions[0]); } else if (candidateVersions.length === 0) { - logger.debug(`Didn't find any versions of the CodeQL tools starting with ${cliVersion} ` + + logger.info(`Didn't find any versions of the CodeQL tools starting with ${cliVersion} ` + `in the toolcache. Trying next fallback method.`); } else { logger.warning(`Found ${candidateVersions.length} versions of the CodeQL tools starting with ` + `${cliVersion} in the toolcache, but at most one was expected.`); - logger.debug("Trying next fallback method."); + logger.info("Trying next fallback method."); } } } @@ -341,7 +342,7 @@ async function getCodeQLSource(toolsInput, defaultCliVersion, apiDetails, varian codeqlFolder = toolcache.find("CodeQL", fallbackVersion); } else { - logger.debug("Could not determine a fallback toolcache version number for CodeQL tools version " + + logger.info("Could not determine a fallback toolcache version number for CodeQL tools version " + `${humanReadableVersion}.`); } } @@ -391,7 +392,7 @@ async function tryGetFallbackToolcacheVersion(cliVersion, tagName, logger) { return undefined; } const fallbackVersion = convertToSemVer(bundleVersion, logger); - logger.debug(`Computed a fallback toolcache version number of ${fallbackVersion} for CodeQL version ` + + logger.info(`Computed a fallback toolcache version number of ${fallbackVersion} for CodeQL version ` + `${cliVersion ?? tagName}.`); return fallbackVersion; } @@ -408,34 +409,38 @@ async function downloadCodeQL(codeqlURL, maybeBundleVersion, maybeCliVersion, ap // We also don't want to send an authorization header if there's already a token provided in the URL. let authorization = undefined; if (searchParams.has("token")) { - logger.debug("CodeQL tools URL contains an authorization token."); + logger.info("CodeQL tools URL contains an authorization token."); } else if (codeqlURL.startsWith(`${apiDetails.url}/`)) { - logger.debug("Providing an authorization token to download CodeQL tools."); + logger.info("Providing an authorization token to download CodeQL tools."); authorization = `token ${apiDetails.auth}`; } else { - logger.debug("Downloading CodeQL tools without an authorization token."); + logger.info("Downloading CodeQL tools without an authorization token."); } + await printDiskSpace(logger); logger.info(`Downloading CodeQL tools from ${codeqlURL}. This may take a while.`); const dest = path.join(tempDir, (0, uuid_1.v4)()); const finalHeaders = Object.assign({ "User-Agent": "CodeQL Action" }, headers); const toolsDownloadStart = perf_hooks_1.performance.now(); const codeqlPath = await toolcache.downloadTool(codeqlURL, dest, authorization, finalHeaders); const toolsDownloadDurationMs = Math.round(perf_hooks_1.performance.now() - toolsDownloadStart); - logger.debug(`Finished downloading CodeQL bundle to ${codeqlPath} (${toolsDownloadDurationMs} ms).`); + logger.info(`Finished downloading CodeQL bundle to ${codeqlPath} (${toolsDownloadDurationMs} ms).`); + await printDiskSpace(logger); const codeqlExtracted = await toolcache.extractTar(codeqlPath); - logger.debug(`Finished extracting CodeQL bundle to ${codeqlExtracted}.`); + logger.info(`Finished extracting CodeQL bundle to ${codeqlExtracted}.`); + await printDiskSpace(logger); try { await (0, del_1.default)(codeqlPath, { force: true }); - logger.debug("Deleted CodeQL bundle archive."); + logger.info("Deleted CodeQL bundle archive."); } catch (e) { logger.warning("Failed to delete CodeQL bundle archive."); } + await printDiskSpace(logger); const bundleVersion = maybeBundleVersion ?? tryGetBundleVersionFromUrl(codeqlURL, logger); if (bundleVersion === undefined) { - logger.debug("Could not cache CodeQL tools because we could not determine the bundle version from the " + + logger.info("Could not cache CodeQL tools because we could not determine the bundle version from the " + `URL ${codeqlURL}.`); return { toolsVersion: maybeCliVersion ?? "unknown", @@ -461,9 +466,13 @@ async function downloadCodeQL(codeqlURL, maybeBundleVersion, maybeCliVersion, ap const toolcacheVersion = maybeCliVersion?.match(/^[0-9]+\.[0-9]+\.[0-9]+$/) ? `${maybeCliVersion}-${bundleVersion}` : convertToSemVer(bundleVersion, logger); + const codeqlFolder = await toolcache.cacheDir(codeqlExtracted, "CodeQL", toolcacheVersion); + await printDiskSpace(logger); + await (0, del_1.default)(codeqlExtracted, { force: true }); + await printDiskSpace(logger); return { toolsVersion: maybeCliVersion ?? toolcacheVersion, - codeqlFolder: await toolcache.cacheDir(codeqlExtracted, "CodeQL", toolcacheVersion), + codeqlFolder, toolsDownloadDurationMs, }; } @@ -502,7 +511,7 @@ async function setupCodeQLBundle(toolsInput, apiDetails, tempDir, variant, defau break; case "toolcache": codeqlFolder = source.codeqlFolder; - logger.debug(`CodeQL found in cache ${codeqlFolder}`); + logger.info(`CodeQL found in cache ${codeqlFolder}`); toolsSource = ToolsSource.Toolcache; break; case "download": { @@ -519,4 +528,8 @@ async function setupCodeQLBundle(toolsInput, apiDetails, tempDir, variant, defau return { codeqlFolder, toolsDownloadDurationMs, toolsSource, toolsVersion }; } exports.setupCodeQLBundle = setupCodeQLBundle; +async function printDiskSpace(logger) { + const diskSpaceInfo = await (0, check_disk_space_1.default)(process.platform === "win32" ? path.parse(process.cwd()).root : "/"); + logger.info(`Disk space info: ${diskSpaceInfo.free / (1024 * 1024 * 1024)} GB free of ${diskSpaceInfo.size / (1024 * 1024 * 1024)} GB`); +} //# sourceMappingURL=setup-codeql.js.map \ No newline at end of file diff --git a/lib/setup-codeql.js.map b/lib/setup-codeql.js.map index c283baf01..b570869d6 100644 --- a/lib/setup-codeql.js.map +++ b/lib/setup-codeql.js.map @@ -1 +1 @@ -{"version":3,"file":"setup-codeql.js","sourceRoot":"","sources":["../src/setup-codeql.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"setup-codeql.js","sourceRoot":"","sources":["../src/setup-codeql.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index aa1e87b30..79af0ee6c 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -1751,6 +1751,14 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/check-disk-space": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.4.0.tgz", + "integrity": "sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==", + "engines": { + "node": ">=16" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", diff --git a/node_modules/check-disk-space/LICENSE b/node_modules/check-disk-space/LICENSE new file mode 100644 index 000000000..80d73b158 --- /dev/null +++ b/node_modules/check-disk-space/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-2019 Alexandre Demode + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/check-disk-space/README.md b/node_modules/check-disk-space/README.md new file mode 100644 index 000000000..b4520d83d --- /dev/null +++ b/node_modules/check-disk-space/README.md @@ -0,0 +1,53 @@ +# Check disk space + +[![Continue Integration](https://img.shields.io/github/workflow/status/Alex-D/check-disk-space/Continuous%20Integration?style=for-the-badge)](https://github.com/Alex-D/check-disk-space/actions/workflows/ci.yml) +[![check-disk-space on npm](https://img.shields.io/npm/v/check-disk-space?style=for-the-badge)](https://www.npmjs.com/package/check-disk-space) +[![License MIT](https://img.shields.io/github/license/Alex-D/check-disk-space.svg?style=for-the-badge)](LICENSE) + + +## Introduction + +Light multi-platform disk space checker without third party for Node.js. + +- Works on Linux, macOS and Windows +- Take care of mounting points on unix-like systems +- No dependencies +- TypeScript support + + +## Install + +`npm install check-disk-space` + + +## Usage + +```js +// ES +import checkDiskSpace from 'check-disk-space' + +// CommonJS +const checkDiskSpace = require('check-disk-space').default + +// On Windows +checkDiskSpace('C:/blabla/bla').then((diskSpace) => { + console.log(diskSpace) + // { + // diskPath: 'C:', + // free: 12345678, + // size: 98756432 + // } + // Note: `free` and `size` are in bytes +}) + +// On Linux or macOS +checkDiskSpace('/mnt/mygames').then((diskSpace) => { + console.log(diskSpace) + // { + // diskPath: '/', + // free: 12345678, + // size: 98756432 + // } + // Note: `free` and `size` are in bytes +}) +``` diff --git a/node_modules/check-disk-space/dist/check-disk-space.cjs b/node_modules/check-disk-space/dist/check-disk-space.cjs new file mode 100644 index 000000000..52ce60daf --- /dev/null +++ b/node_modules/check-disk-space/dist/check-disk-space.cjs @@ -0,0 +1,210 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var node_child_process = require('node:child_process'); +var promises = require('node:fs/promises'); +var node_os = require('node:os'); +var node_path = require('node:path'); +var node_process = require('node:process'); +var node_util = require('node:util'); + +class InvalidPathError extends Error { + constructor(message) { + super(message); + this.name = 'InvalidPathError'; + // Set the prototype explicitly. + Object.setPrototypeOf(this, InvalidPathError.prototype); + } +} + +class NoMatchError extends Error { + constructor(message) { + super(message); + this.name = 'NoMatchError'; + // Set the prototype explicitly. + Object.setPrototypeOf(this, NoMatchError.prototype); + } +} + +/** + * Tells if directory exists + * + * @param directoryPath - The file/folder path + * @param dependencies - Dependencies container + */ +async function isDirectoryExisting(directoryPath, dependencies) { + try { + await dependencies.fsAccess(directoryPath); + return Promise.resolve(true); + } + catch (error) { + return Promise.resolve(false); + } +} + +/** + * Get the first existing parent path + * + * @param directoryPath - The file/folder path from where we want to know disk space + * @param dependencies - Dependencies container + */ +async function getFirstExistingParentPath(directoryPath, dependencies) { + let parentDirectoryPath = directoryPath; + let parentDirectoryFound = await isDirectoryExisting(parentDirectoryPath, dependencies); + while (!parentDirectoryFound) { + parentDirectoryPath = dependencies.pathNormalize(parentDirectoryPath + '/..'); + parentDirectoryFound = await isDirectoryExisting(parentDirectoryPath, dependencies); + } + return parentDirectoryPath; +} + +/** + * Tell if PowerShell 3 is available based on Windows version + * + * Note: 6.* is Windows 7 + * Note: PowerShell 3 is natively available since Windows 8 + * + * @param dependencies - Dependencies Injection Container + */ +async function hasPowerShell3(dependencies) { + const major = parseInt(dependencies.release.split('.')[0], 10); + if (major <= 6) { + return false; + } + try { + await dependencies.cpExecFile('where', ['powershell'], { windowsHide: true }); + return true; + } + catch (error) { + return false; + } +} + +/** + * Check disk space + * + * @param directoryPath - The file/folder path from where we want to know disk space + * @param dependencies - Dependencies container + */ +function checkDiskSpace(directoryPath, dependencies = { + platform: node_process.platform, + release: node_os.release(), + fsAccess: promises.access, + pathNormalize: node_path.normalize, + pathSep: node_path.sep, + cpExecFile: node_util.promisify(node_child_process.execFile), +}) { + // Note: This function contains other functions in order + // to wrap them in a common context and make unit tests easier + /** + * Maps command output to a normalized object {diskPath, free, size} + * + * @param stdout - The command output + * @param filter - To filter drives (only used for win32) + * @param mapping - Map between column index and normalized column name + * @param coefficient - The size coefficient to get bytes instead of kB + */ + function mapOutput(stdout, filter, mapping, coefficient) { + const parsed = stdout + .split('\n') // Split lines + .map(line => line.trim()) // Trim all lines + .filter(line => line.length !== 0) // Remove empty lines + .slice(1) // Remove header + .map(line => line.split(/\s+(?=[\d/])/)); // Split on spaces to get columns + const filtered = parsed.filter(filter); + if (filtered.length === 0) { + throw new NoMatchError(); + } + const diskData = filtered[0]; + return { + diskPath: diskData[mapping.diskPath], + free: parseInt(diskData[mapping.free], 10) * coefficient, + size: parseInt(diskData[mapping.size], 10) * coefficient, + }; + } + /** + * Run the command and do common things between win32 and unix + * + * @param cmd - The command to execute + * @param filter - To filter drives (only used for win32) + * @param mapping - Map between column index and normalized column name + * @param coefficient - The size coefficient to get bytes instead of kB + */ + async function check(cmd, filter, mapping, coefficient = 1) { + const [file, ...args] = cmd; + /* istanbul ignore if */ + if (file === undefined) { + return Promise.reject(new Error('cmd must contain at least one item')); + } + try { + const { stdout } = await dependencies.cpExecFile(file, args, { windowsHide: true }); + return mapOutput(stdout, filter, mapping, coefficient); + } + catch (error) { + return Promise.reject(error); + } + } + /** + * Build the check call for win32 + * + * @param directoryPath - The file/folder path from where we want to know disk space + */ + async function checkWin32(directoryPath) { + if (directoryPath.charAt(1) !== ':') { + return Promise.reject(new InvalidPathError(`The following path is invalid (should be X:\\...): ${directoryPath}`)); + } + const powershellCmd = [ + 'powershell', + 'Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object Caption, FreeSpace, Size', + ]; + const wmicCmd = [ + 'wmic', + 'logicaldisk', + 'get', + 'size,freespace,caption', + ]; + const cmd = await hasPowerShell3(dependencies) ? powershellCmd : wmicCmd; + return check(cmd, driveData => { + // Only get the drive which match the path + const driveLetter = driveData[0]; + return directoryPath.toUpperCase().startsWith(driveLetter.toUpperCase()); + }, { + diskPath: 0, + free: 1, + size: 2, + }); + } + /** + * Build the check call for unix + * + * @param directoryPath - The file/folder path from where we want to know disk space + */ + async function checkUnix(directoryPath) { + if (!dependencies.pathNormalize(directoryPath).startsWith(dependencies.pathSep)) { + return Promise.reject(new InvalidPathError(`The following path is invalid (should start by ${dependencies.pathSep}): ${directoryPath}`)); + } + const pathToCheck = await getFirstExistingParentPath(directoryPath, dependencies); + return check([ + 'df', + '-Pk', + '--', + pathToCheck, + ], () => true, // We should only get one line, so we did not need to filter + { + diskPath: 5, + free: 3, + size: 1, + }, 1024); + } + // Call the right check depending on the OS + if (dependencies.platform === 'win32') { + return checkWin32(directoryPath); + } + return checkUnix(directoryPath); +} + +exports.InvalidPathError = InvalidPathError; +exports.NoMatchError = NoMatchError; +exports.default = checkDiskSpace; +exports.getFirstExistingParentPath = getFirstExistingParentPath; diff --git a/node_modules/check-disk-space/dist/check-disk-space.d.ts b/node_modules/check-disk-space/dist/check-disk-space.d.ts new file mode 100644 index 000000000..b054c684d --- /dev/null +++ b/node_modules/check-disk-space/dist/check-disk-space.d.ts @@ -0,0 +1,53 @@ +import { access } from 'node:fs/promises'; +import { normalize, sep } from 'node:path'; + +declare class InvalidPathError extends Error { + name: string; + constructor(message?: string); +} + +declare class NoMatchError extends Error { + name: string; + constructor(message?: string); +} + +type Dependencies = { + platform: NodeJS.Platform; + release: string; + fsAccess: typeof access; + pathNormalize: typeof normalize; + pathSep: typeof sep; + cpExecFile: (file: string, args: ReadonlyArray | undefined | null, options: { + windowsHide: true; + }) => Promise<{ + stdout: string; + stderr: string; + }>; +}; + +/** + * Get the first existing parent path + * + * @param directoryPath - The file/folder path from where we want to know disk space + * @param dependencies - Dependencies container + */ +declare function getFirstExistingParentPath(directoryPath: string, dependencies: Dependencies): Promise; + +/** + * `free` and `size` are in bytes + */ +type DiskSpace = { + diskPath: string; + free: number; + size: number; +}; + +/** + * Check disk space + * + * @param directoryPath - The file/folder path from where we want to know disk space + * @param dependencies - Dependencies container + */ +declare function checkDiskSpace(directoryPath: string, dependencies?: Dependencies): Promise; + +export { Dependencies, DiskSpace, InvalidPathError, NoMatchError, checkDiskSpace as default, getFirstExistingParentPath }; diff --git a/node_modules/check-disk-space/dist/check-disk-space.mjs b/node_modules/check-disk-space/dist/check-disk-space.mjs new file mode 100644 index 000000000..4af273174 --- /dev/null +++ b/node_modules/check-disk-space/dist/check-disk-space.mjs @@ -0,0 +1,203 @@ +import { execFile } from 'node:child_process'; +import { access } from 'node:fs/promises'; +import { release } from 'node:os'; +import { normalize, sep } from 'node:path'; +import { platform } from 'node:process'; +import { promisify } from 'node:util'; + +class InvalidPathError extends Error { + constructor(message) { + super(message); + this.name = 'InvalidPathError'; + // Set the prototype explicitly. + Object.setPrototypeOf(this, InvalidPathError.prototype); + } +} + +class NoMatchError extends Error { + constructor(message) { + super(message); + this.name = 'NoMatchError'; + // Set the prototype explicitly. + Object.setPrototypeOf(this, NoMatchError.prototype); + } +} + +/** + * Tells if directory exists + * + * @param directoryPath - The file/folder path + * @param dependencies - Dependencies container + */ +async function isDirectoryExisting(directoryPath, dependencies) { + try { + await dependencies.fsAccess(directoryPath); + return Promise.resolve(true); + } + catch (error) { + return Promise.resolve(false); + } +} + +/** + * Get the first existing parent path + * + * @param directoryPath - The file/folder path from where we want to know disk space + * @param dependencies - Dependencies container + */ +async function getFirstExistingParentPath(directoryPath, dependencies) { + let parentDirectoryPath = directoryPath; + let parentDirectoryFound = await isDirectoryExisting(parentDirectoryPath, dependencies); + while (!parentDirectoryFound) { + parentDirectoryPath = dependencies.pathNormalize(parentDirectoryPath + '/..'); + parentDirectoryFound = await isDirectoryExisting(parentDirectoryPath, dependencies); + } + return parentDirectoryPath; +} + +/** + * Tell if PowerShell 3 is available based on Windows version + * + * Note: 6.* is Windows 7 + * Note: PowerShell 3 is natively available since Windows 8 + * + * @param dependencies - Dependencies Injection Container + */ +async function hasPowerShell3(dependencies) { + const major = parseInt(dependencies.release.split('.')[0], 10); + if (major <= 6) { + return false; + } + try { + await dependencies.cpExecFile('where', ['powershell'], { windowsHide: true }); + return true; + } + catch (error) { + return false; + } +} + +/** + * Check disk space + * + * @param directoryPath - The file/folder path from where we want to know disk space + * @param dependencies - Dependencies container + */ +function checkDiskSpace(directoryPath, dependencies = { + platform, + release: release(), + fsAccess: access, + pathNormalize: normalize, + pathSep: sep, + cpExecFile: promisify(execFile), +}) { + // Note: This function contains other functions in order + // to wrap them in a common context and make unit tests easier + /** + * Maps command output to a normalized object {diskPath, free, size} + * + * @param stdout - The command output + * @param filter - To filter drives (only used for win32) + * @param mapping - Map between column index and normalized column name + * @param coefficient - The size coefficient to get bytes instead of kB + */ + function mapOutput(stdout, filter, mapping, coefficient) { + const parsed = stdout + .split('\n') // Split lines + .map(line => line.trim()) // Trim all lines + .filter(line => line.length !== 0) // Remove empty lines + .slice(1) // Remove header + .map(line => line.split(/\s+(?=[\d/])/)); // Split on spaces to get columns + const filtered = parsed.filter(filter); + if (filtered.length === 0) { + throw new NoMatchError(); + } + const diskData = filtered[0]; + return { + diskPath: diskData[mapping.diskPath], + free: parseInt(diskData[mapping.free], 10) * coefficient, + size: parseInt(diskData[mapping.size], 10) * coefficient, + }; + } + /** + * Run the command and do common things between win32 and unix + * + * @param cmd - The command to execute + * @param filter - To filter drives (only used for win32) + * @param mapping - Map between column index and normalized column name + * @param coefficient - The size coefficient to get bytes instead of kB + */ + async function check(cmd, filter, mapping, coefficient = 1) { + const [file, ...args] = cmd; + /* istanbul ignore if */ + if (file === undefined) { + return Promise.reject(new Error('cmd must contain at least one item')); + } + try { + const { stdout } = await dependencies.cpExecFile(file, args, { windowsHide: true }); + return mapOutput(stdout, filter, mapping, coefficient); + } + catch (error) { + return Promise.reject(error); + } + } + /** + * Build the check call for win32 + * + * @param directoryPath - The file/folder path from where we want to know disk space + */ + async function checkWin32(directoryPath) { + if (directoryPath.charAt(1) !== ':') { + return Promise.reject(new InvalidPathError(`The following path is invalid (should be X:\\...): ${directoryPath}`)); + } + const powershellCmd = [ + 'powershell', + 'Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object Caption, FreeSpace, Size', + ]; + const wmicCmd = [ + 'wmic', + 'logicaldisk', + 'get', + 'size,freespace,caption', + ]; + const cmd = await hasPowerShell3(dependencies) ? powershellCmd : wmicCmd; + return check(cmd, driveData => { + // Only get the drive which match the path + const driveLetter = driveData[0]; + return directoryPath.toUpperCase().startsWith(driveLetter.toUpperCase()); + }, { + diskPath: 0, + free: 1, + size: 2, + }); + } + /** + * Build the check call for unix + * + * @param directoryPath - The file/folder path from where we want to know disk space + */ + async function checkUnix(directoryPath) { + if (!dependencies.pathNormalize(directoryPath).startsWith(dependencies.pathSep)) { + return Promise.reject(new InvalidPathError(`The following path is invalid (should start by ${dependencies.pathSep}): ${directoryPath}`)); + } + const pathToCheck = await getFirstExistingParentPath(directoryPath, dependencies); + return check([ + 'df', + '-Pk', + '--', + pathToCheck, + ], () => true, // We should only get one line, so we did not need to filter + { + diskPath: 5, + free: 3, + size: 1, + }, 1024); + } + // Call the right check depending on the OS + if (dependencies.platform === 'win32') { + return checkWin32(directoryPath); + } + return checkUnix(directoryPath); +} + +export { InvalidPathError, NoMatchError, checkDiskSpace as default, getFirstExistingParentPath }; diff --git a/node_modules/check-disk-space/package.json b/node_modules/check-disk-space/package.json new file mode 100644 index 000000000..aa698d8e8 --- /dev/null +++ b/node_modules/check-disk-space/package.json @@ -0,0 +1,83 @@ +{ + "name": "check-disk-space", + "version": "3.4.0", + "description": "Light multi-platform disk space checker without third party for Node.js", + "files": [ + "dist", + "README.md" + ], + "main": "./dist/check-disk-space.cjs", + "module": "./dist/check-disk-space.mjs", + "types": "./dist/check-disk-space.d.ts", + "exports": { + "import": "./dist/check-disk-space.mjs", + "require": "./dist/check-disk-space.cjs", + "types": "./dist/check-disk-space.d.ts" + }, + "scripts": { + "build:lib": "rollup --config", + "build:dts": "rollup --config rollup.dts.config.mjs", + "build": "npm-run-all build:lib build:dts", + "lint": "eslint . --cache", + "lint:fix": "eslint --fix .", + "typecheck": "tsc --noEmit", + "test": "npm-run-all test:coverage lint typecheck", + "test:unit": "NODE_ENV=test TS_NODE_PROJECT='tsconfig.test.json' ava", + "test:coverage": "nyc --reporter=lcov --reporter=text npm run test:unit --silent" + }, + "ava": { + "files": [ + "test/**", + "!test/__helpers__/**" + ], + "extensions": [ + "ts" + ], + "require": [ + "tsconfig-paths/register", + "ts-node/register", + "source-map-support/register" + ] + }, + "engines": { + "node": ">=16" + }, + "devDependencies": { + "@alex-d/eslint-config": "2.2.0", + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@rollup/plugin-typescript": "11.1.1", + "@types/node": "16.11.7", + "@typescript-eslint/eslint-plugin": "5.59.6", + "@typescript-eslint/parser": "5.59.6", + "ava": "5.2.0", + "eslint": "8.41.0", + "eslint-plugin-ava": "14.0.0", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-simple-import-sort": "10.0.0", + "npm-run-all": "4.1.5", + "nyc": "15.1.0", + "rollup": "3.22.0", + "rollup-plugin-dts": "5.3.0", + "source-map-support": "0.5.21", + "ts-node": "10.9.1", + "tsconfig-paths": "4.2.0", + "tslib": "2.5.2", + "typescript": "5.0.4" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Alex-D/check-disk-space.git" + }, + "keywords": [ + "disk", + "space", + "hdd", + "free" + ], + "author": "Alex-D (https://alex-d.fr)", + "license": "MIT", + "bugs": { + "url": "https://github.com/Alex-D/check-disk-space/issues" + }, + "homepage": "https://github.com/Alex-D/check-disk-space#readme" +} diff --git a/package-lock.json b/package-lock.json index 51ead36db..f99cc3078 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "@schemastore/package": "0.0.10", "@types/uuid": "^9.0.2", "adm-zip": "^0.5.10", + "check-disk-space": "^3.4.0", "console-log-level": "^1.4.1", "del": "^6.1.1", "fast-deep-equal": "^3.1.3", @@ -1807,6 +1808,14 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/check-disk-space": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.4.0.tgz", + "integrity": "sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==", + "engines": { + "node": ">=16" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", diff --git a/package.json b/package.json index 5ce76a67b..d0e5fdfc3 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@schemastore/package": "0.0.10", "@types/uuid": "^9.0.2", "adm-zip": "^0.5.10", + "check-disk-space": "^3.4.0", "console-log-level": "^1.4.1", "del": "^6.1.1", "fast-deep-equal": "^3.1.3", diff --git a/src/setup-codeql.ts b/src/setup-codeql.ts index b9c01ea09..ea456faa8 100644 --- a/src/setup-codeql.ts +++ b/src/setup-codeql.ts @@ -4,6 +4,7 @@ import * as path from "path"; import { performance } from "perf_hooks"; import * as toolcache from "@actions/tool-cache"; +import checkDiskSpace from "check-disk-space"; import del from "del"; import { default as deepEqual } from "fast-deep-equal"; import * as semver from "semver"; @@ -71,7 +72,7 @@ function tryGetCodeQLCliVersionForRelease( ); return undefined; } else if (cliVersionsFromMarkerFiles.length === 0) { - logger.debug( + logger.info( `Failed to find the CodeQL CLI version for release ${release.tag_name}.`, ); return undefined; @@ -84,7 +85,7 @@ export async function tryFindCliVersionDotcomOnly( logger: Logger, ): Promise { try { - logger.debug( + logger.info( `Fetching the GitHub Release for the CodeQL bundle tagged ${tagName}.`, ); const apiClient = api.getApiClient(); @@ -96,7 +97,7 @@ export async function tryFindCliVersionDotcomOnly( }); return tryGetCodeQLCliVersionForRelease(release.data, logger); } catch (e) { - logger.debug( + logger.info( `Failed to find the CLI version for the CodeQL bundle tagged ${tagName}. ${ wrapError(e).message }`, @@ -200,7 +201,7 @@ function tryGetBundleVersionFromTagName( ): string | undefined { const match = tagName.match(/^codeql-bundle-(.*)$/); if (match === null || match.length < 2) { - logger.debug(`Could not determine bundle version from tag ${tagName}.`); + logger.info(`Could not determine bundle version from tag ${tagName}.`); return undefined; } return match[1]; @@ -209,7 +210,7 @@ function tryGetBundleVersionFromTagName( function tryGetTagNameFromUrl(url: string, logger: Logger): string | undefined { const match = url.match(/\/(codeql-bundle-.*)\//); if (match === null || match.length < 2) { - logger.debug(`Could not determine tag name for URL ${url}.`); + logger.info(`Could not determine tag name for URL ${url}.`); return undefined; } return match[1]; @@ -228,7 +229,7 @@ export function tryGetBundleVersionFromUrl( export function convertToSemVer(version: string, logger: Logger): string { if (!semver.valid(version)) { - logger.debug( + logger.info( `Bundle version ${version} is not in SemVer format. Will treat it as pre-release 0.0.0-${version}.`, ); version = `0.0.0-${version}`; @@ -284,7 +285,7 @@ async function findOverridingToolsInCache( if (candidates.length === 1) { const candidate = candidates[0]; - logger.debug( + logger.info( `CodeQL tools version ${candidate.version} in toolcache overriding version ${humanReadableVersion}.`, ); return { @@ -293,11 +294,11 @@ async function findOverridingToolsInCache( toolsVersion: candidate.version, }; } else if (candidates.length === 0) { - logger.debug( + logger.info( "Did not find any candidate pinned versions of the CodeQL tools in the toolcache.", ); } else { - logger.debug( + logger.info( "Could not use CodeQL tools from the toolcache since more than one candidate pinned " + "version was found in the toolcache.", ); @@ -376,7 +377,7 @@ export async function getCodeQLSource( url ?? "unknown"; - logger.debug( + logger.info( "Attempting to obtain CodeQL tools. " + `CLI version: ${cliVersion ?? "unknown"}, ` + `bundle tag name: ${tagName ?? "unknown"}, ` + @@ -391,12 +392,12 @@ export async function getCodeQLSource( // Fall back to matching `x.y.z-`. if (!codeqlFolder) { - logger.debug( + logger.info( "Didn't find a version of the CodeQL tools in the toolcache with a version number " + `exactly matching ${cliVersion}.`, ); const allVersions = toolcache.findAllVersions("CodeQL"); - logger.debug( + logger.info( `Found the following versions of the CodeQL tools in the toolcache: ${JSON.stringify( allVersions, )}.`, @@ -407,13 +408,13 @@ export async function getCodeQLSource( version.startsWith(`${cliVersion}-`), ); if (candidateVersions.length === 1) { - logger.debug( + logger.info( `Exactly one version of the CodeQL tools starting with ${cliVersion} found in the ` + "toolcache, using that.", ); codeqlFolder = toolcache.find("CodeQL", candidateVersions[0]); } else if (candidateVersions.length === 0) { - logger.debug( + logger.info( `Didn't find any versions of the CodeQL tools starting with ${cliVersion} ` + `in the toolcache. Trying next fallback method.`, ); @@ -422,7 +423,7 @@ export async function getCodeQLSource( `Found ${candidateVersions.length} versions of the CodeQL tools starting with ` + `${cliVersion} in the toolcache, but at most one was expected.`, ); - logger.debug("Trying next fallback method."); + logger.info("Trying next fallback method."); } } } @@ -437,7 +438,7 @@ export async function getCodeQLSource( if (fallbackVersion) { codeqlFolder = toolcache.find("CodeQL", fallbackVersion); } else { - logger.debug( + logger.info( "Could not determine a fallback toolcache version number for CodeQL tools version " + `${humanReadableVersion}.`, ); @@ -511,7 +512,7 @@ export async function tryGetFallbackToolcacheVersion( return undefined; } const fallbackVersion = convertToSemVer(bundleVersion, logger); - logger.debug( + logger.info( `Computed a fallback toolcache version number of ${fallbackVersion} for CodeQL version ` + `${cliVersion ?? tagName}.`, ); @@ -542,13 +543,16 @@ export async function downloadCodeQL( // We also don't want to send an authorization header if there's already a token provided in the URL. let authorization: string | undefined = undefined; if (searchParams.has("token")) { - logger.debug("CodeQL tools URL contains an authorization token."); + logger.info("CodeQL tools URL contains an authorization token."); } else if (codeqlURL.startsWith(`${apiDetails.url}/`)) { - logger.debug("Providing an authorization token to download CodeQL tools."); + logger.info("Providing an authorization token to download CodeQL tools."); authorization = `token ${apiDetails.auth}`; } else { - logger.debug("Downloading CodeQL tools without an authorization token."); + logger.info("Downloading CodeQL tools without an authorization token."); } + + await printDiskSpace(logger); + logger.info( `Downloading CodeQL tools from ${codeqlURL}. This may take a while.`, ); @@ -570,26 +574,32 @@ export async function downloadCodeQL( performance.now() - toolsDownloadStart, ); - logger.debug( + logger.info( `Finished downloading CodeQL bundle to ${codeqlPath} (${toolsDownloadDurationMs} ms).`, ); + await printDiskSpace(logger); + const codeqlExtracted = await toolcache.extractTar(codeqlPath); - logger.debug(`Finished extracting CodeQL bundle to ${codeqlExtracted}.`); + logger.info(`Finished extracting CodeQL bundle to ${codeqlExtracted}.`); + + await printDiskSpace(logger); try { await del(codeqlPath, { force: true }); - logger.debug("Deleted CodeQL bundle archive."); + logger.info("Deleted CodeQL bundle archive."); } catch (e) { logger.warning("Failed to delete CodeQL bundle archive."); } + await printDiskSpace(logger); + const bundleVersion = maybeBundleVersion ?? tryGetBundleVersionFromUrl(codeqlURL, logger); if (bundleVersion === undefined) { - logger.debug( + logger.info( "Could not cache CodeQL tools because we could not determine the bundle version from the " + `URL ${codeqlURL}.`, ); @@ -624,13 +634,22 @@ export async function downloadCodeQL( const toolcacheVersion = maybeCliVersion?.match(/^[0-9]+\.[0-9]+\.[0-9]+$/) ? `${maybeCliVersion}-${bundleVersion}` : convertToSemVer(bundleVersion, logger); + + const codeqlFolder = await toolcache.cacheDir( + codeqlExtracted, + "CodeQL", + toolcacheVersion, + ); + + await printDiskSpace(logger); + + await del(codeqlExtracted, { force: true }); + + await printDiskSpace(logger); + return { toolsVersion: maybeCliVersion ?? toolcacheVersion, - codeqlFolder: await toolcache.cacheDir( - codeqlExtracted, - "CodeQL", - toolcacheVersion, - ), + codeqlFolder, toolsDownloadDurationMs, }; } @@ -690,7 +709,7 @@ export async function setupCodeQLBundle( break; case "toolcache": codeqlFolder = source.codeqlFolder; - logger.debug(`CodeQL found in cache ${codeqlFolder}`); + logger.info(`CodeQL found in cache ${codeqlFolder}`); toolsSource = ToolsSource.Toolcache; break; case "download": { @@ -714,3 +733,14 @@ export async function setupCodeQLBundle( } return { codeqlFolder, toolsDownloadDurationMs, toolsSource, toolsVersion }; } + +async function printDiskSpace(logger: Logger) { + const diskSpaceInfo = await checkDiskSpace( + process.platform === "win32" ? path.parse(process.cwd()).root : "/", + ); + logger.info( + `Disk space info: ${diskSpaceInfo.free / (1024 * 1024 * 1024)} GB free of ${ + diskSpaceInfo.size / (1024 * 1024 * 1024) + } GB`, + ); +}