66if TYPE_CHECKING :
77 from argparse import Namespace
88
9- def generate_release_notes ( ) -> str :
9+ def generate_release_note ( previous_release_tag : str ) -> str :
1010 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 )
1212
1313 if cp .returncode != 0 :
1414 raise Exception (f"Error generating release notes: { cp .stderr .decode ('utf-8' )} " )
@@ -20,6 +20,7 @@ def main(args: Namespace) -> int:
2020 import semantic_version # type: ignore
2121 import re
2222 import sys
23+ from functools import cmp_to_key
2324
2425 repo = Github (auth = Auth .Token (args .github_token )).get_repo (args .repo )
2526
@@ -48,16 +49,26 @@ def main(args: Namespace) -> int:
4849 print (f"Error: invalid version { release_version } use by release branch. Reason { e } " , file = sys .stderr )
4950 return 1
5051
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 )
5456 return 1
55- release = releases [0 ]
57+ release = candidate_releases [0 ]
5658
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 } " )
5868
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 )
6070
71+ release .update_release (name = release .title , message = release_notes , draft = release .draft , prerelease = release .prerelease , tag_name = release .tag_name )
6172 return 0
6273
6374if __name__ == '__main__' :
0 commit comments