Пример #1
0
class ConfigureContext(object):
    def __init__(self):
        self.env = Environment()
        self.tools = []
        self._tool_modules = {}
        self.builders = {}
        self.cache = {}
        self.conf_results = []
        self._configured = {}
        self._stdout_cache = {}
        self._cmd_cache = {}

        self.src_root = None
        self.bld_root = None
        self.path = None

    def load_tool(self, tool, tooldir=None):
        _t = import_tools([tool], tooldir)
        self.tools.append({"tool": tool, "tooldir": tooldir})
        mod = _t[tool]
        self._tool_modules[tool] = mod
        if hasattr(mod, "get_builder"):
            self.builders[tool] = mod.get_builder(self)
        return mod

    def use_tools(self, tools, tooldir=None):
        ret = {}
        for t in tools:
            if t in self._tool_modules:
                _t = self._tool_modules[t]
            else:
                _t = self.load_tool(t, tooldir)
            ret[t] = _t
        self.setup_tools()
        return ret

    def setup_tools(self):
        for builder in self.builders.values():
            if not builder.configured:
               builder.configure()
               self._configured[builder] = True

    def store(self):
        default_env = self.bld_root.make_node(DEFAULT_ENV)
        self.env.store(default_env.abspath())

        self.log.close()

        config_cache = self.bld_root.make_node(CONFIG_CACHE)
        out = []
        out.append(dumps(self.cache))
        out.append(dumps(self._stdout_cache))
        out.append(dumps(self._cmd_cache))
        config_cache.write(join_bytes(out), flags="wb")

        build_config = self.bld_root.make_node(BUILD_CONFIG)
        build_config.write("%r\n" % self.tools)

        hook_dump = self.bld_root.make_node(HOOK_DUMP)
        s = dumps({"extensions": yaku.task_manager.RULES_REGISTRY,
                   "files": _hook_id_to_hook_path(yaku.task_manager.FILES_REGISTRY)})
        hook_dump.write(s, flags="wb")

    def start_message(self, msg):
        _OUTPUT.write(msg + "... ")
        self.log.write("=" * 79 + "\n")
        self.log.write("%s\n" % msg)

    def end_message(self, msg):
        _OUTPUT.write("%s\n" % msg)

    def fail_configuration(self, msg):
        msg = "%s\nPlease look at the configuration log %r" % (msg, self.log.name)
        self.log.flush()
        raise ConfigurationFailure(msg)

    def set_cmd_cache(self, task, cmd):
        self._cmd_cache[task.get_uid()] = cmd[:]

    def get_cmd(self, task):
        tid = task.get_uid()
        try:
            return self._cmd_cache[tid]
        except KeyError:
            raise UnknownTask

    def set_stdout_cache(self, task, stdout):
        self._stdout_cache[task.get_uid()] = stdout

    def get_stdout(self, task):
        tid = task.get_uid()
        try:
            return self._stdout_cache[tid]
        except KeyError:
            raise UnknownTask
