| 
									
										
										
										
											2020-03-19 12:36:30 +01:00
										 |  |  | #!/usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											2019-07-18 13:29:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # extractFeaturesFromReleaseNotes.py | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Read the release notes - docs/release-notes.md - and generate text | 
					
						
							|  |  |  | # for pasting in to individual documentation pages, to indicate which | 
					
						
							|  |  |  | # versions recent features were released in. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Using the output of the file is easier than manually constructing | 
					
						
							|  |  |  | # the text to paste in to documentation pages. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # One way to use this: | 
					
						
							|  |  |  | # - run this script, saving the output to some temporary file | 
					
						
							|  |  |  | # - diff this output with the actual release notes page | 
					
						
							|  |  |  | # - the differences are Markdown text that can be pasted in to the | 
					
						
							|  |  |  | #   appropriate documentation pages in the docs/ directory. | 
					
						
							|  |  |  | # - each release also has a github link to show which documentation files | 
					
						
							|  |  |  | #   were changed in it. | 
					
						
							|  |  |  | #   This can be helpful to see which documentation pages | 
					
						
							|  |  |  | #   to add the 'Introduced in Catch ...' snippets to the relevant pages. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from __future__ import print_function | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import re | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def create_introduced_in_text(version, bug_number = None): | 
					
						
							|  |  |  |     """Generate text to paste in to documentation file""" | 
					
						
							|  |  |  |     if bug_number: | 
					
						
							|  |  |  |         return '> [Introduced](https://github.com/catchorg/Catch2/issues/%s) in Catch %s.' % (bug_number, version) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         # Use this text for changes that don't have issue numbers | 
					
						
							|  |  |  |         return '> Introduced in Catch %s.' % version | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def link_to_changes_in_release(release, releases): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Markdown text for a hyperlink showing all edits in a release, or empty string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     :param release: A release version, as a string  | 
					
						
							|  |  |  |     :param releases: A container of releases, in descending order - newest to oldest | 
					
						
							|  |  |  |     :return: Markdown text for a hyperlink showing the differences between the give release and the prior one, | 
					
						
							|  |  |  |              or empty string, if the previous release is not known | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if release == releases[-1]: | 
					
						
							|  |  |  |         # This is the earliest release we know about | 
					
						
							|  |  |  |         return '' | 
					
						
							|  |  |  |     index = releases.index(release) | 
					
						
							|  |  |  |     previous_release = releases[index + 1] | 
					
						
							|  |  |  |     return '\n[Changes in %s](https://github.com/catchorg/Catch2/compare/v%s...v%s)' % (release, previous_release, release) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def write_recent_release_notes_with_introduced_text(): | 
					
						
							|  |  |  |     current_version = None | 
					
						
							|  |  |  |     release_toc_regex = r'\[(\d.\d.\d)\]\(#\d+\)<br>' | 
					
						
							|  |  |  |     issue_number_regex = r'#[0-9]+' | 
					
						
							|  |  |  |     releases = [] | 
					
						
							|  |  |  |     with open('../docs/release-notes.md') as release_notes: | 
					
						
							|  |  |  |         for line in release_notes: | 
					
						
							|  |  |  |             line = line[:-1] | 
					
						
							|  |  |  |             print(line) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # Extract version number from table of contents | 
					
						
							|  |  |  |             match = re.search(release_toc_regex, line) | 
					
						
							|  |  |  |             if match: | 
					
						
							|  |  |  |                 release_name = match.group(1) | 
					
						
							|  |  |  |                 releases.append(release_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if line.startswith('## '): | 
					
						
							|  |  |  |                 # It's a section with version number | 
					
						
							|  |  |  |                 current_version = line.replace('## ', '') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # We decided not to add released-date info for older versions | 
					
						
							|  |  |  |                 if current_version == 'Older versions': | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 print(create_introduced_in_text(current_version)) | 
					
						
							|  |  |  |                 print(link_to_changes_in_release(current_version, releases)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # Not yet found a version number, so to avoid picking up hyperlinks to | 
					
						
							|  |  |  |             # version numbers in the index, keep going | 
					
						
							|  |  |  |             if not current_version: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for bug_link in re.findall(issue_number_regex, line): | 
					
						
							|  |  |  |                 bug_number = bug_link.replace('#', '') | 
					
						
							|  |  |  |                 print(create_introduced_in_text(current_version, bug_number)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     write_recent_release_notes_with_introduced_text() |