如何仅在拉取请求中的已更改文件上运行Rubocop?

mar*_*ins 5 git ruby-on-rails continuous-deployment circleci rubocop

我创建了spec/lint/rubocop_spec.rb,它在当前分支和master之间更改的文件上运行Rubocop样式检查器.这在我本地测试时有效,但在构建服务器Circle.ci上运行测试时则无效.我怀疑这是因为只有有问题的分支被下载,所以它没有找到master之间的任何差异.有比这更好的方法git co master && git pull origin master吗?我是否可以查询Github API以获取列出的文件?

require 'spec_helper'

describe 'Check that the files we have changed have correct syntax' do
  before do
    current_sha = `git rev-parse --verify HEAD`.strip!
    files = `git diff master #{current_sha} --name-only | grep .rb`
    files.tr!("\n", ' ')
    @report = 'nada'
    if files.present?
      puts "Changed files: #{files}"

      @report = `rubocop #{files}`
      puts "Report: #{@report}"
    end
  end

  it { @report.match('Offenses').should_not be true }
end
Run Code Online (Sandbox Code Playgroud)

Tim*_*ins 9

您不必使用 github api,甚至 ruby​​(除非您想包装响应),您只需运行:

git fetch && git diff-tree -r --no-commit-id --name-only master@\{u\} head | xargs ls -1 2>/dev/null | xargs rubocop --force-exclusion
Run Code Online (Sandbox Code Playgroud)

请参阅http://www.red56.uk/2017/03/26/running-rubocop-on-changed-files/了解更多

  • `rubocop --force-exclusion` 用于考虑 .rubocop.yml 排除 (2认同)

mar*_*ins 6

我通过查询api.github.com修复了它.这将对current_sha和master分支之间已更改的所有文件运行rubocop.

require 'spec_helper'

describe 'Check that the files we have changed have correct syntax' do
  before do
    current_sha = `git rev-parse --verify HEAD`.strip!
    token = 'YOUR GITHUB TOKEN'
    url = 'https://api.github.com/repos/orwapp/orwapp/compare/' \
          "master...#{current_sha}?access_token=#{token}"
    files = `curl -i #{url} | grep filename | cut -f2 -d: | grep \.rb | tr '"', '\ '`
    files.tr!("\n", ' ')
    @report = 'nada'
    if files.present?
      puts "Changed files: #{files}"

      @report = `rubocop #{files}`
      puts "Report: #{@report}"
    end
  end

  it { expect(@report.match('Offenses')).to be_falsey }
end
Run Code Online (Sandbox Code Playgroud)