From 9e099f97d95525b1b6ce50d32c15a312ce45500f Mon Sep 17 00:00:00 2001 From: Martin Gano Date: Thu, 6 Aug 2020 16:58:47 +0200 Subject: [PATCH] add script with support parsing releases from git --- docs/chart.png | Bin 0 -> 63342 bytes docs/en/versions.rst | 2 + generate_chart.py | 265 +++++++++++++++++++++++++++++++++++++++++++ idf_versions.js | 96 ++++++++++++++++ 4 files changed, 363 insertions(+) create mode 100644 docs/chart.png create mode 100644 generate_chart.py create mode 100644 idf_versions.js diff --git a/docs/chart.png b/docs/chart.png new file mode 100644 index 0000000000000000000000000000000000000000..25475313af7cd1cec59038271c5fa82e67d9f3d4 GIT binary patch literal 63342 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 literal 0 HcmV?d00001 diff --git a/docs/en/versions.rst b/docs/en/versions.rst index b289cc7c7f..6abec3dabf 100644 --- a/docs/en/versions.rst +++ b/docs/en/versions.rst @@ -70,6 +70,8 @@ As a general guideline: - If possible, periodically update the project to a new major or minor ESP-IDF version (for example, once a year.) The update process should be straightforward for Minor updates, but may require some planning and checking of the release notes for Major updates. - Always plan to update to a newer release before the release you are using becomes End of Life. +.. image:: ../chart.png + Checking the Current Version ---------------------------- diff --git a/generate_chart.py b/generate_chart.py new file mode 100644 index 0000000000..d1f61743dc --- /dev/null +++ b/generate_chart.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python +import datetime as dt +import requests +import json +import os +import re + +import matplotlib.dates +import matplotlib.font_manager as font_manager +import matplotlib.patches as mpatches +import matplotlib.pyplot as plt +import numpy as np +from dateutil import parser +from dateutil.relativedelta import relativedelta +from matplotlib.dates import WEEKLY, DateFormatter, RRuleLocator, rrulewrapper + + +class Version(object): + def __init__(self, version_name, + explicit_start_date=None, + explicit_end_date=None, + explicit_end_service_date=None, + is_lts=None): + self.version_name = version_name + + self.is_lts = is_lts or self.is_version_lts() + + self.is_major_minor = Version.is_minor_major_version(self.version_name) + + self._start_date = parser.parse( + explicit_start_date) if explicit_start_date is not None else self._retrieve_start_date() + self._end_of_life_date = parser.parse( + explicit_end_date) if explicit_end_date is not None else self._retrieve_end_of_life_date() + self._end_service_date = parser.parse( + explicit_end_service_date) if explicit_end_service_date is not None else self.get_end_service_date() + + self.start_date_matplotlib_format = matplotlib.dates.date2num(self._start_date) + self.end_of_life_date_matplotlib_format = matplotlib.dates.date2num(self._end_of_life_date) + + self.end_service_date_matplotlib_format = matplotlib.dates.date2num( + self._end_service_date) if self._end_service_date is not None else None + + @staticmethod + def get_config(config_path): + return json.load(open(config_path)) + + @staticmethod + def add_months(source_date, months): + return source_date + relativedelta(months=+months) + + @staticmethod + def is_minor_major_version(version_name): + return True if len(version_name.split(".")) <= 2 else False + + def is_version_lts(self): + version = self.version_name + return version >= 'v4.1' + + def get_start_date(self): + return self._start_date + + def get_end_of_life_date(self): + return self._end_of_life_date + + def _retrieve_start_date(self): + return parser.parse(os.popen("git log -1 --format=%ai " + self.version_name)) + + def _retrieve_end_of_life_date(self): + return self.add_months(self._start_date, 30 if self.is_lts else 18) + + def get_end_service_date(self): + return self.add_months(self._start_date, 12) + + +class ChartVersions(object): + def __init__(self): + self.all_versions = self.get_all_versions_from_git() + + self._releases = self._get_releases_from_url(url="https://dl.espressif.com/dl/esp-idf/idf_versions.js") + self._patches = self._get_patches_from_url(url="https://dl.espressif.com/dl/esp-idf/idf_versions.js") + + self.sorted_releases_supported = sorted(self.filter_old_versions(self._releases), key=lambda x: x.version_name) + self.patches_supported = self.filter_old_versions(self._patches) + + # TODO test higher versions + # self.sorted_releases_supported.append(Version(version_name='v4.1', explicit_start_date="28-9-2020")) + # self.sorted_releases_supported.append(Version(version_name='v4.2', explicit_start_date="28-5-2021")) + + def get_releases_as_json(self): + return { + x.version_name: { + "start_date": x.get_start_date().strftime("%Y-%m-%d"), + "end_date": x.get_end_of_life_date().strftime("%Y-%m-%d"), + "is_lts": x.is_lts + } for x in self.sorted_releases_supported + self.patches_supported + } + + @staticmethod + def parse_chart_releases_from_js(js_as_string): + return json.loads(js_as_string[js_as_string.find("RELEASES: ") + len("RELEASES: "):js_as_string.rfind("};")]) + + def _get_all_version_from_url(self, url=None, filename=None): + releases_file = requests.get(url).text if url is not None else "".join(open(filename).readlines()) + return self.parse_chart_releases_from_js(releases_file) + + def _get_releases_from_url(self, url=None, filename=None): + all_versions = self._get_all_version_from_url(url, filename) + return [ + Version(version_name=x, + explicit_start_date=all_versions[x]['start_date'], + explicit_end_date=all_versions[x]['end_date'] if 'end_date' in all_versions[x].keys() else None, + explicit_end_service_date=all_versions[x]['end_service'] if 'end_service' in all_versions[x].keys() else None) + for x in all_versions.keys() if Version.is_minor_major_version(x) + ] + + def _get_patches_from_url(self, url=None, filename=None): + all_versions = self._get_all_version_from_url(url, filename) + return [ + Version(version_name=x, + explicit_start_date=all_versions[x]['start_date'], + explicit_end_date=all_versions[x]['end_date'] if 'end_date' in all_versions[x].keys() else None, + is_lts=all_versions[x]['new_policy'] if 'new_policy' in all_versions[x].keys() else None) + for x in all_versions.keys() if not Version.is_minor_major_version(x) + ] + + def _get_releases(self, all_versions): + return [Version(release) for release in self._get_releases_names(all_versions)] + + def _get_patches(self, all_versions): + return [Version(patch, explicit_end_date=self.get_super_end_date_as_string(patch), + is_lts=self.get_super_lts_state(patch)) for patch in self._get_patches_names(all_versions)] + + @staticmethod + def _get_releases_names(all_versions): + return list(filter(lambda x: Version.is_minor_major_version(x), all_versions)) + + @staticmethod + def _get_patches_names(all_versions): + return list(filter(lambda x: not Version.is_minor_major_version(x), all_versions)) + + def get_super_version(self, patch): + return list(filter(lambda x: x.version_name == self.get_super_version_name(patch), self._releases))[0] + + def get_super_end_date_as_string(self, patch): + return self.get_super_version(patch).get_end_of_life_date().strftime("%m/%d/%Y, %H:%M:%S") + + def get_super_lts_state(self, patch): + return self.get_super_version(patch).is_lts + + @staticmethod + def get_all_versions_from_git(): + """ + :returns: list of string variables meaning name of the versions or patches (e.g. v4.1, v3.3.1, etc.) + """ + all_git_tags = os.popen("git tag") + stable_releases_regex = "(?:^|)(v\d+\.\d+(?:\.\d+){0,1})(?=\n|$)" + + results = [re.match(stable_releases_regex, line) for line in all_git_tags] + all_versions = [regex_result.group(1) for regex_result in results if regex_result is not None] + return all_versions + + @staticmethod + def filter_old_versions(versions): + return list( + filter(lambda x: x.get_end_of_life_date() >= dt.datetime.now(x.get_end_of_life_date().tzinfo), versions)) + + @staticmethod + def get_super_version_name(version_name): + return ".".join(version_name.split(".")[:2]) + + def create_chart(self, + figure_size=(20, 8), + subplot=111, + step_size=0.5, + bar_height=0.3, + version_alpha=0.8, + patch_width=1, + lts_service_color='darkred', + lts_maintenance_color='red', + bar_align='center', + patch_color='black', + patch_alpha=1, + date_interval=10, + output_chart_name='docs/chart', + output_chart_extension='.png', + months_surrounding_chart=5): + fig = plt.figure(figsize=figure_size) + ax = fig.add_subplot(subplot) + + labels_count = len(self.sorted_releases_supported) + + pos = np.arange(step_size, labels_count * step_size + step_size, step_size) + mapping_releases_index = {release.version_name: i for release, i in + zip(self.sorted_releases_supported, range(labels_count))} + + for release, i in zip(self.sorted_releases_supported, range(labels_count)): + start_date = release.start_date_matplotlib_format + end_of_service_date = release.end_service_date_matplotlib_format + + end_date = release.end_of_life_date_matplotlib_format + + ax.barh((i * step_size) + step_size, (end_of_service_date or end_date) - start_date, left=start_date, + height=bar_height, align=bar_align, + color=lts_service_color, + alpha=version_alpha, + edgecolor=lts_service_color) + if end_of_service_date is not None: + ax.barh((i * step_size) + step_size, end_date - end_of_service_date, left=end_of_service_date, + height=bar_height, align=bar_align, + color=lts_maintenance_color, alpha=version_alpha, edgecolor=lts_maintenance_color) + + for patch, i in zip(self.patches_supported, range(len(self.patches_supported))): + start_date = patch.start_date_matplotlib_format + + ax.barh(mapping_releases_index[self.get_super_version_name(patch.version_name)] * step_size + step_size, + patch_width, left=start_date, height=bar_height, align=bar_align, color=patch_color, + alpha=patch_alpha, + edgecolor=patch_color) + ax.text(start_date - 5, mapping_releases_index[ + self.get_super_version_name(patch.version_name)] * step_size + step_size - 0.2, + patch.version_name.split('.')[-1], + fontsize='xx-small', color='darkred') + + plt.setp(plt.yticks(pos, map(lambda x: x.version_name, self.sorted_releases_supported))[1], fontsize=14) + + ax.set_ylim(bottom=0, ymax=labels_count * step_size + step_size) + + ax.set_xlim( + xmin=Version.add_months( + min(self.sorted_releases_supported, + key=lambda version: version.get_start_date().replace(tzinfo=None)).get_start_date(), + -months_surrounding_chart), + xmax=Version.add_months( + max(self.sorted_releases_supported, + key=lambda version: version.get_end_of_life_date().replace(tzinfo=None)).get_end_of_life_date(), + months_surrounding_chart)) + + ax.grid(color='g', linestyle=':') + ax.xaxis_date() + + rule = rrulewrapper(WEEKLY, interval=date_interval) + loc = RRuleLocator(rule) + formatter = DateFormatter("%d-%b '%y") + + ax.xaxis.set_major_locator(loc) + ax.xaxis.set_major_formatter(formatter) + x_labels = ax.get_xticklabels() + plt.setp(x_labels, rotation=30, fontsize=10) + + ax.legend(loc=1, prop=font_manager.FontProperties(size='small')) + + ax.invert_yaxis() + fig.autofmt_xdate() + + darkred_patch = mpatches.Patch(color='darkred', label='Service period (Recommended for new designs)') + red_patch = mpatches.Patch(color='red', label='Maintenance period') + + plt.legend(handles=[darkred_patch, red_patch], prop={'size': 6}) + fig.set_size_inches(10, 5, forward=True) + plt.savefig(output_chart_name + output_chart_extension) + plt.show() + + +if __name__ == '__main__': + ChartVersions().create_chart() diff --git a/idf_versions.js b/idf_versions.js new file mode 100644 index 0000000000..d36ec3182c --- /dev/null +++ b/idf_versions.js @@ -0,0 +1,96 @@ +var DOCUMENTATION_VERSIONS = { + DEFAULTS: { + has_targets: false, + supported_targets: ["esp32"] + }, + VERSIONS: [{ + name: "latest", + has_targets: true, + supported_targets: ["esp32", "esp32s2"] + }, + { + name: "v4.1-rc", + pre_release: true + }, + { + name: "v4.0.1", + old: false + }, + { + name: "v4.0", + old: true + }, + { + name: "v3.3.2" + }, + { + name: "v3.3.1", + old: true + }, + { + name: "v3.3", + old: true + }, + { + name: "v3.2.3", + old: false + }, + { + name: "v3.1.7", + old: false + }, + { + name: "v3.1.6", + old: true + }, + { + name: "v3.0.9", + old: true + }, + { + name: "release-v4.2", + pre_release: true, + has_targets: true, + supported_targets: ["esp32", "esp32s2"] + }, + { + name: "release-v4.1", + pre_release: true + }, + { + name: "release-v4.0", + pre_release: true + }, + { + name: "release-v3.3", + pre_release: true + }, + { + name: "release-v3.2", + pre_release: true + }, + { + name: "release-v3.1", + pre_release: true + } + ], + RELEASES: { + "v3.1": { + "start_date": "2018-09-07", + "end_date": "2020-10-31" + }, + "v3.2": { + "start_date": "2019-04-11", + "end_date": "2020-10-31" + }, + "v3.3": { + "start_date": "2019-09-05", + "end_date": "2022-03-31" + }, + "v4.0": { + "start_date": "2020-02-11", + "end_service": "2021-02-11", + "end_date": "2021-10-31" + } + } +};