82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import re
 | |
| 
 | |
| from .semver import SemVer
 | |
| from .console_write import console_write
 | |
| 
 | |
| 
 | |
| def semver_compat(v):
 | |
|     if isinstance(v, SemVer):
 | |
|         return str(v)
 | |
| 
 | |
|     # Allowing passing in a dict containing info about a package
 | |
|     if isinstance(v, dict):
 | |
|         if 'version' not in v:
 | |
|             return '0'
 | |
|         v = v['version']
 | |
| 
 | |
|     # Trim v off of the front
 | |
|     v = re.sub('^v', '', v)
 | |
| 
 | |
|     # We prepend 0 to all date-based version numbers so that developers
 | |
|     # may switch to explicit versioning from GitHub/BitBucket
 | |
|     # versioning based on commit dates.
 | |
|     #
 | |
|     # When translating dates into semver, the way to get each date
 | |
|     # segment into the version is to treat the year and month as
 | |
|     # minor and patch, and then the rest as a numeric build version
 | |
|     # with four different parts. The result looks like:
 | |
|     # 0.2012.11+10.31.23.59
 | |
|     date_match = re.match('(\d{4})\.(\d{2})\.(\d{2})\.(\d{2})\.(\d{2})\.(\d{2})$', v)
 | |
|     if date_match:
 | |
|         v = '0.%s.%s+%s.%s.%s.%s' % date_match.groups()
 | |
| 
 | |
|     # This handles version that were valid pre-semver with 4+ dotted
 | |
|     # groups, such as 1.6.9.0
 | |
|     four_plus_match = re.match('(\d+\.\d+\.\d+)[T\.](\d+(\.\d+)*)$', v)
 | |
|     if four_plus_match:
 | |
|         v = '%s+%s' % (four_plus_match.group(1), four_plus_match.group(2))
 | |
| 
 | |
|     # Semver must have major, minor, patch
 | |
|     elif re.match('^\d+$', v):
 | |
|         v += '.0.0'
 | |
|     elif re.match('^\d+\.\d+$', v):
 | |
|         v += '.0'
 | |
|     return v
 | |
| 
 | |
| 
 | |
| def version_comparable(string):
 | |
|     return SemVer(semver_compat(string))
 | |
| 
 | |
| 
 | |
| def version_exclude_prerelease(versions):
 | |
|     output = []
 | |
|     for version in versions:
 | |
|         if SemVer(semver_compat(version)).prerelease != None:
 | |
|             continue
 | |
|         output.append(version)
 | |
|     return output
 | |
| 
 | |
| 
 | |
| def version_filter(versions, allow_prerelease=False):
 | |
|     output = []
 | |
|     for version in versions:
 | |
|         no_v_version = re.sub('^v', '', version)
 | |
|         if not SemVer.valid(no_v_version):
 | |
|             continue
 | |
|         if not allow_prerelease and SemVer(no_v_version).prerelease != None:
 | |
|             continue
 | |
|         output.append(version)
 | |
|     return output
 | |
| 
 | |
| 
 | |
| def _version_sort_key(item):
 | |
|     return SemVer(semver_compat(item))
 | |
| 
 | |
| 
 | |
| def version_sort(sortable, **kwargs):
 | |
|     try:
 | |
|         return sorted(sortable, key=_version_sort_key, **kwargs)
 | |
|     except (ValueError) as e:
 | |
|         console_write(u"Error sorting versions - %s" % e, True)
 | |
|         return []
 |