github.com/haya14busa/reviewdog@v0.0.0-20180723114510-ffb00ef78fd3/cmd/reviewdog/doghouse.go (about) 1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "log" 8 "net/http" 9 "os" 10 "strings" 11 12 "github.com/haya14busa/reviewdog" 13 "github.com/haya14busa/reviewdog/cienv" 14 "github.com/haya14busa/reviewdog/doghouse" 15 "github.com/haya14busa/reviewdog/doghouse/client" 16 "github.com/haya14busa/reviewdog/project" 17 "golang.org/x/oauth2" 18 "golang.org/x/sync/errgroup" 19 ) 20 21 func runDoghouse(ctx context.Context, r io.Reader, opt *option, isProject bool) error { 22 ghInfo, isPr, err := cienv.GetBuildInfo() 23 if err != nil { 24 return err 25 } 26 if !isPr { 27 fmt.Fprintf(os.Stderr, "reviewdog: this is not PullRequest build.") 28 return nil 29 } 30 resultSet, err := checkResultSet(ctx, r, opt, isProject) 31 if err != nil { 32 return err 33 } 34 cli := newDoghouseCli(ctx) 35 return postResultSet(ctx, resultSet, ghInfo, cli) 36 } 37 38 func newDoghouseCli(ctx context.Context) *client.DogHouseClient { 39 httpCli := http.DefaultClient 40 if token := os.Getenv("REVIEWDOG_TOKEN"); token != "" { 41 ts := oauth2.StaticTokenSource( 42 &oauth2.Token{AccessToken: token}, 43 ) 44 httpCli = oauth2.NewClient(ctx, ts) 45 } 46 return client.New(httpCli) 47 } 48 49 var projectRunAndParse = project.RunAndParse 50 51 func checkResultSet(ctx context.Context, r io.Reader, opt *option, isProject bool) (map[string][]*reviewdog.CheckResult, error) { 52 resultSet := make(map[string][]*reviewdog.CheckResult) 53 if isProject { 54 conf, err := projectConfig(opt.conf) 55 if err != nil { 56 return nil, err 57 } 58 resultSet, err = projectRunAndParse(ctx, conf) 59 if err != nil { 60 return nil, err 61 } 62 } else { 63 p, err := newParserFromOpt(opt) 64 if err != nil { 65 return nil, err 66 } 67 rs, err := p.Parse(r) 68 if err != nil { 69 return nil, err 70 } 71 resultSet[toolName(opt)] = rs 72 } 73 return resultSet, nil 74 } 75 76 func postResultSet(ctx context.Context, resultSet map[string][]*reviewdog.CheckResult, ghInfo *cienv.BuildInfo, cli client.DogHouseClientInterface) error { 77 var g errgroup.Group 78 wd, _ := os.Getwd() 79 for name, results := range resultSet { 80 name := name 81 as := make([]*doghouse.Annotation, 0, len(results)) 82 for _, r := range results { 83 as = append(as, checkResultToAnnotation(r, wd)) 84 } 85 req := &doghouse.CheckRequest{ 86 Name: name, 87 Owner: ghInfo.Owner, 88 Repo: ghInfo.Repo, 89 PullRequest: ghInfo.PullRequest, 90 SHA: ghInfo.SHA, 91 Branch: ghInfo.Branch, 92 Annotations: as, 93 } 94 g.Go(func() error { 95 res, err := cli.Check(ctx, req) 96 if err != nil { 97 return err 98 } 99 log.Printf("[%s] reported: %s", name, res.ReportURL) 100 return nil 101 }) 102 } 103 return g.Wait() 104 } 105 106 func checkResultToAnnotation(c *reviewdog.CheckResult, wd string) *doghouse.Annotation { 107 return &doghouse.Annotation{ 108 Path: reviewdog.CleanPath(c.Path, wd), 109 Line: c.Lnum, 110 Message: c.Message, 111 RawMessage: strings.Join(c.Lines, "\n"), 112 } 113 }