예제 #1
0
class Compiler(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
        self.src_path = Path(self.src_path)
        self.out_path = Path(self.out_path)
        self.print = self.print or self.src_filter
        self.classpath = os.environ["CLASSPATH"]
        self.src_extensions = self.src_extensions.split(",")
        try:
            self.plugin_path = path_resolv.resolve("lib/sketchrewriter.jar")
        except:
            self.plugin_path = ""
        assert self.src_path.exists() and self.out_path.exists()

    def clean_dir(self):
        if self.clean:
            [self.out_path.subpath(f).remove_tree() for f in self.out_path.listdir()]

    @staticmethod
    def print_cmd(cmd):
        def quote(v):
            v = re.sub("([\$\'\"])", r"\\\g<1>", v)
            return "\"%s\"" %(v) if (" " in v) else v
        print(" ".join([quote(v) for v in cmd]))

    def run(self, cmd, save_output=None, file_ext="txt"):
        if self.print:
            self.print_cmd(cmd)
        save_output = (self.kwrite or self.vim) if save_output else save_output
        pipe_output = { "stdout": subprocess.PIPE } if save_output else { }
        try:
            proc = subprocess.Popen(cmd, **pipe_output)
            text = proc.communicate()[0]
        except Exception, e:
            proc = namedtuple("anon", "returncode")(1)
            text = "ERROR RUNNING COMMAND - " + str(e)
        if proc.returncode != 0:
            print("=== error compiling ===")
            if not self.print: self.print_cmd(cmd)
            if text: print(text)
            sys.exit(1)
        elif not save_output:
            return

        from tempfile import NamedTemporaryFile
        tf = NamedTemporaryFile(suffix="." + file_ext, delete=False)
        tf.write(text)
        tf.close()
        if self.kwrite:
            subprocess.Popen(["kwrite", tf.name], stderr=subprocess.PIPE)
        elif self.vim:
            subprocess.Popen(["vim", tf.name]).wait()