Compare commits

...

4 Commits

Author SHA1 Message Date
Michael B. Gale
b4db38273c Add generated files to paths-ignore, if FF is enabled 2025-11-19 19:42:18 +00:00
Michael B. Gale
846f8590dc Add IgnoreGeneratedFiles FF 2025-11-19 19:10:42 +00:00
Michael B. Gale
3eaf00092b Add isCCR helper, and update isDefaultSetup 2025-11-19 19:07:21 +00:00
Michael B. Gale
1512f400b3 Add function to query git for all generated files 2025-11-19 15:35:46 +00:00
18 changed files with 307 additions and 51 deletions

View File

@@ -120074,6 +120074,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

12
lib/analyze-action.js generated
View File

@@ -87570,7 +87570,12 @@ function isDynamicWorkflow() {
return getWorkflowEventName() === "dynamic";
}
function isDefaultSetup() {
return isDynamicWorkflow();
return isDynamicWorkflow() && !isCCR();
}
function isCCR() {
return isDynamicWorkflow() && process.env["CODEQL_ACTION_ANALYSIS_KEY"]?.startsWith(
"dynamic/copilot-pull-request-reviewer"
) || false;
}
function prettyPrintInvocation(cmd, args) {
return [cmd, ...args].map((x) => x.includes(" ") ? `'${x}'` : x).join(" ");
@@ -88695,6 +88700,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

View File

@@ -84014,6 +84014,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

View File

@@ -122511,7 +122511,12 @@ function isDynamicWorkflow() {
return getWorkflowEventName() === "dynamic";
}
function isDefaultSetup() {
return isDynamicWorkflow();
return isDynamicWorkflow() && !isCCR();
}
function isCCR() {
return isDynamicWorkflow() && process.env["CODEQL_ACTION_ANALYSIS_KEY"]?.startsWith(
"dynamic/copilot-pull-request-reviewer"
) || false;
}
function prettyPrintInvocation(cmd, args) {
return [cmd, ...args].map((x) => x.includes(" ") ? `'${x}'` : x).join(" ");
@@ -123455,6 +123460,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

133
lib/init-action.js generated
View File

@@ -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;
@@ -84914,7 +84914,12 @@ function isDynamicWorkflow() {
return getWorkflowEventName() === "dynamic";
}
function isDefaultSetup() {
return isDynamicWorkflow();
return isDynamicWorkflow() && !isCCR();
}
function isCCR() {
return isDynamicWorkflow() && process.env["CODEQL_ACTION_ANALYSIS_KEY"]?.startsWith(
"dynamic/copilot-pull-request-reviewer"
) || false;
}
function prettyPrintInvocation(cmd, args) {
return [cmd, ...args].map((x) => x.includes(" ") ? `'${x}'` : x).join(" ");
@@ -85647,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());
@@ -85820,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());
@@ -86109,6 +86140,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",
@@ -87032,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(
@@ -87254,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());
@@ -87266,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()
];
@@ -87317,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"])
}
};
@@ -87926,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());
@@ -88064,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) {
@@ -89402,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 */) {
@@ -89506,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;

View File

@@ -84005,6 +84005,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

View File

@@ -83917,6 +83917,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

View File

@@ -119480,6 +119480,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

View File

@@ -100033,6 +100033,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

12
lib/upload-lib.js generated
View File

@@ -86174,7 +86174,12 @@ function isDynamicWorkflow() {
return getWorkflowEventName() === "dynamic";
}
function isDefaultSetup() {
return isDynamicWorkflow();
return isDynamicWorkflow() && !isCCR();
}
function isCCR() {
return isDynamicWorkflow() && process.env["CODEQL_ACTION_ANALYSIS_KEY"]?.startsWith(
"dynamic/copilot-pull-request-reviewer"
) || false;
}
function prettyPrintInvocation(cmd, args) {
return [cmd, ...args].map((x) => x.includes(" ") ? `'${x}'` : x).join(" ");
@@ -87071,6 +87076,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

View File

@@ -119646,6 +119646,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

View File

@@ -86204,7 +86204,12 @@ function isDynamicWorkflow() {
return getWorkflowEventName() === "dynamic";
}
function isDefaultSetup() {
return isDynamicWorkflow();
return isDynamicWorkflow() && !isCCR();
}
function isCCR() {
return isDynamicWorkflow() && process.env["CODEQL_ACTION_ANALYSIS_KEY"]?.startsWith(
"dynamic/copilot-pull-request-reviewer"
) || false;
}
function prettyPrintInvocation(cmd, args) {
return [cmd, ...args].map((x) => x.includes(" ") ? `'${x}'` : x).join(" ");
@@ -86867,6 +86872,11 @@ var featureConfig = {
legacyApi: true,
minimumVersion: void 0
},
["ignore_generated_files" /* IgnoreGeneratedFiles */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: void 0
},
["java_minimize_dependency_jars" /* JavaMinimizeDependencyJars */]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

View File

@@ -5,6 +5,9 @@ import {
fixCodeQualityCategory,
getPullRequestBranches,
isAnalyzingPullRequest,
isCCR,
isDefaultSetup,
isDynamicWorkflow,
} from "./actions-util";
import { computeAutomationID } from "./api-client";
import { EnvVar } from "./environment";
@@ -246,3 +249,25 @@ test("fixCodeQualityCategory", (t) => {
},
);
});
test("isDynamicWorkflow() returns true if event name is `dynamic`", (t) => {
process.env.GITHUB_EVENT_NAME = "dynamic";
t.assert(isDynamicWorkflow());
process.env.GITHUB_EVENT_NAME = "push";
t.false(isDynamicWorkflow());
});
test("isCCR() returns true when expected", (t) => {
process.env.GITHUB_EVENT_NAME = "dynamic";
process.env.CODEQL_ACTION_ANALYSIS_KEY =
"dynamic/copilot-pull-request-reviewer";
t.assert(isCCR());
t.false(isDefaultSetup());
});
test("isDefaultSetup() returns true when expected", (t) => {
process.env.GITHUB_EVENT_NAME = "dynamic";
process.env.CODEQL_ACTION_ANALYSIS_KEY = "dynamic/github-code-scanning";
t.assert(isDefaultSetup());
t.false(isCCR());
});

View File

@@ -254,7 +254,18 @@ export function isDynamicWorkflow(): boolean {
/** Determines whether we are running in default setup. */
export function isDefaultSetup(): boolean {
return isDynamicWorkflow();
return isDynamicWorkflow() && !isCCR();
}
/** Determines whether we are running in CCR. */
export function isCCR(): boolean {
return (
(isDynamicWorkflow() &&
process.env["CODEQL_ACTION_ANALYSIS_KEY"]?.startsWith(
"dynamic/copilot-pull-request-reviewer",
)) ||
false
);
}
export function prettyPrintInvocation(cmd: string, args: string[]): string {

View File

@@ -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.

View File

@@ -53,6 +53,7 @@ export enum Feature {
DisableJavaBuildlessEnabled = "disable_java_buildless_enabled",
DisableKotlinAnalysisEnabled = "disable_kotlin_analysis_enabled",
ExportDiagnosticsEnabled = "export_diagnostics_enabled",
IgnoreGeneratedFiles = "ignore_generated_files",
JavaMinimizeDependencyJars = "java_minimize_dependency_jars",
OverlayAnalysis = "overlay_analysis",
OverlayAnalysisActions = "overlay_analysis_actions",
@@ -167,6 +168,11 @@ export const featureConfig: Record<
legacyApi: true,
minimumVersion: undefined,
},
[Feature.IgnoreGeneratedFiles]: {
defaultValue: false,
envVar: "CODEQL_ACTION_IGNORE_GENERATED_FILES",
minimumVersion: undefined,
},
[Feature.JavaMinimizeDependencyJars]: {
defaultValue: false,
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",

View File

@@ -1,4 +1,5 @@
import * as fs from "fs";
import * as os from "os";
import * as path from "path";
import * as core from "@actions/core";
@@ -392,3 +393,41 @@ test("getFileOidsUnderPath throws on unexpected output format", async (t) => {
runGitCommandStub.restore();
}
});
test("listFiles returns array of file paths", async (t) => {
sinon
.stub(gitUtils, "runGitCommand")
.resolves(["dir/file.txt", "README.txt"].join(os.EOL));
await t.notThrowsAsync(async () => {
const result = await gitUtils.listFiles("/some/path");
t.is(result.length, 2);
t.is(result[0], "dir/file.txt");
});
});
test("getGeneratedFiles returns generated files only", async (t) => {
const runGitCommandStub = sinon.stub(gitUtils, "runGitCommand");
runGitCommandStub
.onFirstCall()
.resolves(["dir/file.txt", "test.json", "README.txt"].join(os.EOL));
runGitCommandStub
.onSecondCall()
.resolves(
[
"dir/file.txt: linguist-generated: unspecified",
"test.json: linguist-generated: true",
"README.txt: linguist-generated: false",
].join(os.EOL),
);
await t.notThrowsAsync(async () => {
const result = await gitUtils.getGeneratedFiles("/some/path");
t.assert(runGitCommandStub.calledTwice);
t.is(result.length, 1);
t.is(result[0], "test.json");
});
});

View File

@@ -1,3 +1,5 @@
import * as os from "os";
import * as core from "@actions/core";
import * as toolrunner from "@actions/exec/lib/toolrunner";
import * as io from "@actions/io";
@@ -408,3 +410,34 @@ export async function isAnalyzingDefaultBranch(): Promise<boolean> {
return currentRef === defaultBranch;
}
export async function listFiles(workingDirectory: string): Promise<string[]> {
const stdout = await runGitCommand(
workingDirectory,
["ls-files"],
"Unable to list tracked files.",
);
return stdout.split(os.EOL);
}
export async function getGeneratedFiles(
workingDirectory: string,
): Promise<string[]> {
const files = await listFiles(workingDirectory);
const stdout = await runGitCommand(
workingDirectory,
["check-attr", "linguist-generated", "--", ...files],
"Unable to check attributes of files.",
);
const generatedFiles: string[] = [];
const regex = /^([^:]+): linguist-generated: true$/;
for (const result of stdout.split(os.EOL)) {
const match = result.match(regex);
if (match) {
generatedFiles.push(match[1]);
}
}
return generatedFiles;
}