-
Notifications
You must be signed in to change notification settings - Fork 137
/
Copy pathutils.py
153 lines (122 loc) · 4 KB
/
utils.py
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
143
144
145
146
147
148
149
150
151
152
153
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_dev_extension(cwd):
if not is_dev_build():
return ""
# if the current commit does not belong to master, build a .dev1 package to avoid name conflicts for subsequent nightly builds from master
try:
check_output(["git", "merge-base", "--is-ancestor", "HEAD", "master"], cwd=cwd)
return ".dev0"
except:
return ".dev1"
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)
version += get_dev_extension(cwd)
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()