@@ -151,6 +151,15 @@ def init_frontend_unsafe(cls, version_string: str, provider: Optional[FrontEndPr
151151 return cls .DEFAULT_FRONTEND_PATH
152152
153153 repo_owner , repo_name , version = cls .parse_version_string (version_string )
154+
155+ if version .startswith ("v" ):
156+ expected_path = str (Path (cls .CUSTOM_FRONTENDS_ROOT ) / f"{ repo_owner } _{ repo_name } " / version .lstrip ("v" ))
157+ if os .path .exists (expected_path ):
158+ logging .info (f"Using existing copy of specific frontend version tag: { repo_owner } /{ repo_name } @{ version } " )
159+ return expected_path
160+
161+ logging .info (f"Initializing frontend: { repo_owner } /{ repo_name } @{ version } , requesting version details from GitHub..." )
162+
154163 provider = provider or FrontEndProvider (repo_owner , repo_name )
155164 release = provider .get_release (version )
156165
@@ -159,16 +168,20 @@ def init_frontend_unsafe(cls, version_string: str, provider: Optional[FrontEndPr
159168 Path (cls .CUSTOM_FRONTENDS_ROOT ) / provider .folder_name / semantic_version
160169 )
161170 if not os .path .exists (web_root ):
171+ # Use tmp path until complete to avoid path exists check passing from interrupted downloads
172+ tmp_path = web_root + ".tmp"
162173 try :
163- os .makedirs (web_root , exist_ok = True )
174+ os .makedirs (tmp_path , exist_ok = True )
164175 logging .info (
165176 "Downloading frontend(%s) version(%s) to (%s)" ,
166177 provider .folder_name ,
167178 semantic_version ,
168- web_root ,
179+ tmp_path ,
169180 )
170181 logging .debug (release )
171- download_release_asset_zip (release , destination_path = web_root )
182+ download_release_asset_zip (release , destination_path = tmp_path )
183+ if os .listdir (tmp_path ):
184+ os .rename (tmp_path , web_root )
172185 finally :
173186 # Clean up the directory if it is empty, i.e. the download failed
174187 if not os .listdir (web_root ):
0 commit comments