@@ -63,6 +63,49 @@ def handler(*args, **kwargs):
63
63
'slurm-perlapi' ,
64
64
'slurm-slurmdbd' ]
65
65
66
+
67
+ # ------------------------------------------------------------------------------
68
+ # Helper Classes
69
+ # ------------------------------------------------------------------------------
70
+
71
+ class PackageVersion :
72
+ """Compare the installed rpm version of a package to an "[E:]V[-R]" string.
73
+
74
+ If the Release field is not specified for [E:]V[-R], it will be ignored
75
+ for the package's evr in the comparison. The default Epoch is "0".
76
+
77
+ Example package version tests:
78
+
79
+ PackageVersion('osg-release') == '3.4'
80
+ PackageVersion('xrootd-lcmaps') >= '1.4.0'
81
+ PackageVersion('voms-server') < '2.0.12-3.2'
82
+
83
+ Version ranges can also be tested in the normal python fashion:
84
+
85
+ '8.4.0' <= PackageVersion('condor') < '8.8.0'
86
+ """
87
+
88
+ def __init__ (self , pkgname ):
89
+ e ,n ,v ,r ,a = get_package_envra (pkgname )
90
+ self .evr = e ,v ,r
91
+
92
+ def __repr__ (self ):
93
+ return "%s:%s-%s" % self .evr
94
+
95
+ def __cmp__ (self , evr ):
96
+ if isinstance (evr , str ):
97
+ evr = stringToVersion (evr )
98
+ else :
99
+ raise TypeError ('PackageVersion compares to "[E:]V[-R]" string' )
100
+
101
+ if evr [2 ] is None :
102
+ pkg_evr = (self .evr [0 ], self .evr [1 ], None )
103
+ else :
104
+ pkg_evr = self .evr
105
+
106
+ return rpm .labelCompare (pkg_evr , evr )
107
+
108
+
66
109
# ------------------------------------------------------------------------------
67
110
# Global Functions
68
111
# ------------------------------------------------------------------------------
@@ -406,47 +449,6 @@ def get_package_envra(package_name):
406
449
return (epoch , name , version , release , arch )
407
450
408
451
409
- def version_compare (evr1 , evr2 ):
410
- """Compare the EVRs (epoch, version, release) of two RPMs and return
411
- - -1 if the first EVR is older than the second,
412
- - 0 if the two arguments are equal,
413
- - 1 if the first EVR is newer than the second.
414
-
415
- Each EVR may be specified as a string (of the form "V-R" or "E:V-R"), or
416
- as a 3-element tuple or list.
417
-
418
- """
419
- if is_string (evr1 ):
420
- epoch1 , version1 , release1 = stringToVersion (evr1 )
421
- elif isinstance (evr1 , bytes ):
422
- epoch1 , version1 , release1 = stringToVersion (evr1 .decode ())
423
- else :
424
- epoch1 , version1 , release1 = evr1
425
-
426
- if is_string (evr2 ):
427
- epoch2 , version2 , release2 = stringToVersion (evr2 )
428
- elif isinstance (evr2 , bytes ):
429
- epoch2 , version2 , release2 = stringToVersion (evr2 .decode ())
430
- else :
431
- epoch2 , version2 , release2 = evr2
432
-
433
- return rpm .labelCompare ((epoch1 , version1 , release1 ), (epoch2 , version2 , release2 ))
434
-
435
- def package_version_compare (package_name , evr ):
436
- """Compare EVR of installed package_name to provided evr and return:
437
- -1 if the package version is older than evr,
438
- 0 if the package version is equal to evr,
439
- 1 if the package version is newer than evr.
440
-
441
- evr can be a string ("[E:]V[-R]") or 3-element tuple or list.
442
-
443
- This is a wrapper around 'version_compare' that avoids having to call
444
- 'get_package_envra' and extract (e,v,r)
445
- """
446
- e ,n ,v ,r ,a = get_package_envra (package_name )
447
- return version_compare ((e ,v ,r ), evr )
448
-
449
-
450
452
def diagnose (message , command , status , stdout , stderr ):
451
453
"""Constructs a detailed failure message based on arguments."""
452
454
result = message + '\n '
0 commit comments