Skip to content

Commit 9c29840

Browse files
committed
Update to accept specific strategies
1 parent c0befaf commit 9c29840

File tree

6 files changed

+52
-14
lines changed

6 files changed

+52
-14
lines changed

integration-test/Analysis/FicusSpec.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
module Analysis.FicusSpec (spec) where
55

66
import App.Fossa.Ficus.Analyze (analyzeWithFicus)
7-
import App.Fossa.Ficus.Types (FicusAnalysisResults (..), FicusSnippetScanResults (..))
7+
import App.Fossa.Ficus.Types (FicusAnalysisResults (..), FicusSnippetScanResults (..), FicusStrategy (FicusStrategySnippetScan))
88
import App.Types (ProjectRevision (..))
99
import Control.Carrier.Diagnostics (runDiagnostics)
1010
import Control.Carrier.Stack (runStack)
@@ -51,7 +51,7 @@ spec = do
5151
testDataExists <- PIO.doesDirExist testDataDir
5252
testDataExists `shouldBe` True
5353

54-
result <- runStack . runDiagnostics . ignoreStickyLogger . ignoreLogger . runExecIO . runReadFSIO $ analyzeWithFicus testDataDir apiOpts revision Nothing (Just 10) Nothing
54+
result <- runStack . runDiagnostics . ignoreStickyLogger . ignoreLogger . runExecIO . runReadFSIO $ analyzeWithFicus testDataDir apiOpts revision [FicusStrategySnippetScan] Nothing (Just 10) Nothing
5555

5656
case result of
5757
Success _warnings analysisResult -> do

src/App/Fossa/Analyze.hs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ import App.Fossa.Config.Analyze (
5151
import App.Fossa.Config.Analyze qualified as Config
5252
import App.Fossa.Config.Common (DestinationMeta (..), destinationApiOpts, destinationMetadata)
5353
import App.Fossa.Ficus.Analyze (analyzeWithFicus)
54-
import App.Fossa.Ficus.Types (FicusAnalysisResults (vendoredDependencyScanResults), FicusVendoredDependencyScanResults (FicusVendoredDependencyScanResults))
54+
import App.Fossa.Ficus.Types (FicusAnalysisResults (vendoredDependencyScanResults), FicusStrategy (FicusStrategySnippetScan, FicusStrategyVendetta), FicusVendoredDependencyScanResults (FicusVendoredDependencyScanResults))
5555
import App.Fossa.FirstPartyScan (runFirstPartyScan)
5656
import App.Fossa.Lernie.Analyze (analyzeWithLernie)
5757
import App.Fossa.Lernie.Types (LernieResults (..))
@@ -303,6 +303,7 @@ analyze cfg = Diag.context "fossa-analyze" $ do
303303
allowedTactics = Config.allowedTacticTypes cfg
304304
withoutDefaultFilters = Config.withoutDefaultFilters cfg
305305
enableSnippetScan = Config.xSnippetScan cfg
306+
enableVendetta = Config.xVendetta cfg
306307

307308
manualSrcUnits <-
308309
Diag.errorBoundaryIO . diagToDebug $
@@ -341,24 +342,30 @@ analyze cfg = Diag.context "fossa-analyze" $ do
341342
if (fromFlag BinaryDiscovery $ Config.binaryDiscoveryEnabled $ Config.vsiOptions cfg)
342343
then analyzeDiscoverBinaries basedir filters
343344
else pure Nothing
345+
let ficusStrategies = case [enableSnippetScan, enableVendetta] of
346+
[True, True] -> [FicusStrategySnippetScan, FicusStrategyVendetta]
347+
[True, False] -> [FicusStrategySnippetScan]
348+
[False, True] -> [FicusStrategyVendetta]
349+
[False, False] -> []
344350
maybeFicusResults <-
345351
Diag.errorBoundaryIO . diagToDebug $
346-
if not enableSnippetScan
352+
if null ficusStrategies
347353
then do
348-
logInfo "Skipping ficus snippet scanning (--x-snippet-scan not set)"
354+
logInfo "Skipping ficus scanning (--x-snippet-scan and/or x-vendetta not set)"
349355
pure Nothing
350356
else
351357
if filterIsVSIOnly filters
352358
then do
353-
logInfo "Running in VSI only mode, skipping snippet-scan"
359+
logInfo "Running in VSI only mode, skipping ficus scanning"
354360
pure Nothing
355361
else
356-
Diag.context "snippet-scanning"
362+
Diag.context "ficus-scanning"
357363
. runStickyLogger SevInfo
358364
$ analyzeWithFicus
359365
basedir
360366
maybeApiOpts
361367
revision
368+
ficusStrategies
362369
(Config.licenseScanPathFilters vendoredDepsOptions)
363370
(orgSnippetScanSourceCodeRetentionDays =<< orgInfo)
364371
(Config.debugDir cfg)

src/App/Fossa/Config/Analyze.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ data AnalyzeCliOpts = AnalyzeCliOpts
240240
, analyzeWithoutDefaultFilters :: Flag WithoutDefaultFilters
241241
, analyzeStrictMode :: Flag StrictMode
242242
, analyzeSnippetScan :: Bool
243+
, analyzeVendetta :: Bool
243244
}
244245
deriving (Eq, Ord, Show)
245246

