4
4
import dataclasses
5
5
import difflib
6
6
import logging
7
- import subprocess
8
7
import tomllib
9
8
from pathlib import Path
10
9
from typing import Final
11
10
12
11
import click
13
12
import rich
14
- from packaging .version import InvalidVersion , Version
13
+ from packaging .version import Version
15
14
from rich .logging import RichHandler
16
15
from rich .syntax import Syntax
17
16
17
+ from cibuildwheel .extra import github_api_request
18
+
18
19
log = logging .getLogger ("cibw" )
19
20
20
21
# Looking up the dir instead of using utils.resources_dir
30
31
31
32
@dataclasses .dataclass (frozen = True , order = True )
32
33
class VersionTuple :
34
+ name : str
35
+ download_url : str
33
36
version : Version
34
- version_string : str
35
-
36
-
37
- def git_ls_remote_versions (url : str ) -> list [VersionTuple ]:
38
- versions : list [VersionTuple ] = []
39
- tags = subprocess .run (
40
- ["git" , "ls-remote" , "--tags" , url ], check = True , text = True , capture_output = True
41
- ).stdout .splitlines ()
42
- for tag in tags :
43
- _ , ref = tag .split ()
44
- assert ref .startswith ("refs/tags/" )
45
- version_string = ref [10 :]
46
- try :
47
- version = Version (version_string )
48
- if version .is_devrelease :
49
- log .info ("Ignoring development release %r" , str (version ))
50
- continue
51
- if version .is_prerelease :
52
- log .info ("Ignoring pre-release %r" , str (version ))
53
- continue
54
- versions .append (VersionTuple (version , version_string ))
55
- except InvalidVersion :
56
- log .warning ("Ignoring ref %r" , ref )
57
- versions .sort (reverse = True )
58
- return versions
37
+
38
+
39
+ def get_latest_virtualenv_release () -> VersionTuple :
40
+ response = github_api_request ("repos/pypa/get-virtualenv/releases/latest" )
41
+ tag_name = response ["tag_name" ]
42
+
43
+ asset = next (
44
+ (asset for asset in response ["assets" ] if asset ["name" ] == "virtualenv.pyz" ),
45
+ None ,
46
+ )
47
+ if not asset :
48
+ msg = "No asset named 'virtualenv.pyz' found in the latest release of get-virtualenv."
49
+ raise RuntimeError (msg )
50
+
51
+ return VersionTuple (
52
+ version = Version (tag_name ), name = tag_name , download_url = asset ["browser_download_url" ]
53
+ )
59
54
60
55
61
56
@click .command ()
@@ -78,14 +73,20 @@ def update_virtualenv(force: bool, level: str) -> None:
78
73
with toml_file_path .open ("rb" ) as f :
79
74
configurations = tomllib .load (f )
80
75
default = configurations .pop ("default" )
81
- version = str (default ["version" ])
82
- versions = git_ls_remote_versions (GET_VIRTUALENV_GITHUB )
83
- if versions [0 ].version > Version (version ):
84
- version = versions [0 ].version_string
76
+ local_version = str (default ["version" ])
77
+
78
+ latest_release = get_latest_virtualenv_release ()
79
+
80
+ if latest_release .version > Version (local_version ):
81
+ version = latest_release .name
82
+ url = latest_release .download_url
83
+ else :
84
+ version = local_version
85
+ url = default ["url" ]
85
86
86
87
configurations ["default" ] = {
87
88
"version" : version ,
88
- "url" : GET_VIRTUALENV_URL_TEMPLATE . format ( version = version ) ,
89
+ "url" : url ,
89
90
}
90
91
result_toml = "" .join (
91
92
f'{ key } = {{ version = "{ value ["version" ]} ", url = "{ value ["url" ]} " }}\n '
0 commit comments