File: common.py

package info (click to toggle)
austin 3.7.0-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,444 kB
  • sloc: ansic: 8,622; python: 2,669; sh: 106; makefile: 54
file content (59 lines) | stat: -rw-r--r-- 1,912 bytes parent folder | download | duplicates (2)
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
import sys
from itertools import product
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent.parent))

import tarfile
from io import BytesIO
from test.utils import Variant
from urllib.error import HTTPError
from urllib.request import urlopen
import json


def get_latest_release() -> str:
    with urlopen(
        "https://api.github.com/repos/p403n1x87/austin/releases/latest"
    ) as stream:
        return json.loads(stream.read().decode("utf-8"))["tag_name"].strip("v")


def download_release(version: str, dest: Path, variant_name: str = "austin") -> Variant:
    if version == "dev":
        return Variant(f"src/{variant_name}")

    binary_dest = dest / version
    binary = binary_dest / variant_name

    if not binary.exists():
        prefix = "https://github.com/p403n1x87/austin/releases/download/"
        for flavour, v in product({"-gnu", ""}, {"", "v"}):
            try:
                with urlopen(
                    f"{prefix}v{version}/{variant_name}-{v}{version}{flavour}-linux-amd64.tar.xz"
                ) as stream:
                    buffer = BytesIO(stream.read())
                    binary_dest.mkdir(parents=True, exist_ok=True)
                    tar = tarfile.open(fileobj=buffer, mode="r:xz")
                    tar.extract(variant_name, str(binary_dest))
            except HTTPError:
                continue
            break
        else:
            raise RuntimeError(f"Could not download Austin version {version}")

    variant = Variant(str(binary))

    out = variant("-V").stdout
    assert f"{variant_name} {version}" in out, (f"{variant_name} {version}", out)

    return variant


def download_latest(dest: Path, variant_name: str = "austin") -> Variant:
    return download_release(get_latest_release(), dest, variant_name)


def get_dev(variant_name: str = "austin") -> Variant:
    return download_release("dev", None, variant_name)