Allows to build on Debian unstable while using latest dependenciespull/626/head
parent
555f6b8d7c
commit
3c51dd31bc
@ -0,0 +1,116 @@ |
|||||||
|
import json |
||||||
|
import subprocess |
||||||
|
from pathlib import Path |
||||||
|
from urllib.request import urlopen |
||||||
|
|
||||||
|
TARGET_DEBIAN_VERSIONS = ["sid"] |
||||||
|
IGNORE_PACKAGES = {"oxigraph-js", "oxigraph-testsuite", "pyoxigraph", "sparql-smith"} |
||||||
|
ALLOWED_MISSING_PACKAGES = {"escargot", "quick-xml"} |
||||||
|
|
||||||
|
base_path = Path(__file__).parent.parent |
||||||
|
|
||||||
|
cargo_metadata = json.loads( |
||||||
|
subprocess.check_output(["cargo", "metadata", "--format-version", "1"]) |
||||||
|
) |
||||||
|
package_by_id = {package["id"]: package for package in cargo_metadata["packages"]} |
||||||
|
workspace_packages = { |
||||||
|
package_id.split(" ")[0] |
||||||
|
for package_id in cargo_metadata["workspace_default_members"] |
||||||
|
} |
||||||
|
debian_cache = {} |
||||||
|
errors = set() |
||||||
|
|
||||||
|
|
||||||
|
def parse_version(version): |
||||||
|
return tuple(int(e) for e in version.split("-")[0].split(".")) |
||||||
|
|
||||||
|
|
||||||
|
for package_id in cargo_metadata["workspace_default_members"]: |
||||||
|
package = package_by_id[package_id] |
||||||
|
if package["name"] in IGNORE_PACKAGES: |
||||||
|
continue |
||||||
|
for dependency in package["dependencies"]: |
||||||
|
if ( |
||||||
|
dependency["name"] in workspace_packages |
||||||
|
or dependency["name"] in ALLOWED_MISSING_PACKAGES |
||||||
|
): |
||||||
|
continue |
||||||
|
candidate_debian_name = f"rust-{dependency['name'].replace('_', '-')}" |
||||||
|
if dependency["name"] not in debian_cache: |
||||||
|
with urlopen( |
||||||
|
f"https://sources.debian.org/api/src/{candidate_debian_name}/" |
||||||
|
) as response: |
||||||
|
debian_package = json.loads(response.read().decode()) |
||||||
|
debian_cache[candidate_debian_name] = debian_package |
||||||
|
debian_package = debian_cache[candidate_debian_name] |
||||||
|
if "error" in debian_package: |
||||||
|
errors.add(f"No Debian package found for {dependency['name']}") |
||||||
|
continue |
||||||
|
for target_debian_suite in TARGET_DEBIAN_VERSIONS: |
||||||
|
debian_version = next( |
||||||
|
( |
||||||
|
debian_version |
||||||
|
for debian_version in debian_package["versions"] |
||||||
|
if target_debian_suite in debian_version["suites"] |
||||||
|
), |
||||||
|
None, |
||||||
|
) |
||||||
|
if debian_version is None: |
||||||
|
errors.add( |
||||||
|
f"The debian package {debian_package['package']} does not support {target_debian_suite}" |
||||||
|
) |
||||||
|
continue |
||||||
|
|
||||||
|
# We check the debian version is compatible with the req version |
||||||
|
parsed_debian_version = parse_version(debian_version["version"]) |
||||||
|
for range_element in dependency["req"].split(","): |
||||||
|
range_element = range_element.strip() |
||||||
|
if range_element.startswith("^"): |
||||||
|
first_found = False |
||||||
|
for expected, actual in zip( |
||||||
|
parse_version(range_element[1:]), parsed_debian_version |
||||||
|
): |
||||||
|
if first_found: |
||||||
|
if actual > expected: |
||||||
|
break # Done |
||||||
|
if actual < expected: |
||||||
|
errors.add( |
||||||
|
f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" |
||||||
|
) |
||||||
|
break |
||||||
|
else: |
||||||
|
if actual != expected: |
||||||
|
errors.add( |
||||||
|
f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" |
||||||
|
) |
||||||
|
if expected != 0: |
||||||
|
first_found = True |
||||||
|
elif range_element.startswith(">="): |
||||||
|
if not parsed_debian_version >= parse_version(range_element[2:]): |
||||||
|
errors.add( |
||||||
|
f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" |
||||||
|
) |
||||||
|
elif range_element.startswith(">"): |
||||||
|
if not parsed_debian_version > parse_version(range_element[1:]): |
||||||
|
errors.add( |
||||||
|
f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" |
||||||
|
) |
||||||
|
elif range_element.startswith("<="): |
||||||
|
if not parsed_debian_version <= parse_version(range_element[2:]): |
||||||
|
errors.add( |
||||||
|
f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" |
||||||
|
) |
||||||
|
elif range_element.startswith("<"): |
||||||
|
if not parsed_debian_version < parse_version(range_element[1:]): |
||||||
|
errors.add( |
||||||
|
f"The debian package {debian_package['package']} version {debian_version['version']} is not compatible with requirement {range_element}" |
||||||
|
) |
||||||
|
else: |
||||||
|
errors.add( |
||||||
|
f"The requirement {range_element} of {dependency['name']} is not supported by this script" |
||||||
|
) |
||||||
|
|
||||||
|
for error in sorted(errors): |
||||||
|
print(error) |
||||||
|
if errors: |
||||||
|
exit(1) |
Loading…
Reference in new issue