func RunAnalysis()

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")
	}
}