Files
QuestAppLauncher_Assets/QuestAssetGenerator.py
2020-01-25 13:44:37 -08:00

147 lines
5.6 KiB
Python

import argparse
import datetime
import os
import requests
import shutil
import subprocess
import sys
import zipfile
from github import Github
# Temporary directory for scratch space
TEMP_DIR = '__temp__'
LATEST_RELASE_DIR = 'latest_release'
QALAG_OUTPUT_DIR = 'qalag'
QALAG_EXE_PATH = 'bin\\qalag.exe'
WINDIFF_EXE_PATH = 'bin\\windiff.exe'
QUEST_DIR = 'quest'
ICONPACK_QUEST = 'iconpack_quest.zip'
APPNAMES_QUEST = 'appnames_quest.json'
ICONPACK_OTHER = 'iconpack_others.zip'
APPNAMES_OTHER = 'appnames_other.json'
APPNAMES_GALAG_NAME = 'appnames_quest_en_US.json'
def main():
parser = argparse.ArgumentParser(description='Quest Asset Generator')
parser.add_argument('-a', '--access-token', required=True, help='GitHub acess token')
parser.add_argument('-dr', '--download-release', action='store_true', help='Download latest asset release from github')
parser.add_argument('-da', '--download-assets', action='store_true',help='Download assets from Oculus')
parser.add_argument('-c', '--compare', action='store_true', help='Compare assets')
parser.add_argument('-r', '--release', action='store_true', help='Draft a github release')
args = parser.parse_args()
# If nothing is specified, perform all actions
if (not args.download_release and not args.download_assets and not args.compare and not args.release):
args.download_release = True
args.download_assets = True
args.compare = True
args.release = True
# Instantiate github client
g = Github(args.access_token)
repo = g.get_user().get_repo('QuestAppLauncher_Assets')
# Set up temp dir
folder_path_temp = os.path.abspath(TEMP_DIR);
if (not os.path.isdir(folder_path_temp)):
os.mkdir(folder_path_temp)
# Download latest assets
if (args.download_assets):
download_latest_assets()
# Download latest release
if (args.download_release):
download_release_assets(repo)
if (args.compare):
compare()
if (args.release):
create_release(repo)
def get_release_download_path():
return os.path.join(os.path.abspath(TEMP_DIR), LATEST_RELASE_DIR)
def get_galag_download_path():
return os.path.abspath(os.path.join(os.path.abspath(TEMP_DIR), QALAG_OUTPUT_DIR))
# Download latest Github release
def download_release_assets(repo):
release = repo.get_latest_release()
print("Downloading release: '%s'" % (release.title))
download_release_path = get_release_download_path();
if (os.path.isdir(download_release_path)):
shutil.rmtree(download_release_path)
os.mkdir(download_release_path)
assets = release.get_assets()
for asset in assets:
print("\tAsset: %s [%s]" % (asset.name, asset.url))
r = requests.get(asset.url, allow_redirects=True, headers={'Accept': 'application/octet-stream'})
file_path = os.path.join(download_release_path, asset.name)
open(file_path, 'wb').write(r.content)
# Extract quest icons
iconpack_quest_release_zip = os.path.join(download_release_path, ICONPACK_QUEST)
iconpack_quest_release_ext_path = os.path.join(download_release_path, QUEST_DIR)
with zipfile.ZipFile(iconpack_quest_release_zip) as zip:
zip.extractall(iconpack_quest_release_ext_path)
# Download latest assets
def download_latest_assets():
galag_exe_full_path = os.path.abspath(QALAG_EXE_PATH)
galag_output_dir = get_galag_download_path()
if (os.path.isdir(galag_output_dir)):
shutil.rmtree(galag_output_dir)
os.mkdir(galag_output_dir)
# Launch exe, temporarily changing cwd to land results in proper place
cur_dir = os.path.abspath('.')
os.chdir(galag_output_dir)
launch_executable([], galag_exe_full_path)
os.chdir(cur_dir)
# Rename file
os.rename(os.path.join(galag_output_dir, APPNAMES_GALAG_NAME), os.path.join(galag_output_dir, APPNAMES_QUEST))
# Compare
def compare():
iconpack_quest_release_ext_path = os.path.join(get_release_download_path(), QUEST_DIR)
iconpack_quest_generated_ext_path = os.path.join(get_galag_download_path(), QUEST_DIR)
launch_executable(['-t', iconpack_quest_release_ext_path, iconpack_quest_generated_ext_path], bin_path=WINDIFF_EXE_PATH)
appnames_quest_release_path = os.path.join(get_release_download_path(), APPNAMES_QUEST)
appnames_quest_generated_path = os.path.join(get_galag_download_path(), APPNAMES_QUEST)
launch_executable([appnames_quest_release_path, appnames_quest_generated_path], bin_path=WINDIFF_EXE_PATH)
# Create release
def create_release(repo):
tag = 'v' + datetime.date.today().strftime('%m.%d.%Y')
name = tag + ': Update quest assets'
print(str.format('Creating release: tag: %s, name: %s' % (tag, name)))
release = repo.create_git_release(tag=tag, name=name, message='Updating quest assets', draft=True)
# Upload the assets, refreshing quest from generated path
release.upload_asset(os.path.join(get_release_download_path(), APPNAMES_OTHER))
release.upload_asset(os.path.join(get_release_download_path(), ICONPACK_OTHER))
release.upload_asset(os.path.join(get_galag_download_path(), APPNAMES_QUEST))
release.upload_asset(os.path.join(get_galag_download_path(), ICONPACK_QUEST))
# Launch executable and return output
def launch_executable(args, bin_path):
try:
output = subprocess.check_output([bin_path] + args, stderr=subprocess.STDOUT)
return output.decode(sys.stdout.encoding)
except subprocess.CalledProcessError as e:
raise Exception(str.format(str(e) + ". Output: '%s'" % (e.output.decode(sys.stdout.encoding).rstrip()))) from e
except Exception as e:
raise type(e)(str.format(str(e) + " when calling '%s'" % (bin_path)))
main()