9595 print(f"Found version in release name: {release_name_version}")
9696
9797 # Extract assets
98- # Special handling for composer (uses .phar files), xlight (version in release name), and git (files start with "portable")
98+ # Special handling for:
99+ # - composer: uses .phar files
100+ # - xlight: version in release name
101+ # - git: files start with "portable"
102+ # - ghostscript: version embedded without dots (e.g., gs10051w64.7z for version 10.05.1)
99103 assets = []
100104 for asset in release_data.get('assets', []):
101105 filename = asset['name']
@@ -171,6 +175,62 @@ jobs:
171175 print(f"ERROR: Could not extract version for git from release name or filename: {filename}")
172176 print(f"Release name: {release_data.get('name', 'N/A')}")
173177 exit(1)
178+ elif module_name == 'ghostscript':
179+ # For ghostscript, files are named like gs10051w64.7z where 10051 = version 10.05.1
180+ # Pattern: gs + version_without_dots + w32/w64 + .7z
181+ if filename.lower().startswith('gs') and filename.endswith('.7z'):
182+ download_url = asset['browser_download_url']
183+
184+ # Extract the numeric part between 'gs' and 'w32'/'w64'
185+ # Example: gs10051w64.7z -> 10051
186+ match = re.match(r'gs(\d+)w(?:32|64)\.7z', filename.lower())
187+ if match:
188+ version_digits = match.group(1)
189+ # Convert version digits to proper version format
190+ # Examples: 922 -> 9.22, 9561 -> 9.56.1, 10051 -> 10.05.1, 1000 -> 10.0
191+ if len(version_digits) == 3:
192+ # Format: XYZ -> X.YZ (e.g., 922 -> 9.22)
193+ ver = f"{version_digits[0]}.{version_digits[1:]}"
194+ elif len(version_digits) == 4:
195+ if version_digits.startswith('10'):
196+ # Format: 10XY -> 10.X.Y or 10.XY (e.g., 1000 -> 10.0, 1003 -> 10.03)
197+ if version_digits[2:] == '00':
198+ ver = f"10.{version_digits[2]}" # 1000 -> 10.0
199+ else:
200+ ver = f"10.{version_digits[2:]}" # 1003 -> 10.03
201+ else:
202+ # Format: XYZW -> X.YZ.W (e.g., 9561 -> 9.56.1)
203+ ver = f"{version_digits[0]}.{version_digits[1:3]}.{version_digits[3]}"
204+ elif len(version_digits) == 5:
205+ # Format: 10XYZ -> 10.XY.Z (e.g., 10051 -> 10.05.1, 10020 -> 10.02.0)
206+ ver = f"10.{version_digits[2:4]}.{version_digits[4]}"
207+ else:
208+ print(f"WARNING: Unexpected version digit length for ghostscript: {version_digits}")
209+ if release_name_version:
210+ ver = release_name_version
211+ else:
212+ print(f"ERROR: Could not parse version from filename: {filename}")
213+ continue
214+
215+ assets.append({
216+ 'version': ver,
217+ 'url': download_url,
218+ 'filename': filename
219+ })
220+ print(f"Found: {filename} -> Version: {ver} (parsed from filename)")
221+ elif release_name_version:
222+ # Fallback to release name version
223+ ver = release_name_version
224+ assets.append({
225+ 'version': ver,
226+ 'url': download_url,
227+ 'filename': filename
228+ })
229+ print(f"Found: {filename} -> Version: {ver} (from release name)")
230+ else:
231+ print(f"ERROR: Could not extract version for ghostscript from filename: {filename}")
232+ print(f"Release name: {release_data.get('name', 'N/A')}")
233+ exit(1)
174234 elif filename.lower().startswith(module_name):
175235 # Standard modules use .7z, .exe, or .zip and must start with module name (case-insensitive)
176236 if filename.endswith('.7z') or filename.endswith('.exe') or filename.endswith('.zip'):
@@ -226,6 +286,10 @@ jobs:
226286 print(f"No valid assets found in release")
227287 print(f"Expected: .7z, .exe, or .zip files starting with 'portable'")
228288 print(f"Available assets: {[a['name'] for a in release_data.get('assets', [])]}")
289+ elif module_name == 'ghostscript':
290+ print(f"No valid ghostscript assets found in release")
291+ print(f"Expected: .7z files matching pattern gs<version>w32/w64.7z")
292+ print(f"Available assets: {[a['name'] for a in release_data.get('assets', [])]}")
229293 else:
230294 print(f"No .7z, .exe, or .zip assets found starting with '{module_name}' in release")
231295 print(f"Available assets: {[a['name'] for a in release_data.get('assets', [])]}")
@@ -266,15 +330,67 @@ jobs:
266330 for key, value in properties.items():
267331 print(f" {key} = {value}")
268332
333+ # Track if any changes were made
334+ changes_made = False
335+ added_versions = []
336+ updated_versions = []
337+
269338 # Add new versions
270339 for asset in assets:
271340 ver = asset['version']
272341 url = asset['url']
273342
274343 # Create property key (just version number)
275344 key = ver
276- properties[key] = url
277- print(f"Added/Updated: {key} = {url}")
345+
346+ # Check if this is a new version or an update
347+ if key in properties:
348+ if properties[key] != url:
349+ updated_versions.append(f"{key}: {properties[key]} -> {url}")
350+ properties[key] = url
351+ changes_made = True
352+ print(f"Updated: {key} = {url}")
353+ else:
354+ print(f"Unchanged: {key} = {url} (already exists with same URL)")
355+ else:
356+ added_versions.append(f"{key} = {url}")
357+ properties[key] = url
358+ changes_made = True
359+ print(f"Added: {key} = {url}")
360+
361+ # Check if any changes were actually made
362+ if not changes_made:
363+ print(f"\n{'='*70}")
364+ print(f"ERROR: No changes were made to {properties_file}")
365+ print(f"{'='*70}")
366+ print(f"\nRelease Information:")
367+ print(f" Release Tag: {release_tag}")
368+ print(f" Release Name: {release_data.get('name', 'N/A')}")
369+ print(f" Module: {module_name}")
370+ print(f"\nAssets Found in Release:")
371+ for idx, asset in enumerate(assets, 1):
372+ print(f" {idx}. {asset['filename']}")
373+ print(f" Version: {asset['version']}")
374+ print(f" URL: {asset['url']}")
375+ print(f"\nExisting Properties File Content:")
376+ print(f" File: {properties_file}")
377+ print(f" Total entries: {len(properties)}")
378+ for key, value in properties.items():
379+ print(f" {key} = {value}")
380+ print(f"\nReason:")
381+ print(f" All versions from this release already exist in the properties file")
382+ print(f" with the same URLs. No updates are needed.")
383+ print(f"\nPossible Causes:")
384+ print(f" 1. This release was already processed previously")
385+ print(f" 2. The properties file was manually updated with these versions")
386+ print(f" 3. The workflow was re-run on the same release")
387+ print(f"\nAction Required:")
388+ print(f" If this is unexpected, verify:")
389+ print(f" - The release contains new assets not in the properties file")
390+ print(f" - The asset filenames match the expected pattern for {module_name}")
391+ print(f" - The version extraction logic is working correctly")
392+ print(f"{'='*70}\n")
393+ exit(1)
278394
279395 # Sort properties by version (semver)
280396 def extract_version(key):
@@ -298,8 +414,22 @@ jobs:
298414 for key, value in sorted_properties.items():
299415 f.write(f"{key} = {value}\n")
300416
301- print(f"\nSuccessfully updated {properties_file}")
302- print(f"Total versions: {len(sorted_properties)}")
417+ print(f"\n{'='*70}")
418+ print(f"SUCCESS: Updated {properties_file}")
419+ print(f"{'='*70}")
420+ print(f"Total versions in file: {len(sorted_properties)}")
421+
422+ if added_versions:
423+ print(f"\nAdded {len(added_versions)} new version(s):")
424+ for ver in added_versions:
425+ print(f" + {ver}")
426+
427+ if updated_versions:
428+ print(f"\nUpdated {len(updated_versions)} existing version(s):")
429+ for ver in updated_versions:
430+ print(f" ~ {ver}")
431+
432+ print(f"{'='*70}\n")
303433
304434 EOF
305435
0 commit comments