66import zipfile
77from typing import List , Dict , Tuple , Optional
88import sys
9+ import json
910
1011TARGET_FILE = "src/index.json"
1112
@@ -22,7 +23,8 @@ def get_api_urls() -> Tuple[str, str]:
2223 return f"{ base_url } /releases" , f"{ base_url } /git/tags"
2324
2425
25- def get_file_changes () -> List [str ]:
26+ def get_file_diff () -> List [str ]:
27+ """Get added lines from git diff"""
2628 diff_output = subprocess .check_output (
2729 ["git" , "diff" , "HEAD^" , "HEAD" , "--" , TARGET_FILE ],
2830 text = True
@@ -37,70 +39,37 @@ def get_file_changes() -> List[str]:
3739 return added_lines
3840
3941
40- def parse_filename (added_lines : List [str ]) -> Optional [Dict ]:
41- """Parse filename and metadata from added lines"""
42- filename = None
43- metadata = {}
44- download_url = None
45- sha256_digest = None
46- in_metadata = False
47-
42+ def parse_filename (added_lines : List [str ]) -> Optional [str ]:
43+ """Parse filename from added lines"""
4844 for line in added_lines :
49- line = line .strip ()
50-
5145 if '"filename":' in line :
5246 try :
5347 filename = line .split (":" )[1 ].strip ().strip ('",' )
48+ return filename
5449 except IndexError :
5550 print (f"Error parsing line: { line } " )
51+ return None
5652
57- elif '"downloadUrl":' in line :
58- try :
59- download_url = line .split (":" )[1 ].strip ().strip ('",' )
60- except IndexError :
61- print (f"Error parsing downloadUrl: { line } " )
62-
63- elif '"sha256Digest":' in line :
64- try :
65- sha256_digest = line .split (":" )[1 ].strip ().strip ('",' )
66- except IndexError :
67- print (f"Error parsing sha256Digest: { line } " )
68-
69- elif '"metadata":' in line :
70- in_metadata = True
71- continue
72-
73- elif in_metadata and line .startswith ('"' ):
74- # Parse metadata key-value pairs
75- try :
76- key = line .split (":" )[0 ].strip ().strip ('"' )
77- value = line .split (":" )[1 ].strip ().strip ('",' )
78- metadata [key ] = value
79- except IndexError :
80- print (f"Error parsing metadata line: { line } " )
8153
82- elif line .startswith ("}" ):
83- in_metadata = False
54+ def get_extension_info (filename : str ) -> Optional [Dict ]:
55+ """Get extension information from index.json"""
56+ try :
57+ with open (TARGET_FILE , 'r' ) as f :
58+ index_data = json .load (f )
8459
85- if not filename :
86- print ("No filename found in added lines" )
87- return None
60+ # Search for the extension entry with matching filename
61+ for ext_name , versions in index_data .get ("extensions" , {}).items ():
62+ for version in versions :
63+ if version .get ("filename" ) == filename :
64+ return version
8865
89- if not download_url :
90- print ("No downloadUrl found in added lines" )
66+ print (f"Extension { filename } not found in index.json" )
9167 return None
9268
93- if not sha256_digest :
94- print ("No sha256Digest found in added lines " )
69+ except Exception as e :
70+ print (f"Error reading index.json: { e } " )
9571 return None
9672
97- return {
98- "filename" : filename ,
99- "metadata" : metadata ,
100- "downloadUrl" : download_url ,
101- "sha256Digest" : sha256_digest
102- }
103-
10473
10574def generate_tag_and_title (filename : str ) -> Tuple [str , str , str ]:
10675 """Generate tag name and release title from filename"""
@@ -115,13 +84,15 @@ def generate_tag_and_title(filename: str) -> Tuple[str, str, str]:
11584 release_title = f"{ name } { version } "
11685 return tag_name , release_title , version
11786
87+
11888def check_tag_exists (url : str , tag_name : str , headers : Dict [str , str ]) -> bool :
11989 response = requests .get (
12090 f"{ url } /{ tag_name } " ,
12191 headers = headers
12292 )
12393 return response .status_code == 200
12494
95+
12596def create_release (url : str , release_data : Dict [str , str ], headers : Dict [str , str ], wheel_url : str = None ) -> None :
12697 try :
12798 # Create release
@@ -155,7 +126,7 @@ def create_release(url: str, release_data: Dict[str, str], headers: Dict[str, st
155126 data = wheel_response .content
156127 )
157128 upload_response .raise_for_status ()
158- print (f "Successfully uploaded wheel file" )
129+ print ("Successfully uploaded wheel file" )
159130
160131 except requests .exceptions .RequestException as e :
161132 print (f"\n Error creating release for { release_data ['tag_name' ]} " )
@@ -237,31 +208,37 @@ def main():
237208 sys .exit (1 )
238209
239210 release_url , tag_url = get_api_urls ()
240-
241211 headers = {
242212 "Authorization" : f"token { github_token } " ,
243213 "Accept" : "application/vnd.github.v3+json"
244214 }
245215
246216 try :
247- added_lines = get_file_changes ()
217+ # Get added lines from git diff
218+ added_lines = get_file_diff ()
248219 if not added_lines :
249220 print ("No changes found in index.json" )
250221 return
251222
252- file_info = parse_filename (added_lines )
253- if not file_info :
223+ # Parse filename from added lines
224+ filename = parse_filename (added_lines )
225+ if not filename :
254226 print ("No filename found in changes" )
255227 return
256228
229+ # Get extension info from index.json
230+ extension_info = get_extension_info (filename )
231+ if not extension_info :
232+ print ("Could not get extension information from index.json" )
233+ return
234+
257235 try :
258- filename = file_info ["filename" ]
259236 tag_name , release_title , version = generate_tag_and_title (filename )
260237
261238 # Get history notes from wheel package
262239 print ("Getting history notes from wheel package..." )
263- history_note = get_history_note (file_info ["downloadUrl" ], version )
264-
240+ history_note = get_history_note (extension_info ["downloadUrl" ], version )
241+
265242 # If no notes found in wheel, try source code
266243 if "No history notes found" in history_note :
267244 print ("No history notes found in wheel, trying source code..." )
@@ -274,7 +251,7 @@ def main():
274251 history_note = f"Release { extension_name } { version } "
275252
276253 # Generate release body
277- release_body = generate_release_body (history_note , file_info ["sha256Digest" ], filename )
254+ release_body = generate_release_body (history_note , extension_info ["sha256Digest" ], filename )
278255
279256 commit_sha = subprocess .check_output (
280257 ["git" , "rev-parse" , "HEAD" ],
@@ -298,7 +275,7 @@ def main():
298275 print (f"Target commit: { commit_sha } " )
299276 print (f"Body preview: { release_body [:200 ]} ..." )
300277
301- create_release (release_url , release_data , headers , file_info ["downloadUrl" ])
278+ create_release (release_url , release_data , headers , extension_info ["downloadUrl" ])
302279
303280 except ValueError as e :
304281 print (f"Error generating tag for filename { filename } : { e } " )
0 commit comments