55using System ;
66using System . Linq ;
77using System . Reflection ;
8+ using System . Text . RegularExpressions ;
89using JetBrains . Annotations ;
10+ using NuGet . Versioning ;
911using Nuke . Common . Git ;
1012using Nuke . Common . Tools . GitHub ;
13+ using Nuke . Common . Utilities ;
1114using Nuke . Common . ValueInjection ;
1215
1316namespace 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