blob: 999d91633d808d8f80ca769c8cd88a42d66d5522 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# Copyright (c) 2021, Dell Inc. or its subsidiaries. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# See the LICENSE file for details.
#
# This file is part of NVMe STorage Appliance Services (nvme-stas).
#
# Authors: Martin Belanger <Martin.Belanger@dell.com>
#
''' distutils (and hence LooseVersion) is being deprecated. None of the
suggested replacements (e.g. from pkg_resources import parse_version) quite
work with Linux kernel versions the way LooseVersion does.
It was suggested to simply lift the LooseVersion code and vendor it in,
which is what this module is about.
'''
import re
class KernelVersion:
'''Code loosely lifted from distutils's LooseVersion'''
component_re = re.compile(r'(\d+ | [a-z]+ | \.)', re.VERBOSE)
def __init__(self, string: str):
self.string = string
self.version = self.__parse(string)
def __str__(self):
return self.string
def __repr__(self):
return f'KernelVersion ("{self}")'
def __eq__(self, other):
return self.version == self.__version(other)
def __lt__(self, other):
return self.version < self.__version(other)
def __le__(self, other):
return self.version <= self.__version(other)
def __gt__(self, other):
return self.version > self.__version(other)
def __ge__(self, other):
return self.version >= self.__version(other)
@staticmethod
def __version(obj):
return obj.version if isinstance(obj, KernelVersion) else KernelVersion.__parse(obj)
@staticmethod
def __parse(string):
components = []
for item in KernelVersion.component_re.split(string):
if item and item != '.':
try:
components.append(int(item))
except ValueError:
pass
return components
|