Skip to content

Commit da075de

Browse files
committed
Improved tool CLI.
1 parent 60d32fc commit da075de

File tree

1 file changed

+99
-54
lines changed

1 file changed

+99
-54
lines changed

tool.go

Lines changed: 99 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"code.google.com/p/go.tools/go/exact"
55
"code.google.com/p/go.tools/go/types"
6+
"flag"
67
"fmt"
78
"github.com/neelance/gopherjs/translator"
89
"go/build"
@@ -13,7 +14,87 @@ import (
1314
"path"
1415
)
1516

17+
type Mode int
18+
19+
const (
20+
Build Mode = iota
21+
Run
22+
Install
23+
)
24+
1625
func main() {
26+
flag.Parse()
27+
28+
cmd := flag.Arg(0)
29+
switch cmd {
30+
case "build":
31+
err := Do(Build, flag.Arg(1))
32+
HandleError(err)
33+
os.Exit(0)
34+
35+
case "install":
36+
err := Do(Install, flag.Arg(1))
37+
HandleError(err)
38+
os.Exit(0)
39+
40+
case "run":
41+
err := Do(Run, flag.Arg(1))
42+
HandleError(err)
43+
os.Exit(0)
44+
45+
case "tool":
46+
tool := flag.Arg(1)
47+
toolFlags := flag.NewFlagSet("tool", flag.ContinueOnError)
48+
toolFlags.Bool("e", false, "")
49+
toolFlags.Parse(flag.Args()[2:])
50+
if len(tool) == 2 {
51+
switch tool[1] {
52+
case 'g':
53+
err := Do(Build, toolFlags.Arg(0))
54+
HandleError(err)
55+
os.Exit(0)
56+
}
57+
}
58+
fmt.Fprintln(os.Stderr, "Tool not supported: "+tool)
59+
os.Exit(1)
60+
61+
case "help", "":
62+
os.Stderr.WriteString(`GopherJS is a tool for compiling Go source code to JavaScript.
63+
64+
Usage:
65+
66+
gopherjs command [arguments]
67+
68+
The commands are:
69+
70+
build compile packages and dependencies
71+
install compile and install packages and dependencies
72+
run compile and run Go program
73+
74+
`)
75+
os.Exit(0)
76+
77+
default:
78+
fmt.Fprintf(os.Stderr, "gopherjs: unknown subcommand \"%s\"\nRun 'gopherjs help' for usage.\n", cmd)
79+
os.Exit(1)
80+
}
81+
}
82+
83+
func HandleError(err error) {
84+
if err == nil {
85+
return
86+
}
87+
if list, isList := err.(translator.ErrorList); isList {
88+
for _, entry := range list {
89+
fmt.Fprintln(os.Stderr, entry)
90+
}
91+
os.Exit(1)
92+
}
93+
fmt.Fprintln(os.Stderr, err.Error())
94+
os.Exit(1)
95+
}
96+
97+
func Do(mode Mode, filename string) error {
1798
b := &Builder{
1899
BuildContext: &build.Context{
19100
GOROOT: build.Default.GOROOT,
@@ -31,28 +112,21 @@ func main() {
31112
}
32113

33114
var pkg *BuilderPackage
34-
cmd := "help"
35-
if len(os.Args) >= 2 {
36-
cmd = os.Args[1]
37-
}
38-
switch cmd {
39-
case "install":
40-
buildPkg, err := b.BuildContext.Import(os.Args[2], "", 0)
115+
switch mode {
116+
case Install:
117+
buildPkg, err := b.BuildContext.Import(filename, "", 0)
41118
if err != nil {
42-
fmt.Fprintln(os.Stderr, err)
43-
os.Exit(1)
119+
return err
44120
}
45121
pkg = &BuilderPackage{Package: buildPkg}
46122
if pkg.IsCommand() {
47123
pkg.PkgObj = pkg.BinDir + "/" + path.Base(pkg.ImportPath) + ".js"
48124
}
49125

50-
case "build", "run":
51-
filename := os.Args[2]
126+
case Build, Run:
52127
file, err := parser.ParseFile(b.FileSet, filename, nil, parser.ImportsOnly)
53128
if err != nil {
54-
fmt.Fprintln(os.Stderr, err)
55-
os.Exit(1)
129+
return err
56130
}
57131

58132
imports := make([]string, len(file.Imports))
@@ -62,7 +136,7 @@ func main() {
62136

63137
basename := path.Base(filename)
64138
pkgObj := ""
65-
if cmd == "build" {
139+
if mode == Build {
66140
pkgObj = basename[:len(basename)-3] + ".js"
67141
}
68142
pkg = &BuilderPackage{
@@ -75,47 +149,20 @@ func main() {
75149
PkgObj: pkgObj,
76150
},
77151
}
78-
79-
case "help":
80-
os.Stderr.WriteString(`GopherJS is a tool for compiling Go source code to JavaScript.
81-
82-
Usage:
83-
84-
gopherjs command [arguments]
85-
86-
The commands are:
87-
88-
build compile packages and dependencies
89-
install compile and install packages and dependencies
90-
run compile and run Go program
91-
92-
`)
93-
os.Exit(0)
94-
95-
default:
96-
fmt.Fprintf(os.Stderr, "gopherjs: unknown subcommand \"%s\"\nRun 'gopherjs help' for usage.\n", cmd)
97-
os.Exit(1)
98152
}
99153

100154
err := b.BuildPackage(pkg)
101155
if err != nil {
102156
if err == PkgObjUpToDate {
103-
os.Exit(0)
104-
}
105-
if list, isList := err.(translator.ErrorList); isList {
106-
for _, entry := range list {
107-
fmt.Fprintln(os.Stderr, entry)
108-
}
109-
os.Exit(1)
157+
return nil
110158
}
111-
fmt.Fprintln(os.Stderr, err)
112-
os.Exit(1)
159+
return err
113160
}
114161

115-
switch cmd {
116-
case "build", "install":
162+
switch mode {
163+
case Build, Install:
117164
if !pkg.IsCommand() {
118-
os.Exit(0) // already stored by BuildPackage
165+
return nil // already stored by BuildPackage
119166
}
120167

121168
webMode := false
@@ -125,17 +172,15 @@ The commands are:
125172
}
126173

127174
if err := os.MkdirAll(path.Dir(pkg.PkgObj), 0777); err != nil {
128-
fmt.Fprintln(os.Stderr, err)
129-
os.Exit(1)
175+
return err
130176
}
131177
var perm os.FileMode = 0666
132178
if !webMode {
133179
perm = 0777
134180
}
135181
file, err := os.OpenFile(pkg.PkgObj, os.O_RDWR|os.O_CREATE|os.O_TRUNC, perm)
136182
if err != nil {
137-
fmt.Fprintln(os.Stderr, err)
138-
os.Exit(1)
183+
return err
139184
}
140185
if !webMode {
141186
fmt.Fprintln(file, "#!/usr/bin/env node")
@@ -144,15 +189,15 @@ The commands are:
144189
fmt.Fprintf(file, "var Go$webMode = %t;\n", webMode)
145190
file.Write(pkg.JavaScriptCode)
146191
file.Close()
147-
case "run":
192+
193+
case Run:
148194
node := exec.Command("node")
149195
pipe, _ := node.StdinPipe()
150196
node.Stdout = os.Stdout
151197
node.Stderr = os.Stderr
152198
err = node.Start()
153199
if err != nil {
154-
fmt.Fprintln(os.Stderr, err)
155-
os.Exit(1)
200+
return err
156201
}
157202
fmt.Fprintln(pipe, `"use strict";`)
158203
fmt.Fprintln(pipe, "var Go$webMode = false;")
@@ -161,5 +206,5 @@ The commands are:
161206
node.Wait()
162207
}
163208

164-
os.Exit(0)
209+
return nil
165210
}

0 commit comments

Comments
 (0)