@@ -280,6 +281,7 @@ data AnalyzeConfig = AnalyzeConfig
280281
, mode :: Mode
281282
, xSnippetScan :: Bool
282283
, debugDir :: Maybe FilePath
284+
, xVendetta :: Bool
283285
}
284286
deriving (Eq, Ord, Show, Generic)
285287

@@ -352,6 +354,7 @@ cliParser =
352354
<*> withoutDefaultFilterParser fossaAnalyzeDefaultFilterDocUrl
353355
<*> flagOpt StrictMode (applyFossaStyle <> long "strict" <> stringToHelpDoc "Enforces strict analysis to ensure the most accurate results by rejecting fallbacks.")
354356
<*> switch (applyFossaStyle <> long "x-snippet-scan" <> stringToHelpDoc "Experimental flag to enable snippet scanning to identify open source code snippets using fingerprinting.")
357+
<*> switch (applyFossaStyle <> long "x-vendetta" <> stringToHelpDoc "Experimental flag to enable vendored dependency scanning to identify open source components using file hashing.")
355358
where
356359
fossaDepsFileHelp :: Maybe (Doc AnsiStyle)
357360
fossaDepsFileHelp =
@@ -568,6 +571,7 @@ mergeStandardOpts maybeDebugDir maybeConfig envvars cliOpts@AnalyzeCliOpts{..} =
568571
<*> pure mode
569572
<*> pure analyzeSnippetScan
570573
<*> pure maybeDebugDir
574+
<*> pure analyzeVendetta
571575

572576
collectMavenScopeFilters ::
573577
(Has Diagnostics sig m) =>

src/App/Fossa/Ficus/Analyze.hs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import App.Fossa.Ficus.Types (
2424
FicusPerStrategyFlag (..),
2525
FicusScanStats (..),
2626
FicusSnippetScanResults (..),
27+
FicusStrategy (FicusStrategyHash, FicusStrategyNoop, FicusStrategySnippetScan, FicusStrategyVendetta),
2728
FicusVendoredDependency (..),
2829
FicusVendoredDependencyScanResults (..),
2930
)
@@ -96,12 +97,13 @@ analyzeWithFicus ::
9697
Path Abs Dir ->
9798
Maybe ApiOpts ->
9899
ProjectRevision ->
100+
[FicusStrategy] ->
99101
Maybe LicenseScanPathFilters ->
100102
Maybe Int ->
101103
Maybe FilePath -> -- Debug directory (if enabled)
102104
m (Maybe FicusAnalysisResults)
103-
analyzeWithFicus rootDir apiOpts revision filters snippetScanRetentionDays maybeDebugDir = do
104-
Just <$> analyzeWithFicusMain rootDir apiOpts revision filters snippetScanRetentionDays maybeDebugDir
105+
analyzeWithFicus rootDir apiOpts revision strategies filters snippetScanRetentionDays maybeDebugDir = do
106+
Just <$> analyzeWithFicusMain rootDir apiOpts revision strategies filters snippetScanRetentionDays maybeDebugDir
105107

