-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathQuestAssetGenerator.py
147 lines (118 loc) · 5.64 KB
/
QuestAssetGenerator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import argparse
import datetime
import os
import requests
import shutil
import subprocess
import sys
import zipfile
from github import Github # pip install PyGithub
# 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()