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

时间:2015-09-13 19:47:58

标签: ruby-on-rails git continuous-deployment circleci rubocop

我创建了 spec / lint / rubocop_spec.rb ,它在当前分支和主服务器之间更改的文件上运行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

5 个答案:

答案 0 :(得分:4)

你不必使用github api,甚至ruby(除非你想包装回复)你可以运行:

git fetch && git diff-tree -r --no-commit-id --name-only master@\{u\} head | xargs ls -1 2>/dev/null | grep '\.rb$' | xargs rubocop

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

的更长时间内的内容

答案 1 :(得分:3)

我发现https://github.com/m4i/rubocop-git非常有效。但它适用于您的git diff(可选择使用--cached),因此它不允许您比较分支。

答案 2 :(得分:0)

这是另一个将当前分支与origin/master进行比较的替代方案(应该与任何repo托管一起使用 - 只需在带有bitbucket repo的circleci上试用它)。它还传递.rubocop.yml配置文件选项(如果您不需要,可以删除该部分)。

require 'spec_helper'

RSpec.describe 'Check that the files we have changed have correct syntax' do
  before do
    current_sha = 'origin/master..HEAD'
    @files = `git diff-tree --no-commit-id --name-only -r #{current_sha} | grep .rb`
    @files.tr!("\n", ' ')
  end

  it 'runs rubocop on changed ruby files' do
    if @files.empty?
      puts "Linting not performed. No ruby files changed."
    else
      puts "Running rubocop for changed files: #{@files}"
      result = system "bundle exec rubocop --config .rubocop.yml --fail-level warn #{@files}"
      expect(result).to be(true)
    end
  end
end

这里的原始要点:https://gist.github.com/djburdick/5104d15f612c15dde65f#gistcomment-2029606

答案 3 :(得分:0)

您可以使用https://github.com/AtakamaLLC/lint-diffs

除了ruby之外,它还可以与您仓库中的任何语言一起使用(甚至包括bash脚本和README文件),并且可以与任何类型的源代码控制一起使用,而不仅仅是git。

这样,您可以在任何地方使用相同的工具。

您必须在配置中启用rubocop扩展名。

答案 4 :(得分:0)

我的声誉不高,无法对一个答案发表评论,所以我发布了一个答案,以添加我认为有用的改进:

git fetch && git diff-tree -r --no-commit-id --name-only master@\{u\} HEAD | xargs ls -1 2>/dev/null | grep '\.rb$' | xargs bundle exec rubocop --force-exclusion

添加--force-exclusion使RuboCop尊重其配置文件中的Exclude声明(此处使用默认的./.rubocop.yml)。您输入这些声明是有原因的,对吧? ;)