@@ -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
4242class 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
100114def test_get_windows_edition ():
@@ -282,13 +296,13 @@ def print_pacman(clients, show_ci):
282296
283297def 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