-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
109 lines (91 loc) · 2.33 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package main
import (
"flag"
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
"github.com/antchfx/xmlquery"
)
var (
projectDir string
configName string
list bool
)
func init() {
wd, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
flag.StringVar(&projectDir, "project-dir", wd, "project directory")
flag.StringVar(&configName, "config", "", "configuration name")
flag.BoolVar(&list, "list", false, "list configurations")
flag.Parse()
}
func main() {
fmt.Println("Project dir:", projectDir)
workspacePath := filepath.Join(projectDir, ".idea/workspace.xml")
workspaceFile, err := os.Open(workspacePath)
if err != nil {
log.Fatal(err)
}
defer workspaceFile.Close()
root, err := xmlquery.Parse(workspaceFile)
if err != nil {
log.Fatal(err)
}
runManager := xmlquery.FindOne(root, `//project//component[@name="RunManager"]`)
if !list {
if configName == "" {
selected := runManager.SelectAttr("selected")
configName = selected[strings.Index(selected, ".")+1:]
}
fmt.Println("Configuration:", configName)
}
configurations := xmlquery.Find(runManager, `//configuration`)
var configuration *xmlquery.Node
for _, c := range configurations {
name := strings.TrimSpace(c.SelectAttr("name"))
if list {
fmt.Println(name)
} else {
if name == configName {
configuration = c
break
}
}
}
if list {
return
}
if configuration == nil {
log.Fatal("configuration not found")
}
configType := configuration.SelectAttr("type")
if configType == "GradleRunConfiguration" {
var tasks []string
taskNames := xmlquery.Find(configuration, `//option[@name="taskNames"]//list//option`)
for _, taskName := range taskNames {
tasks = append(tasks, taskName.SelectAttr("value"))
}
var env []string
envEntries := xmlquery.Find(configuration, `//option[@name="env"]//map//entry`)
for _, entry := range envEntries {
env = append(env, fmt.Sprintf("%s=%s", entry.SelectAttr("key"), entry.SelectAttr("value")))
}
gradlePath := filepath.Join(projectDir, "gradlew")
cmd := exec.Command(gradlePath, tasks...)
// cmd := exec.Command("env")
cmd.Dir = projectDir
cmd.Env = append(cmd.Env, env...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stdout
log.Println(cmd.String())
_ = cmd.Run()
} else {
log.Fatal("unsupported configuration type: " + configType)
}
}