in internal/core/system.go [129:176]
func RunAnalysis(ctx context.Context, c corescan.Context) int {
log.Debug("Running analysis with options")
platform.LogContext(&c)
if !utils.IsInstalled("git") && (c.FullHistory() || c.Commit() != "" || c.DiffStart() != "" || c.DiffEnd() != "") {
log.Fatal("Cannot use git related functionality without a git executable")
}
startHash, err := c.StartHash()
if err != nil {
log.Fatal(err)
}
scenario := c.DetermineRunScenario(startHash != "")
if scenario != corescan.RunScenarioDefault && !git.RevisionExists(c.RepositoryRoot(), startHash, c.LogDir()) {
msg.WarningMessageCI(
"Cannot run analysis for commit %s because it doesn't exist in the repository. Check that you retrieve the full git history before running Qodana.",
startHash,
)
scenario = corescan.RunScenarioDefault
// backoff to regular analysis
c = c.BackoffToDefaultAnalysisBecauseOfMissingCommit()
}
installPlugins(c)
// this way of running needs to do bootstrap twice on different commits and will do it internally
if !corescan.IsScopedScenario(scenario) && !c.Analyser().IsContainer() {
utils.Bootstrap(c.QodanaYamlConfig().Bootstrap, c.ProjectDir())
}
switch scenario {
case corescan.RunScenarioFullHistory:
return runWithFullHistory(ctx, c, startHash)
case corescan.RunScenarioLocalChanges:
return runLocalChanges(ctx, c, startHash)
case corescan.RunScenarioScoped:
analyzer := NewScopedAnalyzer(ctx, c, startHash, c.DiffEnd(), defaultRunner)
return analyzer.RunAnalysis()
case corescan.RunScenarioReversedScoped:
analyzer := NewReverseScopedAnalyzer(ctx, c, startHash, c.DiffEnd(), defaultRunner)
return analyzer.RunAnalysis()
case corescan.RunScenarioDefault:
return runQodana(ctx, c)
default:
log.Fatalf("Unknown run scenario %s", scenario)
panic("Unreachable")
}
}