reviewdog

package module
v0.0.0-...-ffb00ef Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 23, 2018 License: MIT Imports: 18 Imported by: 0

README ΒΆ

reviewdog

reviewdog - A code review dog who keeps your codebase healthy.

Gitter LICENSE GoDoc releases Github All Releases

Travis Status CircleCI Status Coverage Status drone.io Build Status

"reviewdog" provides a way to post review comments to code hosting service, such as GitHub, automatically by integrating with any linter tools with ease. It uses an output of lint tools and posts them as a comment if findings are in diff of patches to review.

reviewdog also supports run in the local environment to filter an output of lint tools by diff.

design doc

Table of Contents

github-pr-check sample comment in pull-request commit status sample-comment.png reviewdog-local-demo.gif

Installation

Get the binary release (recommended way)

or

$ go get -u github.com/haya14busa/reviewdog/cmd/reviewdog

Input Format

'errorformat'

reviewdog accepts any compiler or linter result from stdin and parses it with scan-f like 'errorformat', which is the port of Vim's errorformat feature.

For example, if the result format is {file}:{line number}:{column number}: {message}, errorformat should be %f:%l:%c: %m and you can pass it as -efm arguments.

$ golint ./...
comment_iowriter.go:11:6: exported type CommentWriter should have comment or be unexported
$ golint ./... | reviewdog -efm="%f:%l:%c: %m" -diff="git diff master"
name description
%f file name
%l line number
%c column number
%m error message
%% the single '%' character
... ...

Please see haya14busa/errorformat and :h errorformat if you want to deal with a more complex output. 'errorformat' can handle more complex output like a multi-line error message.

By this 'errorformat' feature, reviewdog can support any tools output with ease.

Available pre-defined 'errorformat'

But, you don't have to write 'errorformat' in many cases. reviewdog supports pre-defined errorformat for major tools.

You can find available errorformat name by reviewdog -list and you can use it with -f={name}.

$ reviewdog -list
golint          linter for Go source code                                       - https://github.com/golang/lint
govet           Vet examines Go source code and reports suspicious problems     - https://golang.org/cmd/vet/
sbt             the interactive build tool                                      - http://www.scala-sbt.org/
...
$ golint ./... | reviewdog -f=golint -diff="git diff master"

You can add supported pre-defined 'errorformat' by contributing to haya14busa/errorformat

checkstyle format

reviewdog also accepts checkstyle XML format as well. If the linter supports checkstyle format as a report format, you can use -f=checkstyle instead of using 'errorformat'.

# Local
$ eslint -f checkstyle . | reviewdog -f=checkstyle -diff="git diff"

# CI (overwrite tool name which is shown in review comment by -name arg)
$ eslint -f checkstyle . | reviewdog -f=checkstyle -name="eslint" -reporter=github-pr-check

Also, if you want to pass other Json/XML/etc... format to reviewdog, you can write a converter.

$ <linter> | <convert-to-checkstyle> | reviewdog -f=checkstyle -name="<linter>" -reporter=github-pr-check

reviewdog config file

reviewdog can also be controlled via the .reviewdog.yml configuration file instead of "-f" or "-efm" arguments.

With .reviewdog.yml, you can run the same commands both CI service and local environment including editor integration with ease.

.reviewdog.yml
runner:
  <tool-name>:
    cmd: <command> # (required)
    errorformat: # (optional if there is supporeted format for <tool-name>. see reviewdog -list)
      - <list of errorformat>
    name: <tool-name> # (optional. you can overwrite <tool-name> defined by runner key)

  # examples
  golint:
    cmd: golint ./...
    errorformat:
      - "%f:%l:%c: %m"
  govet:
    cmd: go tool vet -all -shadowstrict .
$ reviewdog -diff="git diff master"
project/run_test.go:61:28: [golint] error strings should not end with punctuation
project/run.go:57:18: [errcheck]        defer os.Setenv(name, os.Getenv(name))
project/run.go:58:12: [errcheck]        os.Setenv(name, "")
# You can use -conf to specify config file path.
$ reviewdog -conf=./.reviewdog.yml -reporter=github-pr-check

