diff --git a/src/GitReleaseManager.Core/Configuration/CloseConfig.cs b/src/GitReleaseManager.Core/Configuration/CloseConfig.cs index 48495888..dce0696f 100644 --- a/src/GitReleaseManager.Core/Configuration/CloseConfig.cs +++ b/src/GitReleaseManager.Core/Configuration/CloseConfig.cs @@ -22,5 +22,12 @@ public sealed class CloseConfig [Sample(":tada: This issue has been resolved in version {milestone} :tada:\n\nThe release is available on:\n\n- [NuGet package(@{milestone})](https://nuget.org/packages/{repository}/{milestone})\n- [GitHub release](https://github.com/{owner}/{repository}/releases/tag/{milestone})\n\nYour **[GitReleaseManager](https://github.com/GitTools/GitReleaseManager)** bot :package::rocket:")] [YamlMember(Alias = "issue-comment", ScalarStyle = YamlDotNet.Core.ScalarStyle.Literal)] public string IssueCommentFormat { get; set; } + + /// + /// Gets or sets a value indicating whether the due date should be set when closing the milestone. + /// + [Description("Whether to set the due date when closing the milestone.")] + [YamlMember(Alias = "set-due-date")] + public bool SetDueDate { get; set; } } } \ No newline at end of file diff --git a/src/GitReleaseManager.Core/Configuration/Config.cs b/src/GitReleaseManager.Core/Configuration/Config.cs index 15083cc2..149e7fe6 100644 --- a/src/GitReleaseManager.Core/Configuration/Config.cs +++ b/src/GitReleaseManager.Core/Configuration/Config.cs @@ -42,6 +42,7 @@ public Config() { IssueComments = false, IssueCommentFormat = ISSUE_COMMENT_FORMAT, + SetDueDate = false, // by default, do not set the due date to match previous behavior }; DefaultBranch = "master"; diff --git a/src/GitReleaseManager.Core/Model/Milestone.cs b/src/GitReleaseManager.Core/Model/Milestone.cs index 13e1098a..3c325065 100644 --- a/src/GitReleaseManager.Core/Model/Milestone.cs +++ b/src/GitReleaseManager.Core/Model/Milestone.cs @@ -17,5 +17,7 @@ public sealed class Milestone public string Url { get; set; } public Version Version { get; set; } + + public DateTimeOffset? DueOn { get; set; } } } \ No newline at end of file diff --git a/src/GitReleaseManager.Core/Provider/GitHubProvider.cs b/src/GitReleaseManager.Core/Provider/GitHubProvider.cs index 68d19c4a..f792d2e3 100644 --- a/src/GitReleaseManager.Core/Provider/GitHubProvider.cs +++ b/src/GitReleaseManager.Core/Provider/GitHubProvider.cs @@ -227,7 +227,7 @@ public Task SetMilestoneStateAsync(string owner, string repository, Milestone mi { return ExecuteAsync(async () => { - var update = new MilestoneUpdate { State = (Octokit.ItemState)itemState }; + var update = new MilestoneUpdate { State = (Octokit.ItemState)itemState, DueOn = milestone.DueOn }; await _gitHubClient.Issue.Milestone.Update(owner, repository, milestone.PublicNumber, update).ConfigureAwait(false); }); } diff --git a/src/GitReleaseManager.Core/Provider/GitLabProvider.cs b/src/GitReleaseManager.Core/Provider/GitLabProvider.cs index c2371c72..7e5a0a46 100644 --- a/src/GitReleaseManager.Core/Provider/GitLabProvider.cs +++ b/src/GitReleaseManager.Core/Provider/GitLabProvider.cs @@ -267,6 +267,11 @@ public Task SetMilestoneStateAsync(string owner, string repository, Milestone mi } else if (itemState == ItemState.Closed) { + if (milestone.DueOn.HasValue) + { + mileStoneClient.Update(milestone.InternalNumber, new MilestoneUpdate { DueDate = milestone.DueOn.Value.ToString("o", CultureInfo.InvariantCulture) }); + } + mileStoneClient.Close(milestone.InternalNumber); } diff --git a/src/GitReleaseManager.Core/VcsService.cs b/src/GitReleaseManager.Core/VcsService.cs index 601a20b3..e6d88a0f 100644 --- a/src/GitReleaseManager.Core/VcsService.cs +++ b/src/GitReleaseManager.Core/VcsService.cs @@ -254,6 +254,9 @@ public async Task CloseMilestoneAsync(string owner, string repository, string mi _logger.Verbose("Finding open milestone with title '{Title}' on '{Owner}/{Repository}'", milestoneTitle, owner, repository); var milestone = await _vcsProvider.GetMilestoneAsync(owner, repository, milestoneTitle, ItemStateFilter.Open).ConfigureAwait(false); + // Set the due date only if configured to do so + milestone.DueOn = _configuration.Close.SetDueDate ? DateTimeOffset.UtcNow : (DateTimeOffset?)null; + _logger.Verbose("Closing milestone '{Title}' on '{Owner}/{Repository}'", milestoneTitle, owner, repository); await _vcsProvider.SetMilestoneStateAsync(owner, repository, milestone, ItemState.Closed).ConfigureAwait(false);