blob: 0b3ae4ea5f4c873b91c8f1d97e698e6a4b37e0b3 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright (C) 2018 Codethink Limited
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
#
# Authors:
# Tristan Van Berkom <tristan.vanberkom@codethink.co.uk>
#
import click
import subprocess
import re
# The badge template is modeled after the gitlab badge svgs
#
BADGE_TEMPLATE = """
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="116" height="20">
<a xlink:href="{url_target}">
<linearGradient id="{badge_name}_b" x2="0" y2="100%">
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
<stop offset="1" stop-opacity=".1"/>
</linearGradient>
<mask id="{badge_name}_a">
<rect width="116" height="20" rx="3" fill="#fff"/>
</mask>
<g mask="url(#{badge_name}_a)">
<path fill="#555"
d="M0 0 h62 v20 H0 z"/>
<path fill="{color}"
d="M62 0 h54 v20 H62 z"/>
<path fill="url(#{badge_name}_b)"
d="M0 0 h116 v20 H0 z"/>
</g>
<g fill="#fff" text-anchor="middle">
<g font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
<text x="31" y="15" fill="#010101" fill-opacity=".3">
{badge_name}
</text>
<text x="31" y="14">
{badge_name}
</text>
<text x="89" y="15" fill="#010101" fill-opacity=".3">
{version}
</text>
<text x="89" y="14">
{version}
</text>
</g>
</g>
</a>
</svg>
"""
# The redirect template is for a static html page hosted in the
# latest docs which always redirects you to the latest snapshot
# or release on github.
#
REDIRECT_TEMPLATE = """
<!DOCTYPE html>
<html>
<head>
<title>Latest {badge_name}</title>
<meta http-equiv="refresh" content="0;url={url_target}"/>
</head>
<body>
<p></p>
</body>
</html>
"""
URL_FORMAT = 'https://github.com/apache/buildstream/releases/tag/{version}'
RELEASE_COLOR = '#0040FF'
SNAPSHOT_COLOR = '#FF8000'
VERSION_TAG_MATCH = r'([0-9]*)\.([0-9]*)\.([0-9]*)'
# Parse a release tag and return a three tuple
# of the major, minor and micro version.
#
# Tags which do not follow the release tag format
# will just be returned as (0, 0, 0)
#
def parse_tag(tag):
match = re.search(VERSION_TAG_MATCH, tag)
if match:
major = match.group(1)
minor = match.group(2)
micro = match.group(3)
return (int(major), int(minor), int(micro))
return (0, 0, 0)
# Call out to git and guess the latest version,
# this will just return (0, 0, 0) in case of any error.
#
def guess_version(release):
try:
tags_output = subprocess.check_output(['git', 'tag'])
except subprocess.CalledProcessError:
return (0, 0, 0)
# Parse the `git tag` output into a list of integer tuples
tags_output = tags_output.decode('UTF-8')
all_tags = tags_output.splitlines()
all_versions = [parse_tag(tag) for tag in all_tags]
# Filter the list by the minor point version, if
# we are checking for the latest "release" version, then
# only pickup even number minor points.
#
filtered_versions = [
version for version in all_versions
if (version[1] % 2) == (not release)
]
# Make sure they are sorted, and take the last one
sorted_versions = sorted(filtered_versions)
latest_version = sorted_versions[-1]
return latest_version
@click.command(short_help="Generate the version badges")
@click.option('--release', is_flag=True, default=False,
help="Whether to generate the badge for the release version")
@click.option('--redirect', is_flag=True, default=False,
help="Whether to generate the redirect html file")
def generate_badges(release, redirect):
"""Generate the version badge svg files
"""
major, minor, micro = guess_version(release)
if release:
badge_name = 'release'
color = RELEASE_COLOR
else:
badge_name = 'snapshot'
color = SNAPSHOT_COLOR
version = '{major}.{minor}.{micro}'.format(major=major, minor=minor, micro=micro)
url_target = URL_FORMAT.format(version=version)
if redirect:
template = REDIRECT_TEMPLATE
else:
template = BADGE_TEMPLATE
output = template.format(badge_name=badge_name,
version=version,
color=color,
url_target=url_target)
click.echo(output, nl=False)
return 0
if __name__ == '__main__':
generate_badges()