11from os import environ as env
22import keepachangelog
3- from github import Github
3+ from github import Auth , Github , GithubException , UnknownObjectException
4+ from github .GithubObject import NotSet
45
56
67class Data (dict ):
@@ -17,8 +18,10 @@ def getLatestChange():
1718 return list (changes .values ())[0 ]
1819
1920
20- github = Github (base_url = env ['GITHUB_API_URL' ],
21- login_or_token = env ['INPUT_TOKEN' ])
21+ github = Github (
22+ base_url = env ['GITHUB_API_URL' ],
23+ auth = Auth .Token (env ['INPUT_TOKEN' ])
24+ )
2225repo = github .get_repo (env ['GITHUB_REPOSITORY' ])
2326
2427change = getLatestChange ()
@@ -35,32 +38,56 @@ def getLatestChange():
3538
3639# Create release.
3740data ['tag' ] = env ['INPUT_TAG-TEMPLATE' ].format_map (data )
38- release = repo .create_git_release (
39- data ['tag' ],
40- env ['INPUT_NAME-TEMPLATE' ].format_map (data ),
41- data ['change' ],
42- env ['INPUT_IS-DRAFT' ] == 'true' ,
43- data ['prerelease' ] is not None ,
44- env ['GITHUB_SHA' ])
41+ try :
42+ release = repo .create_git_release (
43+ data ['tag' ],
44+ env ['INPUT_NAME-TEMPLATE' ].format_map (data ),
45+ data ['change' ],
46+ env ['INPUT_IS-DRAFT' ] == 'true' ,
47+ data ['prerelease' ] is not None ,
48+ target_commitish = env ['GITHUB_SHA' ]
49+ )
50+ except GithubException as ex :
51+ if ex .status != 422 :
52+ raise
53+ # If the tag already exists.
54+ release = repo .get_release (data ['tag' ])
55+ release .update_release (
56+ env ['INPUT_NAME-TEMPLATE' ].format_map (data ),
57+ data ['change' ],
58+ target_commitish = env ['GITHUB_SHA' ]
59+ )
60+ for asset in release .get_assets ():
61+ asset .delete_asset ()
62+
63+ # Upload assets.
64+ for entry in env ['INPUT_ASSETS' ].splitlines ():
65+ path , _ , rest = entry .partition (':' )
66+ name , _ , label = rest .partition (':' )
67+ release .upload_asset (
68+ path ,
69+ name = name if name != '' else NotSet ,
70+ label = label
71+ )
4572
4673# Move major tag.
4774if env ['INPUT_MAJOR-TAG-TEMPLATE' ] != '' and data ['major' ] != 0 :
4875 data ['major_tag' ] = env ['INPUT_MAJOR-TAG-TEMPLATE' ].format_map (data )
49- major = repo . get_git_ref ( f'tags/ { data [ "major_tag" ] } ' )
50- if major . ref is not None :
76+ try :
77+ major = repo . get_git_ref ( f'tags/ { data [ "major_tag" ] } ' )
5178 major .edit (env ['GITHUB_SHA' ])
52- else :
79+ except UnknownObjectException :
5380 repo .create_git_ref (f'refs/tags/{ data ["major_tag" ]} ' , env ['GITHUB_SHA' ])
5481else :
5582 data ['major_tag' ] = ''
5683
5784# Move minor tag.
5885if env ['INPUT_MINOR-TAG-TEMPLATE' ] != '' :
5986 data ['minor_tag' ] = env ['INPUT_MINOR-TAG-TEMPLATE' ].format_map (data )
60- minor = repo . get_git_ref ( f'tags/ { data [ "minor_tag" ] } ' )
61- if minor . ref is not None :
87+ try :
88+ minor = repo . get_git_ref ( f'tags/ { data [ "minor_tag" ] } ' )
6289 minor .edit (env ['GITHUB_SHA' ])
63- else :
90+ except UnknownObjectException :
6491 repo .create_git_ref (f'refs/tags/{ data ["minor_tag" ]} ' , env ['GITHUB_SHA' ])
6592else :
6693 data ['minor_tag' ] = ''
0 commit comments