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  }