125 lines
3.4 KiB
Python
125 lines
3.4 KiB
Python
import os
|
|
import json
|
|
import shutil
|
|
from subprocess import PIPE, run
|
|
import sys
|
|
|
|
GAME_DIR_PATTERN = "game"
|
|
GAME_CODE_EXTENSION = ".go"
|
|
GAME_COMPILE_COMMAND = ["go", "build"]
|
|
|
|
def find_all_game_paths(source):
|
|
game_paths = []
|
|
|
|
for root, dirs, files in os.walk(source):
|
|
for directory in dirs:
|
|
if GAME_DIR_PATTERN in directory.lower():
|
|
path = os.path.join(source, directory)
|
|
game_paths.append(path)
|
|
break
|
|
return game_paths
|
|
|
|
|
|
def get_name_from_paths(paths, to_strip):
|
|
new_names = []
|
|
for path in paths:
|
|
_, dir_name = os.path.split(path)
|
|
new_dir_name = dir_name.replace(to_strip, "")
|
|
new_names.append(new_dir_name)
|
|
return new_names
|
|
|
|
|
|
def create_dir(path):
|
|
if not os.path.exists(path):
|
|
os.mkdir(path)
|
|
|
|
|
|
def copy_and_overwrite(source, dest):
|
|
if os.path.exists(dest):
|
|
shutil.rmtree(dest) # remove tree (recursive delete)
|
|
shutil.copytree(source, dest) # copy source to destination
|
|
pass
|
|
|
|
|
|
def make_json_metadata_file(path, game_dirs):
|
|
data = {
|
|
"gameName": game_dirs,
|
|
"numberOfGames": len(game_dirs)
|
|
}
|
|
with open(path, "w") as f:
|
|
json.dump(data, f)
|
|
|
|
|
|
def compile_game_code(path):
|
|
code_file_name = None
|
|
for root, dirs, files in os.walk(path):
|
|
for file in files:
|
|
if file.endswith(GAME_CODE_EXTENSION): # Avoids possible issues of .go.txt etc.
|
|
code_file_name = file
|
|
break
|
|
break
|
|
|
|
if code_file_name is None:
|
|
return
|
|
|
|
command = GAME_COMPILE_COMMAND + [code_file_name] # Run the go command
|
|
run_command(command, path)
|
|
|
|
def run_command(command, path):
|
|
cwd = os.getcwd()
|
|
os.chdir(path)
|
|
|
|
result = run(command, stdout=PIPE, stdin=PIPE, universal_newlines=True)
|
|
# print("compile result", result)
|
|
'''
|
|
PIPE creates a bridge for the python code to be interpreted when
|
|
running a custom command. Essentially creates a .exe(.sh for linux/mac)
|
|
to be able to run the game.
|
|
If an errors occurs when compiling, the stdout will print it.
|
|
'''
|
|
|
|
os.chdir(cwd)
|
|
|
|
|
|
|
|
def main(source, target):
|
|
# Get full folder path to avoid bugs in differing OS
|
|
cwd = os.getcwd()
|
|
source_path = os.path.join(cwd, source)
|
|
target_path = os.path.join(cwd, target)
|
|
|
|
game_paths = find_all_game_paths(source_path)
|
|
# print(game_paths)
|
|
new_game_dirs = get_name_from_paths(game_paths, "_game")
|
|
# print(new_game_dirs)
|
|
|
|
create_dir(target_path)
|
|
|
|
# Loop through all game paths and copy them over to the destination
|
|
for src, dest in zip(game_paths, new_game,dirs):
|
|
dest_path = os.path.join(target_path, dest)
|
|
copy_and_overwrite(src, dest_path)
|
|
compile_game_code(dest_path)
|
|
'''
|
|
How zip works
|
|
Takes matching elements from two arrays and turns it into a tuple
|
|
[1,2,3]
|
|
["a", "b", "c"]
|
|
(1,"a"), (2,"b"), (3,"c")
|
|
'''
|
|
|
|
json_path = os.path.join(target_path, "metadata.json")
|
|
make_json_metadata_file(json_path, new_game_dirs)
|
|
|
|
|
|
# Makes sure the file is run directly
|
|
# Also stops the entire file from being loaded
|
|
if __name__ == "__main__":
|
|
args = sys.argv
|
|
# print(args)
|
|
if len(args) != 3: # Confirm 3 arguments are input
|
|
raise Exception("You must pass a source and target directory - only.")
|
|
|
|
# Takes the two other arguments and assigns them
|
|
source, target = args[1:]
|
|
main(source, target) |