Beispiel #1
0
    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'))
Beispiel #2
0
 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
Beispiel #3
0
 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
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
    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')
Beispiel #7
0
    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')
Beispiel #8
0
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)
Beispiel #9
0
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)
Beispiel #10
0
    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'))
Beispiel #11
0
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))
Beispiel #13
0
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
Beispiel #14
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
Beispiel #15
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
Beispiel #16
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