File: utils.py

package info (click to toggle)
netgen 6.2.2601%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 13,076 kB
  • sloc: cpp: 166,627; tcl: 6,310; python: 2,868; sh: 522; makefile: 90
file content (142 lines) | stat: -rw-r--r-- 3,736 bytes parent folder | download | duplicates (3)
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()