feat(tools): Option in tools.json to rename toolchanis being downloaded

- Implemented condition that version 1 of tools.json must not contain
  new rename_dist keyword in any of #/definitions/versionInfo properties.
This commit is contained in:
Marek Fiala
2023-09-01 17:07:41 +02:00
parent 562bb6783a
commit 56e3e8ce56
3 changed files with 63 additions and 18 deletions

View File

@@ -83,7 +83,7 @@ TOOLS_FILE = 'tools/tools.json'
TOOLS_SCHEMA_FILE = 'tools/tools_schema.json'
TOOLS_FILE_NEW = 'tools/tools.new.json'
IDF_ENV_FILE = 'idf-env.json'
TOOLS_FILE_VERSION = 1
TOOLS_FILE_VERSION = 2
IDF_TOOLS_PATH_DEFAULT = os.path.join('~', '.espressif')
UNKNOWN_VERSION = 'unknown'
SUBST_TOOL_PATH_REGEX = re.compile(r'\${TOOL_PATH}')
@@ -555,12 +555,12 @@ class ToolExecError(RuntimeError):
class IDFToolDownload(object):
def __init__(self, platform_name, url, size, sha256): # type: (str, str, int, str) -> None
def __init__(self, platform_name, url, size, sha256, rename_dist): # type: (str, str, int, str, str) -> None
self.platform_name = platform_name
self.url = url
self.size = size
self.sha256 = sha256
self.platform_name = platform_name
self.rename_dist = rename_dist
@functools.total_ordering
@@ -590,8 +590,8 @@ class IDFToolVersion(object):
return NotImplemented
return self.status == other.status and self.version == other.version
def add_download(self, platform_name, url, size, sha256): # type: (str, str, int, str) -> None
self.downloads[platform_name] = IDFToolDownload(platform_name, url, size, sha256)
def add_download(self, platform_name, url, size, sha256, rename_dist=''): # type: (str, str, int, str, str) -> None
self.downloads[platform_name] = IDFToolDownload(platform_name, url, size, sha256, rename_dist)
def get_download_for_platform(self, platform_name): # type: (Optional[str]) -> Optional[IDFToolDownload]
platform_name = Platforms.get(platform_name)
@@ -855,7 +855,7 @@ class IDFTool(object):
raise SystemExit(1)
url = download_obj.url
archive_name = os.path.basename(url)
archive_name = download_obj.rename_dist if download_obj.rename_dist else os.path.basename(url)
local_path = os.path.join(global_idf_tools_path or '', 'dist', archive_name)
mkdir_p(os.path.dirname(local_path))
@@ -889,7 +889,7 @@ class IDFTool(object):
assert version in self.versions
download_obj = self.versions[version].get_download_for_platform(self._platform)
assert download_obj is not None
archive_name = os.path.basename(download_obj.url)
archive_name = download_obj.rename_dist if download_obj.rename_dist else os.path.basename(download_obj.url)
archive_path = os.path.join(global_idf_tools_path or '', 'dist', archive_name)
assert os.path.isfile(archive_path)
dest_dir = self.get_path_for_version(version)
@@ -1041,7 +1041,8 @@ class IDFTool(object):
(platform_id, tool_name, version))
version_obj.add_download(platform_id,
platform_dict['url'], platform_dict['size'], platform_dict['sha256'])
platform_dict['url'], platform_dict['size'],
platform_dict['sha256'], platform_dict.get('rename_dist', ''))
if version_status == IDFToolVersion.STATUS_RECOMMENDED:
if platform_id not in recommended_versions:
@@ -1068,11 +1069,19 @@ class IDFTool(object):
'status': version_obj.status
}
for platform_id, download in version_obj.downloads.items():
version_json[platform_id] = {
'url': download.url,
'size': download.size,
'sha256': download.sha256
}
if download.rename_dist:
version_json[platform_id] = {
'url': download.url,
'size': download.size,
'sha256': download.sha256,
'rename_dist': download.rename_dist
}
else:
version_json[platform_id] = {
'url': download.url,
'size': download.size,
'sha256': download.sha256
}
versions_array.append(version_json)
overrides_array = self.platform_overrides
@@ -1339,9 +1348,6 @@ def parse_tools_info_json(tools_info): # type: ignore
Parse and validate the dictionary obtained by loading the tools.json file.
Returns a dictionary of tools (key: tool name, value: IDFTool object).
"""
if tools_info['version'] != TOOLS_FILE_VERSION:
raise RuntimeError('Invalid version')
tools_dict = OrderedDict()
tools_array = tools_info.get('tools')
@@ -2321,7 +2327,8 @@ def action_add_version(args): # type: ignore
if not tool_obj:
info('Creating new tool entry for {}'.format(tool_name))
tool_obj = IDFTool(tool_name, TODO_MESSAGE, IDFTool.INSTALL_ALWAYS,
TODO_MESSAGE, TODO_MESSAGE, [TODO_MESSAGE], TODO_MESSAGE)
TODO_MESSAGE, TODO_MESSAGE, [TODO_MESSAGE], TODO_MESSAGE,
[TODO_MESSAGE])
tools_info[tool_name] = tool_obj
version = args.version
version_status = IDFToolVersion.STATUS_SUPPORTED