diff --git a/main.go b/main.go index b1e1cee..821a5c8 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,7 @@ package main import ( - "fmt" "io/ioutil" - "net/http" "net/url" "os" "strings" @@ -11,7 +9,6 @@ import ( "github.com/a8m/mark" "github.com/docopt/docopt-go" - "github.com/fatih/color" "golang.org/x/net/html" ) @@ -37,41 +34,11 @@ func main() { panic(err) } - checkURLs(extractURLs(n), args["--verbose"].(bool)) -} - -func checkURLs(ss []string, verbose bool) { - client := &http.Client{Timeout: 5 * time.Second} - bs := make(chan bool, len(ss)) - - for _, s := range ss { - go checkURL(client, s, bs, verbose) - } - - ok := true - - for i := 0; i < len(ss); i++ { - ok = ok && <-bs - } - - if !ok { + if !newURLChecker(5*time.Second, args["--verbose"].(bool)).CheckMany(extractURLs(n)) { os.Exit(1) } } -func checkURL(client *http.Client, s string, bs chan bool, verbose bool) { - _, err := client.Get(s) - - if s := color.New(color.FgCyan).SprintFunc()(s); err != nil { - printToStderr( - color.New(color.FgRed).SprintFunc()("ERROR") + "\t" + s + "\t" + err.Error()) - } else if err == nil && verbose { - printToStderr(color.New(color.FgGreen).SprintFunc()("OK") + "\t" + s) - } - - bs <- err == nil -} - func extractURLs(n *html.Node) []string { ss := make(map[string]bool) ns := make([]*html.Node, 0, 1024) @@ -99,16 +66,6 @@ func extractURLs(n *html.Node) []string { return stringSetToSlice(ss) } -func stringSetToSlice(s2b map[string]bool) []string { - ss := make([]string, 0, len(s2b)) - - for s := range s2b { - ss = append(ss, s) - } - - return ss -} - func isURL(s string) bool { u, err := url.Parse(s) return err == nil && (u.Scheme == "http" || u.Scheme == "https") @@ -117,10 +74,10 @@ func isURL(s string) bool { func getArgs() map[string]interface{} { usage := `Link checker for Markdown and HTML -Usage: + Usage: linkcheck [-v] -Options: + Options: -v, --verbose Be verbose` args, err := docopt.Parse(usage, nil, true, "linkcheck", true) @@ -131,7 +88,3 @@ Options: return args } - -func printToStderr(xs ...interface{}) { - fmt.Fprintln(os.Stderr, xs...) -} diff --git a/url_checker.go b/url_checker.go index 80f8b73..d6f4f53 100644 --- a/url_checker.go +++ b/url_checker.go @@ -29,13 +29,13 @@ func (c urlChecker) Check(s string) bool { return err == nil } -func (c urlChecker) CheckMany(ss []string) { +func (c urlChecker) CheckMany(ss []string) bool { bs := make(chan bool, len(ss)) for _, s := range ss { - go func() { - bs <- c.Check() - }() + go func(s string) { + bs <- c.Check(s) + }(s) } ok := true diff --git a/utils.go b/utils.go new file mode 100644 index 0000000..988ee66 --- /dev/null +++ b/utils.go @@ -0,0 +1,20 @@ +package main + +import ( + "fmt" + "os" +) + +func stringSetToSlice(s2b map[string]bool) []string { + ss := make([]string, 0, len(s2b)) + + for s := range s2b { + ss = append(ss, s) + } + + return ss +} + +func printToStderr(xs ...interface{}) { + fmt.Fprintln(os.Stderr, xs...) +}