Output format for project config based run is one of the following formats.

  • <file>: [<tool name>] <message>
  • <file>:<lnum>: [<tool name>] <message>
  • <file>:<lnum>:<col>: [<tool name>] <message>

Reporters

reviewdog can report results both in local environment and review services as continuous integration.

Reporter: Local (-reporter=local) [default]

reviewdog can find newly introduced findings by filtering linter results using diff. You can pass diff command as -diff arg.

$ golint ./... | reviewdog -f=golint -diff="git diff master"

Reporter: GitHub Checks (-reporter=github-pr-check)

github-pr-check sample

github-pr-check reporter reports results to GitHub Checks. Since GitHub Checks API is only for GitHub Apps, reviewdog CLI send a request to reviewdog GitHub App server and the server post results as GitHub Checks.

  1. Install reviewdog Apps. https://github.com/apps/reviewdog
  2. Set REVIEWDOG_TOKEN or run reviewdog CLI in trusted CI providers.
  • Get token from https://reviewdog.app/gh/{owner}/{repo-name}.
$ export REVIEWDOG_TOKEN="<token>"
$ reviewdog -reporter=github-pr-check

Note: Token is not required if you run reviewdog in Travis or AppVeyor.

Caution

As described above, github-pr-check reporter is depending on reviewdog GitHub App server. The server is running with haya14busa's pocket money for now and I may break things, so I cannot ensure that the server is running 24h and 365 days.

UPDATE: Started getting support by opencollective. See Supporting reviewdog

github-pr-check reporter is better than github-pr-review reporter in general because it provides more rich feature and has less scope, but please bear in mind the above caution and please use it on your own risk.

You can use github-pr-review reporter if you don't want to depend on reviewdog server.

Reporter: GitHub PullRequest review comment (-reporter=github-pr-review)

sample-comment.png

github-pr-review reporter reports results to GitHub PullRequest review comments using GitHub Personal API Access Token. GitHub Enterprise is supported too.

