| File: Shared\Utilities\RuntimeEnvironmentHelper.cs | Web Access |
| Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Xml.Linq; namespace Microsoft.Tools.ServiceModel.Svcutil { internal class RuntimeEnvironmentHelper { public static bool IsWindows { get { #if NETCORE return System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows); #else var platform = (int)Environment.OSVersion.Platform; return (platform != 4) && (platform != 6) && (platform != 128); #endif } } #if !NETCORE10 private static readonly StringComparison s_ignoreCaseComparison = StringComparison.InvariantCultureIgnoreCase; private static readonly StringComparison s_caseSensitiveComparison = StringComparison.InvariantCulture; #endif public static StringComparison FileStringComparison { get { #if NETCORE10 return IsWindows ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; #else return IsWindows ? s_ignoreCaseComparison : s_caseSensitiveComparison; #endif } } public static async Task TryCopyingConfigFiles(string workingDirectory, string destinationDirectory, ILogger logger, CancellationToken cancellationToken) { if (!File.Exists(Path.Combine(destinationDirectory, "global.json"))) { // copy any global.json in use so the right dotnet SDK is used for the bootstrapping projects. await PathHelper.TryCopyFileIfFoundAsync("global.json", workingDirectory, destinationDirectory, logger, cancellationToken).ConfigureAwait(false); } if (!File.Exists(Path.Combine(destinationDirectory, "nuget.config"))) { // try copy nuget.config to help reduce restore issues. await PathHelper.TryCopyFileIfFoundAsync("nuget.config", workingDirectory, destinationDirectory, logger, cancellationToken).ConfigureAwait(false); } } internal static readonly string NugetConfigFormat = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + Environment.NewLine + "<configuration>" + Environment.NewLine + " <packageSources>" + Environment.NewLine + " <add key = \"svcutilFeed\" value=\"{0}\" />" + Environment.NewLine + " </packageSources>" + Environment.NewLine + "</configuration>" + Environment.NewLine; public static async Task<bool> TryAddSvcutilNuGetFeedAsync(string nugetConfigPath, string packageFeed, ILogger logger, CancellationToken cancellationToken) { bool? added = false; if (File.Exists(nugetConfigPath)) { using (var safeLogger = await SafeLogger.WriteStartOperationAsync(logger, "Adding svcutil NuGet feed to existing nuget.config file ...").ConfigureAwait(false)) { try { using (var stream = File.Open(nugetConfigPath, FileMode.Open, FileAccess.ReadWrite)) { var doc = XDocument.Parse(new StreamReader(stream).ReadToEnd()); var pkgSourcesNode = doc.Element("configuration")?.Element("packageSources"); if (pkgSourcesNode != null) { added = pkgSourcesNode.Elements("add")? .Select(e => e.Attribute("value").Value.TrimEnd(Path.DirectorySeparatorChar)) .Any(v => v != null && packageFeed.Equals(v, RuntimeEnvironmentHelper.FileStringComparison)); if (added != true) { var feedName = "SvcutilNuGetFeed"; var count = 1; while (pkgSourcesNode.Elements("add").Any(e => StringComparer.OrdinalIgnoreCase.Compare(e.Attribute("key").Value, feedName) == 0)) { feedName += count++; } var addElement = new XElement("add"); addElement.Add(new XAttribute("key", feedName), new XAttribute("value", packageFeed)); pkgSourcesNode.Add(addElement); stream.Seek(0, SeekOrigin.Begin); doc.Save(stream); added = true; } else { await safeLogger.WriteMessageAsync("Feed entry already exists.", logToUI: false); } } } } catch (Exception ex) { await safeLogger.WriteErrorAsync(ex.Message, logToUI: false); } await safeLogger.WriteMessageAsync($"Feed entry added/exists: {added == true}", logToUI: false); } } return added == true; } } }