def clean_old_engine_installations(): current_version = get_engine_version_with_prefix() p = re.compile(engine_installation_folder_regex) if current_version is not None: engine_install_root = get_engine_install_root() if engine_install_root is not None and os.path.isdir( engine_install_root): folders = os.listdir(engine_install_root) for folder in folders: # Do not remove folders if they do not match with installation folder name pattern # Also do not remove files. Only remove folders full_path = os.path.join(engine_install_root, folder) if folder != current_version and p.match( folder) is not None and os.path.isdir(full_path): print( f"Removing old engine installation: {str(full_path)}..." ) try: rmtree(full_path, ignore_errors=True) print("Removal was successful!") except Exception as e: pblog.exception(str(e)) print( f"Something went wrong while removing engine folder {str(full_path)}. Please try removing it manually." ) return True return False
def get_project_version(): try: with open(pbconfig.get('defaultgame_path')) as ini_file: for ln in ini_file: if ln.startswith(project_version_key): return ln.replace(project_version_key, '').rstrip() except Exception as e: pblog.exception(str(e)) return None return None
def get_md5_hash(file_path): md5_reader = md5() try: with open(file_path, "rb") as f: data = f.read() md5_reader.update(data) return str(md5_reader.hexdigest()).upper() except Exception as e: pblog.exception(str(e)) return None
def remove_file(file_path): try: os.remove(file_path) except Exception: os.chmod(file_path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) # 0777 try: os.remove(file_path) except Exception as e: pblog.exception(str(e)) pass return not os.path.isfile(file_path)
def get_engine_date_suffix(): try: with open(pbconfig.get('uproject_name')) as uproject_file: data = json.load(uproject_file) engine_association = data[uproject_version_key] build_version = f"b{engine_association[-8:]}" # We're using local build version in .uproject file if "}" in build_version: return None return f"b{engine_association[-8:]}" except Exception as e: pblog.exception(str(e)) return None
def get_engine_install_root(): try: config_key = 'ue4v_ci_config' if pbconfig.get( "is_ci") else 'ue4v_user_config' with open(pbconfig.get(config_key)) as config_file: for ln in config_file: if "download_dir" in ln: split_str = ln.split("=") if len(split_str) == 2: return split_str[1].strip() except Exception as e: pblog.exception(str(e)) return None
def push_package(version_number, file_name): if not os.path.exists(file_name): pblog.error(f"Provided file {file_name} doesn't exist") return False try: output = pbtools.get_combined_output([hub_executable_path, "release", "edit", version_number, "-m", "", "-a", file_name]) if "Attaching 1 asset..." in output: return True else: pblog.error(output) except Exception as e: pblog.exception(str(e)) pblog.error(f"Error occurred while attaching {file_name} into release {version_number}") return False
def set_project_version(version_string): temp_path = "tmpProj.txt" # Create a temp file, do the changes there, and replace it with actual file try: with open(pbconfig.get('defaultgame_path')) as ini_file: with open(temp_path, "wt") as fout: for ln in ini_file: if project_version_key in ln: fout.write(f"ProjectVersion={version_string}\n") else: fout.write(ln) remove(pbconfig.get('defaultgame_path')) move(temp_path, pbconfig.get('defaultgame_path')) except Exception as e: pblog.exception(str(e)) return False return True
def get_engine_version(only_date=True): try: with open(pbconfig.get('uproject_name')) as uproject_file: data = json.load(uproject_file) engine_association = data[uproject_version_key] build_version = engine_association[-8:] if "}" in build_version: # Means we're using local build version in .uproject file return None if not only_date: build_version = f"{pbconfig.get('engine_base_version')}-{engine_version_prefix}-{build_version}" return build_version except Exception as e: pblog.exception(str(e)) return None
def set_engine_version(version_string): temp_path = "tmpEng.txt" try: # Create a temp file, do the changes there, and replace it with actual file with open(pbconfig.get('uproject_name')) as uproject_file: with open(temp_path, "wt") as fout: for ln in uproject_file: if uproject_version_key in ln: fout.write( f"\t\"EngineAssociation\": \"ue4v:{version_string}\",\n" ) else: fout.write(ln) remove(pbconfig.get('uproject_name')) move(temp_path, pbconfig.get('uproject_name')) except Exception as e: pblog.exception(str(e)) return False return True
def is_versionator_symbols_enabled(): if not os.path.isfile(pbconfig.get('ue4v_user_config')): # Config file somehow isn't generated yet, only get a response, but do not write anything into config response = input( "Do you want to download debugging symbols for accurate crash logging? You can change this setting later in the .ue4v-user config file. [y/n]" ) if response == "y" or response == "Y": return True else: return False try: with open(pbconfig.get('ue4v_user_config')) as config_file: for ln in config_file: if "Symbols" in ln or "symbols" in ln: if "False" in ln or "false" in ln: return False elif "True" in ln or "true" in ln: return True else: # Incorrect config return False except Exception as e: pblog.exception(str(e)) return False # Symbols configuration variable is not on the file, let's add it try: with open(pbconfig.get('ue4v_user_config'), "a+") as config_file: response = input( "Do you want to download debugging symbols for accurate crash logging? You can change this setting later in the .ue4v-user config file. [y/n]" ) if response == "y" or response == "Y": config_file.write("\nsymbols = true") return True else: config_file.write("\nsymbols = false") return False except Exception as e: pblog.exception(str(e)) return False
def pull_binaries(version_number: str, pass_checksum=False): if not os.path.isfile(hub_executable_path): pblog.error(f"Hub executable is not found at {hub_executable_path}") return 1 # Backward compatibility with old PBGet junctions. If it still exists, remove the junction if pbtools.is_junction("Binaries") and not pbtools.remove_junction("Binaries"): pblog.error("Something went wrong while removing junction for 'Binaries' folder. You should remove that folder manually to solve the problem") return -1 # Remove binary package if it exists, hub is not able to overwrite existing files if os.path.exists(binary_package_name): try: os.remove(binary_package_name) except Exception as e: pblog.exception(str(e)) pblog.error(f"Exception thrown while trying to remove {binary_package_name}. Please remove it manually") return -1 if not os.path.isfile(hub_config_path): pblog.info("You will now be asked to log in to your GitHub account. Please note that for security reasons, your password will not be shown as you type it.") # If user didn't login with hub yet, do it now for once output = pbtools.run([hub_executable_path, "release", "-L", "1"]) if not os.path.isfile(hub_config_path): pblog.error("Failed to login into hub with git credentials. Please check if your provided credentials are valid.") return pull_binaries(version_number, pass_checksum) else: pblog.info("Login to hub API was successful") try: output = pbtools.get_combined_output([hub_executable_path, "release", "download", version_number, "-i", binary_package_name]) if f"Downloading {binary_package_name}" in output: pass elif "Unable to find release with tag name" in output: pblog.error(f"Failed to find release tag {version_number}. Please wait and try again later.") return -1 elif "The file exists" in output: pblog.error(f"File {binary_package_name} was not able to be overwritten. Please remove it manually and run StartProject again.") return -1 elif "did not match any available assets" in output: pblog.error("Binaries for release {version_number} are not pushed into GitHub yet. Please wait and try again later.") return -1 elif not output: # hub doesn't print any output if package doesn't exist in release pblog.error(f"Failed to find binary package for release {version_number}") return 1 else: pblog.error(f"Unknown error occurred while pulling binaries for release {version_number}") pblog.error(f"Command output was: {output}") return 1 except Exception as e: pblog.exception(str(e)) pblog.error( f"Exception thrown while trying do pull binaries for {version_number}") return 1 # Temp fix for Binaries folder with unnecessary content if os.path.isdir("Binaries"): try: shutil.rmtree("Binaries") except Exception as e: pblog.exception(str(e)) pblog.error("Exception thrown while trying do clean Binaries folder") return 1 try: if pass_checksum: checksum_json_path = None else: checksum_json_path = pbconfig.get("checksum_file") if not os.path.exists(checksum_json_path): pblog.error(f"Checksum json file is not found at {checksum_json_path}") return 1 if not pbtools.compare_md5_single(binary_package_name, checksum_json_path): return 1 with ZipFile(binary_package_name) as zip_file: zip_file.extractall() if pass_checksum: return 0 elif not pbtools.compare_md5_all(checksum_json_path, True): return 1 except Exception as e: pblog.exception(str(e)) pblog.error(f"Exception thrown while trying do extract binary package for {version_number}") return 1 return 0