如何 运行 Rubocop 仅针对拉取请求中已更改的文件?
How to run Rubocop only on the changed files in a pull request?
我创建了 spec/lint/rubocop_spec.rb,其中 运行s 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
我通过查询 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
我发现 https://github.com/m4i/rubocop-git 效果很好。但是它适用于你的 git diff(可选地使用 --cached)所以它不允许你比较分支。
这是将当前分支与 origin/master
进行比较的另一种选择(应该适用于任何存储库托管 - 只是在 circleci 上使用 bitbucket 存储库进行了尝试)。它还传递了一个 .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
您不必使用 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
请参阅 http://www.red56.uk/2017/03/26/running-rubocop-on-changed-files/ 以获得更长的这篇文章
我没有足够高的声誉来评论答案,所以我发布了一个答案以添加我认为有用的改进:
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 遵守其配置文件中的排除声明(此处使用默认的 ./.rubocop.yml
)。你把这些声明放进去是有原因的,对吧?! ;)
我创建了 spec/lint/rubocop_spec.rb,其中 运行s 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
我通过查询 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
我发现 https://github.com/m4i/rubocop-git 效果很好。但是它适用于你的 git diff(可选地使用 --cached)所以它不允许你比较分支。
这是将当前分支与 origin/master
进行比较的另一种选择(应该适用于任何存储库托管 - 只是在 circleci 上使用 bitbucket 存储库进行了尝试)。它还传递了一个 .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
您不必使用 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
请参阅 http://www.red56.uk/2017/03/26/running-rubocop-on-changed-files/ 以获得更长的这篇文章
我没有足够高的声誉来评论答案,所以我发布了一个答案以添加我认为有用的改进:
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 遵守其配置文件中的排除声明(此处使用默认的 ./.rubocop.yml
)。你把这些声明放进去是有原因的,对吧?! ;)