mirror of
https://github.com/xemu-project/xemu.git
synced 2026-07-11 01:24:41 +02:00
scripts/bump-subproject-wraps.py: Handle updates from wrapdb
This commit is contained in:
committed by
mborgerson
parent
6d47853eaa
commit
98b0051138
@@ -12,7 +12,9 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
import urllib.parse
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from dataclasses import dataclass, asdict
|
from dataclasses import dataclass, asdict
|
||||||
|
|
||||||
@@ -107,6 +109,106 @@ class UpdatedWrap:
|
|||||||
new_tag: str
|
new_tag: str
|
||||||
|
|
||||||
|
|
||||||
|
def update_wrapdb_wrap(path: Path) -> None | UpdatedWrap:
|
||||||
|
"""
|
||||||
|
Update a wrapdb wrap file using `meson wrap update`.
|
||||||
|
"""
|
||||||
|
wrap_name = path.stem
|
||||||
|
|
||||||
|
# Read current version
|
||||||
|
cp_before = configparser.ConfigParser(interpolation=None)
|
||||||
|
cp_before.read(path, encoding="utf-8")
|
||||||
|
|
||||||
|
if "wrap-file" not in cp_before:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Extract version info before update
|
||||||
|
w_before = cp_before["wrap-file"]
|
||||||
|
source_url_before = w_before.get("source_url", "")
|
||||||
|
source_hash_before = w_before.get("source_hash", "")
|
||||||
|
patch_hash_before = w_before.get("patch_hash", "")
|
||||||
|
wrapdb_version_before = w_before.get("wrapdb_version", "")
|
||||||
|
|
||||||
|
# Try to extract version from wrapdb_version or filename in source_url
|
||||||
|
old_version = wrapdb_version_before
|
||||||
|
if not old_version and source_url_before:
|
||||||
|
# Common pattern: package-version.tar.gz or package_version.tar.gz
|
||||||
|
filename = urllib.parse.urlparse(source_url_before).path.split("/")[-1]
|
||||||
|
# Try to extract version (this is a heuristic)
|
||||||
|
version_match = re.search(r"[-_]v?(\d+(?:\.\d+)*(?:[.-]\w+)?)", filename)
|
||||||
|
if version_match:
|
||||||
|
old_version = version_match.group(1)
|
||||||
|
|
||||||
|
# Call meson wrap update
|
||||||
|
try:
|
||||||
|
result = subprocess.run(
|
||||||
|
["meson", "wrap", "update", wrap_name],
|
||||||
|
cwd=ROOT,
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
check=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
if result.returncode != 0:
|
||||||
|
log.info("meson wrap update failed for %s: %s", wrap_name, result.stderr)
|
||||||
|
return None
|
||||||
|
|
||||||
|
except FileNotFoundError:
|
||||||
|
log.error("meson command not found. Cannot update wrapdb wraps.")
|
||||||
|
return None
|
||||||
|
except Exception as e:
|
||||||
|
log.exception(e)
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Read updated version
|
||||||
|
cp_after = configparser.ConfigParser(interpolation=None)
|
||||||
|
cp_after.read(path, encoding="utf-8")
|
||||||
|
|
||||||
|
if "wrap-file" not in cp_after:
|
||||||
|
return None
|
||||||
|
|
||||||
|
w_after = cp_after["wrap-file"]
|
||||||
|
source_url_after = w_after.get("source_url", "")
|
||||||
|
source_hash_after = w_after.get("source_hash", "")
|
||||||
|
patch_hash_after = w_after.get("patch_hash", "")
|
||||||
|
wrapdb_version_after = w_after.get("wrapdb_version", "")
|
||||||
|
|
||||||
|
# Check if anything changed (compare multiple fields)
|
||||||
|
if (source_url_before == source_url_after and
|
||||||
|
source_hash_before == source_hash_after and
|
||||||
|
patch_hash_before == patch_hash_after and
|
||||||
|
wrapdb_version_before == wrapdb_version_after):
|
||||||
|
log.info("%s already up to date", path.name)
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Try to extract new version from wrapdb_version or filename
|
||||||
|
new_version = wrapdb_version_after
|
||||||
|
if not new_version and source_url_after:
|
||||||
|
filename = urllib.parse.urlparse(source_url_after).path.split("/")[-1]
|
||||||
|
version_match = re.search(r"[-_]v?(\d+(?:\.\d+)*(?:[.-]\w+)?)", filename)
|
||||||
|
if version_match:
|
||||||
|
new_version = version_match.group(1)
|
||||||
|
|
||||||
|
# Try to extract GitHub info if the source is on GitHub
|
||||||
|
owner, repo = "wrapdb", wrap_name
|
||||||
|
old_rev = old_version or "old"
|
||||||
|
new_rev = new_version or "new"
|
||||||
|
new_tag = new_version or "latest"
|
||||||
|
|
||||||
|
# Check if source_url points to GitHub
|
||||||
|
gh_match = re.match(
|
||||||
|
r".*github\.com[:/](?P<owner>[^/]+)/(?P<repo>[^/]+)/",
|
||||||
|
source_url_after
|
||||||
|
)
|
||||||
|
if gh_match:
|
||||||
|
owner = gh_match.group("owner")
|
||||||
|
repo = gh_match.group("repo")
|
||||||
|
|
||||||
|
log.info("%s updated from %s to %s", path.name, old_version or "?", new_version or "?")
|
||||||
|
|
||||||
|
return UpdatedWrap(str(path), owner, repo, old_rev, new_rev, new_tag)
|
||||||
|
|
||||||
|
|
||||||
def update_wrap(path: Path) -> None | UpdatedWrap:
|
def update_wrap(path: Path) -> None | UpdatedWrap:
|
||||||
"""
|
"""
|
||||||
Return (tag_name, commit_sha) if updated, otherwise None.
|
Return (tag_name, commit_sha) if updated, otherwise None.
|
||||||
@@ -114,8 +216,11 @@ def update_wrap(path: Path) -> None | UpdatedWrap:
|
|||||||
cp = configparser.ConfigParser(interpolation=None)
|
cp = configparser.ConfigParser(interpolation=None)
|
||||||
cp.read(path, encoding="utf-8")
|
cp.read(path, encoding="utf-8")
|
||||||
|
|
||||||
|
if "wrap-file" in cp:
|
||||||
|
# Handle wrapdb wraps using meson wrap update
|
||||||
|
return update_wrapdb_wrap(path)
|
||||||
|
|
||||||
if "wrap-git" not in cp:
|
if "wrap-git" not in cp:
|
||||||
# FIXME: Support wrap-file from wrapdb
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
w = cp["wrap-git"]
|
w = cp["wrap-git"]
|
||||||
|
|||||||
Reference in New Issue
Block a user