Skip to content

Commit 38efacc

Browse files
authored
Merge pull request #14 from dolmen-go/internal-gorun
Internal "go run". Closes #9.
2 parents e0ee975 + c3a0246 commit 38efacc

File tree

2 files changed

+38
-23
lines changed

2 files changed

+38
-23
lines changed

main.go

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"os"
2727
"os/exec"
2828
"path/filepath"
29+
"runtime"
2930
"strings"
3031
"time"
3132

@@ -135,6 +136,40 @@ func runTime(cmd *exec.Cmd) error {
135136
return cmd.Run()
136137
}
137138

139+
func gorun(srcFilename string, env []string, buildDir string, runDir string, args ...string) error {
140+
exeDir, err := os.MkdirTemp("", "goeval*")
141+
if err != nil {
142+
return err
143+
}
144+
defer func() {
145+
if err := os.RemoveAll(exeDir); err != nil {
146+
log.Printf("RemoveAll(%q): %v", exeDir, err)
147+
}
148+
}()
149+
150+
exePath := filepath.Join(exeDir, "goeval-run")
151+
if runtime.GOOS == "windows" {
152+
exePath += ".exe"
153+
}
154+
155+
cmdBuild := exec.Command(goCmd, "build", "-o", exePath, srcFilename)
156+
cmdBuild.Env = env
157+
cmdBuild.Dir = buildDir
158+
cmdBuild.Stdout = os.Stdout
159+
cmdBuild.Stderr = os.Stderr
160+
if err := run(cmdBuild); err != nil {
161+
return fmt.Errorf("failed to build: %w", err)
162+
}
163+
164+
cmdRun := exec.Command(exePath, args...)
165+
cmdRun.Env = env
166+
cmdRun.Dir = runDir // In Go module mode we run from the temp module dir
167+
cmdRun.Stdin = os.Stdin
168+
cmdRun.Stdout = os.Stdout
169+
cmdRun.Stderr = os.Stderr
170+
return run(cmdRun)
171+
}
172+
138173
var goCmd = "go"
139174

140175
func getGOMODCACHE(env []string) (string, error) {
@@ -187,7 +222,7 @@ func flagAction(name string, a actionBits, usage string) {
187222

188223
func _main() error {
189224
imports := imports{
190-
packages: map[string]string{" ": "os"},
225+
packages: map[string]string{},
191226
onlySemVer: true,
192227
}
193228
flag.Var(&imports, "i", "* import package: [alias=]import-path\n* switch to Go module mode and import package: [alias=]import-path@version")
@@ -366,10 +401,6 @@ func _main() error {
366401
}
367402
src.WriteString("func main() {\n")
368403
if action <= actionDump {
369-
src.WriteString("os.Args[1] = os.Args[0]\nos.Args = os.Args[1:]\n")
370-
if moduleMode {
371-
fmt.Fprintf(&src, "_ = os.Chdir(%q)\n", origDir)
372-
}
373404
src.WriteString("//line :1\n")
374405
}
375406
src.WriteString(code)
@@ -391,22 +422,11 @@ func _main() error {
391422
srcFinal = f
392423
srcFilename = f.Name()
393424

394-
runArgs := make([]string, 0, 3+len(args))
395-
runArgs = append(runArgs, "run", srcFilename, "--")
396-
runArgs = append(runArgs, args...)
397-
// log.Println(goCmd, runArgs)
398-
399-
cmd := exec.Command(goCmd, runArgs...)
400-
cmd.Env = env
401-
cmd.Dir = dir // In Go module mode we run from the temp module dir
402-
cmd.Stdin = os.Stdin
403-
cmd.Stdout = os.Stdout
404-
cmd.Stderr = os.Stderr
405425
tail = func() error {
406426
if err = f.Close(); err != nil {
407427
return err
408428
}
409-
return run(cmd)
429+
return gorun(srcFilename, env, dir, origDir, args...)
410430
}
411431
case actionPlay:
412432
var cleanup func()

main_test.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,9 @@ func Example_dump() {
4242
// Output:
4343
// package main
4444
//
45-
// import (
46-
// "fmt"
47-
// "os"
48-
// )
45+
// import "fmt"
4946
//
5047
// func main() {
51-
// os.Args[1] = os.Args[0]
52-
// os.Args = os.Args[1:]
5348
// //line :1
5449
// fmt.Println("OK")
5550
// }

0 commit comments

Comments
 (0)