Fix race between install tot and active tot (#749)

Since #732 we lookup tot release dynamically, but we don't
necessarily want to do this for the `activate` command otherwise
`install` followed by `activate` a can fail if a new build was
produced inbetween.
This commit is contained in:
Sam Clegg
2021-03-08 14:26:03 -08:00
committed by GitHub
parent 226b548c31
commit 73183b5c30

View File

@@ -2155,6 +2155,15 @@ def load_releases_info():
return load_releases_info.cached_info
def get_installed_sdk_version():
version_file = sdk_path(os.path.join('upstream', '.emsdk_version'))
if not os.path.exists(version_file):
return None
with open(version_file) as f:
version = f.read()
return version.split('-')[2]
# Get a list of tags for emscripten-releases.
def load_releases_tags():
tags = []
@@ -2172,13 +2181,9 @@ def load_releases_tags():
# Explicitly add the currently installed SDK version. This could be a custom
# version (installed explicitly) so it might not be part of the main list loaded above.
version_file = sdk_path(os.path.join('upstream', '.emsdk_version'))
if os.path.exists(version_file):
with open(version_file) as f:
version = f.read()
version = version.split('-')[2]
if version not in tags:
tags.append(version)
installed = get_installed_sdk_version()
if installed and installed not in tags:
tags.append(installed)
return tags, tags_fastcomp
@@ -2578,7 +2583,7 @@ def exit_with_fastcomp_error():
exit_with_error('The fastcomp backend is not getting new builds or releases. Please use the upstream llvm backend or use an older version than 2.0.0 (such as 1.40.1).')
def expand_sdk_name(name):
def expand_sdk_name(name, activating):
if name in ('latest-fastcomp', 'latest-releases-fastcomp', 'tot-fastcomp', 'sdk-nightly-latest'):
exit_with_fastcomp_error()
if name in ('latest', 'sdk-latest', 'latest-64bit', 'sdk-latest-64bit'):
@@ -2587,6 +2592,15 @@ def expand_sdk_name(name):
elif name in ('latest-upstream', 'latest-clang-upstream', 'latest-releases-upstream'):
return str(find_latest_releases_sdk('upstream'))
elif name in ('tot', 'sdk-tot', 'tot-upstream'):
if activating:
# When we are activating a tot release, assume that the currently
# installed SDK, if any, is the tot release we want to activate.
# Without this `install tot && activate tot` will race with the builders
# that are producing new builds.
installed = get_installed_sdk_version()
if installed:
debug_print('activating currently installed SDK; not updating tot version')
return 'sdk-releases-upstream-%s-64bit' % installed
return str(find_tot_sdk())
else:
# check if it's a release handled by an emscripten-releases version,
@@ -2770,7 +2784,8 @@ def main(args):
# Replace meta-packages with the real package names.
if cmd in ('update', 'install', 'activate'):
args = [expand_sdk_name(a) for a in args]
activating = cmd == 'activate'
args = [expand_sdk_name(a, activating=activating) for a in args]
load_dot_emscripten()
load_sdk_manifest()