@@ -5,12 +5,13 @@ import { performance } from "perf_hooks";
5
5
import * as yaml from "js-yaml" ;
6
6
import * as semver from "semver" ;
7
7
8
+ import { isAnalyzingPullRequest } from "./actions-util" ;
8
9
import * as api from "./api-client" ;
9
10
import { CachingKind , getCachingKind } from "./caching-utils" ;
10
11
import { CodeQL } from "./codeql" ;
11
12
import { shouldPerformDiffInformedAnalysis } from "./diff-informed-analysis-utils" ;
12
13
import { Feature , FeatureEnablement } from "./feature-flags" ;
13
- import { getGitRoot } from "./git-utils" ;
14
+ import { getGitRoot , isAnalyzingDefaultBranch } from "./git-utils" ;
14
15
import { Language , parseLanguage } from "./languages" ;
15
16
import { Logger } from "./logging" ;
16
17
import {
@@ -743,46 +744,87 @@ function parseQueriesFromInput(
743
744
return trimmedInput . split ( "," ) . map ( ( query ) => ( { uses : query . trim ( ) } ) ) ;
744
745
}
745
746
747
+ /**
748
+ * Calculate and validate the overlay database mode to use.
749
+ *
750
+ * - If the environment variable `CODEQL_OVERLAY_DATABASE_MODE` is set, use it.
751
+ * - Otherwise, if `Feature.OverlayAnalysis` is enabled, calculate the mode
752
+ * based on what we are analyzing.
753
+ * - If we are analyzing a pull request, use `Overlay`.
754
+ * - If we are analyzing the default branch, use `OverlayBase`.
755
+ * - Otherwise, use `None`.
756
+ *
757
+ * For `Overlay` and `OverlayBase`, the function performs further checks and
758
+ * reverts to `None` if any check should fail.
759
+ */
746
760
async function getOverlayDatabaseMode (
747
761
codeql : CodeQL ,
748
762
features : FeatureEnablement ,
749
763
sourceRoot : string ,
750
764
buildMode : BuildMode | undefined ,
751
765
logger : Logger ,
752
766
) : Promise < OverlayDatabaseMode > {
753
- const overlayDatabaseMode = process . env . CODEQL_OVERLAY_DATABASE_MODE ;
767
+ let overlayDatabaseMode = OverlayDatabaseMode . None ;
754
768
769
+ const modeEnv = process . env . CODEQL_OVERLAY_DATABASE_MODE ;
770
+ // Any unrecognized CODEQL_OVERLAY_DATABASE_MODE value will be ignored and
771
+ // treated as if the environment variable was not set.
755
772
if (
756
- overlayDatabaseMode === OverlayDatabaseMode . Overlay ||
757
- overlayDatabaseMode === OverlayDatabaseMode . OverlayBase
773
+ modeEnv === OverlayDatabaseMode . Overlay ||
774
+ modeEnv === OverlayDatabaseMode . OverlayBase ||
775
+ modeEnv === OverlayDatabaseMode . None
758
776
) {
759
- if ( buildMode !== BuildMode . None ) {
760
- logger . warning (
761
- `Cannot build an ${ overlayDatabaseMode } database because ` +
762
- `build-mode is set to "${ buildMode } " instead of "none". ` +
763
- "Falling back to creating a normal full database instead." ,
764
- ) ;
765
- return OverlayDatabaseMode . None ;
766
- }
767
- if ( ! ( await codeQlVersionAtLeast ( codeql , CODEQL_OVERLAY_MINIMUM_VERSION ) ) ) {
768
- logger . warning (
769
- `Cannot build an ${ overlayDatabaseMode } database because ` +
770
- `the CodeQL CLI is older than ${ CODEQL_OVERLAY_MINIMUM_VERSION } . ` +
771
- "Falling back to creating a normal full database instead." ,
777
+ overlayDatabaseMode = modeEnv ;
778
+ logger . info (
779
+ `Setting overlay database mode to ${ overlayDatabaseMode } ` +
780
+ "from the CODEQL_OVERLAY_DATABASE_MODE environment variable." ,
781
+ ) ;
782
+ } else if ( await features . getValue ( Feature . OverlayAnalysis , codeql ) ) {
783
+ if ( isAnalyzingPullRequest ( ) ) {
784
+ overlayDatabaseMode = OverlayDatabaseMode . Overlay ;
785
+ logger . info (
786
+ `Setting overlay database mode to ${ overlayDatabaseMode } ` +
787
+ "because we are analyzing a pull request." ,
772
788
) ;
773
- return OverlayDatabaseMode . None ;
774
- }
775
- if ( ( await getGitRoot ( sourceRoot ) ) === undefined ) {
776
- logger . warning (
777
- `Cannot build an ${ overlayDatabaseMode } database because ` +
778
- `the source root "${ sourceRoot } " is not inside a git repository. ` +
779
- "Falling back to creating a normal full database instead." ,
789
+ } else if ( await isAnalyzingDefaultBranch ( ) ) {
790
+ overlayDatabaseMode = OverlayDatabaseMode . OverlayBase ;
791
+ logger . info (
792
+ `Setting overlay database mode to ${ overlayDatabaseMode } ` +
793
+ "because we are analyzing the default branch." ,
780
794
) ;
781
- return OverlayDatabaseMode . None ;
782
795
}
783
- return overlayDatabaseMode as OverlayDatabaseMode ;
784
796
}
785
- return OverlayDatabaseMode . None ;
797
+
798
+ if ( overlayDatabaseMode === OverlayDatabaseMode . None ) {
799
+ return OverlayDatabaseMode . None ;
800
+ }
801
+
802
+ if ( buildMode !== BuildMode . None ) {
803
+ logger . warning (
804
+ `Cannot build an ${ overlayDatabaseMode } database because ` +
805
+ `build-mode is set to "${ buildMode } " instead of "none". ` +
806
+ "Falling back to creating a normal full database instead." ,
807
+ ) ;
808
+ return OverlayDatabaseMode . None ;
809
+ }
810
+ if ( ! ( await codeQlVersionAtLeast ( codeql , CODEQL_OVERLAY_MINIMUM_VERSION ) ) ) {
811
+ logger . warning (
812
+ `Cannot build an ${ overlayDatabaseMode } database because ` +
813
+ `the CodeQL CLI is older than ${ CODEQL_OVERLAY_MINIMUM_VERSION } . ` +
814
+ "Falling back to creating a normal full database instead." ,
815
+ ) ;
816
+ return OverlayDatabaseMode . None ;
817
+ }
818
+ if ( ( await getGitRoot ( sourceRoot ) ) === undefined ) {
819
+ logger . warning (
820
+ `Cannot build an ${ overlayDatabaseMode } database because ` +
821
+ `the source root "${ sourceRoot } " is not inside a git repository. ` +
822
+ "Falling back to creating a normal full database instead." ,
823
+ ) ;
824
+ return OverlayDatabaseMode . None ;
825
+ }
826
+
827
+ return overlayDatabaseMode ;
786
828
}
787
829
788
830
/**
0 commit comments