From b5d5658cd5c08f5ea404d0a42965b317fd3bc08e Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Fri, 5 Sep 2014 12:18:50 +0800 Subject: [PATCH] #31 --- i18n/zh_CN.json | 1 + main.go | 1 + output/outputs.go | 83 +++++++++++++++++++++++++++++++++++++++++++++-- static/js/wide.js | 22 ++++++++++--- view/index.html | 1 + 5 files changed, 101 insertions(+), 7 deletions(-) diff --git a/i18n/zh_CN.json b/i18n/zh_CN.json index 5dfc57b..f3d16b4 100644 --- a/i18n/zh_CN.json +++ b/i18n/zh_CN.json @@ -9,6 +9,7 @@ "delete": "删除", "save": "保存", "format": "格式化", + "goget": "go get", "build_n_run": "构建 & 运行", "full_screen": "全屏" } \ No newline at end of file diff --git a/main.go b/main.go index 6e33f68..1e43b6a 100644 --- a/main.go +++ b/main.go @@ -76,6 +76,7 @@ func main() { // 运行相关 http.HandleFunc("/build", output.BuildHandler) http.HandleFunc("/run", output.RunHandler) + http.HandleFunc("/go/get", output.GoGetHandler) http.HandleFunc("/output/ws", output.WSHandler) // 文件树 diff --git a/output/outputs.go b/output/outputs.go index 4062d3f..cf2bba2 100644 --- a/output/outputs.go +++ b/output/outputs.go @@ -155,7 +155,6 @@ func BuildHandler(w http.ResponseWriter, r *http.Request) { cmd := exec.Command("go", argv...) cmd.Dir = curDir - // 设置环境变量(设置当前用户的 GOPATH 等) setCmdEnv(cmd, username) glog.Infof("go build -o %s %s", executable, filePath) @@ -233,6 +232,82 @@ func BuildHandler(w http.ResponseWriter, r *http.Request) { } } +func GoGetHandler(w http.ResponseWriter, r *http.Request) { + data := map[string]interface{}{"succ": true} + defer util.RetJSON(w, r, data) + + session, _ := user.Session.Get(r, "wide-session") + sid := session.Values["id"].(string) + username := session.Values["username"].(string) + + decoder := json.NewDecoder(r.Body) + + var args map[string]interface{} + + if err := decoder.Decode(&args); err != nil { + glog.Error(err) + data["succ"] = false + + return + } + + filePath := args["file"].(string) + curDir := filePath[:strings.LastIndex(filePath, string(os.PathSeparator))] + + cmd := exec.Command("go", "get") + cmd.Dir = curDir + + setCmdEnv(cmd, username) + + stdout, err := cmd.StdoutPipe() + if nil != err { + glog.Error(err) + data["succ"] = false + + return + } + + stderr, err := cmd.StderrPipe() + if nil != err { + glog.Error(err) + data["succ"] = false + + return + } + + reader := io.MultiReader(stdout, stderr) + + cmd.Start() + + channelRet := map[string]interface{}{} + + go func(runningId int) { + glog.Infof("Session [%s] is running [go get] [runningId=%d]", sid, runningId) + + for { + buf := make([]byte, 1024) + count, err := reader.Read(buf) + + if nil != err || 0 == count { + glog.Infof("Session [%s] 's running [go get] [runningId=%d] has done", sid, runningId) + + break + } else { + channelRet["output"] = string(buf[:count]) + channelRet["cmd"] = "run" + + if nil != outputWS[sid] { + err := outputWS[sid].WriteJSON(&channelRet) + if nil != err { + glog.Error(err) + break + } + } + } + } + }(rand.Int()) +} + func setCmdEnv(cmd *exec.Cmd, username string) { userWorkspace := conf.Wide.GetUserWorkspace(username) @@ -240,5 +315,9 @@ func setCmdEnv(cmd *exec.Cmd, username string) { "GOPATH="+userWorkspace, "GOOS="+runtime.GOOS, "GOARCH="+runtime.GOARCH, - "GOROOT="+runtime.GOROOT()) + "GOROOT="+runtime.GOROOT(), + "PATH="+os.Getenv("PATH")) + + //"TERM="+os.Getenv("COMSPEC"), + //"ComSpec="+os.Getenv("ComSpec") } diff --git a/static/js/wide.js b/static/js/wide.js index 7b4a4a1..8b62c62 100644 --- a/static/js/wide.js +++ b/static/js/wide.js @@ -125,12 +125,24 @@ var wide = { beforeSend: function(data) { $('#output').text(''); }, + success: function(data) { + } + }); + }, + goget: function() { + var request = { + "file": wide.curNode.path + }; + + $.ajax({ + type: 'POST', + url: '/go/get', + data: JSON.stringify(request), + dataType: "json", + beforeSend: function(data) { + $('#output').text(''); + }, success: function(data) { - executable = data.executable; - - if (data.succ) { - - } } }); }, diff --git a/view/index.html b/view/index.html index e85bfb5..6ffe0ed 100644 --- a/view/index.html +++ b/view/index.html @@ -23,6 +23,7 @@ +