1
1
"""
2
- Release the next version of VWS Python .
2
+ Release the next version.
3
3
"""
4
4
5
5
import datetime
6
6
import os
7
7
import subprocess
8
8
from pathlib import Path
9
9
10
- from dulwich .porcelain import add , commit , push , tag_list
11
- from dulwich .repo import Repo
12
- from github import Github , Repository , UnknownObjectException
10
+ from github import Github , Repository
13
11
14
12
15
- def get_version () -> str :
13
+ def get_version (github_repository : Repository ) -> str :
16
14
"""
17
- Return the next version of VWS Python .
15
+ Return the next version.
18
16
This is today’s date in the format ``YYYY.MM.DD.MICRO``.
19
17
``MICRO`` refers to the number of releases created on this date,
20
18
starting from ``0``.
21
19
"""
22
20
utc_now = datetime .datetime .utcnow ()
23
21
date_format = '%Y.%m.%d'
24
22
date_str = utc_now .strftime (date_format )
25
- local_repository = Repo ('.' )
26
- tag_labels = tag_list (repo = local_repository )
27
- tag_labels = [item .decode () for item in tag_labels ]
23
+ tag_labels = [tag .name for tag in github_repository .get_tags ()]
28
24
today_tag_labels = [
29
25
item for item in tag_labels if item .startswith (date_str )
30
26
]
31
27
micro = int (len (today_tag_labels ))
32
- return '{date}.{micro}' .format (date = date_str , micro = micro )
28
+ new_version = f'{ date_str } .{ micro } '
29
+ return new_version
33
30
34
31
35
- def update_changelog (version : str ) -> None :
32
+ def update_changelog (version : str , github_repository : Repository ) -> None :
36
33
"""
37
34
Add a version title to the changelog.
38
35
"""
39
- changelog = Path ('CHANGELOG.rst' )
40
- changelog_contents = changelog .read_text ()
36
+ changelog_path = Path ('CHANGELOG.rst' )
37
+ branch = 'master'
38
+ changelog_content_file = github_repository .get_contents (
39
+ path = str (changelog_path ),
40
+ ref = branch ,
41
+ )
42
+ changelog_bytes = changelog_content_file .decoded_content
43
+ changelog_contents = changelog_bytes .decode ('utf-8' )
41
44
new_changelog_contents = changelog_contents .replace (
42
45
'Next\n ----' ,
43
- 'Next\n ----\n \n {version}\n ------------' . format ( version = version ) ,
46
+ f 'Next\n ----\n \n { version } \n ------------' ,
44
47
)
45
- changelog .write_text (new_changelog_contents )
46
-
47
-
48
- def create_github_release (
49
- repository : Repository ,
50
- version : str ,
51
- ) -> None :
52
- """
53
- Create a tag and release on GitHub.
54
- """
55
- changelog_url = (
56
- 'https://vws-python.readthedocs.io/en/latest/changelog.html'
57
- )
58
- repository .create_git_tag_and_release (
59
- tag = version ,
60
- tag_message = 'Release ' + version ,
61
- release_name = 'Release ' + version ,
62
- release_message = 'See ' + changelog_url ,
63
- type = 'commit' ,
64
- object = repository .get_commits ()[0 ].sha ,
48
+ github_repository .update_file (
49
+ path = str (changelog_path ),
50
+ message = f'Update for release { version } ' ,
51
+ content = new_changelog_contents ,
52
+ sha = changelog_content_file .sha ,
65
53
)
66
54
67
55
68
- def commit_and_push (version : str , repository : Repository ) -> None :
69
- """
70
- Commit and push all changes.
71
- """
72
- local_repository = Repo ('.' )
73
- paths = ['CHANGELOG.rst' ]
74
- _ , ignored = add (paths = paths )
75
- assert not ignored
76
- message = b'Update for release ' + version .encode ('utf-8' )
77
- commit (message = message )
78
- branch_name = 'master'
79
- push (
80
- repo = local_repository ,
81
- remote_location = repository .ssh_url ,
82
- refspecs = branch_name .encode ('utf-8' ),
83
- )
84
-
85
-
86
- def get_repo (github_token : str , github_owner : str ) -> Repository :
87
- """
88
- Get a GitHub repository.
89
- """
90
- github_client = Github (github_token )
91
- try :
92
- github_user_or_org = github_client .get_organization (github_owner )
93
- except UnknownObjectException :
94
- github_user_or_org = github_client .get_user (github_owner )
95
-
96
- return github_user_or_org .get_repo ('vws-python' )
97
-
98
-
99
- def build () -> None :
56
+ def build_and_upload_to_pypi () -> None :
100
57
"""
101
58
Build source and binary distributions.
102
59
"""
103
60
for args in (
104
- ['git' , 'fetch' ],
61
+ ['git' , 'fetch' , '--tags' ],
105
62
['rm' , '-rf' , 'build' ],
106
63
['python' , 'setup.py' , 'sdist' , 'bdist_wheel' ],
107
64
['twine' , 'upload' , '-r' , 'pypi' , 'dist/*' ],
@@ -115,15 +72,22 @@ def main() -> None:
115
72
"""
116
73
github_token = os .environ ['GITHUB_TOKEN' ]
117
74
github_owner = os .environ ['GITHUB_OWNER' ]
118
- repository = get_repo (github_token = github_token , github_owner = github_owner )
119
- version_str = get_version ()
120
- update_changelog (version = version_str )
121
- commit_and_push (version = version_str , repository = repository )
122
- create_github_release (
123
- repository = repository ,
124
- version = version_str ,
75
+ github_repository_name = os .environ ['GITHUB_REPOSITORY_NAME' ]
76
+ github_client = Github (github_token )
77
+ github_repository = github_client .get_repo (
78
+ full_name_or_id = f'{ github_owner } /{ github_repository_name } ' ,
79
+ )
80
+ version_str = get_version (github_repository = github_repository )
81
+ update_changelog (version = version_str , github_repository = github_repository )
82
+ github_repository .create_git_tag_and_release (
83
+ tag = version_str ,
84
+ tag_message = 'Release ' + version_str ,
85
+ release_name = 'Release ' + version_str ,
86
+ release_message = 'See CHANGELOG.rst' ,
87
+ type = 'commit' ,
88
+ object = github_repository .get_commits ()[0 ].sha ,
125
89
)
126
- build ()
90
+ build_and_upload_to_pypi ()
127
91
128
92
129
93
if __name__ == '__main__' :
0 commit comments