mirror of
https://github.com/kevin-DL/revel-cmd.git
synced 2026-01-20 14:15:09 +00:00
Fixed missing debug context parameter name
Added check to see if specfication was not exported Added warnings if expected types did not match specification
This commit is contained in:
@@ -60,9 +60,9 @@ func NewAppCmd(binPath string, port int) AppCmd {
|
|||||||
func (cmd AppCmd) Start() error {
|
func (cmd AppCmd) Start() error {
|
||||||
listeningWriter := &startupListeningWriter{os.Stdout, make(chan bool)}
|
listeningWriter := &startupListeningWriter{os.Stdout, make(chan bool)}
|
||||||
cmd.Stdout = listeningWriter
|
cmd.Stdout = listeningWriter
|
||||||
revel.RevelLog.Debug("Exec app:","path", cmd.Path,"args", cmd.Args)
|
revel.RevelLog.Debug("Exec app:", "path", cmd.Path, "args", cmd.Args)
|
||||||
if err := cmd.Cmd.Start(); err != nil {
|
if err := cmd.Cmd.Start(); err != nil {
|
||||||
revel.RevelLog.Fatal("Error running:","error", err)
|
revel.RevelLog.Fatal("Error running:", "error", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
@@ -70,7 +70,7 @@ func (cmd AppCmd) Start() error {
|
|||||||
return errors.New("revel/harness: app died")
|
return errors.New("revel/harness: app died")
|
||||||
|
|
||||||
case <-time.After(30 * time.Second):
|
case <-time.After(30 * time.Second):
|
||||||
revel.RevelLog.Debug("Killing revel server process did not respond after wait timeout", cmd.Process.Pid)
|
revel.RevelLog.Debug("Killing revel server process did not respond after wait timeout", "processid", cmd.Process.Pid)
|
||||||
cmd.Kill()
|
cmd.Kill()
|
||||||
return errors.New("revel/harness: app timed out")
|
return errors.New("revel/harness: app timed out")
|
||||||
|
|
||||||
@@ -84,19 +84,19 @@ func (cmd AppCmd) Start() error {
|
|||||||
|
|
||||||
// Run the app server inline. Never returns.
|
// Run the app server inline. Never returns.
|
||||||
func (cmd AppCmd) Run() {
|
func (cmd AppCmd) Run() {
|
||||||
revel.RevelLog.Debug("Exec app:","path", cmd.Path,"args", cmd.Args)
|
revel.RevelLog.Debug("Exec app:", "path", cmd.Path, "args", cmd.Args)
|
||||||
if err := cmd.Cmd.Run(); err != nil {
|
if err := cmd.Cmd.Run(); err != nil {
|
||||||
revel.RevelLog.Fatal("Error running:","error", err)
|
revel.RevelLog.Fatal("Error running:", "error", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kill terminates the app server if it's running.
|
// Kill terminates the app server if it's running.
|
||||||
func (cmd AppCmd) Kill() {
|
func (cmd AppCmd) Kill() {
|
||||||
if cmd.Cmd != nil && (cmd.ProcessState == nil || !cmd.ProcessState.Exited()) {
|
if cmd.Cmd != nil && (cmd.ProcessState == nil || !cmd.ProcessState.Exited()) {
|
||||||
revel.RevelLog.Debug("Killing revel server pid","pid", cmd.Process.Pid)
|
revel.RevelLog.Debug("Killing revel server pid", "pid", cmd.Process.Pid)
|
||||||
err := cmd.Process.Kill()
|
err := cmd.Process.Kill()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
revel.RevelLog.Fatal("Failed to kill revel server:","error", err)
|
revel.RevelLog.Fatal("Failed to kill revel server:", "error", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -393,7 +393,7 @@ var (
|
|||||||
func main() {
|
func main() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
revel.Init(*runMode, *importPath, *srcPath)
|
revel.Init(*runMode, *importPath, *srcPath)
|
||||||
revel.INFO.Println("Running revel server")
|
revel.AppLog.Info("Running revel server")
|
||||||
{{range $i, $c := .Controllers}}
|
{{range $i, $c := .Controllers}}
|
||||||
revel.RegisterController((*{{index $.ImportPaths .ImportPath}}.{{.StructName}})(nil),
|
revel.RegisterController((*{{index $.ImportPaths .ImportPath}}.{{.StructName}})(nil),
|
||||||
[]*revel.MethodType{
|
[]*revel.MethodType{
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
|
"unicode"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SourceInfo is the top-level struct containing all extracted information
|
// SourceInfo is the top-level struct containing all extracted information
|
||||||
@@ -335,6 +336,7 @@ func appendStruct(specs []*TypeInfo, pkgImportPath string, pkg *ast.Package, dec
|
|||||||
if !found {
|
if !found {
|
||||||
return specs
|
return specs
|
||||||
}
|
}
|
||||||
|
|
||||||
structType := spec.Type.(*ast.StructType)
|
structType := spec.Type.(*ast.StructType)
|
||||||
|
|
||||||
// At this point we know it's a type declaration for a struct.
|
// At this point we know it's a type declaration for a struct.
|
||||||
@@ -462,7 +464,7 @@ func appendAction(fset *token.FileSet, mm methodMap, decl ast.Decl, pkgImportPat
|
|||||||
} else if typeExpr.PkgName != "" {
|
} else if typeExpr.PkgName != "" {
|
||||||
var ok bool
|
var ok bool
|
||||||
if importPath, ok = imports[typeExpr.PkgName]; !ok {
|
if importPath, ok = imports[typeExpr.PkgName]; !ok {
|
||||||
revel.RevelLog.Errorf("Failed to find import for arg of type: %s , %s",typeExpr.PkgName, typeExpr.TypeName(""))
|
revel.RevelLog.Errorf("Failed to find import for arg of type: %s , %s", typeExpr.PkgName, typeExpr.TypeName(""))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
method.Args = append(method.Args, &MethodArg{
|
method.Args = append(method.Args, &MethodArg{
|
||||||
@@ -661,7 +663,7 @@ func getStructTypeDecl(decl ast.Decl, fset *token.FileSet) (spec *ast.TypeSpec,
|
|||||||
// TypesThatEmbed returns all types that (directly or indirectly) embed the
|
// TypesThatEmbed returns all types that (directly or indirectly) embed the
|
||||||
// target type, which must be a fully qualified type name,
|
// target type, which must be a fully qualified type name,
|
||||||
// e.g. "github.com/revel/revel.Controller"
|
// e.g. "github.com/revel/revel.Controller"
|
||||||
func (s *SourceInfo) TypesThatEmbed(targetType string) (filtered []*TypeInfo) {
|
func (s *SourceInfo) TypesThatEmbed(targetType, packageFilter string) (filtered []*TypeInfo) {
|
||||||
// Do a search in the "embedded type graph", starting with the target type.
|
// Do a search in the "embedded type graph", starting with the target type.
|
||||||
var (
|
var (
|
||||||
nodeQueue = []string{targetType}
|
nodeQueue = []string{targetType}
|
||||||
@@ -693,6 +695,37 @@ func (s *SourceInfo) TypesThatEmbed(targetType string) (filtered []*TypeInfo) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Strip out any specifications that contain a lower case
|
||||||
|
for exit := false; !exit; exit = true {
|
||||||
|
for i, filteredItem := range filtered {
|
||||||
|
if unicode.IsLower([]rune(filteredItem.StructName)[0]) {
|
||||||
|
revel.RevelLog.Debug("Skipping adding spec for unexported type",
|
||||||
|
"type", filteredItem.StructName,
|
||||||
|
"package", filteredItem.ImportPath)
|
||||||
|
filtered = append(filtered[:i], filtered[i+1:]...)
|
||||||
|
exit = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for any missed types that where from expected packages
|
||||||
|
for _, spec := range s.StructSpecs {
|
||||||
|
if spec.PackageName == packageFilter {
|
||||||
|
found := false
|
||||||
|
for _, filteredItem := range filtered {
|
||||||
|
if filteredItem.StructName == spec.StructName {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
revel.RevelLog.Warn("Type found in package: "+packageFilter+
|
||||||
|
", but did not inherit from: "+filepath.Base(targetType),
|
||||||
|
"name", spec.StructName, "path", spec.ImportPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -700,7 +733,7 @@ func (s *SourceInfo) TypesThatEmbed(targetType string) (filtered []*TypeInfo) {
|
|||||||
// `revel.Controller`
|
// `revel.Controller`
|
||||||
func (s *SourceInfo) ControllerSpecs() []*TypeInfo {
|
func (s *SourceInfo) ControllerSpecs() []*TypeInfo {
|
||||||
if s.controllerSpecs == nil {
|
if s.controllerSpecs == nil {
|
||||||
s.controllerSpecs = s.TypesThatEmbed(revel.RevelImportPath + ".Controller")
|
s.controllerSpecs = s.TypesThatEmbed(revel.RevelImportPath+".Controller", "controllers")
|
||||||
}
|
}
|
||||||
return s.controllerSpecs
|
return s.controllerSpecs
|
||||||
}
|
}
|
||||||
@@ -709,7 +742,7 @@ func (s *SourceInfo) ControllerSpecs() []*TypeInfo {
|
|||||||
// `testing.TestSuite`
|
// `testing.TestSuite`
|
||||||
func (s *SourceInfo) TestSuites() []*TypeInfo {
|
func (s *SourceInfo) TestSuites() []*TypeInfo {
|
||||||
if s.testSuites == nil {
|
if s.testSuites == nil {
|
||||||
s.testSuites = s.TypesThatEmbed(revel.RevelImportPath + "/testing.TestSuite")
|
s.testSuites = s.TypesThatEmbed(revel.RevelImportPath+"/testing.TestSuite", "testsuite")
|
||||||
}
|
}
|
||||||
return s.testSuites
|
return s.testSuites
|
||||||
}
|
}
|
||||||
|
|||||||
10
revel/run.go
10
revel/run.go
@@ -91,7 +91,7 @@ func parseRunArgs(args []string) *RunArgs {
|
|||||||
// 3. revel run [run-mode]
|
// 3. revel run [run-mode]
|
||||||
_, err := build.Import(args[0], "", build.FindOnly)
|
_, err := build.Import(args[0], "", build.FindOnly)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
revel.WARN.Printf("Unable to run using an import path, assuming import path is working directory %s %s", args[0], err.Error())
|
revel.RevelLog.Warn("Unable to run using an import path, assuming import path is working directory %s %s", "Argument", args[0], "error", err.Error())
|
||||||
}
|
}
|
||||||
println("Trying to build with", args[0], err)
|
println("Trying to build with", args[0], err)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@@ -121,18 +121,18 @@ func runApp(args []string) {
|
|||||||
runArgs.Port = revel.HTTPPort
|
runArgs.Port = revel.HTTPPort
|
||||||
}
|
}
|
||||||
|
|
||||||
revel.INFO.Printf("Running %s (%s) in %s mode\n", revel.AppName, revel.ImportPath, runArgs.Mode)
|
revel.RevelLog.Infof("Running %s (%s) in %s mode\n", revel.AppName, revel.ImportPath, runArgs.Mode)
|
||||||
revel.TRACE.Println("Base path:", revel.BasePath)
|
revel.RevelLog.Debug("Base path:", "path", revel.BasePath)
|
||||||
|
|
||||||
// If the app is run in "watched" mode, use the harness to run it.
|
// If the app is run in "watched" mode, use the harness to run it.
|
||||||
if revel.Config.BoolDefault("watch", true) && revel.Config.BoolDefault("watch.code", true) {
|
if revel.Config.BoolDefault("watch", true) && revel.Config.BoolDefault("watch.code", true) {
|
||||||
revel.TRACE.Println("Running in watched mode.")
|
revel.RevelLog.Debug("Running in watched mode.")
|
||||||
revel.HTTPPort = runArgs.Port
|
revel.HTTPPort = runArgs.Port
|
||||||
harness.NewHarness().Run() // Never returns.
|
harness.NewHarness().Run() // Never returns.
|
||||||
}
|
}
|
||||||
|
|
||||||
// Else, just build and run the app.
|
// Else, just build and run the app.
|
||||||
revel.TRACE.Println("Running in live build mode.")
|
revel.RevelLog.Debug("Running in live build mode.")
|
||||||
app, err := harness.Build()
|
app, err := harness.Build()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errorf("Failed to build app: %s", err)
|
errorf("Failed to build app: %s", err)
|
||||||
|
|||||||
@@ -170,13 +170,13 @@ module.testrunner = github.com/revel/modules/testrunner
|
|||||||
# Log to Os's standard error output. Default value.
|
# Log to Os's standard error output. Default value.
|
||||||
# "relative/path/to/log"
|
# "relative/path/to/log"
|
||||||
# Log to file.
|
# Log to file.
|
||||||
log.all.filter.module.app = stdout # Log all loggers for the application to the stdout
|
log.all.filter.module.app = stdout # Log all loggers for the application to the stdout
|
||||||
log.error.output = stderr # Log all loggers for Revel errors to the stderr
|
log.error.nfilter.module.app = stderr # Everything else that logs an error to stderr
|
||||||
|
|
||||||
# Revel request access log
|
# Revel request access log
|
||||||
# Access log line format:
|
# Access log line format:
|
||||||
# INFO 21:53:55 static server-engine.go:169: Request Stats ip=127.0.0.1 path=/public/vendors/datatables.net-buttons/js/buttons.html5.min.js method=GET start=2017/08/31 21:53:55 status=200 duration_seconds=0.0002583 section=requestlog
|
# INFO 21:53:55 static server-engine.go:169: Request Stats ip=127.0.0.1 path=/public/vendors/datatables.net-buttons/js/buttons.html5.min.js method=GET start=2017/08/31 21:53:55 status=200 duration_seconds=0.0002583 section=requestlog
|
||||||
log.request.output = stderr
|
log.request.output = stdout
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -199,9 +199,7 @@ module.testrunner =
|
|||||||
log.warn.output = log/%(app.name)s.log # Log all loggers for the application to the stdout
|
log.warn.output = log/%(app.name)s.log # Log all loggers for the application to the stdout
|
||||||
log.error.output = log/%(app.name)s.log # Log all errors to the stdout
|
log.error.output = log/%(app.name)s.log # Log all errors to the stdout
|
||||||
|
|
||||||
# Revel request access log
|
# Revel request access log (json format)
|
||||||
# Access log line format:
|
|
||||||
# INFO 21:53:55 static server-engine.go:169: Request Stats ip=127.0.0.1 path=/public/vendors/datatables.net-buttons/js/buttons.html5.min.js method=GET start=2017/08/31 21:53:55 status=200 duration_seconds=0.0002583 section=requestlog
|
|
||||||
# Example:
|
# Example:
|
||||||
# log.request.output = %(app.name)s-request.json
|
# log.request.output = %(app.name)s-request.json
|
||||||
log.request.output = log/requests.json
|
log.request.output = log/%(app.name)s-requests.json
|
||||||
|
|||||||
Reference in New Issue
Block a user