Skip to content

Commit d8a6799

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

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

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";
@@ -1075,6 +1078,42 @@ function hasQueryCustomisation(userConfig: UserConfig): boolean {
10751078
);
10761079
}
10771080

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

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

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

0 commit comments

Comments
 (0)