Files
CodeAnalizer/CodeBase/Orchestrators/ScipOrchestrator.cs

86 lines
3.6 KiB
C#

using System.Diagnostics;
namespace CodeBase.Orchestrators
{
public class ScipOrchestrator
{
private readonly Dictionary<string, string> _indexerCommands;
// Внедряем IConfiguration через конструктор
public ScipOrchestrator(IConfiguration configuration)
{
// Считываем секцию из appsettings.json в словарь при старте приложения
_indexerCommands = configuration.GetSection("ScipIndexers").Get<Dictionary<string, string>>()
?? new Dictionary<string, string>();
}
public async Task<bool> GenerateScipAsync(string localRepoPath, string language)
{
var absolutePath = Path.GetFullPath(localRepoPath);
var scipFilePath = Path.Combine(absolutePath, "index.scip");
if (File.Exists(scipFilePath))
{
Console.WriteLine($"[SCIP] Файл графа уже существует: {scipFilePath}");
return true;
}
var langKey = language.Trim().ToLowerInvariant();
// 1. Ищем команду по ключу из файла
if (!_indexerCommands.TryGetValue(langKey, out var commandTemplate))
{
Console.WriteLine($"[SCIP ERROR] Язык '{langKey}' не найден в конфигурации appsettings.json.");
return false;
}
// Обманываем scip-python, подкидывая ему маркер корня проекта, чтобы он не требовал Git
if (langKey == "python")
{
var dummyFilePath = Path.Combine(absolutePath, "pyproject.toml");
var setupFilePath = Path.Combine(absolutePath, "setup.py");
// Если ни одного из файлов конфигурации нет, создаем пустышку
if (!File.Exists(dummyFilePath) && !File.Exists(setupFilePath))
{
File.WriteAllText(dummyFilePath, ""); // Создаем физический файл нулевого размера
Console.WriteLine("[SCIP] Создан пустой файл pyproject.toml для обхода ограничений парсера.");
}
}
// 2. Подставляем путь к репозиторию в шаблон команды (заменяем {0})
string dockerArguments = string.Format(commandTemplate, absolutePath);
Console.WriteLine($"[SCIP] Запускаем индексацию для проекта: {absolutePath} (Язык: {langKey})");
var processStartInfo = new ProcessStartInfo
{
FileName = "docker",
Arguments = dockerArguments,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
using var process = new Process { StartInfo = processStartInfo };
process.Start();
var outputTask = process.StandardOutput.ReadToEndAsync();
var errorTask = process.StandardError.ReadToEndAsync();
await process.WaitForExitAsync();
if (process.ExitCode != 0)
{
var error = await errorTask;
Console.WriteLine($"[SCIP ERROR] Ошибка генерации графа:\n{error}");
return false;
}
return true;
}
}
}