1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
import argparse
import os
import requests
import sys
import time
from subprocess import check_output
from packaging import tags
from packaging.utils import parse_wheel_filename
_sys_tags = None
def _is_wheel_compatible(wheel_filename: str):
global _sys_tags
try:
if _sys_tags is None:
_sys_tags = set(tags.sys_tags())
for tag in parse_wheel_filename(wheel_filename)[-1]:
if tag in _sys_tags:
return True
return False
except Exception as e:
print(f"Error parsing wheel file: {e}")
return False
def is_package_available(package_name, version):
url = f"https://pypi.org/pypi/{package_name}/{version}/json"
try:
response = requests.get(url)
if response.status_code != 200:
return False
data = response.json()
for file_info in data["urls"]:
name = file_info.get("filename", "")
if _is_wheel_compatible(name):
return True
return False
except requests.RequestException as e:
print(f"Error checking package: {e}")
return False
def is_dev_build():
if "NG_NO_DEV_PIP_VERSION" in os.environ:
return False
if (
"CI_COMMIT_REF_NAME" in os.environ
and os.environ["CI_COMMIT_REF_NAME"] == "release"
):
return False
return True
def get_git_version(cwd):
return check_output(["git", "describe", "--tags"], cwd=cwd).decode("utf-8").strip()
def get_version(cwd):
git_version = get_git_version(cwd)
version = git_version[1:].split("-")
if len(version) > 2:
version = version[:2]
if len(version) > 1:
version = ".post".join(version)
if is_dev_build():
version += ".dev0"
else:
version = version[0]
return version
def main():
parser = argparse.ArgumentParser(description="Netgen pip building utilities")
parser.add_argument(
"--check-pip",
action="store_true",
help="Check if package is on pypi already, fails with exit code 1 if available",
)
parser.add_argument(
"--wait-pip",
action="store_true",
help="Wait until package is on pypi, fails with exit code 1 if still not available after 300s",
)
parser.add_argument(
"--get-git-version",
action="store_true",
help="Generate the current package git version string",
)
parser.add_argument(
"--get-version",
action="store_true",
help="Generate the current package version using git",
)
parser.add_argument("--dir", type=str, default=".", help="CWD to run git commands")
parser.add_argument(
"--package",
type=str,
default="netgen-mesher",
help="Package name to check on pypi",
)
args = parser.parse_args()
if args.get_git_version:
print(get_git_version(args.dir))
elif args.get_version:
print(get_version(args.dir))
elif args.check_pip:
version = get_version(args.dir)
if is_package_available(args.package, version):
print(f"{args.package}=={version} is already on pypi")
sys.exit(1)
elif args.wait_pip:
version = get_version(args.dir)
t0 = time.time()
while time.time() - t0 < 300 and not is_package_available(
args.package, version
):
time.sleep(20)
if not is_package_available(args.package, version):
print(
f"Timeout waiting for package {args.package}=={version} to be available on pypi"
)
sys.exit(1)
else:
print("no action")
if __name__ == "__main__":
main()
|