6
6
if TYPE_CHECKING :
7
7
from argparse import Namespace
8
8
9
- def generate_release_notes ( ) -> str :
9
+ def generate_release_note ( previous_release_tag : str ) -> str :
10
10
script_path = Path (__file__ ).parent / "generate_release_notes.py"
11
- cp = subprocess .run (["python" , str (script_path )], capture_output = True )
11
+ cp = subprocess .run (["python" , str (script_path ), previous_release_tag ], capture_output = True )
12
12
13
13
if cp .returncode != 0 :
14
14
raise Exception (f"Error generating release notes: { cp .stderr .decode ('utf-8' )} " )
@@ -20,6 +20,7 @@ def main(args: Namespace) -> int:
20
20
import semantic_version # type: ignore
21
21
import re
22
22
import sys
23
+ from functools import cmp_to_key
23
24
24
25
repo = Github (auth = Auth .Token (args .github_token )).get_repo (args .repo )
25
26
@@ -48,16 +49,26 @@ def main(args: Namespace) -> int:
48
49
print (f"Error: invalid version { release_version } use by release branch. Reason { e } " , file = sys .stderr )
49
50
return 1
50
51
51
- releases = [release for release in repo .get_releases () if release .title == f"v{ release_version } " ]
52
- if len (releases ) != 1 :
53
- print (f"Error: expected exactly one release with title { args .version } , but found { len (releases )} " , file = sys .stderr )
52
+ releases = repo .get_releases ()
53
+ candidate_releases = [release for release in releases if release .tag_name == f"v{ release_version } " ]
54
+ if len (candidate_releases ) != 1 :
55
+ print (f"Error: expected exactly one release with tag v{ release_version } , but found { len (candidate_releases )} " , file = sys .stderr )
54
56
return 1
55
- release = releases [0 ]
57
+ release = candidate_releases [0 ]
56
58
57
- release_notes = generate_release_notes ()
59
+ # All the releases that are not draft and have a valid semantic version tag, our current release is assumed to be in draft (i.e. not yet released)
60
+ previous_releases = [release for release in releases if semantic_version .validate (release .tag_name [1 :]) and not release .draft ] # type: ignore
61
+ if len (previous_releases ) == 0 :
62
+ print (f"Error: no previous releases found" , file = sys .stderr )
63
+ return 1
64
+ # Sort them based on their semantic version tags.
65
+ previous_releases .sort (key = cmp_to_key (lambda a ,b : semantic_version .compare (a .tag_name [1 :], b .tag_name [1 :])), reverse = True ) # type: ignore
66
+ previous_release = previous_releases [0 ].tag_name
67
+ print (f"Using previous release: { previous_release } " )
58
68
59
- release . update_release ( name = release . title , message = release_notes , draft = release . draft , prerelease = release . prerelease , tag_name = release . tag_name )
69
+ release_notes = generate_release_note ( previous_release )
60
70
71
+ release .update_release (name = release .title , message = release_notes , draft = release .draft , prerelease = release .prerelease , tag_name = release .tag_name )
61
72
return 0
62
73
63
74
if __name__ == '__main__' :
0 commit comments