using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Xml.Linq; using Microsoft.Build.Execution; namespace Keysight.OpenTap.Sdk.MSBuild { internal static class ExtensionClass { internal static string ElemOrAttributeValue(this XElement ele, string name, string defaultValue) { return ele.Attribute(name)?.Value ?? ele.Element(name)?.Value ?? defaultValue; } internal static XElement[] GetPackageElements(this XElement ele, string packageName) { var tagNames = new[] { "OpenTapPackageReference", "AdditionalOpenTapPackage" }; var itemGroups = ele.Elements().Where(e => e.Name.LocalName == "ItemGroup"); var packageInstallElements = new List(); foreach (var itemGroup in itemGroups) { var packageElems = itemGroup.Elements().Where(e => tagNames.Contains(e.Name.LocalName)); packageElems = packageElems.Where(e => e?.Attribute("Include")?.Value == packageName); packageInstallElements.AddRange(packageElems); } return packageInstallElements.ToArray(); } } internal class BuildVariableExpander { private readonly ProjectInstance _projectInstance; private const string Pattern = @"\$\(.*?\)"; internal BuildVariableExpander(string sourceFile) { _projectInstance = new ProjectInstance(sourceFile); } internal string ExpandBuildVariables(string input) { var matches = Regex.Matches(input, Pattern); foreach (Match match in matches) { // $(VarName) -> VarName var matchName = match.Value.Substring(2, match.Value.Length - 3); // Expand to csproj variable if available, otherwise expand to environment variable var varValue = _projectInstance.GetProperty(matchName)?.EvaluatedValue ?? Environment.GetEnvironmentVariable(matchName) ?? ""; input = input.Replace(match.Value, varValue); } return input; } } }