1515import argparse
1616
1717import requests
18+
1819from common import Git , Version , fetch_github_releases
1920
2021
@@ -31,43 +32,93 @@ def main(arg_strings=None):
3132The indicated version must not have extensions.""" ,
3233 )
3334
35+ parser .add_argument (
36+ "--dry_run" ,
37+ type = bool ,
38+ default = "True" ,
39+ help = "A boolean flag indicating whether to perform a dry run (default: True). " +
40+ "If set to True, the script will only print the releases and tags that would " +
41+ "be deleted without actually deleting them. This can be useful for verifying " +
42+ " which releases and tags would be affected before performing the actual deletion." )
43+
44+ parser .add_argument (
45+ "--extension" ,
46+ type = str ,
47+ default = "dev" ,
48+ help = "The extension to look for in the releases to be deleted (default: 'dev'). " )
49+
3450 args = parser .parse_args (arg_strings )
51+ version = args .version
52+ dry_run = args .dry_run
53+ extension = args .extension
3554
3655 github_path = Git .get_github_path ()
3756 all_releases = fetch_github_releases (github_path )
38- found_dev_version_to_delete = False
57+ found = []
58+ found_wrong_version = []
59+ found_wrong_extension = []
60+ errors = []
3961 if all_releases :
4062 for package , releases in all_releases .items ():
4163 for release in releases :
4264 release_version : Version = release ["version" ]
43- release_id = release ["id" ]
44- release_tag = release ["tag" ]
45- if release_version .validate_extension () and args .version .match (release_version ):
46- pkg = package .name
47- found_dev_version_to_delete = True
65+ if release_version .has_extension ():
66+ release_id = release ["id" ]
67+ release_tag = release ["tag" ]
68+ if version .matches (release_version ) and release_version .validate_extension (ext = extension ):
69+ found .append (release_id )
70+ if not __delete_release (dry_run , github_path , package .name , release_id , release_version ):
71+ errors .append (f"Release { release_version } -{ package .name } (id: { release_id } )" )
72+ if not __delete_tag (dry_run , github_path , release_tag ):
73+ errors .append (f"Tag { release_tag } " )
74+ elif not version .matches (release_version ) and release_version .validate_extension (ext = extension ):
75+ found_wrong_version .append (release_tag )
76+ elif version .matches (release_version ) :
77+ found_wrong_extension .append (release_tag )
78+ print () # noqa: T201
79+ if len (found ) == 0 :
80+ print (f"No dev releases found for version { version } ." ) # noqa: T201
81+ else :
82+ print (f"✅ Successfully deleted { len (found )} releases { version } with extension '{ extension } '" ) # noqa: T201
83+ if len (errors ) > 0 :
84+ print (f"❌ Failed to delete { len (errors )} items: { sorted (errors )} " ) # noqa: T201
85+ if len (found_wrong_extension ) > 0 :
86+ print (f"Found { len (found_wrong_extension )} releases matching version { version } but with another extension:" ) # noqa: T201
87+ print (sorted (found_wrong_extension )) # noqa: T201
88+ if len (found_wrong_version ) > 0 :
89+ print (f"Found { len (found_wrong_version )} releases matching extension '{ extension } ' but with another version:" ) # noqa: T201
90+ print (sorted (found_wrong_version )) # noqa: T201
4891
49- # Delete release
50- url = f"https://api.github.com/repos/{ github_path } /releases/{ release_id } "
51- response = requests .delete (url , headers = {"Accept" : "application/vnd.github+json" })
52- if response .status_code == 204 :
53- print (f"✅ Successfully deleted '{ pkg } -{ release_version } '." ) # noqa: T201
54- else :
55- status = response .status_code
56- txt = response .text
57- print (f"❌ Failed to delete '{ pkg } -{ release_version } ': { status } - { txt } " )# noqa: T201
92+ def __delete_release (dry_run , github_path : str , pkg : str , release_id : str , release_version : Version ) -> bool :
93+ url = f"https://api.github.com/repos/{ github_path } /releases/{ release_id } "
94+ if dry_run :
95+ print (f'requests.delete("{ url } ", ' + # noqa: T201
96+ 'headers={"Accept": "application/vnd.github+json"})' ) # noqa: T201
97+ return True
98+ else :
99+ response = requests .delete (url , headers = {"Accept" : "application/vnd.github+json" })
100+ if response .status_code == 204 :
101+ print (f"Successfully deleted '{ pkg } -{ release_version } '." ) # noqa: T201
102+ return True
103+ else :
104+ print (f"❌ Failed to delete '{ pkg } -{ release_version } ': { response .status_code } - { response .text } " ) # noqa: T201
105+ return False
58106
59- # Delete tag
60- url = f"https://api.github.com/repos/{ github_path } /git/refs/tags/{ release_tag } '"
61- response = requests .delete (url , headers = {"Accept" : "application/vnd.github+json" })
62- if response .status_code == 204 :
63- print (f"✅ Successfully deleted tag { release_tag } ." ) # noqa: T201
64- else :
65- status = response .status_code
66- txt = response .text
67- print (f"❌ Failed to delete tag { release_tag } : { status } - { txt } " ) # noqa: T201
68107
69- if not found_dev_version_to_delete :
70- print (f"No dev releases found for version { args .version } ." ) # noqa: T201
108+ def __delete_tag (dry_run , github_path : str , release_tag : str ) -> bool :
109+ url = f"https://api.github.com/repos/{ github_path } /git/refs/tags/{ release_tag } "
110+ if dry_run :
111+ print (f'requests.delete("{ url } ", ' + # noqa: T201
112+ 'headers={"Accept": "application/vnd.github+json"})' ) # noqa: T201
113+ return True
114+ else :
115+ response = requests .delete (url , headers = {"Accept" : "application/vnd.github+json" })
116+ if response .status_code == 204 :
117+ print (f"Successfully deleted tag { release_tag } ." ) # noqa: T201
118+ return True
119+ else :
120+ print (f"❌ Failed to delete tag { release_tag } : { response .status_code } - { response .text } " ) # noqa:
121+ return False
71122
72123
73124if __name__ == "__main__" :
0 commit comments