我创建了 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
答案 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
)。您输入这些声明是有原因的,对吧? ;)