Skip to content

Instantly share code, notes, and snippets.

@gigorok
Forked from timheilman/rubocop_pre_commit_hook
Created April 5, 2017 09:42
Show Gist options
  • Save gigorok/0f012b8b7713771e7d008c95516d1364 to your computer and use it in GitHub Desktop.
Save gigorok/0f012b8b7713771e7d008c95516d1364 to your computer and use it in GitHub Desktop.
Ruby style guide git pre-commit hook using Rubocop as the style guide checker. Only runs on staged ruby files that have been added and/or modified. Itself passes rubocop with default settings.
#!/usr/bin/env ruby
require 'rubocop'
require 'english'
ADDED_OR_MODIFIED = /A|AM|^M/
# to prevent code injection: system is a dangerous call
def raise_single_quote_error
raise ArgumentError, 'Single quotes are not allowed in filenames here.'
end
def extract_file_name(file_name_with_status)
file_name_array = file_name_with_status.strip.split(' ')
file_name_array.shift
fname = file_name_array.join(' ')
fname[0] = '' if fname[0] == '"'
fname[fname.length - 1] = '' if fname[fname.length - 1] == '"'
raise_single_quote_error if fname.include?("'")
fname
end
changed_files =
`git status --porcelain`
.split(/\n/)
.select { |file_name_with_status| file_name_with_status =~ ADDED_OR_MODIFIED }
.map { |file_name_with_status| extract_file_name file_name_with_status }
.select { |file_name| File.extname(file_name) =~ /.rb/ }
.join("' '")
system("rubocop '#{changed_files}'") unless changed_files.empty?
exit $CHILD_STATUS.to_s[-1].to_i
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment