@@ -25,6 +25,7 @@ def _padded(iter, length, padding=0):
2525
2626def _parse_version_string (version_string ):
2727 mod = 0
28+ bump_patch_level = False
2829 if version_string .endswith ("+" ):
2930 version_string = version_string [0 :- 1 ]
3031 mod = 1
@@ -35,20 +36,44 @@ def _parse_version_string(version_string):
3536 version_string = version_string [0 :- 1 ]
3637 mod = - 1
3738 # Deal with '-rcX' substrings
38- if version_string . find ( '-rc' ) != - 1 :
39+ if '-rc' in version_string :
3940 version_string = version_string [0 :version_string .find ('-rc' )]
4041 mod = - 1
42+ # Deal with git describe generated substrings
43+ elif '-' in version_string :
44+ version_string = version_string [0 :version_string .find ('-' )]
45+ mod = - 1
46+ bump_patch_level = True
47+
4148
4249 version = [int (part ) for part in version_string .split ("." )]
4350 version = _padded (version , 3 )
51+ # Make _parse_version_string and _parse_version_array agree. For example:
52+ # MongoDB Enterprise > db.runCommand('buildInfo').versionArray
53+ # [ 3, 2, 1, -100 ]
54+ # MongoDB Enterprise > db.runCommand('buildInfo').version
55+ # 3.2.0-97-g1ef94fe
56+ if bump_patch_level :
57+ version [- 1 ] += 1
4458 version .append (mod )
4559
4660 return tuple (version )
4761
4862
63+ def _parse_version_array (version_array ):
64+ version = list (version_array )
65+ if version [- 1 ] < 0 :
66+ version [- 1 ] = - 1
67+ version = _padded (version , 3 )
68+ return tuple (version )
69+
70+
4971# Note this is probably broken for very old versions of the database...
5072def version (client ):
51- return _parse_version_string (client .server_info ()["version" ])
73+ info = client .server_info ()
74+ if "versionArray" in info :
75+ return _parse_version_array (info ["versionArray" ])
76+ return _parse_version_string (info ["version" ])
5277
5378
5479def at_least (client , min_version ):
0 commit comments