@@ -6,7 +6,7 @@ name: Update Releases Properties
66on :
77 release :
88 types : [prereleased, released, edited]
9-
9+
1010 # Manual trigger for testing
1111 workflow_dispatch :
1212 inputs :
1717jobs :
1818 update-properties :
1919 runs-on : ubuntu-latest
20-
20+
2121 steps :
2222 - name : Checkout repository
2323 uses : actions/checkout@v4
2424 with :
2525 token : ${{ secrets.GH_PAT }}
26-
26+
2727 - name : Set up Python
2828 uses : actions/setup-python@v5
2929 with :
3030 python-version : ' 3.11'
31-
31+
3232 - name : Install dependencies
3333 run : |
3434 pip install requests packaging
35-
35+
3636 - name : Extract module name from repository
3737 id : extract_module
3838 run : |
3939 # Extract module name from repo name (e.g., "module-php" -> "php")
4040 REPO_NAME="${{ github.event.repository.name }}"
4141 echo "Repository name: ${REPO_NAME}"
42-
42+
4343 # Remove "module-" prefix (case-insensitive)
4444 if [[ "${REPO_NAME}" == module-* ]]; then
4545 MODULE_NAME="${REPO_NAME#module-}"
@@ -50,13 +50,13 @@ jobs:
5050 echo "Expected format: module-MODULENAME (e.g., module-php)"
5151 exit 1
5252 fi
53-
53+
5454 # Convert to lowercase
5555 MODULE_NAME=$(echo "${MODULE_NAME}" | tr '[:upper:]' '[:lower:]')
56-
56+
5757 echo "module_name=${MODULE_NAME}" >> $GITHUB_OUTPUT
5858 echo "Module name: ${MODULE_NAME}"
59-
59+
6060 - name : Update releases properties
6161 env :
6262 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
@@ -71,47 +71,47 @@ jobs:
7171 import requests
7272 from packaging import version
7373 from collections import OrderedDict
74-
74+
7575 # Get environment variables
7676 release_tag = os.environ['RELEASE_TAG']
7777 repo_owner = os.environ['REPO_OWNER']
7878 repo_name = os.environ['REPO_NAME']
7979 module_name = os.environ['MODULE_NAME']
8080 github_token = os.environ['GITHUB_TOKEN']
81-
81+
8282 # Strip module name prefix from tag if present (e.g., "postgresql-2025.11.22" -> "2025.11.22")
8383 if release_tag.lower().startswith(f"{module_name.lower()}-"):
8484 original_tag = release_tag
8585 release_tag = release_tag[len(module_name)+1:]
8686 print(f"Stripped module prefix from tag: {original_tag} -> {release_tag}")
87-
87+
8888 print(f"Processing release: {release_tag}")
8989 print(f"Module name: {module_name}")
90-
90+
9191 # Construct API URL
9292 api_url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/releases/tags/{release_tag}"
93-
93+
9494 headers = {
9595 'Authorization': f'token {github_token}',
9696 'Accept': 'application/vnd.github.v3+json'
9797 }
98-
98+
9999 print(f"Fetching release information from: {api_url}")
100-
100+
101101 # Fetch release data
102102 response = requests.get(api_url, headers=headers)
103103 response.raise_for_status()
104104 release_data = response.json()
105-
105+
106106 # Extract assets that end with .7z only
107107 assets = []
108108 for asset in release_data.get('assets', []):
109109 filename = asset['name']
110-
110+
111111 # Check if file ends with .7z
112112 if filename.endswith('.7z'):
113113 download_url = asset['browser_download_url']
114-
114+
115115 # Extract version number after module name (e.g., "bearsampp-postgresql-18.1-2025.7.2.7z" -> "18.1")
116116 # Pattern: module_name followed by version, then either a dash+date or .7z
117117 # Supports: 18.1, 17.2.3, 3.2.1.0, 17.0-RC1
@@ -131,29 +131,29 @@ jobs:
131131 print(f"Found: {filename} -> Version: {ver}")
132132 else:
133133 print(f"Warning: Could not extract version from: {filename}")
134-
134+
135135 if not assets:
136136 print(f"No .7z assets found in release")
137137 exit(0)
138-
138+
139139 # Read existing properties file
140140 properties_file = "releases.properties"
141-
141+
142142 if not os.path.exists(properties_file):
143143 print(f"Properties file not found: {properties_file}")
144144 print(f"Creating new properties file...")
145145 with open(properties_file, 'w', encoding='utf-8') as f:
146146 f.write(f"# {module_name.upper()} Releases Properties\n")
147147 f.write(f"# Auto-generated and maintained by automation\n\n")
148-
148+
149149 with open(properties_file, 'r', encoding='utf-8') as f:
150150 lines = f.readlines()
151-
151+
152152 # Parse existing properties
153153 properties = OrderedDict()
154154 header_lines = []
155155 in_header = True
156-
156+
157157 for line in lines:
158158 stripped = line.strip()
159159 if in_header and (stripped.startswith('#') or stripped == ''):
@@ -163,7 +163,7 @@ jobs:
163163 if '=' in line and not stripped.startswith('#'):
164164 key, value = line.split('=', 1)
165165 properties[key.strip()] = value.strip()
166-
166+
167167 # Fix malformed version entries by re-extracting correct versions from URLs
168168 # This handles cases like "2025.7.2.7" or "18.1-2025" that should be "18.1"
169169 fixed_properties = OrderedDict()
@@ -175,7 +175,7 @@ jobs:
175175 url,
176176 re.IGNORECASE
177177 )
178-
178+
179179 if url_version_match:
180180 correct_version = url_version_match.group(1)
181181 # If the key is malformed (date-like or has trailing year), fix it
@@ -188,46 +188,46 @@ jobs:
188188 else:
189189 # If we can't extract version from URL, keep the original entry
190190 fixed_properties[key] = url
191-
191+
192192 properties = fixed_properties
193-
193+
194194 # Add new versions
195195 for asset in assets:
196196 ver = asset['version']
197197 url = asset['url']
198-
198+
199199 # Create property key (just version number)
200200 key = ver
201201 properties[key] = url
202202 print(f"Added/Updated: {key} = {url}")
203-
203+
204204 # Sort properties by version (semver)
205205 def extract_version(key):
206206 # Parse version directly from key
207207 try:
208208 return version.parse(key)
209209 except:
210210 return version.parse("0.0.0")
211-
211+
212212 sorted_properties = OrderedDict(
213213 sorted(properties.items(), key=lambda x: extract_version(x[0]), reverse=True)
214214 )
215-
215+
216216 # Write back to file
217217 with open(properties_file, 'w', encoding='utf-8') as f:
218218 # Write header
219219 for line in header_lines:
220220 f.write(line)
221-
221+
222222 # Write sorted properties with spaces around equals sign
223223 for key, value in sorted_properties.items():
224224 f.write(f"{key} = {value}\n")
225-
225+
226226 print(f"\nSuccessfully updated {properties_file}")
227227 print(f"Total versions: {len(sorted_properties)}")
228-
228+
229229 EOF
230-
230+
231231 - name : Create Pull Request
232232 id : create_pr
233233 uses : peter-evans/create-pull-request@v6
@@ -236,37 +236,37 @@ jobs:
236236 base : main
237237 commit-message : |
238238 Update releases.properties
239-
239+
240240 Auto-generated from release ${{ github.event.release.tag_name || github.event.inputs.release_tag }}
241241 branch : update-releases-${{ github.event.release.tag_name || github.event.inputs.release_tag }}
242242 delete-branch : true
243243 title : ' Update releases.properties from release ${{ github.event.release.tag_name || github.event.inputs.release_tag }}'
244244 body : |
245245 ## 🤖 Automated Releases Properties Update
246-
246+
247247 This PR updates the `releases.properties` file with new versions from release `${{ github.event.release.tag_name || github.event.inputs.release_tag }}`.
248-
248+
249249 ### Changes:
250250 - Extracted .7z assets from the release
251251 - Added version entries with download URLs
252252 - Maintained semver ordering (newest first)
253-
253+
254254 **Release URL:** ${{ github.event.release.html_url || format('https://github.com/{0}/{1}/releases/tag/{2}', github.repository_owner, github.event.repository.name, github.event.inputs.release_tag) }}
255-
255+
256256 ### Next Steps:
257257 1. ⏳ Link validation will run automatically
258258 2. ✅ Once validation passes, this PR will auto-merge
259259 3. ❌ If validation fails, please review and fix invalid URLs
260260 labels : |
261261 automated
262262 releases-update
263-
263+
264264 - name : Wait for validation checks
265265 if : steps.create_pr.outputs.pull-request-number != ''
266266 run : |
267267 echo "Waiting for link validation to complete..."
268268 sleep 10
269-
269+
270270 - name : Enable auto-merge
271271 if : steps.create_pr.outputs.pull-request-number != ''
272272 run : |
0 commit comments