Skip to content

Commit bafada0

Browse files
authored
Fix #14688 (test-my-pr.py: run against the debian ftp server directly) (#8491)
1 parent 92d9735 commit bafada0

1 file changed

Lines changed: 111 additions & 24 deletions

File tree

tools/test-my-pr.py

Lines changed: 111 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@
88
import donate_cpu_lib as lib
99
import argparse
1010
import glob
11+
import gzip
12+
import natsort
1113
import os
1214
import sys
1315
import random
16+
import re
17+
import requests
1418
import subprocess
1519

1620

@@ -20,6 +24,100 @@ def format_float(a, b=1):
2024
return 'N/A'
2125

2226

27+
def ftp_get(url):
28+
try:
29+
response = requests.get(url, timeout=300)
30+
response.raise_for_status()
31+
return response.content
32+
except requests.RequestException as err:
33+
print('Failed to fetch {}: {}'.format(url, err))
34+
return None
35+
36+
37+
def latestvername(names):
38+
s = natsort.natsorted(names, key=lambda x: x[x.index('_')+1:x.index('.orig.tar')])
39+
return s[-1]
40+
41+
42+
def getpackages():
43+
debian = 'https://ftp.debian.org/debian/'
44+
45+
data = ftp_get(debian + 'ls-lR.gz')
46+
if data is None:
47+
print('Failed to fetch ls-lR.gz')
48+
sys.exit(1)
49+
50+
lines = gzip.decompress(data).decode('utf-8', errors='replace').splitlines()
51+
52+
# Example content in ls-lR:
53+
#./pool/main/0/0xffff:
54+
#total 1452
55+
#-rw-r--r-- 2 dak debadmin 6524 Dec 25 2016 0xffff_0.7-2.debian.tar.xz
56+
#-rw-r--r-- 2 dak debadmin 1791 Dec 25 2016 0xffff_0.7-2.dsc
57+
#-rw-r--r-- 2 dak debadmin 57168 Dec 25 2016 0xffff_0.7-2_amd64.deb
58+
#-rw-r--r-- 2 dak debadmin 48578 Dec 26 2016 0xffff_0.7-2_arm64.deb
59+
#-rw-r--r-- 2 dak debadmin 56730 Dec 26 2016 0xffff_0.7-2_armel.deb
60+
#-rw-r--r-- 2 dak debadmin 57296 Dec 26 2016 0xffff_0.7-2_armhf.deb
61+
#-rw-r--r-- 2 dak debadmin 60254 Dec 26 2016 0xffff_0.7-2_i386.deb
62+
#-rw-r--r-- 2 dak debadmin 53130 Dec 26 2016 0xffff_0.7-2_mips.deb
63+
#-rw-r--r-- 2 dak debadmin 52542 Dec 26 2016 0xffff_0.7-2_mips64el.deb
64+
#-rw-r--r-- 2 dak debadmin 53712 Dec 26 2016 0xffff_0.7-2_mipsel.deb
65+
#-rw-r--r-- 2 dak debadmin 51908 Dec 26 2016 0xffff_0.7-2_ppc64el.deb
66+
#-rw-r--r-- 2 dak debadmin 53548 Dec 26 2016 0xffff_0.7-2_s390x.deb
67+
#-rw-r--r-- 2 dak debadmin 65248 Dec 25 2016 0xffff_0.7.orig.tar.gz
68+
#-rw-r--r-- 2 dak debadmin 6884 Jul 19 19:08 0xffff_0.8-1.debian.tar.xz
69+
#-rw-r--r-- 2 dak debadmin 1807 Jul 19 19:08 0xffff_0.8-1.dsc
70+
#-rw-r--r-- 2 dak debadmin 58908 Jul 19 19:08 0xffff_0.8-1_amd64.deb
71+
#-rw-r--r-- 2 dak debadmin 51340 Jul 19 19:58 0xffff_0.8-1_arm64.deb
72+
#-rw-r--r-- 2 dak debadmin 57612 Jul 19 20:13 0xffff_0.8-1_armel.deb
73+
#-rw-r--r-- 2 dak debadmin 58584 Jul 19 19:58 0xffff_0.8-1_armhf.deb
74+
#-rw-r--r-- 2 dak debadmin 57544 Jul 19 20:23 0xffff_0.8-1_hurd-i386.deb
75+
#-rw-r--r-- 2 dak debadmin 62048 Jul 19 23:54 0xffff_0.8-1_i386.deb
76+
#-rw-r--r-- 2 dak debadmin 55080 Jul 23 19:07 0xffff_0.8-1_kfreebsd-amd64.deb
77+
#-rw-r--r-- 2 dak debadmin 58392 Jul 23 19:07 0xffff_0.8-1_kfreebsd-i386.deb
78+
#-rw-r--r-- 2 dak debadmin 54144 Jul 19 22:28 0xffff_0.8-1_mips.deb
79+
#-rw-r--r-- 2 dak debadmin 53648 Jul 20 00:56 0xffff_0.8-1_mips64el.deb
80+
#-rw-r--r-- 2 dak debadmin 54740 Jul 19 22:58 0xffff_0.8-1_mipsel.deb
81+
#-rw-r--r-- 2 dak debadmin 57424 Jul 19 19:58 0xffff_0.8-1_ppc64el.deb
82+
#-rw-r--r-- 2 dak debadmin 53764 Jul 19 22:28 0xffff_0.8-1_s390x.deb
83+
#-rw-r--r-- 2 dak debadmin 64504 Jul 19 19:08 0xffff_0.8.orig.tar.gz
84+
#
85+
86+
path = None
87+
previous_path = ''
88+
archives = []
89+
filename = None
90+
filenames = []
91+
for line in lines:
92+
line = line.strip()
93+
if len(line) < 4:
94+
if filename:
95+
res1 = re.match(r'(.*)-[0-9.]+$', path)
96+
if res1 is None:
97+
res1 = re.match(r'(.*)[-.][0-9.]+$', path)
98+
res2 = re.match(r'(.*)-[0-9.]+$', previous_path)
99+
if res2 is None:
100+
res2 = re.match(r'(.*)[-.][0-9.]+$', previous_path)
101+
if res1 is None or res2 is None or res1.group(1) != res2.group(1):
102+
archives.append(path + '/' + latestvername(filenames))
103+
else:
104+
archives[-1] = path + '/' + latestvername(filenames)
105+
if path:
106+
previous_path = path
107+
path = None
108+
filename = None
109+
filenames = []
110+
elif line.startswith('./pool/main/'):
111+
path = debian + line[2:-1]
112+
elif path and line.endswith(('.orig.tar.gz', '.orig.tar.bz2', '.orig.tar.xz')):
113+
filename = line[1 + line.rfind(' '):]
114+
filenames.append(filename)
115+
116+
return archives
117+
118+
119+
120+
23121
if __name__ == "__main__":
24122
__my_script_name = os.path.splitext(os.path.basename(sys.argv[0]))[0]
25123
__work_path = os.path.expanduser(os.path.join('~', 'cppcheck-' + __my_script_name + '-workfolder'))
@@ -40,6 +138,16 @@ def format_float(a, b=1):
40138

