diff --git a/cmd/godoc/godoc_test.go b/cmd/godoc/godoc_test.go index 65db4559..92183732 100644 --- a/cmd/godoc/godoc_test.go +++ b/cmd/godoc/godoc_test.go @@ -11,6 +11,7 @@ import ( "path/filepath" "regexp" "runtime" + "strings" "testing" ) @@ -32,6 +33,18 @@ var godocTests = []struct { `WriteString writes the contents of the string s to w`, }, }, + { + []string{"nonexistingpkg"}, + []string{ + `no such file or directory`, + }, + }, + { + []string{"fmt", "NonexistentSymbol"}, + []string{ + `No match found\.`, + }, + }, } // Basic regression test for godoc command-line tool. @@ -59,15 +72,10 @@ func TestGodoc(t *testing.T) { t.Errorf("Running with args %#v: %v", test.args, err) continue } - logged := false for _, pat := range test.matches { re := regexp.MustCompile(pat) if !re.Match(out) { - if !logged { - t.Logf("Output of running with args %#v:\n%s", test.args, out) - logged = true - } - t.Errorf("Did not match /%v/", pat) + t.Errorf("godoc %v =\n%s\nwanted /%v/", strings.Join(test.args, " "), out, pat) } } } diff --git a/godoc/cmdline.go b/godoc/cmdline.go index c2d332f2..8a5a3212 100644 --- a/godoc/cmdline.go +++ b/godoc/cmdline.go @@ -85,7 +85,11 @@ func CommandLine(w io.Writer, fs vfs.NameSpace, pres *Presentation, args []strin // contains only subdirectory information if info.PAst == nil && info.PDoc == nil { info = cinfo - } else { + } else if relpath != target { + // The above check handles the case where an operating system path + // is provided (see documentation for paths below). In that case, + // relpath is set to "/target" (in anticipation of accessing packages there), + // and is therefore not expected to match a command. fmt.Fprintf(w, "use 'godoc %s%s' for documentation on the %s command \n\n", cmdPrefix, relpath, relpath) } } diff --git a/godoc/cmdline_test.go b/godoc/cmdline_test.go index a39ef8c3..f9b8b477 100644 --- a/godoc/cmdline_test.go +++ b/godoc/cmdline_test.go @@ -168,12 +168,18 @@ func First() { // Second function is second. func Second() { } +`, + "src/pkg/vet/vet.go": `// Package vet +package vet `, "src/cmd/go/doc.go": `// The go command package main `, "src/cmd/gofmt/doc.go": `// The gofmt command package main +`, + "src/cmd/vet/vet.go": `// The vet command +package main `, }) fs := make(vfs.NameSpace) @@ -209,6 +215,11 @@ package main args: []string{"foo", "First"}, exp: "PACKAGE \nfunc First()\n First function is first.\n", }, + { + desc: "package w. bad filter", + args: []string{"foo", "DNE"}, + exp: "PACKAGE ", + }, { desc: "source mode", args: []string{"src/bar"}, @@ -234,6 +245,16 @@ package main args: []string{"doesnotexist"}, err: true, }, + { + desc: "both command and package", + args: []string{"vet"}, + exp: "use 'godoc cmd/vet' for documentation on the vet command \n\nPACKAGE Package vet\n", + }, + { + desc: "root directory", + args: []string{"/"}, + exp: "", + }, } { w := new(bytes.Buffer) err := CommandLine(w, fs, p, tc.args) diff --git a/godoc/godoc.go b/godoc/godoc.go index b0e721a2..ed63d4e6 100644 --- a/godoc/godoc.go +++ b/godoc/godoc.go @@ -208,9 +208,17 @@ func comment_htmlFunc(comment string) string { // want to avoid that mistake here. const punchCardWidth = 80 +func containsOnlySpace(buf []byte) bool { + isNotSpace := func(r rune) bool { return !unicode.IsSpace(r) } + return bytes.IndexFunc(buf, isNotSpace) == -1 +} + func comment_textFunc(comment, indent, preIndent string) string { var buf bytes.Buffer doc.ToText(&buf, comment, indent, preIndent, punchCardWidth-2*len(indent)) + if containsOnlySpace(buf.Bytes()) { + return "" + } return buf.String() } diff --git a/godoc/static/package.txt b/godoc/static/package.txt index 44ab380e..d2086169 100644 --- a/godoc/static/package.txt +++ b/godoc/static/package.txt @@ -7,7 +7,8 @@ --------------------------------------- -*/}}{{with .PDoc}}{{if $.IsMain}}COMMAND DOCUMENTATION +*/}}{{if and $filtered (not .PDoc)}}No match found. +{{end}}{{with .PDoc}}{{if $.IsMain}}COMMAND DOCUMENTATION {{comment_text .Doc " " "\t"}} {{else}}{{if not $filtered}}PACKAGE DOCUMENTATION @@ -20,8 +21,7 @@ package {{.Name}} --------------------------------------- -*/}}{{with .Consts}}{{if not $filtered}} -CONSTANTS +*/}}{{with .Consts}}{{if not $filtered}}CONSTANTS {{end}}{{range .}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} @@ -29,8 +29,7 @@ CONSTANTS --------------------------------------- -*/}}{{with .Vars}}{{if not $filtered}} -VARIABLES +*/}}{{with .Vars}}{{if not $filtered}}VARIABLES {{end}}{{range .}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} @@ -38,8 +37,7 @@ VARIABLES --------------------------------------- -*/}}{{with .Funcs}}{{if not $filtered}} -FUNCTIONS +*/}}{{with .Funcs}}{{if not $filtered}}FUNCTIONS {{end}}{{range .}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} @@ -47,23 +45,48 @@ FUNCTIONS --------------------------------------- -*/}}{{with .Types}}{{if not $filtered}} -TYPES +*/}}{{with .Types}}{{if not $filtered}}TYPES {{end}}{{range .}}{{$tname := .Name}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} -{{range .Consts}}{{node $ .Decl}} +{{/* + +--------------------------------------- + +*/}}{{if .Consts}}{{range .Consts}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} -{{end}}{{range .Vars}}{{node $ .Decl}} +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Vars}}{{range .Vars}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} -{{end}}{{example_text $ .Name " "}} -{{range .Funcs}}{{node $ .Decl}} +{{example_text $ .Name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Funcs}}{{range .Funcs}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} -{{example_text $ .Name " "}} -{{end}}{{range .Methods}}{{node $ .Decl}} +{{example_text $ .Name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Methods}}{{range .Methods}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} -{{$name := printf "%s_%s" $tname .Name}}{{example_text $ $name " "}}{{end}} -{{end}}{{end}}{{end}}{{/* +{{$name := printf "%s_%s" $tname .Name}}{{example_text $ $name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if and $filtered (not (or .Consts (or .Vars (or .Funcs .Types))))}}No match found. +{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{/* --------------------------------------- @@ -76,10 +99,16 @@ TYPES --------------------------------------- -*/}}{{with .Dirs}} -SUBDIRECTORIES +*/}}{{if not $filtered}}{{with .Dirs}}SUBDIRECTORIES {{if $.DirFlat}}{{range .List}}{{if .HasPkg}} {{.Path}}{{end}}{{end}} {{else}}{{range .List}} {{repeat `. ` .Depth}}{{.Name}}{{end}} -{{end}}{{end}} +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{/* +Make sure there is no newline at the end of this file. +perl -i -pe 'chomp if eof' package.txt +*/}} \ No newline at end of file diff --git a/godoc/static/static.go b/godoc/static/static.go index 49730484..ffd5c0fb 100644 --- a/godoc/static/static.go +++ b/godoc/static/static.go @@ -762,7 +762,8 @@ $(document).ready(function() { --------------------------------------- -*/}}{{with .PDoc}}{{if $.IsMain}}COMMAND DOCUMENTATION +*/}}{{if and $filtered (not .PDoc)}}No match found. +{{end}}{{with .PDoc}}{{if $.IsMain}}COMMAND DOCUMENTATION {{comment_text .Doc " " "\t"}} {{else}}{{if not $filtered}}PACKAGE DOCUMENTATION @@ -775,8 +776,7 @@ package {{.Name}} --------------------------------------- -*/}}{{with .Consts}}{{if not $filtered}} -CONSTANTS +*/}}{{with .Consts}}{{if not $filtered}}CONSTANTS {{end}}{{range .}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} @@ -784,8 +784,7 @@ CONSTANTS --------------------------------------- -*/}}{{with .Vars}}{{if not $filtered}} -VARIABLES +*/}}{{with .Vars}}{{if not $filtered}}VARIABLES {{end}}{{range .}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} @@ -793,8 +792,7 @@ VARIABLES --------------------------------------- -*/}}{{with .Funcs}}{{if not $filtered}} -FUNCTIONS +*/}}{{with .Funcs}}{{if not $filtered}}FUNCTIONS {{end}}{{range .}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} @@ -802,23 +800,48 @@ FUNCTIONS --------------------------------------- -*/}}{{with .Types}}{{if not $filtered}} -TYPES +*/}}{{with .Types}}{{if not $filtered}}TYPES {{end}}{{range .}}{{$tname := .Name}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} -{{range .Consts}}{{node $ .Decl}} +{{/* + +--------------------------------------- + +*/}}{{if .Consts}}{{range .Consts}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} -{{end}}{{range .Vars}}{{node $ .Decl}} +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Vars}}{{range .Vars}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} -{{end}}{{example_text $ .Name " "}} -{{range .Funcs}}{{node $ .Decl}} +{{example_text $ .Name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Funcs}}{{range .Funcs}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} -{{example_text $ .Name " "}} -{{end}}{{range .Methods}}{{node $ .Decl}} +{{example_text $ .Name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Methods}}{{range .Methods}}{{node $ .Decl}} {{comment_text .Doc " " "\t"}} -{{$name := printf "%s_%s" $tname .Name}}{{example_text $ $name " "}}{{end}} -{{end}}{{end}}{{end}}{{/* +{{$name := printf "%s_%s" $tname .Name}}{{example_text $ $name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if and $filtered (not (or .Consts (or .Vars (or .Funcs .Types))))}}No match found. +{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{/* --------------------------------------- @@ -831,14 +854,19 @@ TYPES --------------------------------------- -*/}}{{with .Dirs}} -SUBDIRECTORIES +*/}}{{if not $filtered}}{{with .Dirs}}SUBDIRECTORIES {{if $.DirFlat}}{{range .List}}{{if .HasPkg}} {{.Path}}{{end}}{{end}} {{else}}{{range .List}} {{repeat ` + "`" + `. ` + "`" + ` .Depth}}{{.Name}}{{end}} -{{end}}{{end}} -`, +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{/* +Make sure there is no newline at the end of this file. +perl -i -pe 'chomp if eof' package.txt +*/}}`, "play.js": `// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file.