147 lines
5.6 KiB
Python
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() |