16
16
17
17
import git
18
18
import os
19
- import re
20
19
import shutil
21
20
import tarfile
22
21
import tempfile
23
22
from defusedxml import ElementTree
24
23
from fnmatch import fnmatch
25
24
from io import BytesIO
25
+ from pathlib import Path
26
26
27
- from arch .models import PackageArchitecture
28
27
from packages .models import PackageString
29
28
from packages .utils import find_evr
30
29
from patchman .signals import info_message , warning_message , error_message , pbar_start , pbar_update
@@ -37,13 +36,70 @@ def refresh_gentoo_main_repo(repo):
37
36
"""
38
37
mirrors = get_gentoo_mirror_urls ()
39
38
add_mirrors_from_urls (repo , mirrors )
39
+ ts = get_datetime_now ()
40
+ for mirror in repo .mirror_set .filter (mirrorlist = False , refresh = True , enabled = True ):
41
+ if mirror .url == 'https://api.gentoo.org/mirrors/distfiles.xml' :
42
+ mirror .mirrorlist = True
43
+ mirror .save ()
44
+ continue
45
+
46
+ res = get_url (mirror .url + '.md5sum' )
47
+ data = fetch_content (res , 'Fetching Repo checksum' )
48
+ if data is None :
49
+ mirror .fail ()
50
+ continue
51
+
52
+ checksum = data .decode ().split ()[0 ]
53
+ if checksum is None :
54
+ mirror .fail ()
55
+ continue
56
+
57
+ if mirror .packages_checksum == checksum :
58
+ text = 'Mirror checksum has not changed, not refreshing Package metadata'
59
+ warning_message .send (sender = None , text = text )
60
+ continue
61
+
62
+ res = get_url (mirror .url )
63
+ mirror .last_access_ok = response_is_valid (res )
64
+ if not mirror .last_access_ok :
65
+ mirror .fail ()
66
+ continue
67
+
68
+ data = fetch_content (res , 'Fetching Repo data' )
69
+ if data is None :
70
+ mirror .fail ()
71
+ continue
72
+ extracted = extract (data , mirror .url )
73
+ info_message .send (sender = None , text = f'Found Gentoo Repo - { mirror .url } ' )
74
+
75
+ computed_checksum = get_checksum (data , Checksum .md5 )
76
+ if not mirror_checksum_is_valid (computed_checksum , checksum , mirror , 'package' ):
77
+ mirror .fail ()
78
+ continue
79
+ else :
80
+ mirror .packages_checksum = checksum
81
+
82
+ packages = extract_gentoo_packages (mirror , extracted )
83
+ if packages :
84
+ update_mirror_packages (mirror , packages )
85
+
86
+ mirror .timestamp = ts
87
+ mirror .save ()
40
88
41
89
42
90
def refresh_gentoo_overlay_repo (repo ):
43
91
""" Refresh all mirrors of a Gentoo overlay repo
44
92
"""
45
93
mirrors = get_gentoo_overlay_mirrors (repo .repo_id )
46
94
add_mirrors_from_urls (repo , mirrors )
95
+ ts = get_datetime_now ()
96
+ for mirror in repo .mirror_set .filter (mirrorlist = False , refresh = True , enabled = True ):
97
+ # FIXME: need to check for failure
98
+ packages = extract_gentoo_overlay_packages (mirror )
99
+ if packages :
100
+ update_mirror_packages (mirror , packages )
101
+ mirror .timestamp = ts
102
+ mirror .save ()
47
103
48
104
49
105
def get_gentoo_ebuild_keywords (content ):
@@ -82,7 +138,10 @@ def get_gentoo_ebuild_keywords(content):
82
138
continue
83
139
keywords .add (keyword )
84
140
break
85
- return keywords
141
+ if keywords :
142
+ return keywords
143
+ else :
144
+ return default_keywords
86
145
87
146
88
147
def get_gentoo_overlay_mirrors (repo_name ):
@@ -157,7 +216,25 @@ def extract_gentoo_ebuilds(data):
157
216
for member in tar .getmembers ():
158
217
if member .isfile () and member .name .endswith ('ebuild' ) and not member .name .endswith ('skel.ebuild' ):
159
218
file_content = tar .extractfile (member ).read ()
160
- extracted_ebuilds [member .name ] = file_content
219
+ full_path = Path (member .name )
220
+ ebuild_path = Path (* full_path .parts [1 :])
221
+ extracted_ebuilds [str (ebuild_path )] = file_content
222
+ return extracted_ebuilds
223
+
224
+
225
+ def extract_gentoo_overlay_ebuilds (t ):
226
+ """ Extract ebuilds from a Gentoo overlay tarball
227
+ """
228
+ extracted_ebuilds = {}
229
+ for root , dirs , files in os .walk (t ):
230
+ for name in files :
231
+ if fnmatch (name , '*.ebuild' ):
232
+ package_name = root .replace (t + '/' , '' )
233
+ if len (package_name .split ('/' )) > 2 :
234
+ continue
235
+ with open (os .path .join (root , name ), 'rb' ) as f :
236
+ content = f .read ()
237
+ extracted_ebuilds [f'{ package_name } /{ name } ' ] = content
161
238
return extracted_ebuilds
162
239
163
240
@@ -175,14 +252,14 @@ def extract_gentoo_packages_from_ebuilds(extracted_ebuilds):
175
252
return
176
253
177
254
packages = set ()
178
- flen = len (extracted_ebuilds )
179
- pbar_start .send (sender = None , ptext = f'Processing { flen } ebuilds' , plen = flen )
255
+ elen = len (extracted_ebuilds )
256
+ pbar_start .send (sender = None , ptext = f'Processing { elen } ebuilds' , plen = elen )
180
257
for i , (path , content ) in enumerate (extracted_ebuilds .items ()):
181
258
pbar_update .send (sender = None , index = i + 1 )
182
259
components = path .split (os .sep )
183
- category = components [1 ]
184
- name = components [2 ]
185
- evr = components [3 ].replace (f'{ name } -' , '' ).replace ('.ebuild' , '' )
260
+ category = components [0 ]
261
+ name = components [1 ]
262
+ evr = components [2 ].replace (f'{ name } -' , '' ).replace ('.ebuild' , '' )
186
263
epoch , version , release = find_evr (evr )
187
264
arches = get_gentoo_ebuild_keywords (content )
188
265
for arch in arches :
@@ -205,78 +282,19 @@ def extract_gentoo_overlay_packages(mirror):
205
282
""" Extract packages from gentoo overlay repo
206
283
"""
207
284
t = tempfile .mkdtemp ()
208
- git .Repo .clone_from (mirror .url , t , branch = 'master' , depth = 1 )
285
+ info_message .send (sender = None , text = f'Extracting Gentoo packages from { mirror .url } ' )
286
+ git .Repo .clone_from (mirror .url , t , depth = 1 )
209
287
packages = set ()
210
- arch , c = PackageArchitecture .objects .get_or_create (name = 'any' )
211
- for root , dirs , files in os .walk (t ):
212
- for name in files :
213
- if fnmatch (name , '*.ebuild' ):
214
- full_name = root .replace (t + '/' , '' )
215
- p_category , p_name = full_name .split ('/' )
216
- m = re .match (fr'{ p_name } -(.*)\.ebuild' , name )
217
- if m :
218
- p_evr = m .group (1 )
219
- epoch , version , release = find_evr (p_evr )
220
- package = PackageString (
221
- name = p_name .lower (),
222
- epoch = epoch ,
223
- version = version ,
224
- release = release ,
225
- arch = arch ,
226
- packagetype = 'G' ,
227
- category = p_category ,
228
- )
229
- packages .add (package )
288
+ extracted_ebuilds = extract_gentoo_overlay_ebuilds (t )
230
289
shutil .rmtree (t )
290
+ packages = extract_gentoo_packages_from_ebuilds (extracted_ebuilds )
231
291
return packages
232
292
233
293
234
294
def refresh_gentoo_repo (repo ):
235
295
""" Refresh a Gentoo repo
236
296
"""
237
297
if repo .repo_id == 'gentoo' :
238
- repo_type = 'main'
239
298
refresh_gentoo_main_repo (repo )
240
299
else :
241
300
refresh_gentoo_overlay_repo (repo )
242
- repo_type = 'overlay'
243
- ts = get_datetime_now ()
244
- for mirror in repo .mirror_set .filter (mirrorlist = False , refresh = True , enabled = True ):
245
- res = get_url (mirror .url + '.md5sum' )
246
- data = fetch_content (res , 'Fetching Repo checksum' )
247
- if data is None :
248
- mirror .fail ()
249
- continue
250
- checksum = data .decode ().split ()[0 ]
251
- if checksum is None :
252
- mirror .fail ()
253
- continue
254
- if mirror .packages_checksum == checksum :
255
- text = 'Mirror checksum has not changed, not refreshing Package metadata'
256
- warning_message .send (sender = None , text = text )
257
- continue
258
- res = get_url (mirror .url )
259
- mirror .last_access_ok = response_is_valid (res )
260
- if mirror .last_access_ok :
261
- data = fetch_content (res , 'Fetching Repo data' )
262
- if data is None :
263
- mirror .fail ()
264
- continue
265
- extracted = extract (data , mirror .url )
266
- text = f'Found Gentoo Repo - { mirror .url } '
267
- info_message .send (sender = None , text = text )
268
- computed_checksum = get_checksum (data , Checksum .md5 )
269
- if not mirror_checksum_is_valid (computed_checksum , checksum , mirror , 'package' ):
270
- continue
271
- else :
272
- mirror .packages_checksum = checksum
273
- if repo_type == 'main' :
274
- packages = extract_gentoo_packages (mirror , extracted )
275
- elif repo_type == 'overlay' :
276
- packages = extract_gentoo_overlay_packages (mirror )
277
- mirror .timestamp = ts
278
- if packages :
279
- update_mirror_packages (mirror , packages )
280
- else :
281
- mirror .fail ()
282
- mirror .save ()
0 commit comments