diff --git a/src/Microsoft.DotNet.Compiler.Common/LibraryExporterExtensions.cs b/src/Microsoft.DotNet.Compiler.Common/LibraryExporterExtensions.cs index 7e3440c02..fb863bd49 100644 --- a/src/Microsoft.DotNet.Compiler.Common/LibraryExporterExtensions.cs +++ b/src/Microsoft.DotNet.Compiler.Common/LibraryExporterExtensions.cs @@ -1,6 +1,7 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -9,62 +10,77 @@ using Microsoft.DotNet.ProjectModel.Graph; namespace Microsoft.DotNet.Cli.Compiler.Common { - public static class LibraryExporterExtensions - { - public static IEnumerable GetAllProjectTypeDependencies(this LibraryExporter exporter) - { - return - exporter.GetDependencies(LibraryType.Project) - .Concat(exporter.GetDependencies(LibraryType.MSBuildProject)); - } + public static class LibraryExporterExtensions + { + public static IEnumerable GetAllProjectTypeDependencies(this LibraryExporter exporter) + { + return + exporter.GetDependencies(LibraryType.Project) + .Concat(exporter.GetDependencies(LibraryType.MSBuildProject)); + } - public static void CopyTo(this IEnumerable assets, string destinationPath) - { - if (!Directory.Exists(destinationPath)) - { - Directory.CreateDirectory(destinationPath); - } + public static void CopyTo(this IEnumerable assets, string destinationPath) + { + if (!Directory.Exists(destinationPath)) + { + Directory.CreateDirectory(destinationPath); + } - foreach (var asset in assets) - { - File.Copy(asset.ResolvedPath, Path.Combine(destinationPath, Path.GetFileName(asset.ResolvedPath)), overwrite: true); - } - } + foreach (var asset in assets) + { + var file = Path.Combine(destinationPath, Path.GetFileName(asset.ResolvedPath)); + File.Copy(asset.ResolvedPath, file, overwrite: true); + RemoveFileAttribute(file, FileAttributes.ReadOnly); + } + } - public static void StructuredCopyTo(this IEnumerable assets, string destinationPath, string tempLocation) - { - if (!Directory.Exists(destinationPath)) - { - Directory.CreateDirectory(destinationPath); - } + private static void RemoveFileAttribute(String file, FileAttributes attribute) + { + if (File.Exists(file)) + { + var fileAttributes = File.GetAttributes(file); + if ((fileAttributes & attribute) == attribute) + { + File.SetAttributes(file, fileAttributes & ~attribute); + } + } + } - foreach (var asset in assets) - { - var targetName = ResolveTargetName(destinationPath, asset); - var transformedFile = asset.GetTransformedFile(tempLocation); + public static void StructuredCopyTo(this IEnumerable assets, string destinationPath, string tempLocation) + { + if (!Directory.Exists(destinationPath)) + { + Directory.CreateDirectory(destinationPath); + } - File.Copy(transformedFile, targetName, overwrite: true); - } - } + foreach (var asset in assets) + { + var targetName = ResolveTargetName(destinationPath, asset); + var transformedFile = asset.GetTransformedFile(tempLocation); - private static string ResolveTargetName(string destinationPath, LibraryAsset asset) - { - string targetName; - if (!string.IsNullOrEmpty(asset.RelativePath)) - { - targetName = Path.Combine(destinationPath, asset.RelativePath); - var destinationAssetPath = Path.GetDirectoryName(targetName); + File.Copy(transformedFile, targetName, overwrite: true); + RemoveFileAttribute(targetName, FileAttributes.ReadOnly); + } + } - if (!Directory.Exists(destinationAssetPath)) - { - Directory.CreateDirectory(destinationAssetPath); - } - } - else - { - targetName = Path.Combine(destinationPath, Path.GetFileName(asset.ResolvedPath)); - } - return targetName; - } - } + private static string ResolveTargetName(string destinationPath, LibraryAsset asset) + { + string targetName; + if (!string.IsNullOrEmpty(asset.RelativePath)) + { + targetName = Path.Combine(destinationPath, asset.RelativePath); + var destinationAssetPath = Path.GetDirectoryName(targetName); + + if (!Directory.Exists(destinationAssetPath)) + { + Directory.CreateDirectory(destinationAssetPath); + } + } + else + { + targetName = Path.Combine(destinationPath, Path.GetFileName(asset.ResolvedPath)); + } + return targetName; + } + } }