public static string GetParametersText(NukeBuild build) { var defaultTarget = build.ExecutableTargets.SingleOrDefault(x => x.IsDefault); var builder = new StringBuilder(); var parameters = ValueInjectionUtility.GetParameterMembers(build.GetType(), includeUnlisted: false) .OrderBy(x => x.Name).ToList(); var padRightParameter = Math.Max(parameters.Max(x => x.Name.Length), val2: 16); void PrintParameter(MemberInfo parameter) { var description = SplitLines( // TODO: remove ParameterService.GetParameterDescription(parameter) ?.Replace("{default_target}", defaultTarget?.Name).Append(".") ?? "<no description>"); var parameterName = ParameterService.GetParameterDashedName(parameter); builder.AppendLine($" --{parameterName.PadRight(padRightParameter)} {description.First()}"); foreach (var line in description.Skip(count: 1)) { builder.AppendLine($"{new string(c: ' ', count: padRightParameter + 6)}{line}"); } } builder.AppendLine("Parameters:"); var customParameters = parameters.Where(x => x.DeclaringType != typeof(NukeBuild)).ToList(); if (customParameters.Count > 0) { builder.AppendLine(); } foreach (var parameter in customParameters) { PrintParameter(parameter); } builder.AppendLine(); var inheritedParameters = parameters.Where(x => x.DeclaringType == typeof(NukeBuild)); foreach (var parameter in inheritedParameters) { PrintParameter(parameter); } return(builder.ToString()); }
public void OnBuildCreated(NukeBuild build, IReadOnlyCollection <ExecutableTarget> executableTargets) { // TODO: probably remove if (!Directory.Exists(Constants.GetNukeDirectory(NukeBuild.RootDirectory))) { return; } var parameterMembers = ValueInjectionUtility.GetParameterMembers(build.GetType(), includeUnlisted: true); var passwords = new Dictionary <string, string>(); IEnumerable <string> ConvertToArguments(string profile, string name, string[] values) { var member = parameterMembers.SingleOrDefault(x => ParameterService.GetParameterMemberName(x).EqualsOrdinalIgnoreCase(name)); var scalarType = member?.GetMemberType().GetScalarType(); var mustDecrypt = (member?.HasCustomAttribute <SecretAttribute>() ?? false) && !BuildServerConfigurationGeneration.IsActive; var decryptedValues = values.Select(x => mustDecrypt ? DecryptValue(profile, name, x) : x); var convertedValues = decryptedValues.Select(x => ConvertValue(scalarType, x)).ToList(); Log.Verbose("Passing value for {Member} ({Value})", member?.GetDisplayName() ?? "<unresolved>", !mustDecrypt ? convertedValues.JoinComma() : "secret"); return(new[] { $"--{ParameterService.GetParameterDashedName(name)}" }.Concat(convertedValues)); } string DecryptValue(string profile, string name, string value) => EncryptionUtility.Decrypt( value, passwords[profile] = passwords.GetValueOrDefault(profile) ?? EncryptionUtility.GetPassword(profile), name); // TODO: Abstract AbsolutePath/Solution/Project etc. string ConvertValue(Type scalarType, string value) => scalarType == typeof(AbsolutePath) || typeof(Solution).IsAssignableFrom(scalarType) || scalarType == typeof(Project) ? EnvironmentInfo.WorkingDirectory.GetUnixRelativePathTo(NukeBuild.RootDirectory / value) : value; var arguments = GetParameters().SelectMany(x => ConvertToArguments(x.Profile, x.Name, x.Values)).ToArray(); ParameterService.Instance.ArgumentsFromFilesService = new ParameterService(() => arguments, () => throw new NotSupportedException()); }
public void OnBuildCreated(NukeBuild build, IReadOnlyCollection <ExecutableTarget> executableTargets) { // TODO: probably remove if (!Directory.Exists(Constants.GetNukeDirectory(NukeBuild.RootDirectory))) { return; } var parameterMembers = ValueInjectionUtility.GetParameterMembers(build.GetType(), includeUnlisted: true); var passwords = new Dictionary <string, byte[]>(); IEnumerable <string> ConvertToArguments(string profile, string name, string[] values) { var member = parameterMembers.SingleOrDefault(x => x.Name.EqualsOrdinalIgnoreCase(name)); var scalarType = member?.GetMemberType().GetScalarType(); var mustDecrypt = (member?.HasCustomAttribute <SecretAttribute>() ?? false) && !GenerationMode; var decryptedValues = values.Select(x => mustDecrypt ? DecryptValue(profile, name, x) : x); var convertedValues = decryptedValues.Select(x => ConvertValue(scalarType, x)); Logger.Trace($"Passing argument for '{name}'{(member != null ? $" on '{member.DeclaringType.NotNull().Name}'" : string.Empty)}."); return(new[] { $"--{ParameterService.GetParameterDashedName(name)}" }.Concat(convertedValues)); } string DecryptValue(string profile, string name, string value) => EncryptionUtility.Decrypt( value, passwords[profile] = passwords.GetValueOrDefault(profile) ?? Encoding.UTF8.GetBytes(EncryptionUtility.GetPassword(profile)), name); // TODO: Abstract AbsolutePath/Solution/Project etc. string ConvertValue(Type scalarType, string value) => scalarType == typeof(AbsolutePath) || typeof(Solution).IsAssignableFrom(scalarType) || scalarType == typeof(Project) ? EnvironmentInfo.WorkingDirectory.GetUnixRelativePathTo(NukeBuild.RootDirectory / value) : value; var arguments = GetParameters().SelectMany(x => ConvertToArguments(x.Profile, x.Name, x.Values)).ToArray(); ParameterService.Instance.ArgumentsFromFilesService = new ParameterService(() => arguments, () => throw new NotSupportedException()); }
public static string GetParametersText(NukeBuild build) { var defaultTargets = build.ExecutableTargets.Where(x => x.IsDefault).Select(x => x.Name).ToList(); var builder = new StringBuilder(); var parameters = ValueInjectionUtility.GetParameterMembers(build.GetType(), includeUnlisted: false); var padRightParameter = Math.Max(parameters.Max(x => ParameterService.GetParameterDashedName(x).Length), val2: 16); List <string> SplitLines(string text) { var words = new Queue <string>(text.Split(' ').ToList()); var lines = new List <string> { string.Empty }; foreach (var word in words) { var nextLength = padRightParameter + 6 + lines.Last().Length + word.Length; if (nextLength >= Console.BufferWidth || nextLength > 90) { lines.Add(string.Empty); } lines[lines.Count - 1] = $"{lines.Last()} {word}"; } return(lines); } void PrintParameter(MemberInfo parameter) { var description = SplitLines( // TODO: remove ParameterService.GetParameterDescription(parameter) ?.Replace("{default_target}", defaultTargets.Count > 0 ? defaultTargets.JoinCommaSpace() : "<none>") .TrimEnd(".").Append(".") ?? "<no description>"); var parameterName = ParameterService.GetParameterDashedName(parameter); builder.AppendLine($" --{parameterName.PadRight(padRightParameter)} {description.First()}"); foreach (var line in description.Skip(count: 1)) { builder.AppendLine($"{new string(c: ' ', count: padRightParameter + 6)}{line}"); } } builder.AppendLine("Parameters:"); var customParameters = parameters.Where(x => x.DeclaringType != typeof(NukeBuild)).ToList(); if (customParameters.Count > 0) { builder.AppendLine(); } foreach (var parameter in customParameters) { PrintParameter(parameter); } builder.AppendLine(); var inheritedParameters = parameters.Where(x => x.DeclaringType == typeof(NukeBuild)); foreach (var parameter in inheritedParameters) { PrintParameter(parameter); } return(builder.ToString()); }