@@ -50,6 +50,7 @@ import App.Fossa.Config.Analyze (
5050 )
5151import App.Fossa.Config.Analyze qualified as Config
5252import App.Fossa.Config.Common (DestinationMeta (.. ), destinationApiOpts , destinationMetadata )
53+ import App.Fossa.Ficus.Analyze (analyzeWithFicus )
5354import App.Fossa.FirstPartyScan (runFirstPartyScan )
5455import App.Fossa.Lernie.Analyze (analyzeWithLernie )
5556import App.Fossa.Lernie.Types (LernieResults (.. ))
@@ -108,7 +109,7 @@ import Data.String.Conversion (decodeUtf8, toText)
108109import Data.Text.Extra (showT )
109110import Data.Traversable (for )
110111import Diag.Diagnostic as DI
111- import Diag.Result (resultToMaybe )
112+ import Diag.Result (Result ( Success ), resultToMaybe )
112113import Discovery.Archive qualified as Archive
113114import Discovery.Filters (AllFilters , MavenScopeFilters , applyFilters , filterIsVSIOnly , ignoredPaths , isDefaultNonProductionPath )
114115import Discovery.Projects (withDiscoveredProjects )
@@ -297,6 +298,7 @@ analyze cfg = Diag.context "fossa-analyze" $ do
297298 shouldAnalyzePathDependencies = resolvePathDependencies $ Config. experimental cfg
298299 allowedTactics = Config. allowedTacticTypes cfg
299300 withoutDefaultFilters = Config. withoutDefaultFilters cfg
301+ enableSnippetScan = Config. xSnippetScan cfg
300302
301303 manualSrcUnits <-
302304 Diag. errorBoundaryIO . diagToDebug $
@@ -335,6 +337,19 @@ analyze cfg = Diag.context "fossa-analyze" $ do
335337 if (fromFlag BinaryDiscovery $ Config. binaryDiscoveryEnabled $ Config. vsiOptions cfg)
336338 then analyzeDiscoverBinaries basedir filters
337339 else pure Nothing
340+ maybeFicusResults <-
341+ Diag. errorBoundaryIO . diagToDebug $
342+ if not enableSnippetScan
343+ then do
344+ logInfo " Skipping ficus snippet scanning (--x-snippet-scan not set)"
345+ pure Nothing
346+ else
347+ if filterIsVSIOnly filters
348+ then do
349+ logInfo " Running in VSI only mode, skipping snippet-scan"
350+ pure Nothing
351+ else Diag. context " snippet-scanning" . runStickyLogger SevInfo $ analyzeWithFicus basedir maybeApiOpts revision $ Config. licenseScanPathFilters vendoredDepsOptions
352+ let ficusResults = join . resultToMaybe $ maybeFicusResults
338353 maybeLernieResults <-
339354 Diag. errorBoundaryIO . diagToDebug $
340355 if filterIsVSIOnly filters
@@ -422,7 +437,7 @@ analyze cfg = Diag.context "fossa-analyze" $ do
422437 $ analyzeForReachability projectScans
423438 let reachabilityUnits = onlyFoundUnits reachabilityUnitsResult
424439
425- let analysisResult = AnalysisScanResult projectScans vsiResults binarySearchResults manualSrcUnits dynamicLinkedResults maybeLernieResults reachabilityUnitsResult
440+ let analysisResult = AnalysisScanResult projectScans vsiResults binarySearchResults ( Success [] Nothing ) manualSrcUnits dynamicLinkedResults maybeLernieResults reachabilityUnitsResult
426441 renderScanSummary (severity cfg) maybeEndpointAppVersion analysisResult cfg
427442
428443 -- Need to check if vendored is empty as well, even if its a boolean that vendoredDeps exist
@@ -442,16 +457,16 @@ analyze cfg = Diag.context "fossa-analyze" $ do
442457 (False , FilteredAll ) -> Diag. warn ErrFilteredAllProjects $> emptyScanUnits
443458 (True , FilteredAll ) -> Diag. warn ErrOnlyKeywordSearchResultsFound $> emptyScanUnits
444459 (_, CountedScanUnits scanUnits) -> pure scanUnits
445- sendToDestination outputResult iatAssertion destination basedir jsonOutput revision scanUnits reachabilityUnits
460+ sendToDestination outputResult iatAssertion destination basedir jsonOutput revision scanUnits reachabilityUnits ficusResults
446461
447462 pure outputResult
448463 where
449- sendToDestination result iatAssertion destination basedir jsonOutput revision scanUnits reachabilityUnits =
464+ sendToDestination result iatAssertion destination basedir jsonOutput revision scanUnits reachabilityUnits ficusResults =
450465 let doUpload (DestinationMeta (apiOpts, metadata)) =
451466 Diag. context " upload-results"
452467 . runFossaApiClient apiOpts
453468 $ do
454- locator <- uploadSuccessfulAnalysis (BaseDir basedir) metadata jsonOutput revision scanUnits reachabilityUnits
469+ locator <- uploadSuccessfulAnalysis (BaseDir basedir) metadata jsonOutput revision scanUnits reachabilityUnits ficusResults
455470 doAssertRevisionBinaries iatAssertion locator
456471 in case destination of
457472 OutputStdout -> logStdout . decodeUtf8 $ Aeson. encode result
0 commit comments