19
19
import os
20
20
import re
21
21
import textwrap
22
+ from collections .abc import Mapping
22
23
23
24
from testlib import MachineCase
24
25
25
26
26
27
class PackageCase (MachineCase ):
27
- def setUp (self ):
28
+ def setUp (self ) -> None :
28
29
super ().setUp ()
29
30
30
31
self .repo_dir = os .path .join (self .vm_tmpdir , "repo" )
@@ -129,7 +130,7 @@ def setUp(self):
129
130
self .addCleanup (self .machine .execute , "systemctl disable --now dnf5-automatic.timer 2>/dev/null || true" )
130
131
self .addCleanup (self .machine .execute , "rm -r /etc/systemd/system/dnf5-automatic*.d && systemctl daemon-reload || true" )
131
132
132
- self .updateInfo = {}
133
+ self .updateInfo : dict [ tuple [ str , str , str ], Mapping [ str , str ]] = {}
133
134
134
135
# HACK: kpatch check sometimes complains that we don't set up a full repo in unrelated tests
135
136
self .allow_browser_errors ("Could not determine kpatch packages:.*repodata updates was not complete" )
@@ -138,8 +139,9 @@ def setUp(self):
138
139
# Helper functions for creating packages/repository
139
140
#
140
141
141
- def createPackage (self , name , version , release , install = False ,
142
- postinst = None , depends = "" , content = None , arch = None , provides = None , ** updateinfo ):
142
+ def createPackage (self , name : str , version : str , release : str , * , install : bool = False ,
143
+ postinst : str | None = None , depends : str = "" , content : Mapping [str , Mapping [str , str ] | str ] | None = None ,
144
+ arch : str | None = None , provides : str | None = None , ** updateinfo : str ) -> None :
143
145
"""Create a dummy package in repo_dir on self.machine
144
146
145
147
If install is True, install the package. Otherwise, update the package
@@ -151,15 +153,16 @@ def createPackage(self, name, version, release, install=False,
151
153
provides = ""
152
154
153
155
if self .backend == "apt" :
154
- self .createDeb (name , version + '-' + release , depends , postinst , install , content , arch , provides )
156
+ self .createDeb (name , version + '-' + release , depends , postinst , install = install , content = content , arch = arch , provides = provides )
155
157
elif self .backend == "alpm" :
156
- self .createPacmanPkg (name , version , release , depends , postinst , install , content , arch , provides )
158
+ self .createPacmanPkg (name , version , release , depends , postinst , install = install , content = content , arch = arch , provides = provides )
157
159
else :
158
- self .createRpm (name , version , release , depends , postinst , install , content , arch , provides )
160
+ self .createRpm (name , version , release , depends , postinst , install = install , content = content , arch = arch , provides = provides )
159
161
if updateinfo :
160
162
self .updateInfo [name , version , release ] = updateinfo
161
163
162
- def createDeb (self , name , version , depends , postinst , install , content , arch , provides ):
164
+ def createDeb (self , name : str , version : str , depends : str , postinst : str | None = None , * , install : bool ,
165
+ content : Mapping [str , Mapping [str , str ] | str ] | None = None , arch : str | None = None , provides : str | None = None ) -> None :
163
166
"""Create a dummy deb in repo_dir on self.machine
164
167
165
168
If install is True, install the package. Otherwise, update the package
@@ -178,7 +181,7 @@ def createDeb(self, name, version, depends, postinst, install, content, arch, pr
178
181
for path , data in content .items ():
179
182
dest = "/tmp/b/" + path
180
183
m .execute (f"mkdir -p '{ os .path .dirname (dest )} '" )
181
- if isinstance (data , dict ):
184
+ if isinstance (data , Mapping ):
182
185
m .execute (f"cp '{ data ['path' ]} ' '{ dest } '" )
183
186
else :
184
187
m .write (dest , data )
@@ -206,7 +209,8 @@ def createDeb(self, name, version, depends, postinst, install, content, arch, pr
206
209
m .execute (cmd )
207
210
self .addCleanup (m .execute , f"dpkg -P --force-depends --force-remove-reinstreq { name } 2>/dev/null || true" )
208
211
209
- def createRpm (self , name , version , release , requires , post , install , content , arch , provides ):
212
+ def createRpm (self , name : str , version : str , release : str , requires : str , post : str | None = None , * , install : bool ,
213
+ content : Mapping [str , Mapping [str , str ] | str ] | None = None , arch : str | None = None , provides : str | None = None ) -> None :
210
214
"""Create a dummy rpm in repo_dir on self.machine
211
215
212
216
If install is True, install the package. Otherwise, update the package
@@ -225,7 +229,7 @@ def createRpm(self, name, version, release, requires, post, install, content, ar
225
229
if content is not None :
226
230
for path , data in content .items ():
227
231
installcmds += f'mkdir -p $(dirname "$RPM_BUILD_ROOT/{ path } ")\n '
228
- if isinstance (data , dict ):
232
+ if isinstance (data , Mapping ):
229
233
installcmds += f"cp { data ['path' ]} \" $RPM_BUILD_ROOT/{ path } \" "
230
234
else :
231
235
installcmds += f'cat >"$RPM_BUILD_ROOT/{ path } " <<\' EOF\' \n ' + data + '\n EOF\n '
@@ -267,7 +271,8 @@ def createRpm(self, name, version, release, requires, post, install, content, ar
267
271
self .machine .execute (cmd .format (self .repo_dir , name , version , release , arch ))
268
272
self .addCleanup (self .machine .execute , f"rpm -e --nodeps { name } 2>/dev/null || true" )
269
273
270
- def createPacmanPkg (self , name , version , release , requires , postinst , install , content , arch , provides ):
274
+ def createPacmanPkg (self , name : str , version : str , release : str , requires : str , postinst : str | None = None , * , install : bool ,
275
+ content : Mapping [str , Mapping [str , str ] | str ] | None = None , arch : str | None = None , provides : str | None = None ) -> None :
271
276
"""Create a dummy pacman package in repo_dir on self.machine
272
277
273
278
If install is True, install the package. Otherwise, update the package
@@ -285,7 +290,7 @@ def createPacmanPkg(self, name, version, release, requires, postinst, install, c
285
290
for path , data in content .items ():
286
291
p = os .path .dirname (path )
287
292
installcmds += f'mkdir -p $pkgdir{ p } \n '
288
- if isinstance (data , dict ):
293
+ if isinstance (data , Mapping ):
289
294
dpath = data ["path" ]
290
295
291
296
file = os .path .basename (dpath )
@@ -348,7 +353,7 @@ def createPacmanPkg(self, name, version, release, requires, postinst, install, c
348
353
self .machine .execute (cmd )
349
354
self .addCleanup (self .machine .execute , f"pacman -Rdd --noconfirm { name } 2>/dev/null || true" )
350
355
351
- def createAptChangelogs (self ):
356
+ def createAptChangelogs (self ) -> None :
352
357
# apt metadata has no formal field for bugs/CVEs, they are parsed from the changelog
353
358
for ((pkg , ver , rel ), info ) in self .updateInfo .items ():
354
359
changes = info .get ("changes" , "some changes" )
@@ -366,7 +371,7 @@ def createAptChangelogs(self):
366
371
"""
367
372
self .machine .execute (f"mkdir -p $(dirname { path } ); echo '{ contents } ' > { path } " )
368
373
369
- def createYumUpdateInfo (self ):
374
+ def createYumUpdateInfo (self ) -> str :
370
375
xml = '<?xml version="1.0" encoding="UTF-8"?>\n <updates>\n '
371
376
for ((pkg , ver , rel ), info ) in self .updateInfo .items ():
372
377
refs = ""
@@ -402,10 +407,10 @@ def createYumUpdateInfo(self):
402
407
xml += '</updates>\n '
403
408
return xml
404
409
405
- def addPackageSet (self , name ) :
410
+ def addPackageSet (self , name : str ) -> None :
406
411
self .machine .execute (f"mkdir -p { self .repo_dir } ; cp /var/lib/package-sets/{ name } /* { self .repo_dir } " )
407
412
408
- def enableRepo (self ):
413
+ def enableRepo (self ) -> None :
409
414
if self .backend == "apt" :
410
415
self .createAptChangelogs ()
411
416
self .machine .execute (f"""echo 'deb [trusted=yes] file://{ self .repo_dir } /' > /etc/apt/sources.list.d/test.list
0 commit comments