88import donate_cpu_lib as lib
99import argparse
1010import glob
11+ import gzip
12+ import natsort
1113import os
1214import sys
1315import random
16+ import re
17+ import requests
1418import subprocess
19+ import time
1520
1621
1722def format_float (a , b = 1 ):
@@ -20,6 +25,100 @@ def format_float(a, b=1):
2025 return 'N/A'
2126
2227
28+ def ftp_get (url ):
29+ try :
30+ response = requests .get (url , timeout = 300 )
31+ if response .ok :
32+ return response .content
33+ except Exception :
34+ pass
35+ return None
36+
37+
38+ def latestvername (names ):
39+ s = natsort .natsorted (names , key = lambda x : x [x .index ('_' )+ 1 :x .index ('.orig.tar' )])
40+ return s [- 1 ]
41+
42+
43+ def getpackages ():
44+ debian = 'https://ftp.debian.org/debian/'
45+
46+ data = ftp_get (debian + 'ls-lR.gz' )
47+ if data is None :
48+ print ('Failed to fetch ls-lR.gz' )
49+ sys .exit (1 )
50+
51+ lines = gzip .decompress (data ).decode ('utf-8' , errors = 'replace' ).splitlines ()
52+
53+ # Example content in ls-lR:
54+ #./pool/main/0/0xffff:
55+ #total 1452
56+ #-rw-r--r-- 2 dak debadmin 6524 Dec 25 2016 0xffff_0.7-2.debian.tar.xz
57+ #-rw-r--r-- 2 dak debadmin 1791 Dec 25 2016 0xffff_0.7-2.dsc
58+ #-rw-r--r-- 2 dak debadmin 57168 Dec 25 2016 0xffff_0.7-2_amd64.deb
59+ #-rw-r--r-- 2 dak debadmin 48578 Dec 26 2016 0xffff_0.7-2_arm64.deb
60+ #-rw-r--r-- 2 dak debadmin 56730 Dec 26 2016 0xffff_0.7-2_armel.deb
61+ #-rw-r--r-- 2 dak debadmin 57296 Dec 26 2016 0xffff_0.7-2_armhf.deb
62+ #-rw-r--r-- 2 dak debadmin 60254 Dec 26 2016 0xffff_0.7-2_i386.deb
63+ #-rw-r--r-- 2 dak debadmin 53130 Dec 26 2016 0xffff_0.7-2_mips.deb
64+ #-rw-r--r-- 2 dak debadmin 52542 Dec 26 2016 0xffff_0.7-2_mips64el.deb
65+ #-rw-r--r-- 2 dak debadmin 53712 Dec 26 2016 0xffff_0.7-2_mipsel.deb
66+ #-rw-r--r-- 2 dak debadmin 51908 Dec 26 2016 0xffff_0.7-2_ppc64el.deb
67+ #-rw-r--r-- 2 dak debadmin 53548 Dec 26 2016 0xffff_0.7-2_s390x.deb
68+ #-rw-r--r-- 2 dak debadmin 65248 Dec 25 2016 0xffff_0.7.orig.tar.gz
69+ #-rw-r--r-- 2 dak debadmin 6884 Jul 19 19:08 0xffff_0.8-1.debian.tar.xz
70+ #-rw-r--r-- 2 dak debadmin 1807 Jul 19 19:08 0xffff_0.8-1.dsc
71+ #-rw-r--r-- 2 dak debadmin 58908 Jul 19 19:08 0xffff_0.8-1_amd64.deb
72+ #-rw-r--r-- 2 dak debadmin 51340 Jul 19 19:58 0xffff_0.8-1_arm64.deb
73+ #-rw-r--r-- 2 dak debadmin 57612 Jul 19 20:13 0xffff_0.8-1_armel.deb
74+ #-rw-r--r-- 2 dak debadmin 58584 Jul 19 19:58 0xffff_0.8-1_armhf.deb
75+ #-rw-r--r-- 2 dak debadmin 57544 Jul 19 20:23 0xffff_0.8-1_hurd-i386.deb
76+ #-rw-r--r-- 2 dak debadmin 62048 Jul 19 23:54 0xffff_0.8-1_i386.deb
77+ #-rw-r--r-- 2 dak debadmin 55080 Jul 23 19:07 0xffff_0.8-1_kfreebsd-amd64.deb
78+ #-rw-r--r-- 2 dak debadmin 58392 Jul 23 19:07 0xffff_0.8-1_kfreebsd-i386.deb
79+ #-rw-r--r-- 2 dak debadmin 54144 Jul 19 22:28 0xffff_0.8-1_mips.deb
80+ #-rw-r--r-- 2 dak debadmin 53648 Jul 20 00:56 0xffff_0.8-1_mips64el.deb
81+ #-rw-r--r-- 2 dak debadmin 54740 Jul 19 22:58 0xffff_0.8-1_mipsel.deb
82+ #-rw-r--r-- 2 dak debadmin 57424 Jul 19 19:58 0xffff_0.8-1_ppc64el.deb
83+ #-rw-r--r-- 2 dak debadmin 53764 Jul 19 22:28 0xffff_0.8-1_s390x.deb
84+ #-rw-r--r-- 2 dak debadmin 64504 Jul 19 19:08 0xffff_0.8.orig.tar.gz
85+ #
86+
87+ path = None
88+ previous_path = ''
89+ archives = []
90+ filename = None
91+ filenames = []
92+ for line in lines :
93+ line = line .strip ()
94+ if len (line ) < 4 :
95+ if filename :
96+ res1 = re .match (r'(.*)-[0-9.]+$' , path )
97+ if res1 is None :
98+ res1 = re .match (r'(.*)[-.][0-9.]+$' , path )
99+ res2 = re .match (r'(.*)-[0-9.]+$' , previous_path )
100+ if res2 is None :
101+ res2 = re .match (r'(.*)[-.][0-9.]+$' , previous_path )
102+ if res1 is None or res2 is None or res1 .group (1 ) != res2 .group (1 ):
103+ archives .append (path + '/' + latestvername (filenames ))
104+ else :
105+ archives [- 1 ] = path + '/' + latestvername (filenames )
106+ if path :
107+ previous_path = path
108+ path = None
109+ filename = None
110+ filenames = []
111+ elif line .startswith ('./pool/main/' ):
112+ path = debian + line [2 :- 1 ]
113+ elif path and line .endswith (('.orig.tar.gz' , '.orig.tar.bz2' , '.orig.tar.xz' )):
114+ filename = line [1 + line .rfind (' ' ):]
115+ filenames .append (filename )
116+
117+ return archives
118+
119+
120+
121+
23122if __name__ == "__main__" :
24123 __my_script_name = os .path .splitext (os .path .basename (sys .argv [0 ]))[0 ]
25124 __work_path = os .path .expanduser (os .path .join ('~' , 'cppcheck-' + __my_script_name + '-workfolder' ))
@@ -40,6 +139,19 @@ def format_float(a, b=1):
40139
41140 print (args )
42141
142+ if args .packages_path :
143+ # You can download packages using daca2-download.py
144+ args .packages = glob .glob (os .path .join (args .packages_path , '*.tar.xz' ))
145+ random .shuffle (args .packages )
146+ elif args .packages is None :
147+ args .packages = getpackages ()
148+ random .shuffle (args .packages )
149+
150+ if args .p is None and args .packages :
151+ args .p = len (args .packages )
152+
153+ print ('\n ' .join (args .packages [:20 ]))
154+
43155 if not lib .check_requirements ():
44156 print ("Error: Check requirements" )
45157 sys .exit (1 )
@@ -100,35 +212,14 @@ def format_float(a, b=1):
100212 print ('Failed to compile your version of Cppcheck' )
101213 sys .exit (1 )
102214
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-
121215 packages_processed = 0
122216 crashes = []
123217 timeouts = []
124218
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 ())
219+ while packages_processed < args .p and args .packages :
220+ package = args .packages .pop ()
130221
131- if package .startswith ('ftp://' ) or package .startswith ('http ://' ):
222+ if package .startswith ('ftp://' ) or package .startswith ('https ://' ):
132223 tgz = lib .download_package (work_path , package , None )
133224 if tgz is None :
134225 print ("No package downloaded" )
0 commit comments