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
96 changes: 59 additions & 37 deletions lib/init-action.js

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

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

test.serial(
"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, isAvailable: false },
logger,
);

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

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

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

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

test.serial(
"applyIncrementalAnalysisSettings: reverts to None without exclusions when diff-informed analysis is unavailable",
(t) => {
const config = createTestConfig({});
config.overlayDatabaseMode =
OverlayDatabaseMode.Overlay as OverlayDatabaseMode;
const logger = getRunnerLogger(true);

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

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

test.serial(
"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, isAvailable: true },
logger,
);

t.is(config.overlayDatabaseMode, OverlayDatabaseMode.None);
t.deepEqual(config.extraQueryExclusions, [
{ exclude: { tags: "exclude-from-incremental" } },
]);
},
);
60 changes: 47 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,42 @@ 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 diff-informed analysis is
* actually available.
*/
export function applyIncrementalAnalysisSettings(
config: Config,
diffInformedAnalysis: DiffInformedAnalysisPreparation,
logger: Logger,
): void {
if (
config.overlayDatabaseMode === OverlayDatabaseMode.Overlay &&
diffInformedAnalysis.shouldRun &&
!diffInformedAnalysis.isAvailable
) {
logger.warning(
"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.isAvailable
) {
config.extraQueryExclusions.push({
exclude: { tags: "exclude-from-incremental" },
});
}
}

/**
* Load and return the config.
*
Expand Down Expand Up @@ -1230,18 +1269,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