$ export REVIEWDOG_GITHUB_API_TOKEN="<token>"
$ reviewdog -reporter=github-pr-review`

For GitHub Enterprise, set API endpoint by environment variable.

$ export GITHUB_API="https://example.githubenterprise.com/api/v3/"
$ export REVIEWDOG_INSECURE_SKIP_VERIFY=true # set this as you need to skip verifying SSL

Reporter: GitLab MergeRequest discussions (-reporter=gitlab-mr-discussion)

gitlab-mr-discussion sample

Required GitLab version: >= v10.8.0

gitlab-mr-discussion reporter reports results to GitLab MergeRequest discussions using GitLab Personal API Access token. Get the token with api scope from https://gitlab.com/profile/personal_access_tokens.

$ export REVIEWDOG_GITLAB_API_TOKEN="<token>"
$ reviewdog -reporter=gitlab-mr-discussion

For self-hosted GitLab, set API endpoint by environment variable.

$ export GITLAB_API="https://example.gitlab.com/api/v4"
$ export REVIEWDOG_INSECURE_SKIP_VERIFY=true # set this as you need to skip verifying SSL

Reporter: GitLab MergeRequest commit (-reporter=gitlab-mr-commit)

gitlab-mr-commit is similar to gitlab-mr-discussion reporter but reports results to each commit in GitLab MergeRequest.

gitlab-mr-discussion is recommended, but you can use gitlab-mr-commit reporter if your GitLab version is under v10.8.0.

$ export REVIEWDOG_GITLAB_API_TOKEN="<token>"
$ reviewdog -reporter=gitlab-mr-commit

Supported CI services

Travis CI

Travis CI (-reporter=github-pr-check)

If you use -reporter=github-pr-check in Travis CI, you don't need to set REVIEWDOG_TOKEN.

Example:

env:
  global:
    - REVIEWDOG_VERSION="0.9.11"

install:
  - mkdir -p ~/bin/ && export export PATH="~/bin/:$PATH"
  - curl -fSL https://github.com/haya14busa/reviewdog/releases/download/$REVIEWDOG_VERSION/reviewdog_linux_amd64 -o ~/bin/reviewdog && chmod +x ~/bin/reviewdog

script:
  - reviewdog -conf=.reviewdog.yml -reporter=github-pr-check
Travis CI (-reporter=github-pr-review)

Store GitHub API token by travis encryption keys.

$ gem install travis
$ travis encrypt REVIEWDOG_GITHUB_API_TOKEN=<token> --add env.global

Example:

env:
  global:
    - secure: <token>
    - REVIEWDOG_VERSION="0.9.11"

install:
  - mkdir -p ~/bin/ && export export PATH="~/bin/:$PATH"
  - curl -fSL https://github.com/haya14busa/reviewdog/releases/download/$REVIEWDOG_VERSION/reviewdog_linux_amd64 -o ~/bin/reviewdog && chmod +x ~/bin/reviewdog

script:
  - >-
    golint ./... | reviewdog -f=golint -reporter=github-pr-review

Examples

Circle CI

Store REVIEWDOG_TOKEN or REVIEWDOG_GITHUB_API_TOKEN in Environment variables - CircleCI

.circleci/config.yml sample
version: 2
jobs:
  build:
    docker:
      - image: golang:latest
        environment:
          REVIEWDOG_VERSION: "0.9.11"
    steps:
      - checkout
      - run: curl -fSL https://github.com/haya14busa/reviewdog/releases/download/$REVIEWDOG_VERSION/reviewdog_linux_amd64 -o reviewdog && chmod +x ./reviewdog
      - run: go vet ./... 2>&1 | ./reviewdog -f=govet -reporter=github-pr-check
      # or
      - run: go vet ./... 2>&1 | ./reviewdog -f=govet -reporter=github-pr-review

GitLab CI

Store REVIEWDOG_GITLAB_API_TOKEN in GitLab CI variable.

.gitlab-ci.yml sample
reviewdog:
  script:
    - reviewdog -reporter=gitlab-mr-discussion
    # Or
    - reviewdog -reporter=gitlab-mr-commit

Common (Jenkins, local, etc...)

You can use reviewdog to post review comments from anywhere with following environment variables.

name description
CI_PULL_REQUEST Pull Request number (e.g. 14)
CI_COMMIT SHA1 for the current build
CI_REPO_OWNER repository owner (e.g. "haya14busa" for https://github.com/haya14busa/reviewdog)
CI_REPO_NAME repository name (e.g. "reviewdog" for https://github.com/haya14busa/reviewdog)
CI_BRANCH [optional] branch of the commit
$ export CI_PULL_REQUEST=14
$ export CI_REPO_OWNER=haya14busa
$ export CI_REPO_NAME=reviewdog
$ export CI_COMMIT=$(git rev-parse HEAD)

and set a token if required.

$ REVIEWDOG_TOKEN="<token>"
$ REVIEWDOG_GITHUB_API_TOKEN="<token>"
$ REVIEWDOG_GITLAB_API_TOKEN="<token>"
Jenkins with Github pull request builder plugin
$ export CI_PULL_REQUEST=${ghprbPullId}
$ export CI_REPO_OWNER=haya14busa
$ export CI_REPO_NAME=reviewdog
$ export CI_COMMIT=${ghprbActualCommit}
$ export REVIEWDOG_INSECURE_SKIP_VERIFY=true # set this as you need
$ REVIEWDOG_TOKEN="<token>" reviewdog -reporter=github-pr-check
# Or
$ REVIEWDOG_GITHUB_API_TOKEN="<token>" reviewdog -reporter=github-pr-review

Articles

🐦 Author

haya14busa GitHub followers

Contributors

Contributors

Supporting reviewdog

Become a backer or sponsor and get your logo on our README on Github with a link to your site.

Become a backer Become a sponsor

Documentation ΒΆ

Index ΒΆ

Examples ΒΆ

Constants ΒΆ

View Source
const Version = "0.9.11"

Version is version of reviewdog CLI.

Variables ΒΆ

This section is empty.

Functions ΒΆ

func CleanPath ΒΆ

func CleanPath(path, workdir string) string

CleanPath clean up given path. If workdir is not empty, it returns relative path to the given workdir.

func CreateMergeRequestDiscussion ΒΆ

func CreateMergeRequestDiscussion(cli *gitlab.Client, projectID string, mergeRequest int, discussion *GitLabMergeRequestDiscussion) (*gitlab.Response, error)

CreateMergeRequestDiscussion creates new discussion on a merge request.

GitLab API docs: https://docs.gitlab.com/ee/api/discussions.html#create-new-merge-request-discussion

func RunFromResult ΒΆ

func RunFromResult(ctx context.Context, c CommentService, results []*CheckResult,
	filediffs []*diff.FileDiff, strip int, toolname string) error

Types ΒΆ

type BulkCommentService ΒΆ

type BulkCommentService interface {
	CommentService
	Flush(context.Context) error
}

BulkCommentService posts comments all at once when Flush() is called. Flush() will be called at the end of reviewdog run.

type CheckResult ΒΆ

type CheckResult struct {
	Path    string   // relative file path
	Lnum    int      // line number
	Col     int      // column number (1 <tab> == 1 character column)
	Message string   // error message
	Lines   []string // Original error lines (often one line)
}

CheckResult represents a checked result of static analysis tools. :h error-file-format

type CheckStyleError ΒΆ

type CheckStyleError struct {
	Column   int    `xml:"column,attr,omitempty"`
	Line     int    `xml:"line,attr"`
	Message  string `xml:"message,attr"`
	Severity string `xml:"severity,attr,omitempty"`
	Source   string `xml:"source,attr,omitempty"`
}

CheckStyleError represents <error line="1" column="10" severity="error" message="msg" source="src" />

type CheckStyleFile ΒΆ

type CheckStyleFile struct {
	Name   string             `xml:"name,attr"`
	Errors []*CheckStyleError `xml:"error"`
}

CheckStyleFile represents <file name="fname"><error ... />...</file>

type CheckStyleParser ΒΆ

type CheckStyleParser struct{}

CheckStyleParser is checkstyle parser.

func (*CheckStyleParser) Parse ΒΆ

func (p *CheckStyleParser) Parse(r io.Reader) ([]*CheckResult, error)

type CheckStyleResult ΒΆ

type CheckStyleResult struct {
	XMLName xml.Name          `xml:"checkstyle"`
	Version string            `xml:"version,attr"`
	Files   []*CheckStyleFile `xml:"file,omitempty"`
}

CheckStyleResult represents checkstyle XML result. <?xml version="1.0" encoding="utf-8"?><checkstyle version="4.3"><file ...></file>...</checkstyle>

References:

type Comment ΒΆ

type Comment struct {
	*CheckResult
	Body     string
	LnumDiff int
	ToolName string
}

Comment represents a reported result as a comment.

type CommentService ΒΆ

type CommentService interface {
	Post(context.Context, *Comment) error
}

CommentService is an interface which posts Comment.

func MultiCommentService ΒΆ

func MultiCommentService(services ...CommentService) CommentService

MultiCommentService creates a comment service that duplicates its post to all the provided comment services.

type DiffCmd ΒΆ

type DiffCmd struct {
	// contains filtered or unexported fields
}

func NewDiffCmd ΒΆ

func NewDiffCmd(cmd *exec.Cmd, strip int) *DiffCmd

func (*DiffCmd) Diff ΒΆ

func (d *DiffCmd) Diff(_ context.Context) ([]byte, error)

Diff returns diff. It caches the result and can be used more than once.

func (*DiffCmd) Strip ΒΆ

func (d *DiffCmd) Strip() int

type DiffService ΒΆ

type DiffService interface {
	Diff(context.Context) ([]byte, error)
	Strip() int
}

DiffService is an interface which get diff.

func NewDiffString ΒΆ

func NewDiffString(diff string, strip int) DiffService

type DiffString ΒΆ

type DiffString struct {
	// contains filtered or unexported fields
}

func (*DiffString) Diff ΒΆ

func (d *DiffString) Diff(_ context.Context) ([]byte, error)

func (*DiffString) Strip ΒΆ

func (d *DiffString) Strip() int

type ErrorformatParser ΒΆ

type ErrorformatParser struct {
	// contains filtered or unexported fields
}

ErrorformatParser is errorformat parser.

func NewErrorformatParser ΒΆ

func NewErrorformatParser(efm *errorformat.Errorformat) *ErrorformatParser

NewErrorformatParser returns a new ErrorformatParser.

func NewErrorformatParserString ΒΆ

func NewErrorformatParserString(efms []string) (*ErrorformatParser, error)

NewErrorformatParserString returns a new ErrorformatParser from errorformat in string representation.

func (*ErrorformatParser) Parse ΒΆ

func (p *ErrorformatParser) Parse(r io.Reader) ([]*CheckResult, error)

type FilteredCheck ΒΆ

type FilteredCheck struct {
	*CheckResult
	InDiff   bool
	LnumDiff int
}

FilteredCheck represents CheckResult with filtering info.

func FilterCheck ΒΆ

func FilterCheck(results []*CheckResult, diff []*diff.FileDiff, strip int, wd string) []*FilteredCheck

FilterCheck filters check results by diff. It doesn't drop check which is not in diff but set FilteredCheck.InDiff field false.

type GitHubPullRequest ΒΆ

type GitHubPullRequest struct {
	// contains filtered or unexported fields
}

GitHubPullRequest is a comment and diff service for GitHub PullRequest.

API:

https://developer.github.com/v3/pulls/comments/#create-a-comment
POST /repos/:owner/:repo/pulls/:number/comments

func NewGitHubPullReqest ΒΆ

func NewGitHubPullReqest(cli *github.Client, owner, repo string, pr int, sha string) (*GitHubPullRequest, error)

NewGitHubPullReqest returns a new GitHubPullRequest service. GitHubPullRequest service needs git command in $PATH.

func (*GitHubPullRequest) Diff ΒΆ

func (g *GitHubPullRequest) Diff(ctx context.Context) ([]byte, error)

Diff returns a diff of PullRequest.

func (*GitHubPullRequest) Flush ΒΆ

func (g *GitHubPullRequest) Flush(ctx context.Context) error

Flush posts comments which has not been posted yet.

func (*GitHubPullRequest) Post ΒΆ

Post accepts a comment and holds it. Flush method actually posts comments to GitHub in parallel.

func (*GitHubPullRequest) Strip ΒΆ

func (g *GitHubPullRequest) Strip() int

Strip returns 1 as a strip of git diff.

type GitLabMergeRequestCommitCommenter ΒΆ

type GitLabMergeRequestCommitCommenter struct {
	// contains filtered or unexported fields
}

GitLabMergeRequestCommitCommenter is a comment service for GitLab MergeRequest.

API:

https://docs.gitlab.com/ce/api/commits.html#post-comment-to-commit
POST /projects/:id/repository/commits/:sha/comments

func NewGitLabMergeRequestCommitCommenter ΒΆ

func NewGitLabMergeRequestCommitCommenter(cli *gitlab.Client, owner, repo string, pr int, sha string) (*GitLabMergeRequestCommitCommenter, error)

NewGitLabMergeRequestCommitCommenter returns a new GitLabMergeRequestCommitCommenter service. GitLabMergeRequestCommitCommenter service needs git command in $PATH.

func (*GitLabMergeRequestCommitCommenter) Flush ΒΆ

Flush posts comments which has not been posted yet.

func (*GitLabMergeRequestCommitCommenter) Post ΒΆ

Post accepts a comment and holds it. Flush method actually posts comments to GitLab in parallel.

type GitLabMergeRequestDiff ΒΆ

type GitLabMergeRequestDiff struct {
	// contains filtered or unexported fields
}

GitLabMergeRequestDiff is a diff service for GitLab MergeRequest.

func NewGitLabMergeRequestDiff ΒΆ

func NewGitLabMergeRequestDiff(cli *gitlab.Client, owner, repo string, pr int, sha string) (*GitLabMergeRequestDiff, error)

NewGitLabMergeRequestDiff returns a new GitLabMergeRequestDiff service. itLabMergeRequestDiff service needs git command in $PATH.

func (*GitLabMergeRequestDiff) Diff ΒΆ

func (g *GitLabMergeRequestDiff) Diff(ctx context.Context) ([]byte, error)

Diff returns a diff of MergeRequest. It runs `git diff` locally instead of diff_url of GitLab Merge Request because diff of diff_url is not suited for comment API in a sense that diff of diff_url is equivalent to `git diff --no-renames`, we want diff which is equivalent to `git diff --find-renames`.

func (*GitLabMergeRequestDiff) Strip ΒΆ

func (g *GitLabMergeRequestDiff) Strip() int

Strip returns 1 as a strip of git diff.

type GitLabMergeRequestDiscussion ΒΆ

type GitLabMergeRequestDiscussion struct {
	Body     string                                `json:"body"` // The content of a discussion
	Position *GitLabMergeRequestDiscussionPosition `json:"position"`
}

GitLabMergeRequestDiscussion represents a discussion of MergeRequest.

type GitLabMergeRequestDiscussionCommenter ΒΆ

type GitLabMergeRequestDiscussionCommenter struct {
	// contains filtered or unexported fields
}

GitLabMergeRequestDiscussionCommenter is a comment and diff service for GitLab MergeRequest.

API:

https://docs.gitlab.com/ee/api/discussions.html#create-new-merge-request-discussion
POST /projects/:id/merge_requests/:merge_request_iid/discussions

func NewGitLabMergeRequestDiscussionCommenter ΒΆ

func NewGitLabMergeRequestDiscussionCommenter(cli *gitlab.Client, owner, repo string, pr int, sha string) (*GitLabMergeRequestDiscussionCommenter, error)

NewGitLabMergeRequestDiscussionCommenter returns a new GitLabMergeRequestDiscussionCommenter service. GitLabMergeRequestDiscussionCommenter service needs git command in $PATH.

func (*GitLabMergeRequestDiscussionCommenter) Flush ΒΆ

Flush posts comments which has not been posted yet.

func (*GitLabMergeRequestDiscussionCommenter) Post ΒΆ

Post accepts a comment and holds it. Flush method actually posts comments to GitLab in parallel.

type GitLabMergeRequestDiscussionList ΒΆ

type GitLabMergeRequestDiscussionList struct {
	Notes []*GitLabMergeRequestDiscussion `json:"notes"`
}

GitLabMergeRequestDiscussionList represents response of ListMergeRequestDiscussion API.

GitLab API docs: https://docs.gitlab.com/ee/api/discussions.html#list-project-merge-request-discussions

func ListMergeRequestDiscussion ΒΆ

func ListMergeRequestDiscussion(cli *gitlab.Client, projectID string, mergeRequest int, opts *ListMergeRequestDiscussionOptions) ([]*GitLabMergeRequestDiscussionList, *gitlab.Response, error)

ListMergeRequestDiscussion lists discussion on a merge request.

GitLab API docs: https://docs.gitlab.com/ee/api/discussions.html#list-project-merge-request-discussions

type GitLabMergeRequestDiscussionPosition ΒΆ

type GitLabMergeRequestDiscussionPosition struct {
	// Required.
	BaseSHA      string `json:"base_sha,omitempty"`      // Base commit SHA in the source branch
	StartSHA     string `json:"start_sha,omitempty"`     // SHA referencing commit in target branch
	HeadSHA      string `json:"head_sha,omitempty"`      // SHA referencing HEAD of this merge request
	PositionType string `json:"position_type,omitempty"` // Type of the position reference', allowed values: 'text' or 'image'

	// Optional.
	NewPath string `json:"new_path,omitempty"` // File path after change
	NewLine int    `json:"new_line,omitempty"` // Line number after change (for 'text' diff notes)
	OldPath string `json:"old_path,omitempty"` // File path before change
	OldLine int    `json:"old_line,omitempty"` // Line number before change (for 'text' diff notes)
}

GitLabMergeRequestDiscussionPosition represents position of GitLab MergeRequest Discussion.

type ListMergeRequestDiscussionOptions ΒΆ

type ListMergeRequestDiscussionOptions gitlab.ListOptions

ListMergeRequestDiscussionOptions represents the available ListMergeRequestDiscussion() options.

GitLab API docs: https://docs.gitlab.com/ee/api/discussions.html#list-project-merge-request-discussions

type Parser ΒΆ

type Parser interface {
	Parse(r io.Reader) ([]*CheckResult, error)
}

Parser is an interface which parses compilers, linters, or any tools results.

func NewCheckStyleParser ΒΆ

func NewCheckStyleParser() Parser

NewCheckStyleParser returns a new CheckStyleParser.

func NewParser ΒΆ

func NewParser(opt *ParserOpt) (Parser, error)

NewParser returns Parser based on ParserOpt.

type ParserOpt ΒΆ

type ParserOpt struct {
	FormatName  string
	Errorformat []string
}

ParserOpt represents option to create Parser. Either FormatName or Errorformat should be specified.

type RawCommentWriter ΒΆ

type RawCommentWriter struct {
	// contains filtered or unexported fields
}

RawCommentWriter is comment writer which writes results to given writer without any formatting.

func NewRawCommentWriter ΒΆ

func NewRawCommentWriter(w io.Writer) *RawCommentWriter

func (*RawCommentWriter) Post ΒΆ

func (s *RawCommentWriter) Post(_ context.Context, c *Comment) error

type Reviewdog ΒΆ

type Reviewdog struct {
	// contains filtered or unexported fields
}

Reviewdog represents review dog application which parses result of compiler or linter, get diff and filter the results by diff, and report filtered results.

Example ΒΆ
difftext := `diff --git a/golint.old.go b/golint.new.go
index 34cacb9..a727dd3 100644
--- a/golint.old.go
+++ b/golint.new.go
@@ -2,6 +2,12 @@ package test
 
 var V int
 
