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 }