Browse Source

Show filenames in outputs

renovate/configure
Yota Toyama 8 years ago
parent
commit
aa14822adc
  1. 2
      examples/markdown.feature
  2. 49
      file_checker.go
  3. 16
      main.go
  4. 36
      url_checker.go

2
examples/markdown.feature

@ -92,4 +92,4 @@ Feature: Markdown
linkcheck -v foo.md 2>&1 | wc -l linkcheck -v foo.md 2>&1 | wc -l
""" """
When I successfully run `sh foo.sh` When I successfully run `sh foo.sh`
Then the stdout should contain exactly "4" Then the stdout should contain exactly "5"

49
file_checker.go

@ -3,6 +3,7 @@ package main
import ( import (
"bytes" "bytes"
"io/ioutil" "io/ioutil"
"strings"
"time" "time"
"golang.org/x/net/html" "golang.org/x/net/html"
@ -17,20 +18,58 @@ func newFileChecker(timeout time.Duration, verbose bool) fileChecker {
return fileChecker{newURLChecker(timeout, verbose)} return fileChecker{newURLChecker(timeout, verbose)}
} }
func (c fileChecker) Check(f string) bool { func (c fileChecker) Check(f string) ([]urlResult, error) {
bs, err := ioutil.ReadFile(f) bs, err := ioutil.ReadFile(f)
if err != nil { if err != nil {
printToStderr(err.Error()) return nil, err
return false
} }
n, err := html.Parse(bytes.NewReader(blackfriday.Run(bs))) n, err := html.Parse(bytes.NewReader(blackfriday.Run(bs)))
if err != nil { if err != nil {
printToStderr(err.Error()) return nil, err
}
us := extractURLs(n)
rc := make(chan urlResult, len(us))
rs := make([]urlResult, 0, len(us))
go c.urlChecker.CheckMany(us, rc)
for r := range rc {
rs = append(rs, r)
}
return rs, nil
}
type fileResult struct {
filename string
urlResults []urlResult
err error
}
func (r fileResult) String() string {
ss := make([]string, 0, len(r.urlResults))
for _, r := range r.urlResults {
ss = append(ss, "\t"+r.String())
}
return strings.Join(append([]string{r.filename}, ss...), "\n")
}
func (r fileResult) Ok() bool {
if r.err != nil {
return false return false
} }
return c.urlChecker.CheckMany(extractURLs(n)) for _, r := range r.urlResults {
if r.err != nil {
return false
}
}
return true
} }

16
main.go

@ -27,19 +27,29 @@ func main() {
args := getArgs() args := getArgs()
fs := args["<filenames>"].([]string) fs := args["<filenames>"].([]string)
bs := make(chan bool, len(fs)) rc := make(chan fileResult, len(fs))
c := newFileChecker(5*time.Second, args["--verbose"].(bool)) c := newFileChecker(5*time.Second, args["--verbose"].(bool))
for _, f := range fs { for _, f := range fs {
go func(f string) { go func(f string) {
bs <- c.Check(f) rs, err := c.Check(f)
if err != nil {
rc <- fileResult{filename: f, err: err}
}
rc <- fileResult{filename: f, urlResults: rs}
}(f) }(f)
} }
ok := true ok := true
for i := 0; i < len(fs); i++ { for i := 0; i < len(fs); i++ {
ok = <-bs && ok r := <-rc
ok = ok && r.Ok()
printToStderr(r.String())
} }
if !ok { if !ok {

36
url_checker.go

@ -2,6 +2,7 @@ package main
import ( import (
"net/http" "net/http"
"sync"
"time" "time"
"github.com/fatih/color" "github.com/fatih/color"
@ -16,32 +17,35 @@ func newURLChecker(timeout time.Duration, verbose bool) urlChecker {
return urlChecker{http.Client{Timeout: timeout}, verbose} return urlChecker{http.Client{Timeout: timeout}, verbose}
} }
func (c urlChecker) Check(s string) bool { func (c urlChecker) Check(s string) error {
_, err := c.client.Get(s) _, err := c.client.Get(s)
return err
if err != nil {
printToStderr(color.RedString("ERROR") + "\t" + s + "\t" + color.YellowString(err.Error()))
} else if err == nil && c.verbose {
printToStderr(color.GreenString("OK") + "\t" + s)
}
return err == nil
} }
func (c urlChecker) CheckMany(ss []string) bool { func (c urlChecker) CheckMany(ss []string, rc chan<- urlResult) {
bs := make(chan bool, len(ss)) wg := sync.WaitGroup{}
for _, s := range ss { for _, s := range ss {
wg.Add(1)
go func(s string) { go func(s string) {
bs <- c.Check(s) rc <- urlResult{s, c.Check(s)}
wg.Done()
}(s) }(s)
} }
ok := true wg.Wait()
close(rc)
}
type urlResult struct {
url string
err error
}
for i := 0; i < len(ss); i++ { func (r urlResult) String() string {
ok = <-bs && ok if r.err == nil {
return color.GreenString("OK") + "\t" + r.url
} }
return ok return color.RedString("ERROR") + "\t" + r.url + "\t" + color.YellowString(r.err.Error())
} }

Loading…
Cancel
Save