106108
analyzeWithFicusMain ::
107109
( Has Diagnostics sig m
@@ -111,11 +113,12 @@ analyzeWithFicusMain ::
111113
Path Abs Dir ->
112114
Maybe ApiOpts ->
113115
ProjectRevision ->
116+
[FicusStrategy] ->
114117
Maybe LicenseScanPathFilters ->
115118
Maybe Int ->
116119
Maybe FilePath -> -- Debug directory (if enabled)
117120
m FicusAnalysisResults
118-
analyzeWithFicusMain rootDir apiOpts revision filters snippetScanRetentionDays maybeDebugDir = do
121+
analyzeWithFicusMain rootDir apiOpts revision strategies filters snippetScanRetentionDays maybeDebugDir = do
119122
logDebugWithTime "Preparing Ficus analysis configuration..."
120123
ficusResults <- runFicus maybeDebugDir ficusConfig
121124
logDebugWithTime "runFicus completed, processing results..."
@@ -134,6 +137,7 @@ analyzeWithFicusMain rootDir apiOpts revision filters snippetScanRetentionDays m
134137
, ficusConfigRevision = revision
135138
, ficusConfigFlags = [All $ FicusAllFlag SkipHiddenFiles, All $ FicusAllFlag Gitignore]
136139
, ficusConfigSnippetScanRetentionDays = snippetScanRetentionDays
140+
, ficusConfigOnlyStrategies = strategies
137141
}
138142

139143
findingToSnippetScanResult :: FicusFinding -> Maybe FicusSnippetScanResults
@@ -171,7 +175,7 @@ formatFicusScanSummary results =
171175

172176
findingToVendoredDependency :: FicusFinding -> Maybe FicusVendoredDependency
173177
findingToVendoredDependency (FicusFinding (FicusMessageData strategy payload))
174-
| Text.toLower strategy == "vendored" =
178+
| Text.toLower strategy == "vendetta" =
175179
decode (BL.fromStrict $ Text.Encoding.encodeUtf8 payload)
176180
findingToVendoredDependency _ = Nothing
177181

@@ -400,11 +404,17 @@ ficusCommand ficusConfig bin = do
400404
pure cmd
401405
where
402406
snippetScanRetentionDays = ficusConfigSnippetScanRetentionDays ficusConfig
403-
configArgs endpoint = ["analyze", "--secret", secret, "--endpoint", endpoint, "--locator", locator, "--set", "all:skip-hidden-files", "--set", "all:gitignore", "--exclude", ".git", "--exclude", ".git/**"] ++ configExcludes ++ maybe [] (\days -> ["--snippet-scan-retention-days", toText days]) snippetScanRetentionDays ++ [targetDir]
407+
configArgs endpoint = ["analyze", "--secret", secret, "--endpoint", endpoint, "--locator", locator, "--set", "all:skip-hidden-files", "--set", "all:gitignore", "--exclude", ".git", "--exclude", ".git/**"] ++ configExcludes ++ configStrategies ++ maybe [] (\days -> ["--snippet-scan-retention-days", toText days]) snippetScanRetentionDays ++ [targetDir]
404408
targetDir = toText $ toFilePath $ ficusConfigRootDir ficusConfig
405409
secret = maybe "" (toText . unApiKey) $ ficusConfigSecret ficusConfig
406410
locator = renderLocator $ Locator "custom" (projectName $ ficusConfigRevision ficusConfig) (Just $ projectRevision $ ficusConfigRevision ficusConfig)
407411
configExcludes = concatMap (\path -> ["--exclude", unGlobFilter path]) $ ficusConfigExclude ficusConfig
412+
configStrategies = concatMap (\strategy -> ["--only", strategyToArg strategy]) $ ficusConfigOnlyStrategies ficusConfig
413+
strategyToArg = \case
414+
FicusStrategySnippetScan -> "snippet-scan"
415+
FicusStrategyNoop -> "noop"
416+
FicusStrategyHash -> "hash"
417+
FicusStrategyVendetta -> "vendetta"
408418

