File: src\CreateChangelogFile.cs
Web Access
Project: Microsoft.DotNet.Build.Tasks.Installers.csproj (Microsoft.DotNet.Build.Tasks.Installers)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.IO;
using System.IO.Compression;
using System.Text;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace Microsoft.DotNet.Build.Tasks.Installers;

/// <summary>
/// Write a changelog file in the debian format and compressed using gzip.
/// </summary>
/// <remarks>
/// The format is specified at https://manpages.debian.org/bookworm/dpkg-dev/deb-changelog.5.en.html
/// </remarks>
[MSBuildMultiThreadableTask]
public sealed class CreateChangelogFile : Task, IMultiThreadableTask
{
    /// <summary>Injected by MSBuild so paths resolve against the project directory in multithreaded builds.</summary>
    public TaskEnvironment TaskEnvironment { get; set; } = TaskEnvironment.Fallback;

    [Required]
    public string ChangelogOutputPath { get; set; }

    [Required]
    public string MaintainerEmail { get; set; }

    [Required]
    public string MaintainerName { get; set; }

    [Required]
    public string PackageName { get; set; }

    [Required]
    public string PackageVersion { get; set; }

    [Required]
    public string ReleaseNotes { get; set; }

    public override bool Execute()
    {
        using GZipStream stream = new(File.Create(TaskEnvironment.GetAbsolutePath(ChangelogOutputPath)), CompressionLevel.Optimal);
        using StreamWriter writer = new(stream, Encoding.ASCII);
        writer.WriteLine($"{PackageName} ({PackageVersion}) unstable; urgency=low");
        writer.WriteLine();
        writer.WriteLine($"  * {ReleaseNotes}");
        writer.WriteLine();
        writer.WriteLine($" -- {MaintainerName} <{MaintainerEmail}>  {DateTime.Now:ddd, dd MMM yyyy HH:mm:ss zzz}");

        return true;
    }
}