Пример #2
0
class ConfigureContext(object):
    def __init__(self):
        self.env = Environment()
        self.tools = []
        self._tool_modules = {}
        self.builders = {}
        self.cache = {}
        self.conf_results = []
        self._configured = {}
        self._stdout_cache = {}
        self._cmd_cache = {}

        self.src_root = None
        self.bld_root = None
        self.path = None

    def load_tool(self, tool, tooldir=None):
        _t = import_tools([tool], tooldir)
        self.tools.append({"tool": tool, "tooldir": tooldir})
        mod = _t[tool]
        self._tool_modules[tool] = mod
        if hasattr(mod, "get_builder"):
            self.builders[tool] = mod.get_builder(self)
        return mod

    def use_tools(self, tools, tooldir=None):
        ret = {}
        for t in tools:
            if t in self._tool_modules:
                _t = self._tool_modules[t]
            else:
                _t = self.load_tool(t, tooldir)
            ret[t] = _t
        self.setup_tools()
        return ret

    def setup_tools(self):
        for builder in list(self.builders.values()):
            if not builder.configured:
                builder.configure()
                self._configured[builder] = True

    def store(self):
        default_env = self.bld_root.make_node(DEFAULT_ENV)
        self.env.store(default_env.abspath())

        self.log.close()

        config_cache = self.bld_root.make_node(CONFIG_CACHE)
        out = []
        out.append(dumps(self.cache))
        out.append(dumps(self._stdout_cache))
        out.append(dumps(self._cmd_cache))
        config_cache.write(join_bytes(out), flags="wb")

        build_config = self.bld_root.make_node(BUILD_CONFIG)
        build_config.write("%r\n" % self.tools)

        hook_dump = self.bld_root.make_node(HOOK_DUMP)
        s = dumps({
            "extensions":
            yaku.task_manager.RULES_REGISTRY,
            "files":
            _hook_id_to_hook_path(yaku.task_manager.FILES_REGISTRY)
        })
        hook_dump.write(s, flags="wb")

    def start_message(self, msg):
        _OUTPUT.write(msg + "... ")
        self.log.write("=" * 79 + "\n")
        self.log.write("%s\n" % msg)

    def end_message(self, msg):
        _OUTPUT.write("%s\n" % msg)

    def fail_configuration(self, msg):
        msg = "%s\nPlease look at the configuration log %r" % (msg,
                                                               self.log.name)
        self.log.flush()
        raise ConfigurationFailure(msg)

    def set_cmd_cache(self, task, cmd):
        self._cmd_cache[task.get_uid()] = cmd[:]

    def get_cmd(self, task):
        tid = task.get_uid()
        try:
            return self._cmd_cache[tid]
        except KeyError:
            raise UnknownTask

    def set_stdout_cache(self, task, stdout):
        self._stdout_cache[task.get_uid()] = stdout

    def get_stdout(self, task):
        tid = task.get_uid()
        try:
            return self._stdout_cache[tid]
        except KeyError:
            raise UnknownTask
Пример #3
0
class ConfigureContext(object):
    def __init__(self):
        self.env = Environment()
        self.tools = []
        self._tool_modules = {}
        self.builders = {}
        self.cache = {}
        self.conf_results = []
        self._configured = {}
        self._stdout_cache = {}
        self._cmd_cache = {}

        self.src_root = None
        self.bld_root = None
        self.path = None

    def load_tool(self, tool, tooldir=None):
        _t = import_tools([tool], tooldir)
        self.tools.append({"tool": tool, "tooldir": tooldir})
        mod = _t[tool]
        self._tool_modules[tool] = mod
        if hasattr(mod, "get_builder"):
            self.builders[tool] = mod.get_builder(self)
        return mod

    def use_tools(self, tools, tooldir=None):
        ret = {}
        for t in tools:
            if t in self._tool_modules:
                _t = self._tool_modules[t]
            else:
                _t = self.load_tool(t, tooldir)
            ret[t] = _t
        self.setup_tools()
        return ret

    def setup_tools(self):
        for builder in self.builders.values():
            if not builder.configured:
                builder.configure()
                self._configured[builder] = True

    def store(self):
        default_env = self.bld_root.make_node(DEFAULT_ENV)
        self.env.store(default_env.abspath())

        self.log.close()

        config_cache = self.bld_root.make_node(CONFIG_CACHE)
        out = []
        out.append(dumps(self.cache))
        out.append(dumps(self._stdout_cache))
        out.append(dumps(self._cmd_cache))
        config_cache.write(join_bytes(out), flags="wb")

        build_config = self.bld_root.make_node(BUILD_CONFIG)
        build_config.write("%r\n" % self.tools)

        hook_dump = self.bld_root.make_node(HOOK_DUMP)
        s = dumps({
            "extensions":
            yaku.task_manager.RULES_REGISTRY,
            "files":
            _hook_id_to_hook_path(yaku.task_manager.FILES_REGISTRY)
        })
        hook_dump.write(s, flags="wb")

    def start_message(self, msg):
        _OUTPUT.write(msg + "... ")
        self.log.write("=" * 79 + "\n")
        self.log.write("%s\n" % msg)

    def end_message(self, msg):
        _OUTPUT.write("%s\n" % msg)

    def fail_configuration(self, msg):
        msg = "%s\nPlease look at the configuration log %r" % (msg,
                                                               self.log.name)
        self.log.flush()
        raise ConfigurationFailure(msg)

    def set_cmd_cache(self, task, cmd):
        self._cmd_cache[task.get_uid()] = cmd[:]

    def get_cmd(self, task):
        tid = task.get_uid()
        try:
            return self._cmd_cache[tid]
        except KeyError:
            raise UnknownTask

    def set_stdout_cache(self, task, stdout):
        self._stdout_cache[task.get_uid()] = stdout

    def get_stdout(self, task):
        tid = task.get_uid()
        try:
            return self._stdout_cache[tid]
        except KeyError:
            raise UnknownTask

    def try_command(self, cmd, cwd=None, env=None, kw=None):
        if cwd is None:
            cwd = self.bld_root.abspath()
        if kw is None:
            kw = {}
        if env is not None:
            kw["env"] = env

        def log_failure(succeed, explanation):
            if succeed:
                self.log.write("---> Succeeded !\n")
            else:
                self.log.write("---> Failure !\n")
                self.log.write("~~~~~~~~~~~~~~\n")
                self.log.write(explanation)
                self.log.write("~~~~~~~~~~~~~~\n")
            self.log.write("Command was:\n")
            self.log.write("%s\n" % cmd)
            self.log.write("\n")

        try:
            p = subprocess.Popen(cmd,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.STDOUT,
                                 cwd=cwd,
                                 **kw)
            stdout = p.communicate()[0].decode("utf-8")
            log_failure(p.returncode == 0, stdout)
            if p.returncode:
                return False
            return True
        except OSError:
            e = get_exception()
            log_failure(False, str(e))
        except WindowsError:
            e = get_exception()
            log_failure(False, str(e))
        return False
