Skip to content

Instantly share code, notes, and snippets.

@rdunlop
Last active May 5, 2017 08:31
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rdunlop/8cae9417f15b4cb89784cca89b930839 to your computer and use it in GitHub Desktop.
Save rdunlop/8cae9417f15b4cb89784cca89b930839 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'
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("' '")
unless changed_files.empty?
system("rubocop -a --force-exclusion '#{changed_files}'")
system("git add '#{changed_files}'")
end
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