Merge pull request #5752 from aws-lumberyard-dev/puvvadar/gitflow_211118_o3de

Merge stabilization/2110
This commit is contained in:
puvvadar
2021-11-19 15:46:16 -08:00
committed by GitHub
387 changed files with 6580 additions and 3688 deletions
+1 -1
View File
@@ -69,7 +69,7 @@ def disable_gem_in_project(gem_name: str = None,
return 1
gem_path = pathlib.Path(gem_path).resolve()
# make sure this gem already exists if we're adding. We can always remove a gem.
if not gem_path.is_dir():
if not gem_path.exists():
logger.error(f'Gem Path {gem_path} does not exist.')
return 1
+24 -20
View File
@@ -44,30 +44,34 @@ def validate_downloaded_zip_sha256(download_uri_json_data: dict, download_zip_pa
try:
sha256A = download_uri_json_data['sha256']
except KeyError as e:
logger.warn('SECURITY WARNING: The advertised o3de object you downloaded has no "sha256"!!! Be VERY careful!!!'
logger.warning('SECURITY WARNING: The advertised o3de object you downloaded has no "sha256"!!! Be VERY careful!!!'
' We cannot verify this is the actually the advertised object!!!')
return 1
else:
sha256B = hashlib.sha256(download_zip_path.open('rb').read()).hexdigest()
if sha256A != sha256B:
logger.error(f'SECURITY VIOLATION: Downloaded zip sha256 {sha256B} does not match'
f' the advertised "sha256":{sha256A} in the f{manifest_json_name}.')
return 0
if len(sha256A) == 0:
logger.warning('SECURITY WARNING: The advertised o3de object you downloaded has no "sha256"!!! Be VERY careful!!!'
' We cannot verify this is the actually the advertised object!!!')
return 1
with download_zip_path.open('rb') as f:
sha256B = hashlib.sha256(f.read()).hexdigest()
if sha256A != sha256B:
logger.error(f'SECURITY VIOLATION: Downloaded zip sha256 {sha256B} does not match'
f' the advertised "sha256":{sha256A} in the f{manifest_json_name}.')
return 0
unzipped_manifest_json_data = unzip_manifest_json_data(download_zip_path, manifest_json_name)
# remove the sha256 if present in the advertised downloadable manifest json
# then compare it to the json in the zip, they should now be identical
try:
del download_uri_json_data['sha256']
except KeyError as e:
pass
# do not include the data we know will not match/exist
for key in ['sha256','repo_name']:
if key in download_uri_json_data:
del download_uri_json_data[key]
if key in unzipped_manifest_json_data:
del unzipped_manifest_json_data[key]
sha256A = hashlib.sha256(json.dumps(download_uri_json_data, indent=4).encode('utf8')).hexdigest()
sha256B = hashlib.sha256(json.dumps(unzipped_manifest_json_data, indent=4).encode('utf8')).hexdigest()
if sha256A != sha256B:
logger.error('SECURITY VIOLATION: Downloaded manifest json does not match'
' the advertised manifest json.')
if download_uri_json_data != unzipped_manifest_json_data:
logger.error(f'SECURITY VIOLATION: Downloaded {manifest_json_name} contents do not match'
' the advertised manifest json contents.')
return 0
return 1
@@ -102,7 +106,7 @@ def download_o3de_object(object_name: str, default_folder_name: str, dest_path:
logger.error(f'Downloadable o3de object {object_name} not found.')
return 1
origin_uri = downloadable_object_data['originuri']
origin_uri = downloadable_object_data['origin_uri']
parsed_uri = urllib.parse.urlparse(origin_uri)
download_zip_result = utils.download_zip_file(parsed_uri, download_zip_path, force_overwrite, download_progress_callback)
@@ -237,13 +241,13 @@ def is_o3de_object_update_available(object_name: str, downloadable_kwarg_key, lo
try:
repo_copy_updated_string = downloadable_object_data['last_updated']
except KeyError:
logger.warn(f'last_updated field not found for {object_name}.')
logger.warning(f'last_updated field not found for {object_name}.')
return False
try:
local_last_updated_time = datetime.fromisoformat(local_last_updated)
except ValueError:
logger.warn(f'last_updated field has incorrect format for local copy of {downloadable_kwarg_key} {object_name}.')
logger.warning(f'last_updated field has incorrect format for local copy of {downloadable_kwarg_key} {object_name}.')
# Possible that an earlier version did not have this field so still want to check against cached downloadable version
local_last_updated_time = datetime.min
+83 -76
View File
@@ -108,75 +108,79 @@ def get_o3de_third_party_folder() -> pathlib.Path:
# o3de manifest file methods
def get_default_o3de_manifest_json_data() -> dict:
"""
Returns dict with default values suitable for storing
in the o3de_manifests.json
"""
username = os.path.split(get_home_folder())[-1]
o3de_folder = get_o3de_folder()
default_engines_folder = get_o3de_engines_folder()
default_projects_folder = get_o3de_projects_folder()
default_gems_folder = get_o3de_gems_folder()
default_templates_folder = get_o3de_templates_folder()
default_restricted_folder = get_o3de_restricted_folder()
default_third_party_folder = get_o3de_third_party_folder()
default_projects_restricted_folder = default_projects_folder / 'Restricted'
default_projects_restricted_folder.mkdir(parents=True, exist_ok=True)
default_gems_restricted_folder = default_gems_folder / 'Restricted'
default_gems_restricted_folder.mkdir(parents=True, exist_ok=True)
default_templates_restricted_folder = default_templates_folder / 'Restricted'
default_templates_restricted_folder.mkdir(parents=True, exist_ok=True)
json_data = {}
json_data.update({'o3de_manifest_name': f'{username}'})
json_data.update({'origin': o3de_folder.as_posix()})
json_data.update({'default_engines_folder': default_engines_folder.as_posix()})
json_data.update({'default_projects_folder': default_projects_folder.as_posix()})
json_data.update({'default_gems_folder': default_gems_folder.as_posix()})
json_data.update({'default_templates_folder': default_templates_folder.as_posix()})
json_data.update({'default_restricted_folder': default_restricted_folder.as_posix()})
json_data.update({'default_third_party_folder': default_third_party_folder.as_posix()})
json_data.update({'engines': []})
json_data.update({'projects': []})
json_data.update({'external_subdirectories': []})
json_data.update({'templates': []})
json_data.update({'restricted': []})
json_data.update({'repos': []})
default_restricted_folder_json = default_restricted_folder / 'restricted.json'
if not default_restricted_folder_json.is_file():
with default_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'o3de'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
default_projects_restricted_folder_json = default_projects_restricted_folder / 'restricted.json'
if not default_projects_restricted_folder_json.is_file():
with default_projects_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'projects'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
default_gems_restricted_folder_json = default_gems_restricted_folder / 'restricted.json'
if not default_gems_restricted_folder_json.is_file():
with default_gems_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'gems'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
default_templates_restricted_folder_json = default_templates_restricted_folder / 'restricted.json'
if not default_templates_restricted_folder_json.is_file():
with default_templates_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'templates'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
return json_data
def get_o3de_manifest() -> pathlib.Path:
manifest_path = get_o3de_folder() / 'o3de_manifest.json'
if not manifest_path.is_file():
username = os.path.split(get_home_folder())[-1]
o3de_folder = get_o3de_folder()
default_registry_folder = get_o3de_registry_folder()
default_cache_folder = get_o3de_cache_folder()
default_downloads_folder = get_o3de_download_folder()
default_logs_folder = get_o3de_logs_folder()
default_engines_folder = get_o3de_engines_folder()
default_projects_folder = get_o3de_projects_folder()
default_gems_folder = get_o3de_gems_folder()
default_templates_folder = get_o3de_templates_folder()
default_restricted_folder = get_o3de_restricted_folder()
default_third_party_folder = get_o3de_third_party_folder()
default_projects_restricted_folder = default_projects_folder / 'Restricted'
default_projects_restricted_folder.mkdir(parents=True, exist_ok=True)
default_gems_restricted_folder = default_gems_folder / 'Restricted'
default_gems_restricted_folder.mkdir(parents=True, exist_ok=True)
default_templates_restricted_folder = default_templates_folder / 'Restricted'
default_templates_restricted_folder.mkdir(parents=True, exist_ok=True)
json_data = {}
json_data.update({'o3de_manifest_name': f'{username}'})
json_data.update({'origin': o3de_folder.as_posix()})
json_data.update({'default_engines_folder': default_engines_folder.as_posix()})
json_data.update({'default_projects_folder': default_projects_folder.as_posix()})
json_data.update({'default_gems_folder': default_gems_folder.as_posix()})
json_data.update({'default_templates_folder': default_templates_folder.as_posix()})
json_data.update({'default_restricted_folder': default_restricted_folder.as_posix()})
json_data.update({'default_third_party_folder': default_third_party_folder.as_posix()})
json_data.update({'engines': []})
json_data.update({'projects': []})
json_data.update({'external_subdirectories': []})
json_data.update({'templates': []})
json_data.update({'restricted': []})
json_data.update({'repos': []})
default_restricted_folder_json = default_restricted_folder / 'restricted.json'
if not default_restricted_folder_json.is_file():
with default_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'o3de'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
json_data.update({'default_restricted_folder': default_restricted_folder.as_posix()})
default_projects_restricted_folder_json = default_projects_restricted_folder / 'restricted.json'
if not default_projects_restricted_folder_json.is_file():
with default_projects_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'projects'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
default_gems_restricted_folder_json = default_gems_restricted_folder / 'restricted.json'
if not default_gems_restricted_folder_json.is_file():
with default_gems_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'gems'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
default_templates_restricted_folder_json = default_templates_restricted_folder / 'restricted.json'
if not default_templates_restricted_folder_json.is_file():
with default_templates_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'templates'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
json_data = get_default_o3de_manifest_json_data()
with manifest_path.open('w') as s:
s.write(json.dumps(json_data, indent=4) + '\n')
@@ -188,6 +192,7 @@ def load_o3de_manifest(manifest_path: pathlib.Path = None) -> dict:
"""
Loads supplied manifest file or ~/.o3de/o3de_manifest.json if None
raises Json.JSONDecodeError if manifest data could not be decoded to JSON
:param manifest_path: optional path to manifest file to load
"""
if not manifest_path:
@@ -196,8 +201,10 @@ def load_o3de_manifest(manifest_path: pathlib.Path = None) -> dict:
try:
json_data = json.load(f)
except json.JSONDecodeError as e:
logger.error(f'Manifest json failed to load: {str(e)}')
return {}
logger.error(f'Manifest json failed to load at path "{manifest_path}": {str(e)}')
# Re-raise the exception and let the caller
# determine if they can proceed
raise
else:
return json_data
@@ -455,7 +462,7 @@ def get_json_data_file(object_json: pathlib.Path,
try:
object_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warn(f'{object_json} failed to load: {e}')
logger.warning(f'{object_json} failed to load: {e}')
else:
return object_json_data
@@ -589,14 +596,14 @@ def get_registered(engine_name: str = None,
if isinstance(engine, dict):
engine_path = pathlib.Path(engine['path']).resolve()
else:
engine_path = pathlib.Path(engine_object).resolve()
engine_path = pathlib.Path(engine).resolve()
engine_json = engine_path / 'engine.json'
with engine_json.open('r') as f:
try:
engine_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warn(f'{engine_json} failed to load: {str(e)}')
logger.warning(f'{engine_json} failed to load: {str(e)}')
else:
this_engines_name = engine_json_data['engine_name']
if this_engines_name == engine_name:
@@ -611,7 +618,7 @@ def get_registered(engine_name: str = None,
try:
project_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warn(f'{project_json} failed to load: {str(e)}')
logger.warning(f'{project_json} failed to load: {str(e)}')
else:
this_projects_name = project_json_data['project_name']
if this_projects_name == project_name:
@@ -626,7 +633,7 @@ def get_registered(engine_name: str = None,
try:
gem_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warn(f'{gem_json} failed to load: {str(e)}')
logger.warning(f'{gem_json} failed to load: {str(e)}')
else:
this_gems_name = gem_json_data['gem_name']
if this_gems_name == gem_name:
@@ -641,7 +648,7 @@ def get_registered(engine_name: str = None,
try:
template_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warn(f'{template_path} failed to load: {str(e)}')
logger.warning(f'{template_path} failed to load: {str(e)}')
else:
this_templates_name = template_json_data['template_name']
if this_templates_name == template_name:
@@ -656,7 +663,7 @@ def get_registered(engine_name: str = None,
try:
restricted_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warn(f'{restricted_json} failed to load: {str(e)}')
logger.warning(f'{restricted_json} failed to load: {str(e)}')
else:
this_restricted_name = restricted_json_data['restricted_name']
if this_restricted_name == restricted_name:
@@ -689,7 +696,7 @@ def get_registered(engine_name: str = None,
try:
repo_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warn(f'{cache_file} failed to load: {str(e)}')
logger.warning(f'{cache_file} failed to load: {str(e)}')
else:
this_repos_name = repo_json_data['repo_name']
if this_repos_name == repo_name:
+1 -1
View File
@@ -326,7 +326,7 @@ def print_repos_data(repos_data: dict) -> int:
try:
repo_json_data = json.load(s)
except json.JSONDecodeError as e:
logger.warn(f'{cache_file} failed to load: {str(e)}')
logger.warning(f'{cache_file} failed to load: {str(e)}')
else:
print(f'{repo_uri}/repo.json cached as:')
print(cache_file)
+115 -96
View File
@@ -485,12 +485,12 @@ def register_repo(json_data: dict,
json_data['repos'].remove(repo_uri)
if remove:
logger.warn(f'Removing repo uri {repo_uri}.')
logger.warning(f'Removing repo uri {repo_uri}.')
return 0
repo_sha256 = hashlib.sha256(url.encode())
cache_file = manifest.get_o3de_cache_folder() / str(repo_sha256.hexdigest() + '.json')
result = utils.download_file(parsed_uri, cache_file)
result = utils.download_file(parsed_uri, cache_file, True)
if result == 0:
json_data.setdefault('repos', []).insert(0, repo_uri)
@@ -560,6 +560,107 @@ def register_default_third_party_folder(json_data: dict,
manifest.get_o3de_third_party_folder() if remove else default_third_party_folder,
'default_third_party_folder')
def remove_invalid_o3de_projects(manifest_path: pathlib.Path = None) -> int:
if not manifest_path:
manifest_path = manifest.get_o3de_manifest()
json_data = manifest.load_o3de_manifest(manifest_path)
result = 0
for project in json_data.get('projects', []):
if not validation.valid_o3de_project_json(pathlib.Path(project).resolve() / 'project.json'):
logger.warning(f"Project path {project} is invalid.")
# Attempt to unregister all invalid projects even if previous projects failed to unregister
# but combine the result codes of each command.
result = register(project_path=pathlib.Path(project), remove=True) or result
return result
def remove_invalid_o3de_objects() -> None:
for engine_path in manifest.get_engines():
if not validation.valid_o3de_engine_json(pathlib.Path(engine_path).resolve() / 'engine.json'):
logger.warning(f"Engine path {engine_path} is invalid.")
register(engine_path=engine_path, remove=True)
remove_invalid_o3de_projects()
for external in manifest.get_external_subdirectories():
external = pathlib.Path(external).resolve()
if not external.is_dir():
logger.warning(f"External subdirectory {external} is invalid.")
register(engine_path=engine_path, external_subdir_path=external, remove=True)
for template in manifest.get_templates():
if not validation.valid_o3de_template_json(pathlib.Path(template).resolve() / 'template.json'):
logger.warning(f"Template path {template} is invalid.")
register(template_path=template, remove=True)
for restricted in manifest.get_restricted():
if not validation.valid_o3de_restricted_json(pathlib.Path(restricted).resolve() / 'restricted.json'):
logger.warning(f"Restricted path {restricted} is invalid.")
register(restricted_path=restricted, remove=True)
json_data = manifest.load_o3de_manifest()
default_engines_folder = pathlib.Path(
json_data.get('default_engines_folder', manifest.get_o3de_engines_folder())).resolve()
if not default_engines_folder.is_dir():
new_default_engines_folder = manifest.get_o3de_folder() / 'Engines'
new_default_engines_folder.mkdir(parents=True, exist_ok=True)
logger.warning(
f"Default engines folder {default_engines_folder} is invalid. Set default {new_default_engines_folder}")
register(default_engines_folder=new_default_engines_folder.as_posix())
default_projects_folder = pathlib.Path(
json_data.get('default_projects_folder', manifest.get_o3de_projects_folder())).resolve()
if not default_projects_folder.is_dir():
new_default_projects_folder = manifest.get_o3de_folder() / 'Projects'
new_default_projects_folder.mkdir(parents=True, exist_ok=True)
logger.warning(
f"Default projects folder {default_projects_folder} is invalid. Set default {new_default_projects_folder}")
register(default_projects_folder=new_default_projects_folder.as_posix())
default_gems_folder = pathlib.Path(json_data.get('default_gems_folder', manifest.get_o3de_gems_folder())).resolve()
if not default_gems_folder.is_dir():
new_default_gems_folder = manifest.get_o3de_folder() / 'Gems'
new_default_gems_folder.mkdir(parents=True, exist_ok=True)
logger.warning(f"Default gems folder {default_gems_folder} is invalid."
f" Set default {new_default_gems_folder}")
register(default_gems_folder=new_default_gems_folder.as_posix())
default_templates_folder = pathlib.Path(
json_data.get('default_templates_folder', manifest.get_o3de_templates_folder())).resolve()
if not default_templates_folder.is_dir():
new_default_templates_folder = manifest.get_o3de_folder() / 'Templates'
new_default_templates_folder.mkdir(parents=True, exist_ok=True)
logger.warning(
f"Default templates folder {default_templates_folder} is invalid."
f" Set default {new_default_templates_folder}")
register(default_templates_folder=new_default_templates_folder.as_posix())
default_restricted_folder = pathlib.Path(
json_data.get('default_restricted_folder', manifest.get_o3de_restricted_folder())).resolve()
if not default_restricted_folder.is_dir():
default_restricted_folder = manifest.get_o3de_folder() / 'Restricted'
default_restricted_folder.mkdir(parents=True, exist_ok=True)
logger.warning(
f"Default restricted folder {default_restricted_folder} is invalid."
f" Set default {default_restricted_folder}")
register(default_restricted_folder=default_restricted_folder.as_posix())
default_third_party_folder = pathlib.Path(
json_data.get('default_third_party_folder', manifest.get_o3de_third_party_folder())).resolve()
if not default_third_party_folder.is_dir():
default_third_party_folder = manifest.get_o3de_folder() / '3rdParty'
default_third_party_folder.mkdir(parents=True, exist_ok=True)
logger.warning(
f"Default 3rd Party folder {default_third_party_folder} is invalid."
f" Set default {default_third_party_folder}")
register(default_third_party_folder=default_third_party_folder.as_posix())
def register(engine_path: pathlib.Path = None,
project_path: pathlib.Path = None,
gem_path: pathlib.Path = None,
@@ -604,7 +705,18 @@ def register(engine_path: pathlib.Path = None,
:return: 0 for success or non 0 failure code
"""
json_data = manifest.load_o3de_manifest()
try:
json_data = manifest.load_o3de_manifest()
except json.JSONDecodeError:
if not force:
logger.error('O3DE object registration has halted due to JSON Decode Error in manifest at path:'
f' "{manifest.get_o3de_manifest()}".'
'\n Registration can be forced using the --force option,'
' but that will result in the manifest using default data')
return 1
else:
# Use a default manifest data an proceed
json_data = manifest.get_default_o3de_manifest_json_data()
result = 0
@@ -679,99 +791,6 @@ def register(engine_path: pathlib.Path = None,
return result
def remove_invalid_o3de_projects(manifest_path: pathlib.Path = None) -> int:
if not manifest_path:
manifest_path = manifest.get_o3de_manifest()
json_data = manifest.load_o3de_manifest(manifest_path)
result = 0
for project in json_data.get('projects', []):
if not validation.valid_o3de_project_json(pathlib.Path(project).resolve() / 'project.json'):
logger.warn(f"Project path {project} is invalid.")
# Attempt to unregister all invalid projects even if previous projects failed to unregister
# but combine the result codes of each command.
result = register(project_path=pathlib.Path(project), remove=True) or result
return result
def remove_invalid_o3de_objects() -> None:
for engine_path in manifest.get_engines():
if not validation.valid_o3de_engine_json(pathlib.Path(engine_path).resolve() / 'engine.json'):
logger.warn(f"Engine path {engine_path} is invalid.")
register(engine_path=engine_path, remove=True)
remove_invalid_o3de_projects()
for external in manifest.get_external_subdirectories():
external = pathlib.Path(external).resolve()
if not external.is_dir():
logger.warn(f"External subdirectory {external} is invalid.")
register(engine_path=engine_path, external_subdir_path=external, remove=True)
for template in manifest.get_templates():
if not validation.valid_o3de_template_json(pathlib.Path(template).resolve() / 'template.json'):
logger.warn(f"Template path {template} is invalid.")
register(template_path=template, remove=True)
for restricted in manifest.get_restricted():
if not validation.valid_o3de_restricted_json(pathlib.Path(restricted).resolve() / 'restricted.json'):
logger.warn(f"Restricted path {restricted} is invalid.")
register(restricted_path=restricted, remove=True)
json_data = manifest.load_o3de_manifest()
default_engines_folder = pathlib.Path(json_data.get('default_engines_folder', manifest.get_o3de_engines_folder())).resolve()
if not default_engines_folder.is_dir():
new_default_engines_folder = manifest.get_o3de_folder() / 'Engines'
new_default_engines_folder.mkdir(parents=True, exist_ok=True)
logger.warn(
f"Default engines folder {default_engines_folder} is invalid. Set default {new_default_engines_folder}")
register(default_engines_folder=new_default_engines_folder.as_posix())
default_projects_folder = pathlib.Path(json_data.get('default_projects_folder', manifest.get_o3de_projects_folder())).resolve()
if not default_projects_folder.is_dir():
new_default_projects_folder = manifest.get_o3de_folder() / 'Projects'
new_default_projects_folder.mkdir(parents=True, exist_ok=True)
logger.warn(
f"Default projects folder {default_projects_folder} is invalid. Set default {new_default_projects_folder}")
register(default_projects_folder=new_default_projects_folder.as_posix())
default_gems_folder = pathlib.Path(json_data.get('default_gems_folder', manifest.get_o3de_gems_folder())).resolve()
if not default_gems_folder.is_dir():
new_default_gems_folder = manifest.get_o3de_folder() / 'Gems'
new_default_gems_folder.mkdir(parents=True, exist_ok=True)
logger.warn(f"Default gems folder {default_gems_folder} is invalid."
f" Set default {new_default_gems_folder}")
register(default_gems_folder=new_default_gems_folder.as_posix())
default_templates_folder = pathlib.Path(json_data.get('default_templates_folder', manifest.get_o3de_templates_folder())).resolve()
if not default_templates_folder.is_dir():
new_default_templates_folder = manifest.get_o3de_folder() / 'Templates'
new_default_templates_folder.mkdir(parents=True, exist_ok=True)
logger.warn(
f"Default templates folder {default_templates_folder} is invalid."
f" Set default {new_default_templates_folder}")
register(default_templates_folder=new_default_templates_folder.as_posix())
default_restricted_folder = pathlib.Path(json_data.get('default_restricted_folder', manifest.get_o3de_restricted_folder())).resolve()
if not default_restricted_folder.is_dir():
default_restricted_folder = manifest.get_o3de_folder() / 'Restricted'
default_restricted_folder.mkdir(parents=True, exist_ok=True)
logger.warn(
f"Default restricted folder {default_restricted_folder} is invalid."
f" Set default {default_restricted_folder}")
register(default_restricted_folder=default_restricted_folder.as_posix())
default_third_party_folder = pathlib.Path(json_data.get('default_third_party_folder', manifest.get_o3de_third_party_folder())).resolve()
if not default_third_party_folder.is_dir():
default_third_party_folder = manifest.get_o3de_folder() / '3rdParty'
default_third_party_folder.mkdir(parents=True, exist_ok=True)
logger.warn(
f"Default 3rd Party folder {default_third_party_folder} is invalid."
f" Set default {default_third_party_folder}")
register(default_third_party_folder=default_third_party_folder.as_posix())
def _run_register(args: argparse) -> int:
if args.override_home_folder:
+7 -6
View File
@@ -9,7 +9,6 @@
import json
import logging
import pathlib
import shutil
import urllib.parse
import urllib.request
import hashlib
@@ -24,6 +23,7 @@ def process_add_o3de_repo(file_name: str or pathlib.Path,
repo_set: set) -> int:
file_name = pathlib.Path(file_name).resolve()
if not validation.valid_o3de_repo_json(file_name):
logger.error(f'Repository JSON {file_name} could not be loaded or is missing required values')
return 1
cache_folder = manifest.get_o3de_cache_folder()
@@ -114,7 +114,7 @@ def get_gem_json_paths_from_cached_repo(repo_uri: str) -> set:
file_name = pathlib.Path(cache_filename).resolve()
if not file_name.is_file():
logger.error(f'Could not find cached repo json file for {repo_uri}')
logger.error(f'Could not find cached repository json file for {repo_uri}. Try refreshing the repository.')
return gem_set
with file_name.open('r') as f:
@@ -139,7 +139,7 @@ def get_gem_json_paths_from_cached_repo(repo_uri: str) -> set:
if cache_gem_json_filepath.is_file():
gem_set.add(cache_gem_json_filepath)
else:
logger.warn(f'Could not find cached gem json file {cache_gem_json_filepath} for {o3de_object_uri} in repo {repo_uri}')
logger.warning(f'Could not find cached gem json file {cache_gem_json_filepath} for {o3de_object_uri} in repo {repo_uri}')
return gem_set
@@ -167,6 +167,7 @@ def refresh_repo(repo_uri: str,
download_file_result = utils.download_file(parsed_uri, cache_file, True)
if download_file_result != 0:
logger.error(f'Repo json {repo_uri} could not download.')
return download_file_result
if not validation.valid_o3de_repo_json(cache_file):
@@ -217,10 +218,10 @@ def search_repo(manifest_json_data: dict,
json_key = 'gem_name'
search_func = lambda manifest_json_data: manifest_json_data if manifest_json_data.get(json_key, '') == gem_name else None
elif isinstance(template_name, str) or isinstance(template_name, pathlib.PurePath):
o3de_object_uris = manifest_json_data['template']
o3de_object_uris = manifest_json_data['templates']
manifest_json = 'template.json'
json_key = 'template_name'
search_func = lambda manifest_json_data: manifest_json_data if manifest_json_data.get(json_key, '') == template_name_name else None
search_func = lambda manifest_json_data: manifest_json_data if manifest_json_data.get(json_key, '') == template_name else None
elif isinstance(restricted_name, str) or isinstance(restricted_name, pathlib.PurePath):
o3de_object_uris = manifest_json_data['restricted']
manifest_json = 'restricted.json'
@@ -257,7 +258,7 @@ def search_o3de_object(manifest_json, o3de_object_uris, search_func):
try:
manifest_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warn(f'{cache_file} failed to load: {str(e)}')
logger.warning(f'{cache_file} failed to load: {str(e)}')
else:
result_json_data = search_func(manifest_json_data)
if result_json_data:
+22 -16
View File
@@ -125,7 +125,8 @@ def download_file(parsed_uri, download_path: pathlib.Path, force_overwrite: bool
"""
if download_path.is_file():
if not force_overwrite:
logger.warn(f'File already downloaded to {download_path}.')
logger.error(f'File already downloaded to {download_path} and force_overwrite is not set.')
return 1
else:
try:
os.unlink(download_path)
@@ -134,20 +135,25 @@ def download_file(parsed_uri, download_path: pathlib.Path, force_overwrite: bool
return 1
if parsed_uri.scheme in ['http', 'https', 'ftp', 'ftps']:
with urllib.request.urlopen(parsed_uri.geturl()) as s:
download_file_size = 0
try:
download_file_size = s.headers['content-length']
except KeyError:
pass
def download_progress(downloaded_bytes):
if download_progress_callback:
return download_progress_callback(int(downloaded_bytes), int(download_file_size))
return False
with download_path.open('wb') as f:
download_cancelled = copyfileobj(s, f, download_progress)
if download_cancelled:
return 1
try:
with urllib.request.urlopen(parsed_uri.geturl()) as s:
download_file_size = 0
try:
download_file_size = s.headers['content-length']
except KeyError:
pass
def download_progress(downloaded_bytes):
if download_progress_callback:
return download_progress_callback(int(downloaded_bytes), int(download_file_size))
return False
with download_path.open('wb') as f:
download_cancelled = copyfileobj(s, f, download_progress)
if download_cancelled:
logger.info(f'Download of file to {download_path} cancelled.')
return 1
except urllib.error.HTTPError as e:
logger.error(f'HTTP Error {e.code} opening {parsed_uri.geturl()}')
return 1
else:
origin_file = pathlib.Path(parsed_uri.geturl()).resolve()
if not origin_file.is_file():
@@ -167,7 +173,7 @@ def download_zip_file(parsed_uri, download_zip_path: pathlib.Path, force_overwri
return download_file_result
if not zipfile.is_zipfile(download_zip_path):
logger.error(f"File zip {download_zip_path} is invalid.")
logger.error(f"File zip {download_zip_path} is invalid. Try re-downloading the file.")
download_zip_path.unlink()
return 1