|
|
@@ -37,14 +37,22 @@ import requests
|
|
|
GITHUB_API = 'https://api.github.com/repos'
|
|
|
|
|
|
|
|
|
-class Version(namedtuple('_Version', 'major minor patch rc')):
|
|
|
+class Version(namedtuple('_Version', 'major minor patch rc edition')):
|
|
|
|
|
|
@classmethod
|
|
|
def parse(cls, version):
|
|
|
+ edition = None
|
|
|
version = version.lstrip('v')
|
|
|
version, _, rc = version.partition('-')
|
|
|
+ if rc:
|
|
|
+ if 'rc' not in rc:
|
|
|
+ edition = rc
|
|
|
+ rc = None
|
|
|
+ elif '-' in rc:
|
|
|
+ edition, rc = rc.split('-')
|
|
|
+
|
|
|
major, minor, patch = version.split('.', 3)
|
|
|
- return cls(major, minor, patch, rc)
|
|
|
+ return cls(major, minor, patch, rc, edition)
|
|
|
|
|
|
@property
|
|
|
def major_minor(self):
|
|
|
@@ -61,7 +69,8 @@ class Version(namedtuple('_Version', 'major minor patch rc')):
|
|
|
|
|
|
def __str__(self):
|
|
|
rc = '-{}'.format(self.rc) if self.rc else ''
|
|
|
- return '.'.join(map(str, self[:3])) + rc
|
|
|
+ edition = '-{}'.format(self.edition) if self.edition else ''
|
|
|
+ return '.'.join(map(str, self[:3])) + edition + rc
|
|
|
|
|
|
|
|
|
def group_versions(versions):
|
|
|
@@ -94,6 +103,7 @@ def get_latest_versions(versions, num=1):
|
|
|
group.
|
|
|
"""
|
|
|
versions = group_versions(versions)
|
|
|
+ num = min(len(versions), num)
|
|
|
return [versions[index][0] for index in range(num)]
|
|
|
|
|
|
|
|
|
@@ -112,16 +122,18 @@ def get_versions(tags):
|
|
|
print("Skipping invalid tag: {name}".format(**tag), file=sys.stderr)
|
|
|
|
|
|
|
|
|
-def get_github_releases(project):
|
|
|
+def get_github_releases(projects):
|
|
|
"""Query the Github API for a list of version tags and return them in
|
|
|
sorted order.
|
|
|
|
|
|
See https://developer.github.com/v3/repos/#list-tags
|
|
|
"""
|
|
|
- url = '{}/{}/tags'.format(GITHUB_API, project)
|
|
|
- response = requests.get(url)
|
|
|
- response.raise_for_status()
|
|
|
- versions = get_versions(response.json())
|
|
|
+ versions = []
|
|
|
+ for project in projects:
|
|
|
+ url = '{}/{}/tags'.format(GITHUB_API, project)
|
|
|
+ response = requests.get(url)
|
|
|
+ response.raise_for_status()
|
|
|
+ versions.extend(get_versions(response.json()))
|
|
|
return sorted(versions, reverse=True, key=operator.attrgetter('order'))
|
|
|
|
|
|
|
|
|
@@ -136,7 +148,7 @@ def parse_args(argv):
|
|
|
|
|
|
def main(argv=None):
|
|
|
args = parse_args(argv)
|
|
|
- versions = get_github_releases(args.project)
|
|
|
+ versions = get_github_releases(args.project.split(','))
|
|
|
|
|
|
if args.command == 'recent':
|
|
|
print(' '.join(map(str, get_latest_versions(versions, args.num))))
|