Merge pull request #5752 from aws-lumberyard-dev/puvvadar/gitflow_211118_o3de
Merge stabilization/2110
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user