Пример #4
0
class ConfigureContext(object):
    def __init__(self):
        self.env = Environment()
        self.tools = []
        self._tool_modules = {}
        self.builders = {}
        self.cache = {}
        self.conf_results = []
        self._configured = {}
        self._stdout_cache = {}
        self._cmd_cache = {}

        self.src_root = None
        self.bld_root = None
        self.path = None

    def load_tool(self, tool, tooldir=None):
        _t = import_tools([tool], tooldir)
        self.tools.append({"tool": tool, "tooldir": tooldir})
        mod = _t[tool]
        self._tool_modules[tool] = mod
        if hasattr(mod, "get_builder"):
            self.builders[tool] = mod.get_builder(self)
        return mod

    def use_tools(self, tools, tooldir=None):
        ret = {}
        for t in tools:
            if t in self._tool_modules:
                _t = self._tool_modules[t]
            else:
                _t = self.load_tool(t, tooldir)
            ret[t] = _t
        self.setup_tools()
        return ret

    def setup_tools(self):
        for builder in self.builders.values():
            if not builder.configured:
               builder.configure()
               self._configured[builder] = True

    def store(self):
        default_env = self.bld_root.make_node(DEFAULT_ENV)
        self.env.store(default_env.abspath())

        self.log.close()

        config_cache = self.bld_root.make_node(CONFIG_CACHE)
        out = []
        out.append(dumps(self.cache))
        out.append(dumps(self._stdout_cache))
        out.append(dumps(self._cmd_cache))
        config_cache.write(join_bytes(out), flags="wb")

        build_config = self.bld_root.make_node(BUILD_CONFIG)
        build_config.write("%r\n" % self.tools)

        hook_dump = self.bld_root.make_node(HOOK_DUMP)
        s = dumps({"extensions": yaku.task_manager.RULES_REGISTRY,
                   "files": _hook_id_to_hook_path(yaku.task_manager.FILES_REGISTRY)})
        hook_dump.write(s, flags="wb")

    def start_message(self, msg):
        _OUTPUT.write(msg + "... ")
        self.log.write("=" * 79 + "\n")
        self.log.write("%s\n" % msg)

    def end_message(self, msg):
        _OUTPUT.write("%s\n" % msg)

    def fail_configuration(self, msg):
        msg = "%s\nPlease look at the configuration log %r" % (msg, self.log.name)
        self.log.flush()
        raise ConfigurationFailure(msg)

    def set_cmd_cache(self, task, cmd):
        self._cmd_cache[task.get_uid()] = cmd[:]

    def get_cmd(self, task):
        tid = task.get_uid()
        try:
            return self._cmd_cache[tid]
        except KeyError:
            raise UnknownTask

    def set_stdout_cache(self, task, stdout):
        self._stdout_cache[task.get_uid()] = stdout

    def get_stdout(self, task):
        tid = task.get_uid()
        try:
            return self._stdout_cache[tid]
        except KeyError:
            raise UnknownTask

    def try_command(self, cmd, cwd=None, env=None, kw=None):
        if cwd is None:
            cwd = self.bld_root.abspath()
        if kw is None:
            kw = {}
        if env is not None:
            kw["env"] = env

        def log_failure(succeed, explanation):
            if succeed:
                self.log.write("---> Succeeded !\n")
            else:
                self.log.write("---> Failure !\n")
                self.log.write("~~~~~~~~~~~~~~\n")
                self.log.write(explanation)
                self.log.write("~~~~~~~~~~~~~~\n")
            self.log.write("Command was:\n")
            self.log.write("%s\n" % cmd)
            self.log.write("\n")

        try:
            p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                    stderr=subprocess.STDOUT, cwd=cwd, **kw)
            stdout = p.communicate()[0].decode("utf-8")
            log_failure(p.returncode == 0, stdout)
            if p.returncode:
                return False
            return True
        except OSError:
            e = get_exception()
            log_failure(False, str(e))
        except WindowsError:
            e = get_exception()
            log_failure(False, str(e))
        return False
