Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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) => {
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.
!diffInformedAnalysis.hasDiffRanges
) {
logger.info(
"Diff-informed analysis is not available for this pull request. " +
`Reverting overlay database mode to ${OverlayDatabaseMode.None}.`,
);
config.overlayDatabaseMode = OverlayDatabaseMode.None;
}

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