41139
print(args)
42140

141+
if args.packages_path:
142+
# You can download packages using daca2-download.py
143+
args.packages = glob.glob(os.path.join(args.packages_path, '*.tar.xz'))
144+
random.shuffle(args.packages)
145+
elif args.packages is None:
146+
args.packages = getpackages()
147+
random.shuffle(args.packages)
148+
149+
print('\n'.join(args.packages[:20]))
150+
43151
if not lib.check_requirements():
44152
print("Error: Check requirements")
45153
sys.exit(1)
@@ -100,35 +208,14 @@ def format_float(a, b=1):
100208
print('Failed to compile your version of Cppcheck')
101209
sys.exit(1)
102210

103-
if args.packages_path:
104-
# You can download packages using daca2-download.py
105-
args.packages = glob.glob(os.path.join(args.packages_path, '*.tar.xz'))
106-
args.p = len(args.packages)
107-
packages_idxs = list(range(args.p))
108-
random.shuffle(packages_idxs)
109-
elif args.packages:
110-
args.p = len(args.packages)
111-
packages_idxs = []
112-
else:
113-
packages_count = lib.get_packages_count()
114-
if not packages_count:
115-
print("network or server might be temporarily down..")
116-
sys.exit(1)
117-
118-
packages_idxs = list(range(packages_count))
119-
random.shuffle(packages_idxs)
120-
121211
packages_processed = 0
122212
crashes = []
123213
timeouts = []
124214

125-
while (packages_processed < args.p and len(packages_idxs) > 0) or args.packages:
126-
if args.packages:
127-
package = args.packages.pop()
128-
else:
129-
package = lib.get_package(packages_idxs.pop())
215+
while packages_processed < args.p and args.packages:
216+
package = args.packages.pop()
130217

131-
if package.startswith('ftp://') or package.startswith('http://'):
218+
if package.startswith('ftp://') or package.startswith('https://'):
132219
tgz = lib.download_package(work_path, package, None)
133220
if tgz is None:
134221
print("No package downloaded")

0 commit comments

Comments
 (0)