diff --git a/lib/init-action.js b/lib/init-action.js index e79ca0a45..43aca1aef 100644 --- a/lib/init-action.js +++ b/lib/init-action.js @@ -98,11 +98,11 @@ var require_command = __commonJS({ }; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.issue = exports2.issueCommand = void 0; - var os5 = __importStar4(require("os")); + var os6 = __importStar4(require("os")); var utils_1 = require_utils(); function issueCommand(command, properties, message) { const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os5.EOL); + process.stdout.write(cmd.toString() + os6.EOL); } exports2.issueCommand = issueCommand; function issue(name, message = "") { @@ -186,7 +186,7 @@ var require_file_command = __commonJS({ exports2.prepareKeyValueMessage = exports2.issueFileCommand = void 0; var crypto2 = __importStar4(require("crypto")); var fs15 = __importStar4(require("fs")); - var os5 = __importStar4(require("os")); + var os6 = __importStar4(require("os")); var utils_1 = require_utils(); function issueFileCommand(command, message) { const filePath = process.env[`GITHUB_${command}`]; @@ -196,7 +196,7 @@ var require_file_command = __commonJS({ if (!fs15.existsSync(filePath)) { throw new Error(`Missing file at path: ${filePath}`); } - fs15.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os5.EOL}`, { + fs15.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os6.EOL}`, { encoding: "utf8" }); } @@ -210,7 +210,7 @@ var require_file_command = __commonJS({ if (convertedValue.includes(delimiter)) { throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); } - return `${key}<<${delimiter}${os5.EOL}${convertedValue}${os5.EOL}${delimiter}`; + return `${key}<<${delimiter}${os6.EOL}${convertedValue}${os6.EOL}${delimiter}`; } exports2.prepareKeyValueMessage = prepareKeyValueMessage; } @@ -18933,7 +18933,7 @@ var require_toolrunner = __commonJS({ }; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.argStringToArray = exports2.ToolRunner = void 0; - var os5 = __importStar4(require("os")); + var os6 = __importStar4(require("os")); var events = __importStar4(require("events")); var child = __importStar4(require("child_process")); var path16 = __importStar4(require("path")); @@ -18988,12 +18988,12 @@ var require_toolrunner = __commonJS({ _processLineBuffer(data, strBuffer, onLine) { try { let s = strBuffer + data.toString(); - let n = s.indexOf(os5.EOL); + let n = s.indexOf(os6.EOL); while (n > -1) { const line = s.substring(0, n); onLine(line); - s = s.substring(n + os5.EOL.length); - n = s.indexOf(os5.EOL); + s = s.substring(n + os6.EOL.length); + n = s.indexOf(os6.EOL); } return s; } catch (err) { @@ -19162,7 +19162,7 @@ var require_toolrunner = __commonJS({ } const optionsNonNull = this._cloneExecOptions(this.options); if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os5.EOL); + optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os6.EOL); } const state = new ExecState(optionsNonNull, this.toolPath); state.on("debug", (message) => { @@ -19650,7 +19650,7 @@ var require_core = __commonJS({ var command_1 = require_command(); var file_command_1 = require_file_command(); var utils_1 = require_utils(); - var os5 = __importStar4(require("os")); + var os6 = __importStar4(require("os")); var path16 = __importStar4(require("path")); var oidc_utils_1 = require_oidc_utils(); var ExitCode; @@ -19718,7 +19718,7 @@ Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); if (filePath) { return (0, file_command_1.issueFileCommand)("OUTPUT", (0, file_command_1.prepareKeyValueMessage)(name, value)); } - process.stdout.write(os5.EOL); + process.stdout.write(os6.EOL); (0, command_1.issueCommand)("set-output", { name }, (0, utils_1.toCommandValue)(value)); } exports2.setOutput = setOutput2; @@ -19752,7 +19752,7 @@ Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); } exports2.notice = notice; function info6(message) { - process.stdout.write(message + os5.EOL); + process.stdout.write(message + os6.EOL); } exports2.info = info6; function startGroup4(name) { @@ -31906,7 +31906,7 @@ var require_internal_pattern = __commonJS({ }; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.Pattern = void 0; - var os5 = __importStar4(require("os")); + var os6 = __importStar4(require("os")); var path16 = __importStar4(require("path")); var pathHelper = __importStar4(require_internal_path_helper()); var assert_1 = __importDefault4(require("assert")); @@ -31999,7 +31999,7 @@ var require_internal_pattern = __commonJS({ if (pattern === "." || pattern.startsWith(`.${path16.sep}`)) { pattern = _Pattern.globEscape(process.cwd()) + pattern.substr(1); } else if (pattern === "~" || pattern.startsWith(`~${path16.sep}`)) { - homedir2 = homedir2 || os5.homedir(); + homedir2 = homedir2 || os6.homedir(); assert_1.default(homedir2, "Unable to determine HOME directory"); assert_1.default(pathHelper.hasAbsoluteRoot(homedir2), `Expected HOME directory to be a rooted path. Actual '${homedir2}'`); pattern = _Pattern.globEscape(homedir2) + pattern.substr(1); @@ -35242,14 +35242,14 @@ var require_dist = __commonJS({ "node_modules/@azure/logger/dist/index.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); - var os5 = require("os"); + var os6 = require("os"); var util = require("util"); function _interopDefaultLegacy(e) { return e && typeof e === "object" && "default" in e ? e : { "default": e }; } var util__default = /* @__PURE__ */ _interopDefaultLegacy(util); function log(message, ...args) { - process.stderr.write(`${util__default["default"].format(message, ...args)}${os5.EOL}`); + process.stderr.write(`${util__default["default"].format(message, ...args)}${os6.EOL}`); } var debugEnvVariable = typeof process !== "undefined" && process.env && process.env.DEBUG || void 0; var enabledString; @@ -36516,7 +36516,7 @@ var require_userAgentPlatform = __commonJS({ exports2.getHeaderName = getHeaderName; exports2.setPlatformSpecificData = setPlatformSpecificData; var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); - var os5 = tslib_1.__importStar(require("node:os")); + var os6 = tslib_1.__importStar(require("node:os")); var process2 = tslib_1.__importStar(require("node:process")); function getHeaderName() { return "User-Agent"; @@ -36532,7 +36532,7 @@ var require_userAgentPlatform = __commonJS({ map2.set("Node", versions.node); } } - map2.set("OS", `(${os5.arch()}-${os5.type()}-${os5.release()})`); + map2.set("OS", `(${os6.arch()}-${os6.type()}-${os6.release()})`); } } }); @@ -37854,7 +37854,7 @@ var require_has_flag = __commonJS({ var require_supports_color = __commonJS({ "node_modules/supports-color/index.js"(exports2, module2) { "use strict"; - var os5 = require("os"); + var os6 = require("os"); var tty = require("tty"); var hasFlag = require_has_flag(); var { env } = process; @@ -37902,7 +37902,7 @@ var require_supports_color = __commonJS({ return min; } if (process.platform === "win32") { - const osRelease = os5.release().split("."); + const osRelease = os6.release().split("."); if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { return Number(osRelease[2]) >= 14931 ? 3 : 2; } @@ -45124,11 +45124,11 @@ var require_XMLParser = __commonJS({ // node_modules/fast-xml-parser/src/xmlbuilder/orderedJs2Xml.js var require_orderedJs2Xml = __commonJS({ "node_modules/fast-xml-parser/src/xmlbuilder/orderedJs2Xml.js"(exports2, module2) { - var EOL = "\n"; + var EOL2 = "\n"; function toXml(jArray, options) { let indentation = ""; if (options.format && options.indentBy.length > 0) { - indentation = EOL; + indentation = EOL2; } return arrToStr(jArray, options, "", indentation); } @@ -77691,7 +77691,7 @@ var require_internal_pattern2 = __commonJS({ }; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.Pattern = void 0; - var os5 = __importStar4(require("os")); + var os6 = __importStar4(require("os")); var path16 = __importStar4(require("path")); var pathHelper = __importStar4(require_internal_path_helper2()); var assert_1 = __importDefault4(require("assert")); @@ -77784,7 +77784,7 @@ var require_internal_pattern2 = __commonJS({ if (pattern === "." || pattern.startsWith(`.${path16.sep}`)) { pattern = _Pattern.globEscape(process.cwd()) + pattern.substr(1); } else if (pattern === "~" || pattern.startsWith(`~${path16.sep}`)) { - homedir2 = homedir2 || os5.homedir(); + homedir2 = homedir2 || os6.homedir(); (0, assert_1.default)(homedir2, "Unable to determine HOME directory"); (0, assert_1.default)(pathHelper.hasAbsoluteRoot(homedir2), `Expected HOME directory to be a rooted path. Actual '${homedir2}'`); pattern = _Pattern.globEscape(homedir2) + pattern.substr(1); @@ -78826,12 +78826,12 @@ var require_manifest = __commonJS({ exports2._readLinuxVersionFile = exports2._getOsVersion = exports2._findMatch = void 0; var semver9 = __importStar4(require_semver2()); var core_1 = require_core(); - var os5 = require("os"); + var os6 = require("os"); var cp = require("child_process"); var fs15 = require("fs"); function _findMatch(versionSpec, stable, candidates, archFilter) { return __awaiter4(this, void 0, void 0, function* () { - const platFilter = os5.platform(); + const platFilter = os6.platform(); let result; let match; let file; @@ -78868,7 +78868,7 @@ var require_manifest = __commonJS({ } exports2._findMatch = _findMatch; function _getOsVersion() { - const plat = os5.platform(); + const plat = os6.platform(); let version = ""; if (plat === "darwin") { version = cp.execSync("sw_vers -productVersion").toString(); @@ -79775,7 +79775,7 @@ var require_tool_cache = __commonJS({ var crypto2 = __importStar4(require("crypto")); var fs15 = __importStar4(require("fs")); var mm = __importStar4(require_manifest()); - var os5 = __importStar4(require("os")); + var os6 = __importStar4(require("os")); var path16 = __importStar4(require("path")); var httpm = __importStar4(require_lib5()); var semver9 = __importStar4(require_semver2()); @@ -80053,7 +80053,7 @@ var require_tool_cache = __commonJS({ function cacheDir(sourceDir, tool, version, arch2) { return __awaiter4(this, void 0, void 0, function* () { version = semver9.clean(version) || version; - arch2 = arch2 || os5.arch(); + arch2 = arch2 || os6.arch(); core14.debug(`Caching tool ${tool} ${version} ${arch2}`); core14.debug(`source dir: ${sourceDir}`); if (!fs15.statSync(sourceDir).isDirectory()) { @@ -80072,7 +80072,7 @@ var require_tool_cache = __commonJS({ function cacheFile(sourceFile, targetFile, tool, version, arch2) { return __awaiter4(this, void 0, void 0, function* () { version = semver9.clean(version) || version; - arch2 = arch2 || os5.arch(); + arch2 = arch2 || os6.arch(); core14.debug(`Caching tool ${tool} ${version} ${arch2}`); core14.debug(`source file: ${sourceFile}`); if (!fs15.statSync(sourceFile).isFile()) { @@ -80094,7 +80094,7 @@ var require_tool_cache = __commonJS({ if (!versionSpec) { throw new Error("versionSpec parameter is required"); } - arch2 = arch2 || os5.arch(); + arch2 = arch2 || os6.arch(); if (!isExplicitVersion(versionSpec)) { const localVersions = findAllVersions2(toolName, arch2); const match = evaluateVersions(localVersions, versionSpec); @@ -80117,7 +80117,7 @@ var require_tool_cache = __commonJS({ exports2.find = find2; function findAllVersions2(toolName, arch2) { const versions = []; - arch2 = arch2 || os5.arch(); + arch2 = arch2 || os6.arch(); const toolPath = path16.join(_getCacheDirectory(), toolName); if (fs15.existsSync(toolPath)) { const children = fs15.readdirSync(toolPath); @@ -80168,7 +80168,7 @@ var require_tool_cache = __commonJS({ }); } exports2.getManifestFromRepo = getManifestFromRepo; - function findFromManifest(versionSpec, stable, manifest, archFilter = os5.arch()) { + function findFromManifest(versionSpec, stable, manifest, archFilter = os6.arch()) { return __awaiter4(this, void 0, void 0, function* () { const match = yield mm._findMatch(versionSpec, stable, manifest, archFilter); return match; @@ -85652,6 +85652,7 @@ var path4 = __toESM(require("path")); var actionsCache = __toESM(require_cache3()); // src/git-utils.ts +var os2 = __toESM(require("os")); var core7 = __toESM(require_core()); var toolrunner2 = __toESM(require_toolrunner()); var io3 = __toESM(require_io2()); @@ -85825,6 +85826,31 @@ async function isAnalyzingDefaultBranch() { } return currentRef === defaultBranch; } +async function listFiles(workingDirectory) { + const stdout = await runGitCommand( + workingDirectory, + ["ls-files"], + "Unable to list tracked files." + ); + return stdout.split(os2.EOL); +} +async function getGeneratedFiles(workingDirectory) { + const files = await listFiles(workingDirectory); + const stdout = await runGitCommand( + workingDirectory, + ["check-attr", "linguist-generated", "--", ...files], + "Unable to check attributes of files." + ); + const generatedFiles = []; + const regex = /^([^:]+): linguist-generated: true$/; + for (const result of stdout.split(os2.EOL)) { + const match = result.match(regex); + if (match) { + generatedFiles.push(match[1]); + } + } + return generatedFiles; +} // src/logging.ts var core8 = __toESM(require_core()); @@ -87042,6 +87068,15 @@ async function initConfig(features, inputs) { ); } const config = await initActionState(inputs, userConfig); + if (await features.getValue("ignore_generated_files" /* IgnoreGeneratedFiles */) || isCCR()) { + try { + const generatedFiles = await getGeneratedFiles(inputs.sourceRoot); + config.computedConfig["paths-ignore"] ??= []; + config.computedConfig["paths-ignore"].push(...generatedFiles); + } catch (error3) { + logger.info(`Cannot ignore generated files: ${getErrorMessage(error3)}`); + } + } if (config.analysisKinds.length === 1 && isCodeQualityEnabled(config)) { if (hasQueryCustomisation(config.computedConfig)) { throw new ConfigurationError( @@ -87264,7 +87299,7 @@ function isCodeQualityEnabled(config) { } // src/dependency-caching.ts -var os2 = __toESM(require("os")); +var os3 = __toESM(require("os")); var import_path = require("path"); var actionsCache3 = __toESM(require_cache3()); var glob = __toESM(require_glob2()); @@ -87276,9 +87311,9 @@ function getJavaTempDependencyDir() { function getJavaDependencyDirs() { return [ // Maven - (0, import_path.join)(os2.homedir(), ".m2", "repository"), + (0, import_path.join)(os3.homedir(), ".m2", "repository"), // Gradle - (0, import_path.join)(os2.homedir(), ".gradle", "caches"), + (0, import_path.join)(os3.homedir(), ".gradle", "caches"), // CodeQL Java build-mode: none getJavaTempDependencyDir() ]; @@ -87327,11 +87362,11 @@ var defaultCacheConfigs = { ]) }, csharp: { - getDependencyPaths: () => [(0, import_path.join)(os2.homedir(), ".nuget", "packages")], + getDependencyPaths: () => [(0, import_path.join)(os3.homedir(), ".nuget", "packages")], getHashPatterns: getCsharpHashPatterns }, go: { - getDependencyPaths: () => [(0, import_path.join)(os2.homedir(), "go", "pkg", "mod")], + getDependencyPaths: () => [(0, import_path.join)(os3.homedir(), "go", "pkg", "mod")], getHashPatterns: async () => internal.makePatternCheck(["**/go.sum"]) } }; @@ -87936,7 +87971,7 @@ function inferCompressionMethod(tarPath) { // src/tools-download.ts var fs8 = __toESM(require("fs")); -var os3 = __toESM(require("os")); +var os4 = __toESM(require("os")); var path9 = __toESM(require("path")); var import_perf_hooks2 = require("perf_hooks"); var core9 = __toESM(require_core()); @@ -88074,7 +88109,7 @@ function getToolcacheDirectory(version) { getRequiredEnvParam("RUNNER_TOOL_CACHE"), TOOLCACHE_TOOL_NAME, semver6.clean(version) || version, - os3.arch() || "" + os4.arch() || "" ); } function writeToolcacheMarkerFile(extractedPath, logger) { @@ -89412,7 +89447,7 @@ function cleanupDatabaseClusterDirectory(config, logger, options = {}, rmSync2 = } // src/status-report.ts -var os4 = __toESM(require("os")); +var os5 = __toESM(require("os")); var core11 = __toESM(require_core()); function isFirstPartyAnalysis(actionName) { if (actionName !== "upload-sarif" /* UploadSarif */) { @@ -89516,7 +89551,7 @@ async function createStatusReportBase(actionName, status, actionStartedAt, confi statusReport.runner_arch = process.env["RUNNER_ARCH"]; } if (!(runnerOs === "Linux" && isSelfHostedRunner())) { - statusReport.runner_os_release = os4.release(); + statusReport.runner_os_release = os5.release(); } if (codeQlCliVersion !== void 0) { statusReport.codeql_version = codeQlCliVersion.version; diff --git a/src/config-utils.ts b/src/config-utils.ts index cbfcb3b95..34382058f 100644 --- a/src/config-utils.ts +++ b/src/config-utils.ts @@ -4,7 +4,11 @@ import { performance } from "perf_hooks"; import * as yaml from "js-yaml"; -import { getActionVersion, isAnalyzingPullRequest } from "./actions-util"; +import { + getActionVersion, + isAnalyzingPullRequest, + isCCR, +} from "./actions-util"; import { AnalysisConfig, AnalysisKind, @@ -26,7 +30,11 @@ import { shouldPerformDiffInformedAnalysis } from "./diff-informed-analysis-util import * as errorMessages from "./error-messages"; import { Feature, FeatureEnablement } from "./feature-flags"; import { RepositoryProperties } from "./feature-flags/properties"; -import { getGitRoot, isAnalyzingDefaultBranch } from "./git-utils"; +import { + getGeneratedFiles, + getGitRoot, + isAnalyzingDefaultBranch, +} from "./git-utils"; import { KnownLanguage, Language } from "./languages"; import { Logger } from "./logging"; import { @@ -44,6 +52,7 @@ import { cloneObject, isDefined, checkDiskUsage, + getErrorMessage, } from "./util"; export * from "./config/db-config"; @@ -845,6 +854,19 @@ export async function initConfig( const config = await initActionState(inputs, userConfig); + // If we are in CCR or the corresponding FF is enabled, try to determine + // which files in the repository are marked as generated and add them to + // the `paths-ignore` configuration. + if ((await features.getValue(Feature.IgnoreGeneratedFiles)) || isCCR()) { + try { + const generatedFiles = await getGeneratedFiles(inputs.sourceRoot); + config.computedConfig["paths-ignore"] ??= []; + config.computedConfig["paths-ignore"].push(...generatedFiles); + } catch (error) { + logger.info(`Cannot ignore generated files: ${getErrorMessage(error)}`); + } + } + // If Code Quality analysis is the only enabled analysis kind, then we will initialise // the database for Code Quality. That entails disabling the default queries and only // running quality queries. We do not currently support query customisations in that case.