def compile(self): os.chdir(VIGRIDR_SRC) self.logger.info('Changing game code') change_game_code(self.pid, False, False, False, NullLogger()) # Hack for the case of just one player # TODO: Fix it! if self.num_players == 1: self.num_players = 2 self.uids.append("COMPUTER") self.siids.append("COMPUTER") self.exts.append("py") os.chdir('..') os.mkdir(self.game) with open(os.devnull, "w") as dev_null: for idx, siid, ext in zip(range(1, self.num_players + 1), self.siids, self.exts): lang = 'csharp' if ext == 'cs' else ext if siid == "COMPUTER": # 1-player hack shutil.copy(path.join(VIGRIDR_SRC, 'games', self.pid, 'sampleclient', 'ClientLogic.py'), path.join(VIGRIDR_SRC, 'client', 'ClientLogic.' + ext)) else: shutil.copy(path.join(DOWNLOADS, siid), path.join(VIGRIDR_SRC, 'client', 'ClientLogic.' + ext)) self.logger.info('make client' + lang) check_call(['make', 'client' + lang], stdout=dev_null, stderr=STDOUT) shutil.copytree(path.join('bin', lang), path.join(self.game, 'client' + str(idx))) check_call(['make', 'remove'], stdout=dev_null, stderr=STDOUT) os.mkdir(path.join(self.game, 'server')) shutil.copy(path.join(VIGRIDR_SRC, 'games', self.pid, 'bin', 'server'), path.join(self.game, 'server', 'server'))
def __exit__(self, t, v, tr): #shutil.rmtree(self.game, True) os.chdir(VIGRIDR_SRC) change_game_code('template', True, False, False, NullLogger()) if t: self.logger.error('From Game.__exit__:') for line in traceback.format_exception(t, v, tr): self.logger.error(line[:-1]) return True
def __exit__(self, t, v, tr): #shutil.rmtree(self.game, True) os.chdir(VIGRIDR_SRC) change_game_code('template', True, False, False, NullLogger()) if t: self.logger.error('From Game.__exit__:') for line in traceback.format_exception(t, v, tr): self.logger.error(line[:-1]) return True
def build_all(): os.chdir('..') call(['make', 'directories']) call(['make', 'remove']) os.chdir("src") for game in game_list: change_game_code(game, copy_sample_clients=False, copy_tests=True, copy_obj=False) call(['make', 'remove']) call(['make', 'server']) call(['make', 'buildtests']) call(['make', 'test']) cache_state(game) change_game_code(game_list[0], copy_sample_clients=False, copy_tests=True, copy_obj=False)
def _build_game(game, stdout=sys.stdout): """ Builds a game, in the vigridr directory. It doesn't restore the original files. Parameter: game - the game name as string """ logger.info("The %s game has never been built. Building it..." % game) os.chdir(VIGRIDR) check_call(['make', 'directories'], stdout=stdout) check_call(['make', 'remove'], stdout=stdout) os.chdir(VIGRIDRSRC) change_game_code(game, copy_sample_clients=False, copy_tests=False, copy_obj=False, used_logger=_SilentLogger()) check_call(['make', 'server'], stdout=stdout) cache_state(game)
def compile(self): os.chdir(VIGRIDR_SRC) self.logger.info('Changing game code') change_game_code(self.pid, False, False, False, NullLogger()) os.chdir('..') lang = 'csharp' if self.ext == 'cs' else self.ext if self.ext == 'cs' or self.ext == 'cpp' or self.ext == 'java': shutil.copy(path.join(DOWNLOADS, self.siid), path.join('src', 'client', 'ClientLogic.' + self.ext)) self.logger.info('make client' + lang) with open(os.devnull, 'w') as dev_null: with open(BUILD_ERR, 'w') as build_err: returncode = call(['make', 'client' + lang], stdout=dev_null, stderr=build_err) if returncode == 0: self.result = {'status': 'Success'} self.logger.info('Compilation succeded') else: self.logger.info('Compilation failed') self.result = { 'status': 'Failure', 'error': open(BUILD_ERR, 'r').read() } check_call(['make', 'remove'], stdout=dev_null, stderr=dev_null) elif self.ext == 'py': filename = BUILD + 'ClientLogic.' + self.ext shutil.copy(path.join(DOWNLOADS, self.siid), filename) try: self.logger.info('compile python') compile(open(filename, 'r').read(), filename, 'exec') self.result = {'status': 'Success'} self.logger.info('Compilation succeded') except SyntaxError: self.result = { 'status': 'Failure', 'error': traceback.format_exc() } self.logger.info('Compilation failed')
def compile(self): os.chdir(VIGRIDR_SRC) self.logger.info('Changing game code') change_game_code(self.pid, False, False, False, NullLogger()) os.chdir('..') lang = 'csharp' if self.ext == 'cs' else self.ext if self.ext == 'cs' or self.ext == 'cpp' or self.ext == 'java': shutil.copy(path.join(DOWNLOADS, self.siid), path.join('src', 'client', 'ClientLogic.' + self.ext)) self.logger.info('make client' + lang) with open(os.devnull, 'w') as dev_null: with open(BUILD_ERR, 'w') as build_err: returncode = call(['make', 'client' + lang], stdout=dev_null, stderr=build_err) if returncode == 0: self.result = { 'status': 'Success' } self.logger.info('Compilation succeded') else: self.logger.info('Compilation failed') self.result = { 'status': 'Failure', 'error': open(BUILD_ERR, 'r').read() } check_call(['make', 'remove'], stdout=dev_null, stderr=dev_null) elif self.ext == 'py': filename = BUILD + 'ClientLogic.' + self.ext shutil.copy(path.join(DOWNLOADS, self.siid), filename) try: self.logger.info('compile python') compile(open(filename, 'r').read(), filename, 'exec') self.result = { 'status': 'Success' } self.logger.info('Compilation succeded') except SyntaxError: self.result = { 'status': 'Failure', 'error': traceback.format_exc() } self.logger.info('Compilation failed')
def _build_game(game, stdout=sys.stdout): """ Builds a game, in the vigridr directory. It doesn't restore the original files. Parameter: game - the game name as string """ logger.info("The %s game has never been built. Building it..." % game) os.chdir(VIGRIDR) check_call(['make', 'directories'], stdout=stdout) check_call(['make', 'remove'], stdout=stdout) os.chdir(VIGRIDRSRC) change_game_code(game, copy_sample_clients=False, copy_tests=False, copy_obj=False, used_logger=_SilentLogger()) check_call(['make', 'server'], stdout=stdout) cache_state(game)
def build_all(): os.chdir('..') call(['make', 'directories']) call(['make', 'remove']) os.chdir("src") for game in game_list: change_game_code(game, copy_sample_clients=False, copy_tests=True, copy_obj=False) call(['make', 'remove']) call(['make', 'server']) call(['make', 'buildtests']) call(['make', 'test']) cache_state(game) change_game_code(game_list[0], copy_sample_clients=False, copy_tests=True, copy_obj=False)
def compile(self): os.chdir(VIGRIDR_SRC) self.logger.info('Changing game code') change_game_code(self.pid, False, False, False, NullLogger()) # Hack for the case of just one player # TODO: Fix it! if self.num_players == 1: self.num_players = 2 self.uids.append("COMPUTER") self.siids.append("COMPUTER") self.exts.append("py") os.chdir('..') os.mkdir(self.game) with open(os.devnull, "w") as dev_null: for idx, siid, ext in zip(range(1, self.num_players + 1), self.siids, self.exts): lang = 'csharp' if ext == 'cs' else ext if siid == "COMPUTER": # 1-player hack shutil.copy( path.join(VIGRIDR_SRC, 'games', self.pid, 'sampleclient', 'ClientLogic.py'), path.join(VIGRIDR_SRC, 'client', 'ClientLogic.' + ext)) else: shutil.copy( path.join(DOWNLOADS, siid), path.join(VIGRIDR_SRC, 'client', 'ClientLogic.' + ext)) self.logger.info('make client' + lang) check_call(['make', 'client' + lang], stdout=dev_null, stderr=STDOUT) shutil.copytree(path.join('bin', lang), path.join(self.game, 'client' + str(idx))) check_call(['make', 'remove'], stdout=dev_null, stderr=STDOUT) os.mkdir(path.join(self.game, 'server')) shutil.copy(path.join(VIGRIDR_SRC, 'games', self.pid, 'bin', 'server'), path.join(self.game, 'server', 'server'))
sys.path.append(VIGRIDR_SRC) from change_game_code import change_game_code sys.path.pop(-1) class Logger(): def error(self, msg): print msg def info(self, msg): print msg os.chdir(VIGRIDR_SRC) change_game_code(CURRENT_GAME, False, True, False, Logger()) idx = 1 print('######################## Compiling ########################') try: shutil.rmtree(os.path.join(TEST_SRC, 'client1')) shutil.rmtree(os.path.join(TEST_SRC, 'client2')) shutil.rmtree(os.path.join(TEST_SRC, 'server')) except: pass for x in range(0, 2): print('======================== Setting up client ' + str(idx) + ' ========================')
CURRENT_GAME = 'tron' CLIENT_EXTENSION = 'cpp' SERVER_EXTENSION = 'cpp' sys.path.append(VIGRIDR_SRC) from change_game_code import change_game_code sys.path.pop(-1) class Logger(): def error(self, msg): print msg def info(self, msg): print msg os.chdir(VIGRIDR_SRC) change_game_code(CURRENT_GAME, False, True, False, Logger()) idx = 1 print('######################## Compiling ########################') try: shutil.rmtree(os.path.join(TEST_SRC, 'client1')) shutil.rmtree(os.path.join(TEST_SRC, 'client2')) shutil.rmtree(os.path.join(TEST_SRC, 'server')) except: pass for x in range(0, 2): print('======================== Setting up client ' + str(idx) + ' ========================') shutil.copy(os.path.join(VIGRIDR_SRC, 'games', CURRENT_GAME, 'sampleclient', 'ClientLogic.' + CLIENT_EXTENSION), os.path.join(VIGRIDR_SRC, 'client', 'ClientLogic.' + CLIENT_EXTENSION))
def update(mjollnir): build_game = mjollnir._build_game build_solution = mjollnir.build logger = mjollnir.logger # Silence invocations of build_game and build_solution mjollnir.logger = mjollnir._SilentLogger() try: logger.info("Checking for configuration changes...") something_changed = False dev_null = open(os.devnull, "w") _mjollnir_solutions_folder_changed(mjollnir) if _changed(VIGRIDRSRC): logger.info(" * Source code for games changed") something_changed = True logger.info(" -> Rebuilding all game binaries") for game in glob(path.join(VIGRIDRSRC, "games", "*")): if not path.isdir(game): continue if not json.load(open(path.join(game, "config.json"), "r"))["published"]: continue try: game_name = path.basename(game) logger.info(" Game '%s'..." % game_name) build_game(game_name, stdout=dev_null) except CalledProcessError as e: logger.warn("Failure to build game '%s'" % game_name) print str(e) # If game failed, doesn't matter. Go to next. bin_folders = glob(path.expanduser(path.join("~", "mjollnir-solutions", "*", "*", "bin"))) if bin_folders: logger.info(" -> Rebuilding solution binaries") for bin_folder in bin_folders: solution_folder = path.dirname(bin_folder) solution_name = path.basename(solution_folder) game = path.basename(path.dirname(solution_folder)) logger.info(" Solution '%s/%s'..." % (game, solution_name)) os.chdir(solution_folder) if build_solution([], stdout=dev_null) != 0: logger.warn("Failure to build solution '%s'" % solution_name) # If solution failed, doesn't matter. Go to next. if _changed(path.join(MJOLLNIR, "autocomplete-mjollnir")) or _changed(path.join(MJOLLNIR, "include-mjollnir")): logger.info(" * A shell script was changed.") logger.info(" -> In order to get full capabilities, please either") logger.info(" close and reopen your terminals or run '. ~/.bashrc' in each of them.") something_changed = True if not something_changed: logger.info("Nothing to do.") except KeyboardInterrupt as e: logger.err(repr(e)) return 1 finally: os.chdir(VIGRIDRSRC) change_game_code( "template", copy_sample_clients=True, copy_tests=False, copy_obj=False, used_logger=mjollnir._SilentLogger() ) mjollnir.logger = logger dev_null.close() return 0
def build(params, stdout=sys.stdout): """ With no parameters, builds the solution in the current folder. Parameters: [clean] clean - Delete build and bin folders of current solution. """ # Requirements if len(params) > 1: logger.err("Wrong number of parameters\n") help(["build"]) return 1 correct_folder, solution_folder, game, solution_name, language = _check_correct_folder( ) if not correct_folder: logger.err("You are not in a solution folder") return 1 clean = False if len(params) == 1: if params[0] == "clean": clean = True else: logger.err("Unrecognized option: " + params[0]) return 1 # Command execution build_folder = path.join("/sandboxes", "-".join([game, solution_name + "." + language])) if path.isdir(build_folder): logger.info("Deleting old build folder...") shutil.rmtree(build_folder) if clean: if path.isdir("./bin"): logger.info("Deleting bin folder...") shutil.rmtree("./bin") return 0 full_lang = language if language == "cs": full_lang = "csharp" try: # Check if game code has been built if not path.isdir(path.join(GAMESDIR, game, "gen-" + full_lang)): try: _build_game(game) except CalledProcessError as e: logger.err(str(e)) return 1 logger.info("Changing game code...") os.chdir(VIGRIDRSRC) change_game_code(game, copy_sample_clients=True, copy_tests=False, copy_obj=False, used_logger=_SilentLogger()) logger.info("Copying to build folder...") def ignore(src, names): """ Returns the names the files inside `src` to NOT copy. """ do_copy = names if src == VIGRIDR: do_copy = ["Makefile", "third-parties", "src"] elif src == VIGRIDRSRC: do_copy = ["Makefile", "Makefile.inc", "client", "thrifts"] if language == "cpp": do_copy.append("utils") elif src == path.join(VIGRIDRSRC, "client"): do_copy = ["Makefile", "GameClient." + language] if language == "cpp": do_copy.append("ClientLogic.h") elif language == "java": do_copy.append("java_run_script.sh") elif language == "py": do_copy.append("python_run_script.sh") elif src == path.join(VIGRIDRSRC, "thrifts"): do_copy = ["gen-" + full_lang] elif src == path.join(VIGRIDR, "third-parties"): do_copy = ["python" if full_lang == "py" else full_lang] return list(set(names) - set(do_copy)) shutil.copytree(VIGRIDR, build_folder, symlinks=True, ignore=ignore) logger.info("Copying your specific solution...") shutil.copy( path.join(solution_folder, solution_name + "." + language), path.join(build_folder, "src", "client", "ClientLogic." + language)) os.chdir(path.join(build_folder, "src")) logger.info("Building solution...") os.makedirs(path.join(build_folder, "obj", "client")) if language == "cpp": os.makedirs(path.join(build_folder, "obj", "thrifts", "gen-cpp")) os.makedirs(path.join(build_folder, "obj", "utils")) os.makedirs(path.join(build_folder, "bin", full_lang)) return_value = call(["make", "client" + full_lang], stdout=stdout, stderr=STDOUT) if return_value != 0: return return_value # Specific code for python, just to make a syntactic analysis if language == "py": filename = path.join(solution_folder, solution_name + "." + language) contents = "" with open(filename, "r") as f: contents = f.read() try: compile(contents, filename, "exec") except SyntaxError as e: logger.info("") logger.err(str(e)) logger.info("") return 1 logger.info("Copying back...") if path.isdir(path.join(solution_folder, "bin")): shutil.rmtree(path.join(solution_folder, "bin")) shutil.copytree(path.join(build_folder, "bin", full_lang), path.join(solution_folder, "bin")) except KeyboardInterrupt as e: logger.err(repr(e)) return 1 finally: logger.info("Changing game code back to normal...") os.chdir(VIGRIDRSRC) change_game_code("template", copy_sample_clients=True, copy_tests=False, copy_obj=False, used_logger=_SilentLogger()) return 0
def build(params, stdout=sys.stdout): """ With no parameters, builds the solution in the current folder. Parameters: [clean] clean - Delete build and bin folders of current solution. """ # Requirements if len(params) > 1: logger.err("Wrong number of parameters\n") help(["build"]) return 1 correct_folder, solution_folder, game, solution_name, language = _check_correct_folder() if not correct_folder: logger.err("You are not in a solution folder") return 1 clean = False if len(params) == 1: if params[0] == "clean": clean = True else: logger.err("Unrecognized option: " + params[0]) return 1 # Command execution build_folder = path.join("/sandboxes", "-".join([game, solution_name + "." + language])) if path.isdir(build_folder): logger.info("Deleting old build folder...") shutil.rmtree(build_folder) if clean: if path.isdir("./bin"): logger.info("Deleting bin folder...") shutil.rmtree("./bin") return 0 full_lang = language if language == "cs": full_lang = "csharp" try: # Check if game code has been built if not path.isdir(path.join(GAMESDIR, game, "gen-" + full_lang)): try: _build_game(game) except CalledProcessError as e: logger.err(str(e)) return 1 logger.info("Changing game code...") os.chdir(VIGRIDRSRC) change_game_code(game, copy_sample_clients=True, copy_tests=False, copy_obj=False, used_logger=_SilentLogger()) logger.info("Copying to build folder...") def ignore(src, names): """ Returns the names the files inside `src` to NOT copy. """ do_copy = names if src == VIGRIDR: do_copy = ["Makefile", "third-parties", "src"] elif src == VIGRIDRSRC: do_copy = ["Makefile", "Makefile.inc", "client", "thrifts"] if language == "cpp": do_copy.append("utils") elif src == path.join(VIGRIDRSRC, "client"): do_copy = ["Makefile", "GameClient." + language] if language == "cpp": do_copy.append("ClientLogic.h") elif language == "java": do_copy.append("java_run_script.sh") elif language == "py": do_copy.append("python_run_script.sh") elif src == path.join(VIGRIDRSRC, "thrifts"): do_copy = ["gen-" + full_lang] elif src == path.join(VIGRIDR, "third-parties"): do_copy = ["python" if full_lang == "py" else full_lang] return list(set(names) - set(do_copy)) shutil.copytree(VIGRIDR, build_folder, symlinks=True, ignore=ignore) logger.info("Copying your specific solution...") shutil.copy(path.join(solution_folder, solution_name + "." + language), path.join(build_folder, "src", "client", "ClientLogic." + language)) os.chdir(path.join(build_folder, "src")) logger.info("Building solution...") os.makedirs(path.join(build_folder, "obj", "client")) if language == "cpp": os.makedirs(path.join(build_folder, "obj", "thrifts", "gen-cpp")) os.makedirs(path.join(build_folder, "obj", "utils")) os.makedirs(path.join(build_folder, "bin", full_lang)) return_value = call(["make", "client" + full_lang], stdout=stdout, stderr=STDOUT) if return_value != 0: return return_value # Specific code for python, just to make a syntactic analysis if language == "py": filename = path.join(solution_folder, solution_name + "." + language) contents = "" with open(filename, "r") as f: contents = f.read() try: compile(contents, filename, "exec") except SyntaxError as e: logger.info("") logger.err(str(e)) logger.info("") return 1 logger.info("Copying back...") if path.isdir(path.join(solution_folder, "bin")): shutil.rmtree(path.join(solution_folder, "bin")) shutil.copytree(path.join(build_folder, "bin", full_lang), path.join(solution_folder, "bin")) except KeyboardInterrupt as e: logger.err(repr(e)) return 1 finally: logger.info("Changing game code back to normal...") os.chdir(VIGRIDRSRC) change_game_code("template", copy_sample_clients=True, copy_tests=False, copy_obj=False, used_logger=_SilentLogger()) return 0
def update(mjollnir, local=False): build_game = mjollnir._build_game build_solution = mjollnir.build logger = mjollnir.logger # Silence invocations of build_game and build_solution mjollnir.logger = mjollnir._SilentLogger() try: logger.info("Checking for configuration changes...") something_changed = False dev_null = open(os.devnull, "w") _mjollnir_solutions_folder_changed(mjollnir) if _changed(VIGRIDRSRC, local): logger.info(" * Source code for game(s) changed") something_changed = True if local: logger.info(" -> Rebuilding all changed games binaries (on current branch, since last commit)") else: logger.info(" -> Rebuilding all changed games binaries (comparing, on master, last commit with last but one commit)") for game in glob(path.join(VIGRIDRSRC, "games", "*")): if not path.isdir(game): continue if not json.load(open(path.join(game, "config.json"), "r"))["published"]: continue game_name = path.basename(game) if _changed(path.join(VIGRIDRSRC, "games", game_name, ""), local): try: logger.info(" Game '%s'..." % game_name) build_game(game_name, stdout=dev_null) except CalledProcessError as e: logger.warn("Failure to build game '%s'" % game_name) print str(e) # If game failed, doesn't matter. Go to next. bin_folders = glob(path.expanduser(path.join("~", "mjollnir-solutions", "*", "*", "bin"))) if bin_folders: logger.info(" -> Rebuilding solution binaries") for bin_folder in bin_folders: solution_folder = path.dirname(bin_folder) solution_name = path.basename(solution_folder) game_name = path.basename(path.dirname(solution_folder)) if _changed(path.join(VIGRIDRSRC, "games", game_name, ""), local): logger.info(" Solution '%s/%s'..." % (game_name, solution_name)) os.chdir(solution_folder) if build_solution([], stdout=dev_null) != 0: logger.warn("Failure to build solution '%s'" % solution_name) # If solution failed, doesn't matter. Go to next. if _changed(path.join(MJOLLNIR, "autocomplete-mjollnir"), local) or _changed(path.join(MJOLLNIR, "include-mjollnir"), local): logger.info(" * A shell script was changed.") logger.info(" -> In order to get full capabilities, please either") logger.info(" close and reopen your terminals or run '. ~/.bashrc' in each of them.") something_changed = True if not something_changed: logger.info("Nothing to do.") except KeyboardInterrupt as e: logger.err(repr(e)) return 1 finally: os.chdir(VIGRIDRSRC) change_game_code("template", copy_sample_clients=True, copy_tests=False, copy_obj=False, used_logger=mjollnir._SilentLogger()) mjollnir.logger = logger dev_null.close() return 0