99"""
1010
1111from pathlib import Path
12- from os .path import relpath
13- from glob import glob
1412from subprocess import check_call , check_output , CalledProcessError
1513from shutil import which
16- import datetime
17-
18-
19- def get_releases (source_path : Path ):
20- """
21- Get all releases defined by release note files
22- """
23- release_notes = source_path / "release_notes"
24- releases = []
25- for idx , file_name in enumerate (sorted (glob (str (release_notes / "*.rst" )), reverse = True )):
26- releases .append (Release (file_name , is_latest = idx == 0 ))
27- return releases
14+ from datetime import datetime
2815
2916
3017def create_release_notes ():
3118 """
3219 Create monolithic release notes file from several input files
3320 """
34- source_path = Path (__file__ ).parent .parent / "docs"
35-
36- check_call (["towncrier" , "build" , "--keep" ], cwd = source_path .parent )
37-
38- releases = get_releases (source_path )
39- latest_release = releases [0 ]
40-
41- with (source_path / "release_notes.inc" ).open ("w" , encoding = "utf-8" ) as fptr :
42- fptr .write (
43- "`Commits since last release "
44- f"<https://github.com/VUnit/vunit/compare/{ latest_release .tag !s} ...master>`__"
21+ root = Path (__file__ ).parent .parent
22+ docsroot = root / "docs"
23+
24+ check_call (["towncrier" , "build" , "--keep" ], cwd = root )
25+
26+ # Get all releases defined by release note files
27+ releases = [
28+ Release (file_name , is_latest = idx == 0 )
29+ for idx , file_name in enumerate (sorted ((docsroot / "release_notes" ).glob ("*.rst" ), reverse = True ))
30+ ]
31+
32+ content = (
33+ "`Commits since last release "
34+ f"<https://github.com/VUnit/vunit/compare/v{ releases [0 ].name !s} ...master>`__"
35+ "\n \n "
36+ )
37+
38+ for idx , release in enumerate (releases ):
39+ title = f":vunit_commit:`{ release .name !s} <v{ release .name !s} >` - { release .date .strftime ('%Y-%m-%d' )} "
40+
41+ if idx == 0 :
42+ title += " (latest)"
43+ content += ".. _release:latest:\n \n "
44+
45+ content += (
46+ f".. _release:{ release .name } :\n \n "
47+ f"{ title } \n { '-' * len (title )} \n \n "
48+ f"`Download from PyPI <https://pypi.python.org/pypi/vunit_hdl/{ release .name !s} />`__"
4549 )
4650
47- fptr .write ("\n \n " )
48-
49- for idx , release in enumerate (releases ):
50- is_last = idx == len (releases ) - 1
51-
52- if release .is_latest :
53- fptr .write (".. _release:latest:\n \n " )
54-
55- fptr .write (f".. _release:{ release .name } :\n \n " )
51+ if idx != len (releases ) - 1 :
52+ content += (
53+ f" | `Commits since previous release "
54+ f"<https://github.com/VUnit/vunit/compare/v{ releases [idx + 1 ].name !s} ...v{ release .name !s} >`__"
55+ )
5656
57- title = f":vunit_commit:`{ release .name !s} <{ release .tag !s} >` - { release .date .strftime ('%Y-%m-%d' )!s} "
58- if release .is_latest :
59- title += " (latest)"
60- fptr .write (title + "\n " )
61- fptr .write ("-" * len (title ) + "\n \n " )
57+ content += f"\n \n .. include:: release_notes/{ release .name } { release .suffix } \n \n \n "
6258
63- fptr .write (f"\n `Download from PyPI <https://pypi.python.org/pypi/vunit_hdl/{ release .name !s} />`__" )
64-
65- if not is_last :
66- fptr .write (
67- f" | `Commits since previous release "
68- f"<https://github.com/VUnit/vunit/compare/{ releases [idx + 1 ].tag !s} ...{ release .tag !s} >`__"
69- )
70-
71- fptr .write (f"\n \n .. include:: { relpath (release .file_name , source_path )!s} \n \n " )
59+ with open (str (docsroot / "release_notes.inc" ), "w" , encoding = "utf-8" ) as fptr :
60+ fptr .write (content )
7261
7362
7463class Release (object ):
@@ -77,33 +66,27 @@ class Release(object):
7766 """
7867
7968 def __init__ (self , file_name , is_latest ):
80- self .file_name = file_name
81- self .name = str (Path (file_name ).with_suffix ("" ).name )
82- self .tag = "v" + self .name
83- self .is_latest = is_latest
69+ self .suffix = file_name .suffix
70+ self .name = file_name .stem
71+ tag = "v" + self .name
8472
85- try :
86- self .date = _get_date (self .tag )
73+ git = which ("git" )
74+ if git is None :
75+ raise BaseException ("'git' is required!" )
8776
77+ try :
78+ self ._get_date (git , tag )
8879 except CalledProcessError :
89- if self .is_latest :
90- # Release tag for latest release not yet created, assume HEAD will become release
91- print (f"Release tag { self .tag !s} not created yet, use HEAD for date" )
92- self .date = _get_date ("HEAD" )
93- else :
80+ if not is_latest :
9481 raise
95-
96- with Path (file_name ).open ("r" , encoding = "utf-8" ) as fptr :
97- self .notes = fptr .read ()
98-
99-
100- def _get_date (commit ):
101- """
102- Get date
103- """
104- git = which ("git" )
105- if git is None :
106- raise BaseException ("'git' is required!" )
107- date_str = check_output ([git , "log" , "-1" , "--format=%ci" , commit ]).decode ().strip ()
108- date_str = " " .join (date_str .split (" " )[0 :2 ])
109- return datetime .datetime .strptime (date_str , "%Y-%m-%d %H:%M:%S" )
82+ print (f"Release tag { tag } not created yet, use HEAD for date" )
83+ self ._get_date (git , "HEAD" )
84+
85+ def _get_date (self , git , ref ):
86+ """
87+ Get date
88+ """
89+ self .date = datetime .strptime (
90+ " " .join (check_output ([git , "log" , "-1" , "--format=%ci" , ref ]).decode ().strip ().split (" " )[0 :2 ]),
91+ "%Y-%m-%d %H:%M:%S" ,
92+ )
0 commit comments