Skip to content
Open
93 changes: 56 additions & 37 deletions lib/init-action.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

65 changes: 65 additions & 0 deletions src/config-utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2200,3 +2200,68 @@ test.serial(
});
},
);

test("applyIncrementalAnalysisSettings: no-op when mode is not Overlay and diff-informed is unavailable", (t) => {
Comment thread
sam-robson marked this conversation as resolved.
Outdated
const config = createTestConfig({});
config.overlayDatabaseMode = OverlayDatabaseMode.None;
const logger = getRunnerLogger(true);

configUtils.applyIncrementalAnalysisSettings(
config,
{ shouldRun: false, hasDiffRanges: false },
logger,
);

t.is(config.overlayDatabaseMode, OverlayDatabaseMode.None);
t.deepEqual(config.extraQueryExclusions, []);
});

test("applyIncrementalAnalysisSettings: keeps overlay mode and adds exclusions when diff-informed analysis shouldn't run", (t) => {
const config = createTestConfig({});
config.overlayDatabaseMode = OverlayDatabaseMode.Overlay;
const logger = getRunnerLogger(true);

configUtils.applyIncrementalAnalysisSettings(
config,
{ shouldRun: false, hasDiffRanges: false },
logger,
);

t.is(config.overlayDatabaseMode, OverlayDatabaseMode.Overlay);
t.deepEqual(config.extraQueryExclusions, [
{ exclude: { tags: "exclude-from-incremental" } },
]);
});

test("applyIncrementalAnalysisSettings: disables overlay analysis when diff-informed analysis is unavailable", (t) => {
const config = createTestConfig({
overlayDatabaseMode: OverlayDatabaseMode.Overlay,
});
const logger = getRunnerLogger(true);

configUtils.applyIncrementalAnalysisSettings(
config,
{ shouldRun: true, hasDiffRanges: false },
logger,
);

t.is(config.overlayDatabaseMode, OverlayDatabaseMode.None);
t.deepEqual(config.extraQueryExclusions, []);
});

test("applyIncrementalAnalysisSettings: adds exclusions for diff-informed-only runs", (t) => {
const config = createTestConfig({});
config.overlayDatabaseMode = OverlayDatabaseMode.None;
const logger = getRunnerLogger(true);

configUtils.applyIncrementalAnalysisSettings(
config,
{ shouldRun: true, hasDiffRanges: true },
logger,
);

t.is(config.overlayDatabaseMode, OverlayDatabaseMode.None);
t.deepEqual(config.extraQueryExclusions, [
{ exclude: { tags: "exclude-from-incremental" } },
]);
});
66 changes: 53 additions & 13 deletions src/config-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ import {
addNoLanguageDiagnostic,
makeTelemetryDiagnostic,
} from "./diagnostics";
import { shouldPerformDiffInformedAnalysis } from "./diff-informed-analysis-utils";
import {
type DiffInformedAnalysisPreparation,
prepareDiffInformedAnalysis,
} from "./diff-informed-analysis-utils";
import { EnvVar } from "./environment";
import * as errorMessages from "./error-messages";
import { Feature, FeatureEnablement } from "./feature-flags";
Expand Down Expand Up @@ -1076,6 +1079,48 @@ function hasQueryCustomisation(userConfig: UserConfig): boolean {
);
}

/**
* Finalize the incremental-analysis configuration for this run.
*
* If overlay mode was selected for a PR but diff-informed analysis should have
* run and could not be prepared, fall back to a full non-overlay analysis.
* Query exclusions for incremental-only queries are applied only when the final
* configuration still uses overlay analysis or the diff ranges are available.
*
* Note that `overlayDatabaseMode === Overlay` does not imply
* `diffInformedAnalysis.shouldRun`. Overlay mode is selected based on language
* and feature-flag state and can apply outside of pull-request contexts (e.g.
* on branch pushes that build up the overlay cache), whereas diff-informed
* analysis only runs for pull requests where we can compute a diff. Each
* combination is therefore handled explicitly.
*/
export function applyIncrementalAnalysisSettings(
config: Config,
diffInformedAnalysis: DiffInformedAnalysisPreparation,
logger: Logger,
): void {
if (
config.overlayDatabaseMode === OverlayDatabaseMode.Overlay &&
diffInformedAnalysis.shouldRun &&
Comment thread
sam-robson marked this conversation as resolved.
Outdated
!diffInformedAnalysis.hasDiffRanges
) {
logger.info(
"Diff-informed analysis is not available for this pull request. " +
`Reverting overlay database mode to ${OverlayDatabaseMode.None}.`,
Comment thread
sam-robson marked this conversation as resolved.
Outdated
);
config.overlayDatabaseMode = OverlayDatabaseMode.None;
Comment thread
sam-robson marked this conversation as resolved.
}

if (
config.overlayDatabaseMode === OverlayDatabaseMode.Overlay ||
diffInformedAnalysis.hasDiffRanges
) {
config.extraQueryExclusions.push({
exclude: { tags: "exclude-from-incremental" },
});
}
}

/**
* Load and return the config.
*
Expand Down Expand Up @@ -1230,18 +1275,13 @@ export async function initConfig(
);
}

if (
config.overlayDatabaseMode === OverlayDatabaseMode.Overlay ||
(await shouldPerformDiffInformedAnalysis(
inputs.codeql,
inputs.features,
logger,
))
) {
config.extraQueryExclusions.push({
exclude: { tags: "exclude-from-incremental" },
});
}
const diffInformedAnalysis = await prepareDiffInformedAnalysis(
inputs.codeql,
inputs.features,
logger,
);

applyIncrementalAnalysisSettings(config, diffInformedAnalysis, logger);

if (await isTrapCachingEnabled(features, config.overlayDatabaseMode)) {
const { trapCaches, trapCacheDownloadTime } = await downloadCacheWithTime(
Expand Down
Loading
Loading