Skip to content

Commit ba7999b

Browse files
committed
feat(common): use regex pattern for LatestGitHubReleaseAttribute
1 parent a27b2fe commit ba7999b

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

build/Build.ReleaseImage.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
partial class Build
2222
{
23-
[LatestGitHubRelease("JetBrains/JetBrainsMono", TrimPrefix = true)]
23+
[LatestGitHubRelease("JetBrains/JetBrainsMono")]
2424
readonly string JetBrainsMonoVersion;
2525

2626
string[] FontDownloadUrls =>

source/Nuke.Common/Attributes/LatestGitHubReleaseAttribute.cs

+22-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
using System;
66
using System.Linq;
77
using System.Reflection;
8+
using System.Text.RegularExpressions;
89
using JetBrains.Annotations;
10+
using NuGet.Versioning;
911
using Nuke.Common.Git;
1012
using Nuke.Common.Tools.GitHub;
13+
using Nuke.Common.Utilities;
1114
using Nuke.Common.ValueInjection;
1215

1316
namespace Nuke.Common.Tooling;
@@ -23,11 +26,28 @@ public LatestGitHubReleaseAttribute(string identifier)
2326
}
2427

2528
public bool IncludePrerelease { get; set; }
26-
public bool TrimPrefix { get; set; }
29+
public bool UseTagName { get; set; }
30+
31+
[RegexPattern]
32+
public string Pattern { get; set; } = @"v?(?<version>\d+\.\d+(?:\.\d+)?(?:\.\d+)?(?:-\w+)?)";
2733

2834
public override object GetValue(MemberInfo member, object instance)
2935
{
3036
var repository = GitRepository.FromUrl($"https://github.com/{_identifier}");
31-
return repository.GetLatestRelease(IncludePrerelease, TrimPrefix).GetAwaiter().GetResult();
37+
var releases = GitHubTasks.GitHubClient.Repository.Release
38+
.GetAll(repository.GetGitHubOwner(), repository.GetGitHubName()).GetAwaiter().GetResult();
39+
var versions = releases
40+
.Select(x => Regex.Match((!UseTagName ? x.Name : x.TagName).NotNullOrWhiteSpace(), Pattern))
41+
.Select(x => x.Groups["version"].Value)
42+
.Select(NuGetVersion.Parse)
43+
.OrderByDescending(x => x);
44+
45+
if (member.GetMemberType() == typeof(NuGetVersion[]))
46+
return versions.ToArray();
47+
48+
var latestVersion = versions.FirstOrDefault(x => !x.IsPrerelease || IncludePrerelease);
49+
return member.GetMemberType() == typeof(NuGetVersion)
50+
? latestVersion
51+
: latestVersion?.ToString();
3252
}
3353
}

0 commit comments

Comments
 (0)