@@ -32,6 +32,7 @@ def _padded(cls, iter, length, padding=0):
32
32
@classmethod
33
33
def from_string (cls , version_string ):
34
34
mod = 0
35
+ bump_patch_level = False
35
36
if version_string .endswith ("+" ):
36
37
version_string = version_string [0 :- 1 ]
37
38
mod = 1
@@ -42,19 +43,43 @@ def from_string(cls, version_string):
42
43
version_string = version_string [0 :- 1 ]
43
44
mod = - 1
44
45
# Deal with '-rcX' substrings
45
- if version_string . find ( '-rc' ) != - 1 :
46
+ if '-rc' in version_string :
46
47
version_string = version_string [0 :version_string .find ('-rc' )]
47
48
mod = - 1
49
+ # Deal with git describe generated substrings
50
+ elif '-' in version_string :
51
+ version_string = version_string [0 :version_string .find ('-' )]
52
+ mod = - 1
53
+ bump_patch_level = True
54
+
48
55
49
56
version = [int (part ) for part in version_string .split ("." )]
50
57
version = cls ._padded (version , 3 )
58
+ # Make from_string and from_version_array agree. For example:
59
+ # MongoDB Enterprise > db.runCommand('buildInfo').versionArray
60
+ # [ 3, 2, 1, -100 ]
61
+ # MongoDB Enterprise > db.runCommand('buildInfo').version
62
+ # 3.2.0-97-g1ef94fe
63
+ if bump_patch_level :
64
+ version [- 1 ] += 1
51
65
version .append (mod )
52
66
53
67
return Version (* version )
54
68
69
+ @classmethod
70
+ def from_version_array (cls , version_array ):
71
+ version = list (version_array )
72
+ if version [- 1 ] < 0 :
73
+ version [- 1 ] = - 1
74
+ version = cls ._padded (version , 3 )
75
+ return Version (* version )
76
+
55
77
@classmethod
56
78
def from_client (cls , client ):
57
- return cls .from_string (client .server_info ()['version' ])
79
+ info = client .server_info ()
80
+ if 'versionArray' in info :
81
+ return cls .from_version_array (info ['versionArray' ])
82
+ return cls .from_string (info ['version' ])
58
83
59
84
def at_least (self , * other_version ):
60
85
return self >= Version (* other_version )
0 commit comments