409419
maskApiKeyInCommand :: Text -> Text
410420
maskApiKeyInCommand cmdText =

src/App/Fossa/Ficus/Types.hs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ module App.Fossa.Ficus.Types (
77
FicusDebug (..),
88
FicusError (..),
99
FicusAnalysisFlag (..),
10+
FicusStrategy (..),
1011
FicusAllFlag (..),
1112
FicusWalkFlag (..),
1213
FicusNoopFlag (..),
1314
FicusHashFlag (..),
1415
FicusSnippetScanFlag,
1516
FicusSnippetScanResults (..),
1617
FicusScanStats (..),
18+
FicusVendettaFlag,
1719
FicusPerStrategyFlag (..),
1820
FicusAnalysisResults (..),
1921
FicusVendoredDependency (..),
@@ -204,9 +206,17 @@ data FicusConfig = FicusConfig
204206
, ficusConfigRevision :: ProjectRevision -- TODO: get this from `projectRevision AnalyzeConfig`
205207
, ficusConfigFlags :: [FicusPerStrategyFlag]
206208
, ficusConfigSnippetScanRetentionDays :: Maybe Int
209+
, ficusConfigOnlyStrategies :: [FicusStrategy]
207210
}
208211
deriving (Show, Eq, Generic)
209212

213+
data FicusStrategy
214+
= FicusStrategySnippetScan
215+
| FicusStrategyNoop
216+
| FicusStrategyHash
217+
| FicusStrategyVendetta
218+
deriving (Show, Eq, Generic)
219+
210220
-- A flag for ficus paired with a proper strategy or pseudo-strategy.
211221
-- @Walk@ and @All@ are pseudo-strategies which accept similar flags,
212222
-- but expand into a subset of strategies in ficus.
@@ -216,6 +226,7 @@ data FicusPerStrategyFlag
216226
| SnippetScan FicusSnippetScanFlag
217227
| Noop FicusNoopFlag
218228
| Hash FicusHashFlag
229+
| Vendetta FicusVendettaFlag
219230
deriving (Show, Eq, Generic)
220231

221232
data FicusAnalysisFlag
@@ -233,6 +244,11 @@ newtype FicusNoopFlag = FicusNoopFlag FicusAnalysisFlag deriving (Show, Eq)
233244
newtype FicusHashFlag = FicusHashFlag FicusAnalysisFlag deriving (Show, Eq)
234245

235246
data FicusSnippetScanFlag
236-
= CommonFlag FicusAnalysisFlag
237-
| BatchLen Int
247+
= SnippetScanCommonFlag FicusAnalysisFlag
248+
| SnippetScanBatchLen Int
249+
deriving (Show, Eq)
250+
251+
data FicusVendettaFlag
252+
= VendettaCommonFlag FicusAnalysisFlag
253+
| VendettaBatchLen Int
238254
deriving (Show, Eq)

test/Test/Fixtures.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,7 @@ standardAnalyzeConfig =
678678
, ANZ.mode = NonStrict
679679
, ANZ.xSnippetScan = False
680680
, ANZ.debugDir = Nothing
681+
, ANZ.xVendetta = False
681682
}
682683

683684
sampleJarParsedContent :: Text

0 commit comments

Comments
 (0)