Skip to content

Commit 3d50556

Browse files
committed
refactor: fall back to non-overlay analysis when diff-informed analysis is unavailable
1 parent 6521697 commit 3d50556

File tree

5 files changed

+268
-95
lines changed

5 files changed

+268
-95
lines changed

lib/init-action.js

Lines changed: 59 additions & 37 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/config-utils.test.ts

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2200,3 +2200,80 @@ test.serial(
22002200
});
22012201
},
22022202
);
2203+
2204+
test.serial(
2205+
"applyIncrementalAnalysisSettings: no-op when mode is not Overlay and diff-informed is unavailable",
2206+
(t) => {
2207+
const config = createTestConfig({});
2208+
config.overlayDatabaseMode = OverlayDatabaseMode.None;
2209+
const logger = getRunnerLogger(true);
2210+
2211+
configUtils.applyIncrementalAnalysisSettings(
2212+
config,
2213+
{ shouldRun: false, isAvailable: false },
2214+
logger,
2215+
);
2216+
2217+
t.is(config.overlayDatabaseMode, OverlayDatabaseMode.None);
2218+
t.deepEqual(config.extraQueryExclusions, []);
2219+
},
2220+
);
2221+
2222+
test.serial(
2223+
"applyIncrementalAnalysisSettings: keeps overlay mode and adds exclusions when diff-informed analysis is disabled",
2224+
(t) => {
2225+
const config = createTestConfig({});
2226+
config.overlayDatabaseMode = OverlayDatabaseMode.Overlay;
2227+
const logger = getRunnerLogger(true);
2228+
2229+
configUtils.applyIncrementalAnalysisSettings(
2230+
config,
2231+
{ shouldRun: false, isAvailable: false },
2232+
logger,
2233+
);
2234+
2235+
t.is(config.overlayDatabaseMode, OverlayDatabaseMode.Overlay);
2236+
t.deepEqual(config.extraQueryExclusions, [
2237+
{ exclude: { tags: "exclude-from-incremental" } },
2238+
]);
2239+
},
2240+
);
2241+
2242+
test.serial(
2243+
"applyIncrementalAnalysisSettings: reverts to None without exclusions when diff-informed analysis is unavailable",
2244+
(t) => {
2245+
const config = createTestConfig({});
2246+
config.overlayDatabaseMode =
2247+
OverlayDatabaseMode.Overlay as OverlayDatabaseMode;
2248+
const logger = getRunnerLogger(true);
2249+
2250+
configUtils.applyIncrementalAnalysisSettings(
2251+
config,
2252+
{ shouldRun: true, isAvailable: false },
2253+
logger,
2254+
);
2255+
2256+
t.is(config.overlayDatabaseMode, OverlayDatabaseMode.None);
2257+
t.deepEqual(config.extraQueryExclusions, []);
2258+
},
2259+
);
2260+
2261+
test.serial(
2262+
"applyIncrementalAnalysisSettings: adds exclusions for diff-informed-only runs",
2263+
(t) => {
2264+
const config = createTestConfig({});
2265+
config.overlayDatabaseMode = OverlayDatabaseMode.None;
2266+
const logger = getRunnerLogger(true);
2267+
2268+
configUtils.applyIncrementalAnalysisSettings(
2269+
config,
2270+
{ shouldRun: true, isAvailable: true },
2271+
logger,
2272+
);
2273+
2274+
t.is(config.overlayDatabaseMode, OverlayDatabaseMode.None);
2275+
t.deepEqual(config.extraQueryExclusions, [
2276+
{ exclude: { tags: "exclude-from-incremental" } },
2277+
]);
2278+
},
2279+
);

src/config-utils.ts

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ import {
3131
addNoLanguageDiagnostic,
3232
makeTelemetryDiagnostic,
3333
} from "./diagnostics";
34-
import { shouldPerformDiffInformedAnalysis } from "./diff-informed-analysis-utils";
34+
import {
35+
type DiffInformedAnalysisPreparation,
36+
prepareDiffInformedAnalysis,
37+
} from "./diff-informed-analysis-utils";
3538
import { EnvVar } from "./environment";
3639
import * as errorMessages from "./error-messages";
3740
import { Feature, FeatureEnablement } from "./feature-flags";
@@ -1076,6 +1079,42 @@ function hasQueryCustomisation(userConfig: UserConfig): boolean {
10761079
);
10771080
}
10781081

1082+
/**
1083+
* Finalize the incremental-analysis configuration for this run.
1084+
*
1085+
* If overlay mode was selected for a PR but diff-informed analysis should have
1086+
* run and could not be prepared, fall back to a full non-overlay analysis.
1087+
* Query exclusions for incremental-only queries are applied only when the final
1088+
* configuration still uses overlay analysis or diff-informed analysis is
1089+
* actually available.
1090+
*/
1091+
export function applyIncrementalAnalysisSettings(
1092+
config: Config,
1093+
diffInformedAnalysis: DiffInformedAnalysisPreparation,
1094+
logger: Logger,
1095+
): void {
1096+
if (
1097+
config.overlayDatabaseMode === OverlayDatabaseMode.Overlay &&
1098+
diffInformedAnalysis.shouldRun &&
1099+
!diffInformedAnalysis.isAvailable
1100+
) {
1101+
logger.warning(
1102+
"Diff-informed analysis is not available for this pull request. " +
1103+
`Reverting overlay database mode to ${OverlayDatabaseMode.None}.`,
1104+
);
1105+
config.overlayDatabaseMode = OverlayDatabaseMode.None;
1106+
}
1107+
1108+
if (
1109+
config.overlayDatabaseMode === OverlayDatabaseMode.Overlay ||
1110+
diffInformedAnalysis.isAvailable
1111+
) {
1112+
config.extraQueryExclusions.push({
1113+
exclude: { tags: "exclude-from-incremental" },
1114+
});
1115+
}
1116+
}
1117+
10791118
/**
10801119
* Load and return the config.
10811120
*
@@ -1230,18 +1269,13 @@ export async function initConfig(
12301269
);
12311270
}
12321271

1233-
if (
1234-
config.overlayDatabaseMode === OverlayDatabaseMode.Overlay ||
1235-
(await shouldPerformDiffInformedAnalysis(
1236-
inputs.codeql,
1237-
inputs.features,
1238-
logger,
1239-
))
1240-
) {
1241-
config.extraQueryExclusions.push({
1242-
exclude: { tags: "exclude-from-incremental" },
1243-
});
1244-
}
1272+
const diffInformedAnalysis = await prepareDiffInformedAnalysis(
1273+
inputs.codeql,
1274+
inputs.features,
1275+
logger,
1276+
);
1277+
1278+
applyIncrementalAnalysisSettings(config, diffInformedAnalysis, logger);
12451279

12461280
if (await isTrapCachingEnabled(features, config.overlayDatabaseMode)) {
12471281
const { trapCaches, trapCacheDownloadTime } = await downloadCacheWithTime(

0 commit comments

Comments
 (0)