tools/pipeline-generator/Azure.Sdk.Tools.PipelineGenerator/SdkComponentScanner.cs (58 lines of code) (raw):

using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace PipelineGenerator { public class SdkComponentScanner { public SdkComponentScanner(ILogger<SdkComponentScanner> logger) { Logger = logger; } private ILogger<SdkComponentScanner> Logger { get; } public IEnumerable<SdkComponent> Scan(DirectoryInfo path, string searchPattern) { string variantPattern = searchPattern.Replace(".yml", "\\.(?<variant>(\\w+))\\.yml"); Regex variantExtractionExpression = new Regex($"^{variantPattern}$"); Logger.LogDebug($"Scanning directory '{path.FullName}' for components with search pattern '{searchPattern}' variant pattern '{variantPattern}'"); if (!path.Exists) { throw new ArgumentException(nameof(path), "Path does not exist."); } var pipelineYamlFiles = path.EnumerateFiles(searchPattern, SearchOption.AllDirectories); pipelineYamlFiles = pipelineYamlFiles.Concat(path.EnumerateFiles(searchPattern.Replace(".yml", ".*.yml"), SearchOption.AllDirectories)); if (pipelineYamlFiles.Count() == 0) { Logger.LogWarning("Did not find any YAML files with search pattern '{0}' in path '{1}'.", searchPattern, path.FullName); } Logger.LogDebug("Finding repository root from '{0}'.", path.FullName); var repositoryHelper = new RepositoryHelper(); var root = repositoryHelper.GetRepositoryRoot(path); Logger.LogDebug("Found repository root at: {0}", root); foreach (var pipelineYamlFile in pipelineYamlFiles) { var relativePath = Path.GetRelativePath(root, pipelineYamlFile.FullName); Logger.LogDebug("Repository root relative path for '{0}' is: {1}", pipelineYamlFile, relativePath); var component = new SdkComponent() { Name = pipelineYamlFile.Directory.Name, Path = pipelineYamlFile.Directory, RelativeYamlPath = relativePath }; // Append variant information. if (variantExtractionExpression.IsMatch(pipelineYamlFile.Name)) { var match = variantExtractionExpression.Match(pipelineYamlFile.Name); var variant = match.Groups["variant"].Value; component.Variant = variant; Logger.LogDebug($"variant = {variant}"); } yield return component; } } } }