@@ -3,6 +3,7 @@ package main
3
3
import (
4
4
"code.google.com/p/go.tools/go/exact"
5
5
"code.google.com/p/go.tools/go/types"
6
+ "flag"
6
7
"fmt"
7
8
"github.com/neelance/gopherjs/translator"
8
9
"go/build"
@@ -13,7 +14,87 @@ import (
13
14
"path"
14
15
)
15
16
17
+ type Mode int
18
+
19
+ const (
20
+ Build Mode = iota
21
+ Run
22
+ Install
23
+ )
24
+
16
25
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\" \n Run '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 {
17
98
b := & Builder {
18
99
BuildContext : & build.Context {
19
100
GOROOT : build .Default .GOROOT ,
@@ -31,28 +112,21 @@ func main() {
31
112
}
32
113
33
114
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 )
41
118
if err != nil {
42
- fmt .Fprintln (os .Stderr , err )
43
- os .Exit (1 )
119
+ return err
44
120
}
45
121
pkg = & BuilderPackage {Package : buildPkg }
46
122
if pkg .IsCommand () {
47
123
pkg .PkgObj = pkg .BinDir + "/" + path .Base (pkg .ImportPath ) + ".js"
48
124
}
49
125
50
- case "build" , "run" :
51
- filename := os .Args [2 ]
126
+ case Build , Run :
52
127
file , err := parser .ParseFile (b .FileSet , filename , nil , parser .ImportsOnly )
53
128
if err != nil {
54
- fmt .Fprintln (os .Stderr , err )
55
- os .Exit (1 )
129
+ return err
56
130
}
57
131
58
132
imports := make ([]string , len (file .Imports ))
@@ -62,7 +136,7 @@ func main() {
62
136
63
137
basename := path .Base (filename )
64
138
pkgObj := ""
65
- if cmd == "build" {
139
+ if mode == Build {
66
140
pkgObj = basename [:len (basename )- 3 ] + ".js"
67
141
}
68
142
pkg = & BuilderPackage {
@@ -75,47 +149,20 @@ func main() {
75
149
PkgObj : pkgObj ,
76
150
},
77
151
}
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\" \n Run 'gopherjs help' for usage.\n " , cmd )
97
- os .Exit (1 )
98
152
}
99
153
100
154
err := b .BuildPackage (pkg )
101
155
if err != nil {
102
156
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
110
158
}
111
- fmt .Fprintln (os .Stderr , err )
112
- os .Exit (1 )
159
+ return err
113
160
}
114
161
115
- switch cmd {
116
- case "build" , "install" :
162
+ switch mode {
163
+ case Build , Install :
117
164
if ! pkg .IsCommand () {
118
- os . Exit ( 0 ) // already stored by BuildPackage
165
+ return nil // already stored by BuildPackage
119
166
}
120
167
121
168
webMode := false
@@ -125,17 +172,15 @@ The commands are:
125
172
}
126
173
127
174
if err := os .MkdirAll (path .Dir (pkg .PkgObj ), 0777 ); err != nil {
128
- fmt .Fprintln (os .Stderr , err )
129
- os .Exit (1 )
175
+ return err
130
176
}
131
177
var perm os.FileMode = 0666
132
178
if ! webMode {
133
179
perm = 0777
134
180
}
135
181
file , err := os .OpenFile (pkg .PkgObj , os .O_RDWR | os .O_CREATE | os .O_TRUNC , perm )
136
182
if err != nil {
137
- fmt .Fprintln (os .Stderr , err )
138
- os .Exit (1 )
183
+ return err
139
184
}
140
185
if ! webMode {
141
186
fmt .Fprintln (file , "#!/usr/bin/env node" )
@@ -144,15 +189,15 @@ The commands are:
144
189
fmt .Fprintf (file , "var Go$webMode = %t;\n " , webMode )
145
190
file .Write (pkg .JavaScriptCode )
146
191
file .Close ()
147
- case "run" :
192
+
193
+ case Run :
148
194
node := exec .Command ("node" )
149
195
pipe , _ := node .StdinPipe ()
150
196
node .Stdout = os .Stdout
151
197
node .Stderr = os .Stderr
152
198
err = node .Start ()
153
199
if err != nil {
154
- fmt .Fprintln (os .Stderr , err )
155
- os .Exit (1 )
200
+ return err
156
201
}
157
202
fmt .Fprintln (pipe , `"use strict";` )
158
203
fmt .Fprintln (pipe , "var Go$webMode = false;" )
@@ -161,5 +206,5 @@ The commands are:
161
206
node .Wait ()
162
207
}
163
208
164
- os . Exit ( 0 )
209
+ return nil
165
210
}
0 commit comments