Skip to content

Commit 42a7e6a

Browse files
committed
logstats: add arm64 detection support
Parse the new ARM64 flag to detect if we are running on arm64 hardware. Since all that wow64/xta/prism stuff gets confusing fast just derive the cygwin and host arch from the UA instead and display that. Imo easier to understand for people not familiar with the internals.
1 parent 6749715 commit 42a7e6a

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

msys2-logstats

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,15 @@ class UserAgent:
3333
pacman_version: Tuple[int, int, int]
3434
windows_version: Tuple[int, int]
3535
build_number: int
36-
is_wow64: bool
37-
cpu_arch: str
36+
cygwin_arch: str
37+
host_arch: str
3838
libalpm_version: Tuple[int, int, int]
3939

4040

4141
@dataclass
4242
class ClientInfo:
4343
pacman_version: str
4444
windows_edition: str
45-
cpu_arch: str
46-
is_wow64: str
4745
user_agent: UserAgent
4846
ci: str
4947

@@ -56,21 +54,28 @@ def parse_user_agent(ua: str) -> UserAgent:
5654
assert is_valid_user_agent(ua)
5755
m = re.match(r"pacman/([^\s]+) \(([^-]+)-([^-]+)-?([0-9]+|)-?(.+|) ([^)]+)\) libalpm/(.+)", ua)
5856
assert m is not None
59-
pacman_version, _, windows_version, build_number, wow64, arch, alpm_version = m.groups()
57+
pacman_version, _, windows_version, build_number, extra, arch, alpm_version = m.groups()
6058

6159
pacman_version = tuple(map(int, pacman_version.split("-")[0].split(".")))
6260
windows_version = tuple(map(int, windows_version.split(".")))
6361
build_number = int(build_number or "-1")
64-
is_wow64 = bool(wow64)
65-
cpu_arch = arch
62+
cygwin_arch = arch
63+
if extra in ("WOW64", "WOW") and cygwin_arch == "i686":
64+
host_arch = "x86_64"
65+
elif extra == "ARM64":
66+
host_arch = "aarch64"
67+
elif extra:
68+
host_arch = "???"
69+
else:
70+
host_arch = cygwin_arch
6671
alpm_version = tuple(map(int, alpm_version.split(".")))
6772

6873
return UserAgent(
6974
pacman_version,
7075
windows_version,
7176
build_number,
72-
is_wow64,
73-
cpu_arch,
77+
cygwin_arch,
78+
host_arch,
7479
alpm_version
7580
)
7681

@@ -79,22 +84,31 @@ def test_parse_user_agent():
7984
ua = "pacman/6.0.1 (MSYS_NT-10.0-19042 x86_64) libalpm/13.0.1"
8085
assert parse_user_agent(ua).pacman_version == (6, 0, 1)
8186
ua = "pacman/6.0.1 (MSYS_NT-10.0-19042-WOW64 i686) libalpm/13.0.1"
82-
assert parse_user_agent(ua).is_wow64
87+
assert parse_user_agent(ua).cygwin_arch == "i686"
88+
assert parse_user_agent(ua).host_arch == "x86_64"
8389
assert parse_user_agent(ua).build_number == 19042
8490
ua = "pacman/5.2.1 (MSYS_NT-6.1-7601-WOW64 i686) libalpm/12.0.1"
85-
assert parse_user_agent(ua).is_wow64
91+
assert parse_user_agent(ua).cygwin_arch == "i686"
92+
assert parse_user_agent(ua).host_arch == "x86_64"
8693
assert parse_user_agent(ua).build_number == 7601
8794
ua = "pacman/5.1.0 (MINGW64_NT-10.0 x86_64) libalpm/11.0.0"
8895
assert parse_user_agent(ua).build_number == -1
89-
assert parse_user_agent(ua).cpu_arch == "x86_64"
96+
assert parse_user_agent(ua).cygwin_arch == "x86_64"
97+
assert parse_user_agent(ua).host_arch == "x86_64"
9098
ua = "pacman/5.0.1 (UCRT64_NT-10.0-WOW i686) libalpm/10.0.1"
9199
assert parse_user_agent(ua).build_number == -1
92-
assert parse_user_agent(ua).is_wow64
93-
assert parse_user_agent(ua).cpu_arch == "i686"
100+
assert parse_user_agent(ua).host_arch == "x86_64"
101+
assert parse_user_agent(ua).cygwin_arch == "i686"
94102
ua = "pacman/4.2.1-313-g5535-dirty (MINGW64_NT-6.1 x86_64) libalpm/9.0.1"
95103
assert parse_user_agent(ua).pacman_version == (4, 2, 1)
96104
ua = "pacman/6.0.1 (MSYS_NT-6.0-6002 x86_64) libalpm/13.0.1"
97105
assert parse_user_agent(ua).windows_version == (6, 0)
106+
ua = "pacman/6.1.0 (MSYS_NT-10.0-22631-ARM64 x86_64) libalpm/14.0.0"
107+
assert parse_user_agent(ua).host_arch == "aarch64"
108+
assert parse_user_agent(ua).cygwin_arch == "x86_64"
109+
ua = "pacman/6.1.0 (MSYS_NT-10.0-22631-ARM64 i686) libalpm/14.0.0"
110+
assert parse_user_agent(ua).host_arch == "aarch64"
111+
assert parse_user_agent(ua).cygwin_arch == "i686"
98112

99113

100114
def test_get_windows_edition():
@@ -282,13 +296,13 @@ def print_pacman(clients, show_ci):
282296

283297
def print_system_arch(clients, show_ci):
284298
table = []
285-
for (cpu_arch, is_wow64, ci), count in Counter([(u.cpu_arch, u.is_wow64, u.ci) for u in clients]).most_common():
299+
for (cygwin_arch, host_arch, ci), count in Counter([(u.user_agent.cygwin_arch, u.user_agent.host_arch, u.ci) for u in clients]).most_common():
286300
pcnt = count / len(clients) * 100
287-
line = [cpu_arch, is_wow64, ci, f"{pcnt:.2f}%", f"{count}"]
301+
line = [cygwin_arch, host_arch, ci, f"{pcnt:.2f}%", f"{count}"]
288302
if not show_ci:
289303
line.pop(2)
290304
table.append(line)
291-
headers = ["Arch", "WOW64", "CI", "% Clients", "Clients"]
305+
headers = ["Cygwin Arch", "Host Arch", "CI", "% Clients", "Clients"]
292306
if not show_ci:
293307
headers.pop(2)
294308
print()
@@ -392,8 +406,6 @@ def main(argv):
392406
client_info = ClientInfo(
393407
".".join(map(str, user_agent.pacman_version)),
394408
get_windows_edition(user_agent),
395-
user_agent.cpu_arch,
396-
str(user_agent.is_wow64),
397409
user_agent,
398410
ci
399411
)

0 commit comments

Comments
 (0)