+var NewError1 int
+
 // invalid func comment
 func F() {
 }
+
+// invalid func comment2
+func F2() {
+}
`
lintresult := `golint.new.go:3:5: exported var V should have comment or be unexported
golint.new.go:5:5: exported var NewError1 should have comment or be unexported
golint.new.go:7:1: comment on exported function F should be of the form "F ..."
golint.new.go:11:1: comment on exported function F2 should be of the form "F2 ..."
`
efm, _ := errorformat.NewErrorformat([]string{`%f:%l:%c: %m`})
p := NewErrorformatParser(efm)
c := NewRawCommentWriter(os.Stdout)
d := NewDiffString(difftext, 1)
app := NewReviewdog("tool name", p, c, d)
app.Run(context.Background(), strings.NewReader(lintresult))
Output:

golint.new.go:5:5: exported var NewError1 should have comment or be unexported
golint.new.go:11:1: comment on exported function F2 should be of the form "F2 ..."

func NewReviewdog ΒΆ

func NewReviewdog(toolname string, p Parser, c CommentService, d DiffService) *Reviewdog

NewReviewdog returns a new Reviewdog.

func (*Reviewdog) Run ΒΆ

func (w *Reviewdog) Run(ctx context.Context, r io.Reader) error

Run runs Reviewdog application.

type UnifiedCommentWriter ΒΆ

type UnifiedCommentWriter struct {
	// contains filtered or unexported fields
}

UnifiedCommentWriter is comment writer which writes results to given writer in one of following unified formats.

Format:

  • <file>: [<tool name>] <message>
  • <file>:<lnum>: [<tool name>] <message>
  • <file>:<lnum>:<col>: [<tool name>] <message>

where <message> can be multiple lines.

func NewUnifiedCommentWriter ΒΆ

func NewUnifiedCommentWriter(w io.Writer) *UnifiedCommentWriter

func (*UnifiedCommentWriter) Post ΒΆ

Directories ΒΆ

Path Synopsis
Package cienv provides utility for environment variable in CI services.
Package cienv provides utility for environment variable in CI services.
cmd
Package diff provides a utility to parse unified diff.
Package diff provides a utility to parse unified diff.
Package project provides utility for reviewdog execution based on project config.
Package project provides utility for reviewdog execution based on project config.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL