/// <summary> /// Parses a MSBuild solution. /// </summary> /// <param name="solutionPath">The solution path.</param> /// <returns>A parsed solution.</returns> public SolutionParserResult Parse(FilePath solutionPath) { if (solutionPath == null) { throw new ArgumentNullException("solutionPath"); } if (solutionPath.IsRelative) { solutionPath = solutionPath.MakeAbsolute(_environment); } // Get the release notes file. var file = _fileSystem.GetFile(solutionPath); if (!file.Exists) { const string format = "Solution file '{0}' do not exist."; var message = string.Format(CultureInfo.InvariantCulture, format, solutionPath.FullPath); throw new CakeException(message); } string version = null, visualStudioVersion = null, minimumVisualStudioVersion = null; var projects = new List <SolutionProject>(); foreach (var line in file.ReadLines(Encoding.UTF8)) { if (line.StartsWith("Project(\"{")) { var project = ParseSolutionProjectLine(file, line); if (!StringComparer.OrdinalIgnoreCase.Equals(project.Type, SolutionFolder)) { projects.Add(project); } } else if (line.StartsWith("Microsoft Visual Studio Solution File, ")) { version = string.Concat(line.Skip(39)); } else if (line.StartsWith("VisualStudioVersion = ")) { visualStudioVersion = string.Concat(line.Skip(22)); } else if (line.StartsWith("MinimumVisualStudioVersion = ")) { minimumVisualStudioVersion = string.Concat(line.Skip(29)); } } var solutionParserResult = new SolutionParserResult( version, visualStudioVersion, minimumVisualStudioVersion, projects.AsReadOnly()); return(solutionParserResult); }
/// <summary> /// Parses a MSBuild solution. /// </summary> /// <param name="solutionPath">The solution path.</param> /// <returns>A parsed solution.</returns> public SolutionParserResult Parse(FilePath solutionPath) { if (solutionPath == null) { throw new ArgumentNullException(nameof(solutionPath)); } if (solutionPath.IsRelative) { solutionPath = solutionPath.MakeAbsolute(_environment); } // Get the release notes file. var file = _fileSystem.GetFile(solutionPath); if (!file.Exists) { const string format = "Solution file '{0}' does not exist."; var message = string.Format(CultureInfo.InvariantCulture, format, solutionPath.FullPath); throw new CakeException(message); } string version = null, visualStudioVersion = null, minimumVisualStudioVersion = null; var projects = new List <SolutionProject>(); bool inNestedProjectsSection = false; foreach (var line in file.ReadLines(Encoding.UTF8)) { var trimmed = line.Trim(); if (trimmed == string.Empty) { continue; } if (line.StartsWith("Project(\"{")) { var project = ParseSolutionProjectLine(file, line); if (StringComparer.OrdinalIgnoreCase.Equals(project.Type, SolutionFolder.TypeIdentifier)) { projects.Add(new SolutionFolder(project.Id, project.Name, project.Path)); continue; } projects.Add(project); } else if (line.StartsWith("Microsoft Visual Studio Solution File, ")) { version = string.Concat(line.Skip(39)); } else if (line.StartsWith("VisualStudioVersion = ")) { visualStudioVersion = string.Concat(line.Skip(22)); } else if (line.StartsWith("MinimumVisualStudioVersion = ")) { minimumVisualStudioVersion = string.Concat(line.Skip(29)); } else if (trimmed.StartsWith("GlobalSection(NestedProjects)")) { inNestedProjectsSection = true; } else if (inNestedProjectsSection && trimmed.StartsWith("EndGlobalSection")) { inNestedProjectsSection = false; } else if (inNestedProjectsSection) { ParseNestedProjectLine(projects, trimmed); } } var solutionParserResult = new SolutionParserResult( version, visualStudioVersion, minimumVisualStudioVersion, projects.AsReadOnly()); return(solutionParserResult); }