Пример #5
0
class ConfigureContext(object):
    def __init__(self):
        self.env = Environment()
        self.tools = []
        self._tool_modules = {}
        self.builders = {}
        self.cache = {}
        self.conf_results = []
        self._configured = {}
        self._stdout_cache = {}
        self._cmd_cache = {}

    def load_tool(self, tool, tooldir=None):
        _t = import_tools([tool], tooldir)
        self.tools.append({"tool": tool, "tooldir": tooldir})
        mod = _t[tool]
        self._tool_modules[tool] = mod
        if hasattr(mod, "get_builder"):
            self.builders[tool] = mod.get_builder(self)
        return mod

    def use_tools(self, tools, tooldir=None):
        ret = {}
        for t in tools:
            if t in self._tool_modules:
                _t = self._tool_modules[t]
            else:
                _t = self.load_tool(t, tooldir)
            ret[t] = _t
        self.setup_tools()
        return ret

    def setup_tools(self):
        for builder in self.builders.values():
            if not builder.configured:
               builder.configure()
               self._configured[builder] = True

    def store(self):
        self.env.store(DEFAULT_ENV)

        self.log.close()
        fid = open(CONFIG_CACHE, "wb")
        try:
            dump(self.cache, fid)
            dump(self._stdout_cache, fid)
            dump(self._cmd_cache, fid)
        finally:
            fid.close()

        fid = myopen(BUILD_CONFIG, "w")
        try:
            fid.write("%r\n" % self.tools)
        finally:
            fid.close()

        fid = myopen(HOOK_DUMP, "wb")
        try:
            dump({"extensions": yaku.task_manager.RULES_REGISTRY,
                  "files": _hook_id_to_hook_path(yaku.task_manager.FILES_REGISTRY)},
                 fid)
        finally:
            fid.close()

    def start_message(self, msg):
        sys.stderr.write(msg + "... ")
        self.log.write("=" * 79 + "\n")
        self.log.write("%s\n" % msg)

    def end_message(self, msg):
        sys.stderr.write("%s\n" % msg)

    def set_cmd_cache(self, task, cmd):
        self._cmd_cache[task.get_uid()] = cmd[:]

    def get_cmd(self, task):
        tid = task.get_uid()
        try:
            return self._cmd_cache[tid]
        except KeyError:
            raise UnknownTask

    def set_stdout_cache(self, task, stdout):
        self._stdout_cache[task.get_uid()] = stdout

    def get_stdout(self, task):
        tid = task.get_uid()
        try:
            return self._stdout_cache[tid]
        except KeyError:
            raise UnknownTask