github.com/theodus/go-transpiler@v0.0.0-20160215204930-f7a111b512c0/transpile.go (about)

     1  package main
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  	"os/exec"
     9  	"strings"
    10  )
    11  
    12  func tardis(lang, pkg string) {
    13  	_, err := os.Stat(fmt.Sprintf("%s/bin/tardisgo", os.Getenv("GOPATH")))
    14  	if os.IsNotExist(err) {
    15  		verbose("go", "get", "-u", "-v", "github.com/tardisgo/tardisgo")
    16  	}
    17  	if pkg == "" {
    18  		wd, err := os.Getwd()
    19  		if err != nil {
    20  			fmt.Fprintln(os.Stderr, err)
    21  		}
    22  		pref := fmt.Sprintf("%s%s", os.Getenv("GOPATH"), "/src/")
    23  		pkg = strings.TrimPrefix(wd, pref)
    24  	}
    25  	verbose("tardisgo", pkg)
    26  	verbose("haxe", "-main", "tardis.Go", "-cp", "tardis", "-dce", "full", fmt.Sprintf("-%s", lang), fmt.Sprintf("tardis/%s", lang))
    27  	out := pkg[strings.LastIndex(pkg, "/")+1:]
    28  	switch lang {
    29  	case "java":
    30  		out += ".jar"
    31  		f, err := os.Create(out)
    32  		if err != nil {
    33  			fmt.Fprintln(os.Stderr, err)
    34  		}
    35  		if err := copyFile("tardis/java/Go.jar", f.Name()); err != nil {
    36  			fmt.Fprintln(os.Stderr, err)
    37  		}
    38  	case "cpp":
    39  		f, err := os.Create(out)
    40  		if err != nil {
    41  			fmt.Fprintln(os.Stderr, err)
    42  		}
    43  		if err := copyFile("tardis/java/Go", f.Name()); err != nil {
    44  			fmt.Fprintln(os.Stderr, err)
    45  		}
    46  	}
    47  }
    48  
    49  func gopherjs(pkg string) {
    50  	_, err := os.Stat(fmt.Sprintf("%s/bin/gopherjs", os.Getenv("GOPATH")))
    51  	if os.IsNotExist(err) {
    52  		verbose("go", "get", "-u", "-v", "github.com/gopherjs/gopherjs")
    53  	}
    54  	if pkg == "" {
    55  		verbose("gopherjs", "build")
    56  		return
    57  	}
    58  	verbose("gopherjs", "build", pkg)
    59  }
    60  
    61  func copyFile(src, dst string) (err error) {
    62  	sfi, err := os.Stat(src)
    63  	if err != nil {
    64  		return err
    65  	}
    66  	if !sfi.Mode().IsRegular() {
    67  		return fmt.Errorf("non-regular source file %s (%q)", sfi.Name(), sfi.Mode().String())
    68  	}
    69  	dfi, err := os.Stat(dst)
    70  	if err != nil {
    71  		if !os.IsNotExist(err) {
    72  			return nil
    73  		}
    74  	} else {
    75  		if !(dfi.Mode().IsRegular()) {
    76  			return fmt.Errorf("non-regular destination file %s (%q)", dfi.Name(), dfi.Mode().String())
    77  		}
    78  		if os.SameFile(sfi, dfi) {
    79  			return nil
    80  		}
    81  	}
    82  	if err = os.Link(src, dst); err == nil {
    83  		return err
    84  	}
    85  	return copyFileContents(src, dst)
    86  }
    87  
    88  func copyFileContents(src, dst string) (err error) {
    89  	in, err := os.Open(src)
    90  	if err != nil {
    91  		return err
    92  	}
    93  	defer in.Close()
    94  	out, err := os.Create(dst)
    95  	if err != nil {
    96  		return err
    97  	}
    98  	defer func() {
    99  		cerr := out.Close()
   100  		if err == nil {
   101  			err = cerr
   102  		}
   103  	}()
   104  	if _, err = io.Copy(out, in); err != nil {
   105  		return err
   106  	}
   107  	err = out.Sync()
   108  	return err
   109  }
   110  
   111  func verbose(cmdName string, cmdArgs ...string) {
   112  	cmd := exec.Command(cmdName, cmdArgs...)
   113  	cmdStr := cmdName
   114  	for _, s := range cmdArgs {
   115  		cmdStr += fmt.Sprintf(" %s", s)
   116  	}
   117  	fmt.Println(cmdStr)
   118  	outReader, err := cmd.StdoutPipe()
   119  	if err != nil {
   120  		fmt.Fprintln(os.Stderr, err)
   121  		os.Exit(1)
   122  	}
   123  	outScanner := bufio.NewScanner(outReader)
   124  	go func() {
   125  		for outScanner.Scan() {
   126  			fmt.Println(outScanner.Text())
   127  		}
   128  	}()
   129  	errReader, err := cmd.StderrPipe()
   130  	if err != nil {
   131  		fmt.Fprintln(os.Stderr, err)
   132  		os.Exit(1)
   133  	}
   134  	errScanner := bufio.NewScanner(errReader)
   135  	go func() {
   136  		for errScanner.Scan() {
   137  			fmt.Println(errScanner.Text())
   138  		}
   139  	}()
   140  	if err = cmd.Start(); err != nil {
   141  		fmt.Fprintln(os.Stderr, err)
   142  		os.Exit(1)
   143  	}
   144  	if err = cmd.Wait(); err != nil {
   145  		fmt.Fprintln(os.Stderr, err)
   146  		os.Exit(1)
   147  	}
   148  }