Fix #182
This commit is contained in:
parent
d900b13174
commit
72e54f6509
|
@ -666,7 +666,7 @@ func find(dir, name string, results []*string) []*string {
|
||||||
match, err := filepath.Match(strings.ToLower(pattern), strings.ToLower(path))
|
match, err := filepath.Match(strings.ToLower(pattern), strings.ToLower(path))
|
||||||
|
|
||||||
if nil != err {
|
if nil != err {
|
||||||
logger.Errorf("Find match filename failed: [%s]", err.Error)
|
logger.Errorf("Find match filename failed: [%s]", err.Error())
|
||||||
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,5 +162,9 @@
|
||||||
"open": "Open",
|
"open": "Open",
|
||||||
"pricing": "Pricing",
|
"pricing": "Pricing",
|
||||||
"search_no_match": "No matching files were found.",
|
"search_no_match": "No matching files were found.",
|
||||||
"outline": "Outline"
|
"outline": "Outline",
|
||||||
|
"govet": "go vet",
|
||||||
|
"start-vet": "START [go vet]",
|
||||||
|
"vet-succ": "[go vet] SUCCESS",
|
||||||
|
"vet-error": "[go vet] ERROR"
|
||||||
}
|
}
|
|
@ -162,5 +162,9 @@
|
||||||
"open": "オープン",
|
"open": "オープン",
|
||||||
"pricing": "价格",
|
"pricing": "价格",
|
||||||
"search_no_match": "一致するファイルが見つかりませんでした。",
|
"search_no_match": "一致するファイルが見つかりませんでした。",
|
||||||
"outline": "アウトライン"
|
"outline": "アウトライン",
|
||||||
|
"govet": "go vet",
|
||||||
|
"start-vet": "START [go vet]",
|
||||||
|
"vet-succ": "[go vet] SUCCESS",
|
||||||
|
"vet-error": "[go vet] ERROR"
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,5 +162,9 @@
|
||||||
"open": "打开",
|
"open": "打开",
|
||||||
"pricing": "价格",
|
"pricing": "价格",
|
||||||
"search_no_match": "没有发现匹配的文件。",
|
"search_no_match": "没有发现匹配的文件。",
|
||||||
"outline": "大纲"
|
"outline": "大纲",
|
||||||
|
"govet": "go vet",
|
||||||
|
"start-vet": "START [go vet]",
|
||||||
|
"vet-succ": "[go vet] SUCCESS",
|
||||||
|
"vet-error": "[go vet] ERROR"
|
||||||
}
|
}
|
|
@ -162,5 +162,9 @@
|
||||||
"open": "打開",
|
"open": "打開",
|
||||||
"pricing": "價格",
|
"pricing": "價格",
|
||||||
"search_no_match": "沒有發現匹配的文件。",
|
"search_no_match": "沒有發現匹配的文件。",
|
||||||
"outline": "大綱"
|
"outline": "大綱",
|
||||||
|
"govet": "go vet",
|
||||||
|
"start-vet": "START [go vet]",
|
||||||
|
"vet-succ": "[go vet] SUCCESS",
|
||||||
|
"vet-error": "[go vet] ERROR"
|
||||||
}
|
}
|
1
main.go
1
main.go
|
@ -118,6 +118,7 @@ func main() {
|
||||||
http.HandleFunc(conf.Wide.Context+"/run", handlerWrapper(output.RunHandler))
|
http.HandleFunc(conf.Wide.Context+"/run", handlerWrapper(output.RunHandler))
|
||||||
http.HandleFunc(conf.Wide.Context+"/stop", handlerWrapper(output.StopHandler))
|
http.HandleFunc(conf.Wide.Context+"/stop", handlerWrapper(output.StopHandler))
|
||||||
http.HandleFunc(conf.Wide.Context+"/go/test", handlerWrapper(output.GoTestHandler))
|
http.HandleFunc(conf.Wide.Context+"/go/test", handlerWrapper(output.GoTestHandler))
|
||||||
|
http.HandleFunc(conf.Wide.Context+"/go/vet", handlerWrapper(output.GoVetHandler))
|
||||||
http.HandleFunc(conf.Wide.Context+"/go/get", handlerWrapper(output.GoGetHandler))
|
http.HandleFunc(conf.Wide.Context+"/go/get", handlerWrapper(output.GoGetHandler))
|
||||||
http.HandleFunc(conf.Wide.Context+"/go/install", handlerWrapper(output.GoInstallHandler))
|
http.HandleFunc(conf.Wide.Context+"/go/install", handlerWrapper(output.GoInstallHandler))
|
||||||
http.HandleFunc(conf.Wide.Context+"/output/ws", handlerWrapper(output.WSHandler))
|
http.HandleFunc(conf.Wide.Context+"/output/ws", handlerWrapper(output.WSHandler))
|
||||||
|
|
|
@ -615,6 +615,124 @@ func GoTestHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
}(rand.Int())
|
}(rand.Int())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GoVetHandler handles request of go vet.
|
||||||
|
func GoVetHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
data := map[string]interface{}{"succ": true}
|
||||||
|
defer util.RetJSON(w, r, data)
|
||||||
|
|
||||||
|
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||||
|
if httpSession.IsNew {
|
||||||
|
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
username := httpSession.Values["username"].(string)
|
||||||
|
locale := conf.GetUser(username).Locale
|
||||||
|
|
||||||
|
var args map[string]interface{}
|
||||||
|
|
||||||
|
if err := json.NewDecoder(r.Body).Decode(&args); err != nil {
|
||||||
|
logger.Error(err)
|
||||||
|
data["succ"] = false
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sid := args["sid"].(string)
|
||||||
|
|
||||||
|
filePath := args["file"].(string)
|
||||||
|
curDir := filepath.Dir(filePath)
|
||||||
|
|
||||||
|
cmd := exec.Command("go", "vet", ".")
|
||||||
|
cmd.Dir = curDir
|
||||||
|
|
||||||
|
setCmdEnv(cmd, username)
|
||||||
|
|
||||||
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
if nil != err {
|
||||||
|
logger.Error(err)
|
||||||
|
data["succ"] = false
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
stderr, err := cmd.StderrPipe()
|
||||||
|
if nil != err {
|
||||||
|
logger.Error(err)
|
||||||
|
data["succ"] = false
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !data["succ"].(bool) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
channelRet := map[string]interface{}{}
|
||||||
|
|
||||||
|
if nil != session.OutputWS[sid] {
|
||||||
|
// display "START [go vet]" in front-end browser
|
||||||
|
|
||||||
|
channelRet["output"] = "<span class='start-vet'>" + i18n.Get(locale, "start-vet").(string) + "</span>\n"
|
||||||
|
channelRet["cmd"] = "start-vet"
|
||||||
|
|
||||||
|
wsChannel := session.OutputWS[sid]
|
||||||
|
|
||||||
|
err := wsChannel.WriteJSON(&channelRet)
|
||||||
|
if nil != err {
|
||||||
|
logger.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
wsChannel.Refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
reader := bufio.NewReader(io.MultiReader(stdout, stderr))
|
||||||
|
|
||||||
|
if err := cmd.Start(); nil != err {
|
||||||
|
logger.Error(err)
|
||||||
|
data["succ"] = false
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
go func(runningId int) {
|
||||||
|
defer util.Recover()
|
||||||
|
|
||||||
|
logger.Debugf("User [%s, %s] is running [go vet] [runningId=%d]", username, sid, runningId)
|
||||||
|
|
||||||
|
channelRet := map[string]interface{}{}
|
||||||
|
channelRet["cmd"] = "go vet"
|
||||||
|
|
||||||
|
// read all
|
||||||
|
buf, _ := ioutil.ReadAll(reader)
|
||||||
|
|
||||||
|
// waiting for go vet finished
|
||||||
|
cmd.Wait()
|
||||||
|
|
||||||
|
if !cmd.ProcessState.Success() {
|
||||||
|
logger.Debugf("User [%s, %s] 's running [go vet] [runningId=%d] has done (with error)", username, sid, runningId)
|
||||||
|
|
||||||
|
channelRet["output"] = "<span class='vet-error'>" + i18n.Get(locale, "vet-error").(string) + "</span>\n" + string(buf)
|
||||||
|
} else {
|
||||||
|
logger.Debugf("User [%s, %s] 's running [go vet] [runningId=%d] has done", username, sid, runningId)
|
||||||
|
|
||||||
|
channelRet["output"] = "<span class='vet-succ'>" + i18n.Get(locale, "vet-succ").(string) + "</span>\n" + string(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
if nil != session.OutputWS[sid] {
|
||||||
|
wsChannel := session.OutputWS[sid]
|
||||||
|
|
||||||
|
err := wsChannel.WriteJSON(&channelRet)
|
||||||
|
if nil != err {
|
||||||
|
logger.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
wsChannel.Refresh()
|
||||||
|
}
|
||||||
|
}(rand.Int())
|
||||||
|
}
|
||||||
|
|
||||||
// GoInstallHandler handles request of go install.
|
// GoInstallHandler handles request of go install.
|
||||||
func GoInstallHandler(w http.ResponseWriter, r *http.Request) {
|
func GoInstallHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
data := map[string]interface{}{"succ": true}
|
data := map[string]interface{}{"succ": true}
|
||||||
|
|
|
@ -86,7 +86,7 @@ func (procs *procs) kill(wSession *session.WideSession, pid int) {
|
||||||
for i, p := range userProcesses {
|
for i, p := range userProcesses {
|
||||||
if p.Pid == pid {
|
if p.Pid == pid {
|
||||||
if err := p.Kill(); nil != err {
|
if err := p.Kill(); nil != err {
|
||||||
logger.Error("Kill a process [pid=%d] of user [%s, %s] failed [error=%v]", pid, wSession.Username, sid, err)
|
logger.Errorf("Kill a process [pid=%d] of user [%s, %s] failed [error=%v]", pid, wSession.Username, sid, err)
|
||||||
} else {
|
} else {
|
||||||
var newProcesses []*os.Process
|
var newProcesses []*os.Process
|
||||||
|
|
||||||
|
|
|
@ -439,21 +439,21 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-window-group .output .start-build,
|
.bottom-window-group .output .start-build,
|
||||||
.bottom-window-group .output .start-test,
|
.bottom-window-group .output .start-test, .start-vet,
|
||||||
.bottom-window-group .output .start-install,
|
.bottom-window-group .output .start-install,
|
||||||
.bottom-window-group .output .start-get {
|
.bottom-window-group .output .start-get {
|
||||||
color: #999;
|
color: #999;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-window-group .output .build-succ,
|
.bottom-window-group .output .build-succ,
|
||||||
.bottom-window-group .output .test-succ,
|
.bottom-window-group .output .test-succ, .vet-succ,
|
||||||
.bottom-window-group .output .install-succ,
|
.bottom-window-group .output .install-succ,
|
||||||
.bottom-window-group .output .get-succ {
|
.bottom-window-group .output .get-succ {
|
||||||
color: rgb(0,153,0);
|
color: rgb(0,153,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-window-group .output .build-error,
|
.bottom-window-group .output .build-error,
|
||||||
.bottom-window-group .output .test-error,
|
.bottom-window-group .output .test-error, .vet-error,
|
||||||
.bottom-window-group .output .install-error,
|
.bottom-window-group .output .install-error,
|
||||||
.bottom-window-group .output .get-error {
|
.bottom-window-group .output .get-error {
|
||||||
color: #9d0000;
|
color: #9d0000;
|
||||||
|
|
|
@ -189,7 +189,7 @@ var editors = {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (editors.data.length === 0) { // 起始页可能存在,所以用编辑器数据判断
|
if (editors.data.length === 0) { // 起始页可能存在,所以用编辑器数据判断
|
||||||
menu.disabled(['save-all', 'build', 'run', 'go-test', 'go-get', 'go-install',
|
menu.disabled(['save-all', 'build', 'run', 'go-test','go-vet', 'go-get', 'go-install',
|
||||||
'find', 'find-next', 'find-previous', 'replace', 'replace-all',
|
'find', 'find-next', 'find-previous', 'replace', 'replace-all',
|
||||||
'format', 'autocomplete', 'jump-to-decl', 'expr-info', 'find-usages', 'toggle-comment',
|
'format', 'autocomplete', 'jump-to-decl', 'expr-info', 'find-usages', 'toggle-comment',
|
||||||
'edit']);
|
'edit']);
|
||||||
|
@ -721,7 +721,7 @@ var editors = {
|
||||||
content: '<textarea id="editor' + id + '"></textarea>'
|
content: '<textarea id="editor' + id + '"></textarea>'
|
||||||
});
|
});
|
||||||
|
|
||||||
menu.undisabled(['save-all', 'close-all', 'build', 'run', 'go-test', 'go-get', 'go-install',
|
menu.undisabled(['save-all', 'close-all', 'build', 'run', 'go-test', 'go-vet', 'go-get', 'go-install',
|
||||||
'find', 'find-next', 'find-previous', 'replace', 'replace-all',
|
'find', 'find-next', 'find-previous', 'replace', 'replace-all',
|
||||||
'format', 'autocomplete', 'jump-to-decl', 'expr-info', 'find-usages', 'toggle-comment',
|
'format', 'autocomplete', 'jump-to-decl', 'expr-info', 'find-usages', 'toggle-comment',
|
||||||
'edit']);
|
'edit']);
|
||||||
|
|
|
@ -227,7 +227,7 @@ var menu = {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($(".menu li.test").hasClass("disabled")) {
|
if ($(".menu li.go-test").hasClass("disabled")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,6 +246,34 @@ var menu = {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
// go vet.
|
||||||
|
govet: function () {
|
||||||
|
menu.saveAllFiles();
|
||||||
|
|
||||||
|
var currentPath = editors.getCurrentPath();
|
||||||
|
if (!currentPath) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($(".menu li.go-vet").hasClass("disabled")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var request = newWideRequest();
|
||||||
|
request.file = currentPath;
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
type: 'POST',
|
||||||
|
url: config.context + '/go/vet',
|
||||||
|
data: JSON.stringify(request),
|
||||||
|
dataType: "json",
|
||||||
|
beforeSend: function (data) {
|
||||||
|
bottomGroup.resetOutput();
|
||||||
|
},
|
||||||
|
success: function (data) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
// Build & Run.
|
// Build & Run.
|
||||||
run: function () {
|
run: function () {
|
||||||
menu.saveAllFiles();
|
menu.saveAllFiles();
|
||||||
|
|
|
@ -367,12 +367,14 @@ var wide = {
|
||||||
break;
|
break;
|
||||||
case 'start-build':
|
case 'start-build':
|
||||||
case 'start-test':
|
case 'start-test':
|
||||||
|
case 'start-vet':
|
||||||
case 'start-install':
|
case 'start-install':
|
||||||
case 'start-get':
|
case 'start-get':
|
||||||
bottomGroup.fillOutput(data.output);
|
bottomGroup.fillOutput(data.output);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'go test':
|
case 'go test':
|
||||||
|
case 'go vet':
|
||||||
case 'go install':
|
case 'go install':
|
||||||
case 'go get':
|
case 'go get':
|
||||||
bottomGroup.fillOutput($('.bottom-window-group .output > div').html() + data.output);
|
bottomGroup.fillOutput($('.bottom-window-group .output > div').html() + data.output);
|
||||||
|
|
|
@ -290,6 +290,11 @@
|
||||||
<span class="space"></span>
|
<span class="space"></span>
|
||||||
<span>{{.i18n.goinstall}}</span>
|
<span>{{.i18n.goinstall}}</span>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="hr"></li>
|
||||||
|
<li class="go-vet disabled" onclick="if (!$(this).hasClass('disabled')){menu.govet()}">
|
||||||
|
<span class="space"></span>
|
||||||
|
<span>{{.i18n.govet}}</span>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
Loading…
Reference in New Issue