5
5
using System ;
6
6
using System . Linq ;
7
7
using System . Reflection ;
8
+ using System . Text . RegularExpressions ;
8
9
using JetBrains . Annotations ;
10
+ using NuGet . Versioning ;
9
11
using Nuke . Common . Git ;
10
12
using Nuke . Common . Tools . GitHub ;
13
+ using Nuke . Common . Utilities ;
11
14
using Nuke . Common . ValueInjection ;
12
15
13
16
namespace Nuke . Common . Tooling ;
@@ -23,11 +26,28 @@ public LatestGitHubReleaseAttribute(string identifier)
23
26
}
24
27
25
28
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+)?)" ;
27
33
28
34
public override object GetValue ( MemberInfo member , object instance )
29
35
{
30
36
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 ( ) ;
32
52
}
33
53
}
0 commit comments