144 lines
		
	
	
	
		
			4.3 KiB
			
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			144 lines
		
	
	
	
		
			4.3 KiB
			
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								// 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 Microsoft.Build.Framework;
							 | 
						||
| 
								 | 
							
								using Microsoft.Build.Utilities;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Microsoft.DotNet.Build.Tasks
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public sealed class TarGzFileCreateFromDirectory : ToolTask
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// The path to the directory to be archived.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        [Required]
							 | 
						||
| 
								 | 
							
								        public string SourceDirectory { get; set; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// The path of the archive to be created.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        [Required]
							 | 
						||
| 
								 | 
							
								        public string DestinationArchive { get; set; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// Indicates if the destination archive should be overwritten if it already exists.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        public bool OverwriteDestination { get; set; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// If zipping an entire folder without exclusion patterns, whether to include the folder in the archive.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        public bool IncludeBaseDirectory { get; set; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /// <summary>
							 | 
						||
| 
								 | 
							
								        /// An item group of regular expressions for content to exclude from the archive.
							 | 
						||
| 
								 | 
							
								        /// </summary>
							 | 
						||
| 
								 | 
							
								        public ITaskItem[] ExcludePatterns { get; set; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected override bool ValidateParameters()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            base.ValidateParameters();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            var retVal = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (File.Exists(DestinationArchive))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if (OverwriteDestination == true)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    Log.LogMessage(MessageImportance.Low, $"{DestinationArchive} will be overwritten");
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    Log.LogError($"'{DestinationArchive}' already exists. Did you forget to set '{nameof(OverwriteDestination)}' to true?");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    retVal = false;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            SourceDirectory = Path.GetFullPath(SourceDirectory);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            SourceDirectory = SourceDirectory.EndsWith(Path.DirectorySeparatorChar.ToString())
							 | 
						||
| 
								 | 
							
								                ? SourceDirectory
							 | 
						||
| 
								 | 
							
								                : SourceDirectory + Path.DirectorySeparatorChar;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (!Directory.Exists(SourceDirectory))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Log.LogError($"SourceDirectory '{SourceDirectory} does not exist.");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                retVal = false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return retVal;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public override bool Execute()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return base.Execute();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected override string ToolName
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            get { return "tar"; }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected override MessageImportance StandardOutputLoggingImportance
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            get { return MessageImportance.High; } // or else the output doesn't get logged by default
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected override string GenerateFullPathToTool()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return "tar";
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        protected override string GenerateCommandLineCommands()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return $"{GetDestinationArchive()} {GetSourceSpecification()}";
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private string GetSourceSpecification()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (IncludeBaseDirectory)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                var parentDirectory = Directory.GetParent(SourceDirectory).Parent.FullName;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                var sourceDirectoryName = Path.GetFileName(Path.GetDirectoryName(SourceDirectory));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                return $"--directory {parentDirectory} {sourceDirectoryName}  {GetExcludes()}";
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return $"--directory {SourceDirectory}  {GetExcludes()} \".\"";
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private string GetDestinationArchive()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return $"-czf {DestinationArchive}";
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private string GetExcludes()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            var excludes = String.Empty;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (ExcludePatterns != null)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                foreach (var excludeTaskItem in ExcludePatterns)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    excludes += $" --exclude {excludeTaskItem.ItemSpec}";
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            return excludes;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        protected override void LogToolCommand(string message)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            base.LogToolCommand($"{base.GetWorkingDirectory()}> {message}");
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |