public static bool TryParse(ICodebaseService codebaseService, CsProjectFileInfo projFileInfo, out CsProjectFile csProject) { try { csProject = CsProjectFile.Parse(codebaseService, projFileInfo); return(true); } catch { csProject = null; return(false); } }
/// <summary> /// Получает последовательность всех солюшенов из репозитория (на указанной ветке) /// </summary> public static IEnumerable <Result <CsSolution> > GetAllSolutions( ICodebaseService codebaseService , BranchInfo branch , ProgressObserver progressObserver = null) { if (codebaseService == null) { throw new ArgumentNullException(nameof(codebaseService)); } bool isSolutionFileInfo(SourceItemInfo item) => item.Type == SourceItemTypes.File && item.Extension?.ToLower() == "sln"; return(codebaseService.FindAllItems( branch , null , isSolutionFileInfo , items => items.Any(isSolutionFileInfo) , true , progressObserver) .Select(solutionFileInfo => { try { var solutionFileContent = codebaseService.GetSourceFileContent(solutionFileInfo); var solutionFile = CsSolutionFile.Parse(solutionFileContent, solutionFileInfo); var projectFiles = solutionFile.CsProjectFileInfos .Select(projectFileInfo => CsProjectFile.Parse(codebaseService, projectFileInfo)); return new Result <CsSolution> { IsSuccessful = true, Data = new CsSolution(solutionFile, projectFiles) }; } catch (Exception e) { return new Result <CsSolution> { IsSuccessful = false, Tag = solutionFileInfo, ErrorMessage = e.Message }; } })); }
public static CsProjectFile Parse(ICodebaseService codebaseService, CsProjectFileInfo projFileInfo) { var projFileContent = codebaseService.GetSourceFileContent(projFileInfo); var result = new CsProjectFile { ProjectFileInfo = projFileInfo, //IsNewFormat = CsParsingHelper.IsProjectOfNewFormat(projFileContent) }; CsParsingHelper.ParseFieldsFromCsProjectXml(result, projFileContent); if (!result.IsNewFormat) { if (codebaseService.TryGetSourceFileContentIfExists(projFileInfo.Branch , $"{projFileInfo.FolderPath}/packages.config", out var packagesConfigContent)) { result.PackageReferences = CsParsingHelper.ParsePackageReferencesFromConfig(packagesConfigContent); } } return(result); }
public static void ParseFieldsFromCsProjectXml(CsProjectFile targetProject, string xmlString, Action <Exception> onError = null) { if (targetProject == null) { throw new ArgumentNullException(nameof(targetProject)); } var projXml = CsParsingHelper.ToXElement(xmlString, onError); // новый/старый формат var isNewFormat = projXml.Attribute("ToolsVersion") == null; targetProject.IsNewFormat = isNewFormat; if (isNewFormat) { var propertyGroup = projXml.Elements("PropertyGroup") .SelectMany(e => e.Elements()); targetProject.Version = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Version")?.Value; targetProject.TargetFramework = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "TargetFramework")?.Value; targetProject.GeneratePackageOnBuild = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "GeneratePackageOnBuild")?.Value.Trim().ToLower() == "true"; targetProject.Authors = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Authors")?.Value; targetProject.Description = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Description")?.Value; targetProject.Company = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Company")?.Value; targetProject.Product = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Product")?.Value; targetProject.AssemblyName = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "AssemblyName")?.Value; targetProject.RootNamespace = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "RootNamespace")?.Value; targetProject.PackageReferences = projXml.Elements("ItemGroup") .SelectMany(e => e.Elements() .Where(rf => rf.Name.LocalName == "PackageReference")) .Select(pr => new CsProjectFile.PackageReference { Name = pr.Attribute("Include").Value, Version = pr.Attribute("Version")?.Value // может отсутствовать }); targetProject.DotNetCliToolReferences = projXml.Elements("ItemGroup") .SelectMany(e => e.Elements() .Where(rf => rf.Name.LocalName == "DotNetCliToolReference")) .Select(e => new CsProjectFile.DotNetCliToolReference { Name = e.Attribute("Include").Value, Version = e.Attribute("Version").Value }); targetProject.ProjectReferences = projXml.Elements("ItemGroup") .SelectMany(e => e.Elements() .Where(rf => rf.Name.LocalName == "ProjectReference")) .Select(e => new CsProjectFile.ProjectReference { RelativePath = e.Attribute("Include").Value }); } else { // если формат файла проекта старый var propertyGroup = projXml.Elements("PropertyGroup") .SelectMany(e => e.Elements()); targetProject.Version = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Version")?.Value; targetProject.TargetFramework = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "TargetFrameworkVersion")?.Value; targetProject.GeneratePackageOnBuild = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "GeneratePackageOnBuild")?.Value.Trim().ToLower() == "true"; targetProject.Authors = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Authors")?.Value; targetProject.Description = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Description")?.Value; targetProject.Company = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Company")?.Value; targetProject.Product = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "Product")?.Value; targetProject.AssemblyName = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "AssemblyName")?.Value; targetProject.RootNamespace = propertyGroup.FirstOrDefault(e => e.Name.LocalName == "RootNamespace")?.Value; targetProject.ProjectReferences = projXml.Elements("ItemGroup") .SelectMany(e => e.Elements() .Where(rf => rf.Name.LocalName == "ProjectReference")) .Select(e => new CsProjectFile.ProjectReference { RelativePath = e.Attribute("Include").Value }); } }