|
38 | 38 | import re
|
39 | 39 | import subprocess
|
40 | 40 | import sys
|
41 |
| -try: |
42 |
| - # Prefer newer `packaging` over deprecated packages. |
43 |
| - from packaging.version import Version as Version |
44 |
| - from packaging.version import parse as parse_version |
45 |
| -except ImportError: |
46 |
| - # Fallback to deprecated pkg_resources. |
47 |
| - try: |
48 |
| - from pkg_resources.extern.packaging.version import Version |
49 |
| - from pkg_resources import parse_version |
50 |
| - except ImportError: |
51 |
| - # Fallback to deprecated distutils. |
52 |
| - from distutils.version import LooseVersion as Version |
53 |
| - from distutils.version import LooseVersion as parse_version |
| 41 | + |
| 42 | +class Version: |
| 43 | + def __init__(self, s): |
| 44 | + pat = r'(\d+)\.(\d+)\.(\d+)(\-\S+)?' |
| 45 | + match = re.match(pat, s) |
| 46 | + assert match, "Unrecognized version string %s" % s |
| 47 | + self.major, self.minor, self.micro = ( |
| 48 | + map(int, (match.group(1), match.group(2), match.group(3)))) |
| 49 | + |
| 50 | + if match.group(4): |
| 51 | + self.prerelease = match.group(4)[1:] |
| 52 | + else: |
| 53 | + self.prerelease = '' |
| 54 | + |
| 55 | + def __lt__(self, other): |
| 56 | + if self.major != other.major: |
| 57 | + return self.major < other.major |
| 58 | + if self.minor != other.minor: |
| 59 | + return self.minor < other.minor |
| 60 | + if self.micro != other.micro: |
| 61 | + return self.micro < other.micro |
| 62 | + if self.prerelease != other.prerelease: |
| 63 | + if self.prerelease != '' and other.prerelease == '': |
| 64 | + # Consider a prerelease less than non-prerelease. |
| 65 | + return True |
| 66 | + # For simplicity, compare prerelease versions lexicographically. |
| 67 | + return self.prerelease < other.prerelease |
| 68 | + |
| 69 | + # Versions are equal. |
| 70 | + return False |
| 71 | + |
| 72 | + def __eq__(self, other): |
| 73 | + self_tuple = self.major, self.minor, self.micro, self.prerelease |
| 74 | + other_tuple = other.major, other.minor, other.micro, other.prerelease |
| 75 | + return self_tuple == other_tuple |
| 76 | + |
| 77 | + |
| 78 | +def parse_version(ver): |
| 79 | + return Version(ver) |
54 | 80 |
|
55 | 81 | DEBUG = len(sys.argv) > 1 and '-d' in sys.argv
|
56 | 82 | if DEBUG:
|
|
0 commit comments