pre-commit 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +10 -0
 - data/lib/plugins/pre_commit/checks/before_all.rb +3 -3
 - data/lib/plugins/pre_commit/checks/ci.rb +3 -1
 - data/lib/plugins/pre_commit/checks/coffeelint.rb +6 -2
 - data/lib/plugins/pre_commit/checks/console_log.rb +3 -3
 - data/lib/plugins/pre_commit/checks/debugger.rb +2 -2
 - data/lib/plugins/pre_commit/checks/gemfile_path.rb +3 -3
 - data/lib/plugins/pre_commit/checks/jshint.rb +20 -10
 - data/lib/plugins/pre_commit/checks/local.rb +10 -4
 - data/lib/plugins/pre_commit/checks/merge_conflict.rb +2 -2
 - data/lib/plugins/pre_commit/checks/pry.rb +1 -1
 - data/lib/plugins/pre_commit/checks/rspec_focus.rb +2 -2
 - data/lib/plugins/pre_commit/checks/rubocop.rb +5 -1
 - data/lib/plugins/pre_commit/checks/ruby_symbol_hashrockets.rb +2 -2
 - data/lib/plugins/pre_commit/checks/scss_lint.rb +6 -2
 - data/lib/plugins/pre_commit/checks/tabs.rb +2 -2
 - data/lib/plugins/pre_commit/configuration/providers/yaml.rb +3 -5
 - data/lib/pre-commit/checks/grep.rb +33 -10
 - data/lib/pre-commit/checks/plugin.rb +12 -0
 - data/lib/pre-commit/checks/shell.rb +17 -4
 - data/lib/pre-commit/cli.rb +1 -1
 - data/lib/pre-commit/configuration/top_level.rb +11 -0
 - data/lib/pre-commit/error_list.rb +23 -0
 - data/lib/pre-commit/installer.rb +8 -2
 - data/lib/pre-commit/line.rb +22 -0
 - data/lib/pre-commit/message.rb +17 -0
 - data/lib/pre-commit/runner.rb +7 -2
 - data/lib/pre-commit/support/jshint/jshint.js +10388 -3977
 - data/lib/pre-commit/utils/staged_files.rb +20 -5
 - metadata +6 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 0b7eca26aaae49efaf8967fb7a02d01521f272cc
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 7e36f001ca2d85847d5038b757f442ffbb411a4e
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: f21965abc93d4cec2c941d53b519aa8bcf0416334a329784e061d8791108651f289184d7e0504e54da1b57e5b93d5395992753f856fbde69f08735c7810940e9
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: df10779b7b8a0be223b55b6f70a0cd476b080bc75074b39832a3b4409da5c966aefcd55f28ff5b95e8010142525e3e6fe611ca736247f0409b966e68f3dc2e54
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -107,4 +107,14 @@ pre-commit run <file-list>  # run on the list of files, patterns not supported 
     | 
|
| 
       107 
107 
     | 
    
         
             
            - `yaml` - reads configuration from `/etc/pre_commit.yml`, `$HOME/.pre_commit.yml` and `config/pre_commit.yml`, allows `config/pre_commit.yml` updates
         
     | 
| 
       108 
108 
     | 
    
         
             
            - `env` - reads configuration from environment variables
         
     | 
| 
       109 
109 
     | 
    
         | 
| 
      
 110 
     | 
    
         
            +
            ## Excluding files from checks
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
            `pre-commit` uses `git` to get list of files to check, you can ignore
         
     | 
| 
      
 113 
     | 
    
         
            +
            the list of git files to check with:
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
            1. `.gitignore` - git supported file shared beteen all checkouts
         
     | 
| 
      
 116 
     | 
    
         
            +
            2. `.git/info/exclude` - git supported file only for this checkout
         
     | 
| 
      
 117 
     | 
    
         
            +
            3. `.pre_commit.ignore` - `pre-commit` specific list can be shared,
         
     | 
| 
      
 118 
     | 
    
         
            +
                [Allowed filters](http://www.ruby-doc.org/core-2.1.3/File.html#method-c-fnmatch)
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
       110 
120 
     | 
    
         
             
            ## [Contributing](CONTRIBUTING.md)
         
     | 
| 
         @@ -9,15 +9,15 @@ module PreCommit 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                  def extra_grep
         
     | 
| 
       12 
     | 
    
         
            -
                     
     | 
| 
      
 12 
     | 
    
         
            +
                    %w{-v //}
         
     | 
| 
       13 
13 
     | 
    
         
             
                  end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                  def message
         
     | 
| 
       16 
     | 
    
         
            -
                    "before(:all) found 
     | 
| 
      
 16 
     | 
    
         
            +
                    "before(:all) found:"
         
     | 
| 
       17 
17 
     | 
    
         
             
                  end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                  def pattern
         
     | 
| 
       20 
     | 
    
         
            -
                     
     | 
| 
      
 20 
     | 
    
         
            +
                    "before.*:all"
         
     | 
| 
       21 
21 
     | 
    
         
             
                  end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                  def self.description
         
     | 
| 
         @@ -7,7 +7,9 @@ module PreCommit 
     | 
|
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
                  def call(_)
         
     | 
| 
       9 
9 
     | 
    
         
             
                    return if system("rake #{Ci::CI_TASK_NAME} --silent")
         
     | 
| 
       10 
     | 
    
         
            -
                     
     | 
| 
      
 10 
     | 
    
         
            +
                    PreCommit::ErrorList.new(
         
     | 
| 
      
 11 
     | 
    
         
            +
                      "your test suite has failed, for the full output run `#{CI_TASK_NAME}`"
         
     | 
| 
      
 12 
     | 
    
         
            +
                    )
         
     | 
| 
       11 
13 
     | 
    
         
             
                  end
         
     | 
| 
       12 
14 
     | 
    
         | 
| 
       13 
15 
     | 
    
         
             
                  def self.description
         
     | 
| 
         @@ -8,9 +8,13 @@ module PreCommit 
     | 
|
| 
       8 
8 
     | 
    
         
             
                    staged_files = staged_files.grep(/\.coffee$/)
         
     | 
| 
       9 
9 
     | 
    
         
             
                    return if staged_files.empty?
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
                     
     | 
| 
      
 11 
     | 
    
         
            +
                    result =
         
     | 
| 
      
 12 
     | 
    
         
            +
                    in_groups(staged_files).map do |files|
         
     | 
| 
      
 13 
     | 
    
         
            +
                      args = %w{coffeelint} + config_file_flag + files
         
     | 
| 
      
 14 
     | 
    
         
            +
                      execute(args)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end.compact
         
     | 
| 
       12 
16 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
                     
     | 
| 
      
 17 
     | 
    
         
            +
                    result.empty? ? nil : result.join("\n")
         
     | 
| 
       14 
18 
     | 
    
         
             
                  end
         
     | 
| 
       15 
19 
     | 
    
         | 
| 
       16 
20 
     | 
    
         
             
                  def config_file_flag
         
     | 
| 
         @@ -9,15 +9,15 @@ module PreCommit 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                  def extra_grep
         
     | 
| 
       12 
     | 
    
         
            -
                     
     | 
| 
      
 12 
     | 
    
         
            +
                    %w{-v //}
         
     | 
| 
       13 
13 
     | 
    
         
             
                  end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                  def message
         
     | 
| 
       16 
     | 
    
         
            -
                    "console.log found 
     | 
| 
      
 16 
     | 
    
         
            +
                    "console.log found:"
         
     | 
| 
       17 
17 
     | 
    
         
             
                  end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                  def pattern
         
     | 
| 
       20 
     | 
    
         
            -
                     
     | 
| 
      
 20 
     | 
    
         
            +
                    "console\\.log"
         
     | 
| 
       21 
21 
     | 
    
         
             
                  end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                  def self.description
         
     | 
| 
         @@ -9,15 +9,15 @@ module PreCommit 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                  def message
         
     | 
| 
       12 
     | 
    
         
            -
                    "local path found in Gemfile 
     | 
| 
      
 12 
     | 
    
         
            +
                    "local path found in Gemfile:"
         
     | 
| 
       13 
13 
     | 
    
         
             
                  end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                  def pattern
         
     | 
| 
       16 
     | 
    
         
            -
                    " 
     | 
| 
      
 16 
     | 
    
         
            +
                    "path:|:path\\s*=>"
         
     | 
| 
       17 
17 
     | 
    
         
             
                  end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                  def extra_grep
         
     | 
| 
       20 
     | 
    
         
            -
                     
     | 
| 
      
 20 
     | 
    
         
            +
                    %w{-v #}
         
     | 
| 
       21 
21 
     | 
    
         
             
                  end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                  def self.description
         
     | 
| 
         @@ -4,17 +4,8 @@ module PreCommit 
     | 
|
| 
       4 
4 
     | 
    
         
             
              module Checks
         
     | 
| 
       5 
5 
     | 
    
         
             
                class Jshint < Js
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
                  def js_config
         
     | 
| 
       8 
     | 
    
         
            -
                    if config_file
         
     | 
| 
       9 
     | 
    
         
            -
                      ExecJS.exec("return (#{File.read(config_file)});")
         
     | 
| 
       10 
     | 
    
         
            -
                    else
         
     | 
| 
       11 
     | 
    
         
            -
                      {}
         
     | 
| 
       12 
     | 
    
         
            -
                    end
         
     | 
| 
       13 
     | 
    
         
            -
                  end
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
7 
     | 
    
         
             
                  def run_check(file)
         
     | 
| 
       16 
     | 
    
         
            -
                    context 
     | 
| 
       17 
     | 
    
         
            -
                    context.call("JSHINT", File.read(file), js_config, js_config["globals"])
         
     | 
| 
      
 8 
     | 
    
         
            +
                    context.call("JSHINT._getErrors", File.read(file), js_config, js_config["globals"])
         
     | 
| 
       18 
9 
     | 
    
         
             
                  end
         
     | 
| 
       19 
10 
     | 
    
         | 
| 
       20 
11 
     | 
    
         
             
                  def linter_src
         
     | 
| 
         @@ -29,6 +20,25 @@ module PreCommit 
     | 
|
| 
       29 
20 
     | 
    
         
             
                    "Checks javascript files with JSHint."
         
     | 
| 
       30 
21 
     | 
    
         
             
                  end
         
     | 
| 
       31 
22 
     | 
    
         | 
| 
      
 23 
     | 
    
         
            +
                  private
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  def context
         
     | 
| 
      
 26 
     | 
    
         
            +
                    @context ||= ExecJS.compile(File.read(linter_src) << <<-JAVASCRIPT)
         
     | 
| 
      
 27 
     | 
    
         
            +
                      ;JSHINT._getErrors = function(source, options, globals) {
         
     | 
| 
      
 28 
     | 
    
         
            +
                        JSHINT(source, options, globals);
         
     | 
| 
      
 29 
     | 
    
         
            +
                        return JSHINT.errors;
         
     | 
| 
      
 30 
     | 
    
         
            +
                      }
         
     | 
| 
      
 31 
     | 
    
         
            +
                    JAVASCRIPT
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  def js_config
         
     | 
| 
      
 35 
     | 
    
         
            +
                    @js_config ||= if config_file
         
     | 
| 
      
 36 
     | 
    
         
            +
                      ExecJS.exec("return (#{File.read(config_file)});")
         
     | 
| 
      
 37 
     | 
    
         
            +
                    else
         
     | 
| 
      
 38 
     | 
    
         
            +
                      {}
         
     | 
| 
      
 39 
     | 
    
         
            +
                    end
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
       32 
42 
     | 
    
         
             
                end
         
     | 
| 
       33 
43 
     | 
    
         
             
              end
         
     | 
| 
       34 
44 
     | 
    
         
             
            end
         
     | 
| 
         @@ -4,16 +4,22 @@ module PreCommit 
     | 
|
| 
       4 
4 
     | 
    
         
             
              module Checks
         
     | 
| 
       5 
5 
     | 
    
         
             
                class Local < Plugin
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
                   
     | 
| 
      
 7 
     | 
    
         
            +
                  attr_writer :script
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                  def call(staged_files 
     | 
| 
       10 
     | 
    
         
            -
                    return unless  
     | 
| 
      
 9 
     | 
    
         
            +
                  def call(staged_files)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    return unless script
         
     | 
| 
       11 
11 
     | 
    
         
             
                    output = `ruby #{script} #{staged_files.join(" ")} 2>&1`
         
     | 
| 
       12 
12 
     | 
    
         
             
                    "#{script} failed:\n#{output}" unless $?.success?
         
     | 
| 
       13 
13 
     | 
    
         
             
                  end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                  def self.description
         
     | 
| 
       16 
     | 
    
         
            -
                    "Executes  
     | 
| 
      
 16 
     | 
    
         
            +
                    "Executes a custom script located at config/pre_commit.rb"
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  def script
         
     | 
| 
      
 20 
     | 
    
         
            +
                    @script ||= ["config/pre_commit.rb", "config/pre-commit.rb"].detect do |file|
         
     | 
| 
      
 21 
     | 
    
         
            +
                      File.exist?(file)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    end
         
     | 
| 
       17 
23 
     | 
    
         
             
                  end
         
     | 
| 
       18 
24 
     | 
    
         | 
| 
       19 
25 
     | 
    
         
             
                end
         
     | 
| 
         @@ -9,11 +9,11 @@ module PreCommit 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                  def message
         
     | 
| 
       12 
     | 
    
         
            -
                    ":focus found in specs 
     | 
| 
      
 12 
     | 
    
         
            +
                    ":focus found in specs:"
         
     | 
| 
       13 
13 
     | 
    
         
             
                  end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                  def pattern
         
     | 
| 
       16 
     | 
    
         
            -
                    " 
     | 
| 
      
 16 
     | 
    
         
            +
                    "(describe|context|it).*(:focus|focus:).*do"
         
     | 
| 
       17 
17 
     | 
    
         
             
                  end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                  def self.description
         
     | 
| 
         @@ -21,7 +21,7 @@ module PreCommit 
     | 
|
| 
       21 
21 
     | 
    
         
             
                    staged_files = staged_files.grep(/\.rb$/)
         
     | 
| 
       22 
22 
     | 
    
         
             
                    return if staged_files.empty?
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
                    args = config_file_flag + ["--force-exclusion"] + staged_files
         
     | 
| 
      
 24 
     | 
    
         
            +
                    args = config_file_flag + user_supplied_flags + ["--force-exclusion"] + staged_files
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
                    success, captured = capture { ::RuboCop::CLI.new.run(args) == 0 }
         
     | 
| 
       27 
27 
     | 
    
         
             
                    captured unless success
         
     | 
| 
         @@ -41,6 +41,10 @@ module PreCommit 
     | 
|
| 
       41 
41 
     | 
    
         
             
                    config_file ? ['-c', config_file] : []
         
     | 
| 
       42 
42 
     | 
    
         
             
                  end
         
     | 
| 
       43 
43 
     | 
    
         | 
| 
      
 44 
     | 
    
         
            +
                  def user_supplied_flags
         
     | 
| 
      
 45 
     | 
    
         
            +
                    Array(config.get('rubocop.flags')).reject(&:empty?)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       44 
48 
     | 
    
         
             
                  def alternate_config_file
         
     | 
| 
       45 
49 
     | 
    
         
             
                    '.rubocop.yml'
         
     | 
| 
       46 
50 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -9,11 +9,11 @@ module PreCommit 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                  def message
         
     | 
| 
       12 
     | 
    
         
            -
                    "detected :symbol => value hashrocket 
     | 
| 
      
 12 
     | 
    
         
            +
                    "detected :symbol => value hashrocket:"
         
     | 
| 
       13 
13 
     | 
    
         
             
                  end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                  def pattern
         
     | 
| 
       16 
     | 
    
         
            -
                    ' 
     | 
| 
      
 16 
     | 
    
         
            +
                    '[^:](:{1}(?:\$|@|@@|[_A-Za-z])?\w*[=!?]?\s*=>\s*)'
         
     | 
| 
       17 
17 
     | 
    
         
             
                  end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                  def self.description
         
     | 
| 
         @@ -8,9 +8,13 @@ module PreCommit 
     | 
|
| 
       8 
8 
     | 
    
         
             
                    staged_files = staged_files.grep(/\.scss$/)
         
     | 
| 
       9 
9 
     | 
    
         
             
                    return if staged_files.empty?
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
                     
     | 
| 
      
 11 
     | 
    
         
            +
                    result =
         
     | 
| 
      
 12 
     | 
    
         
            +
                    in_groups(staged_files).map do |files|
         
     | 
| 
      
 13 
     | 
    
         
            +
                      args = %w{scss-lint} + config_file_flag + files
         
     | 
| 
      
 14 
     | 
    
         
            +
                      execute(args)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end.compact
         
     | 
| 
       12 
16 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
                     
     | 
| 
      
 17 
     | 
    
         
            +
                    result.empty? ? nil : result.join("\n")
         
     | 
| 
       14 
18 
     | 
    
         
             
                  end
         
     | 
| 
       15 
19 
     | 
    
         | 
| 
       16 
20 
     | 
    
         
             
                  def config_file_flag
         
     | 
| 
         @@ -1,10 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'yaml'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "pre-commit/configuration/top_level"
         
     | 
| 
       2 
3 
     | 
    
         | 
| 
       3 
4 
     | 
    
         
             
            module PreCommit
         
     | 
| 
       4 
5 
     | 
    
         
             
              class Configuration
         
     | 
| 
       5 
6 
     | 
    
         
             
                class Providers
         
     | 
| 
       6 
7 
     | 
    
         | 
| 
       7 
8 
     | 
    
         
             
                  class Yaml
         
     | 
| 
      
 9 
     | 
    
         
            +
                    include PreCommit::Configuration::TopLevel
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       8 
11 
     | 
    
         
             
                    def self.priority
         
     | 
| 
       9 
12 
     | 
    
         
             
                      20
         
     | 
| 
       10 
13 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -55,11 +58,6 @@ module PreCommit 
     | 
|
| 
       55 
58 
     | 
    
         
             
                      File.join(top_level, 'config', 'pre_commit.yml')
         
     | 
| 
       56 
59 
     | 
    
         
             
                    end
         
     | 
| 
       57 
60 
     | 
    
         | 
| 
       58 
     | 
    
         
            -
                    def top_level
         
     | 
| 
       59 
     | 
    
         
            -
                      top_level = `git rev-parse --show-toplevel`.chomp.strip
         
     | 
| 
       60 
     | 
    
         
            -
                      raise "no git repo!" if top_level == ""
         
     | 
| 
       61 
     | 
    
         
            -
                      top_level
         
     | 
| 
       62 
     | 
    
         
            -
                    end
         
     | 
| 
       63 
61 
     | 
    
         
             
                  end
         
     | 
| 
       64 
62 
     | 
    
         | 
| 
       65 
63 
     | 
    
         
             
                end
         
     | 
| 
         @@ -1,9 +1,10 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'pre-commit/checks/ 
     | 
| 
       2 
     | 
    
         
            -
            require ' 
     | 
| 
      
 1 
     | 
    
         
            +
            require 'pre-commit/checks/shell'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'pre-commit/error_list'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'pre-commit/line'
         
     | 
| 
       3 
4 
     | 
    
         | 
| 
       4 
5 
     | 
    
         
             
            module PreCommit
         
     | 
| 
       5 
6 
     | 
    
         
             
              module Checks
         
     | 
| 
       6 
     | 
    
         
            -
                class Grep <  
     | 
| 
      
 7 
     | 
    
         
            +
                class Grep < Shell
         
     | 
| 
       7 
8 
     | 
    
         
             
                  class PaternNotSet < StandardError
         
     | 
| 
       8 
9 
     | 
    
         
             
                    def message
         
     | 
| 
       9 
10 
     | 
    
         
             
                      "Please define 'pattern' method."
         
     | 
| 
         @@ -17,7 +18,7 @@ module PreCommit 
     | 
|
| 
       17 
18 
     | 
    
         
             
                  end
         
     | 
| 
       18 
19 
     | 
    
         | 
| 
       19 
20 
     | 
    
         
             
                  def extra_grep
         
     | 
| 
       20 
     | 
    
         
            -
                    @extra_grep or  
     | 
| 
      
 21 
     | 
    
         
            +
                    @extra_grep or []
         
     | 
| 
       21 
22 
     | 
    
         
             
                  end
         
     | 
| 
       22 
23 
     | 
    
         | 
| 
       23 
24 
     | 
    
         
             
                  def message
         
     | 
| 
         @@ -31,21 +32,43 @@ module PreCommit 
     | 
|
| 
       31 
32 
     | 
    
         
             
                # general code:
         
     | 
| 
       32 
33 
     | 
    
         | 
| 
       33 
34 
     | 
    
         
             
                  def call(staged_files)
         
     | 
| 
       34 
     | 
    
         
            -
                    staged_files = files_filter(staged_files) 
     | 
| 
      
 35 
     | 
    
         
            +
                    staged_files = files_filter(staged_files)
         
     | 
| 
       35 
36 
     | 
    
         
             
                    return if staged_files.empty?
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                     
     | 
| 
       38 
     | 
    
         
            -
                     
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    result =
         
     | 
| 
      
 39 
     | 
    
         
            +
                    in_groups(staged_files).map do |files|
         
     | 
| 
      
 40 
     | 
    
         
            +
                      args = grep + [pattern] + files
         
     | 
| 
      
 41 
     | 
    
         
            +
                      args += ["|", "grep"] + extra_grep if !extra_grep.nil? and !extra_grep.empty?
         
     | 
| 
      
 42 
     | 
    
         
            +
                      execute(args, success_status: false)
         
     | 
| 
      
 43 
     | 
    
         
            +
                    end.compact
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                    result.empty? ? nil : parse_errors(message, result)
         
     | 
| 
       39 
46 
     | 
    
         
             
                  end
         
     | 
| 
       40 
47 
     | 
    
         | 
| 
       41 
48 
     | 
    
         
             
                private
         
     | 
| 
       42 
49 
     | 
    
         | 
| 
      
 50 
     | 
    
         
            +
                  def parse_errors(message, list)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    result = PreCommit::ErrorList.new(message)
         
     | 
| 
      
 52 
     | 
    
         
            +
                    result.errors +=
         
     | 
| 
      
 53 
     | 
    
         
            +
                    list.map do |group|
         
     | 
| 
      
 54 
     | 
    
         
            +
                      group.split(/\n/)
         
     | 
| 
      
 55 
     | 
    
         
            +
                    end.flatten.compact.map do |line|
         
     | 
| 
      
 56 
     | 
    
         
            +
                      PreCommit::Line.new(nil, *parse_error(line))
         
     | 
| 
      
 57 
     | 
    
         
            +
                    end
         
     | 
| 
      
 58 
     | 
    
         
            +
                    result
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                  def parse_error(line)
         
     | 
| 
      
 62 
     | 
    
         
            +
                    matches = /^([^:]+):([[:digit:]]+):(.*)$/.match(line)
         
     | 
| 
      
 63 
     | 
    
         
            +
                    matches and matches.captures
         
     | 
| 
      
 64 
     | 
    
         
            +
                  end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
       43 
66 
     | 
    
         
             
                  def grep(grep_version = nil)
         
     | 
| 
       44 
67 
     | 
    
         
             
                    grep_version ||= detect_grep_version
         
     | 
| 
       45 
68 
     | 
    
         
             
                    if grep_version =~ /FreeBSD/
         
     | 
| 
       46 
     | 
    
         
            -
                       
     | 
| 
      
 69 
     | 
    
         
            +
                      %w{grep -EnIH}
         
     | 
| 
       47 
70 
     | 
    
         
             
                    else
         
     | 
| 
       48 
     | 
    
         
            -
                       
     | 
| 
      
 71 
     | 
    
         
            +
                      %w{grep -PnIH}
         
     | 
| 
       49 
72 
     | 
    
         
             
                    end
         
     | 
| 
       50 
73 
     | 
    
         
             
                  end
         
     | 
| 
       51 
74 
     | 
    
         | 
| 
         @@ -1,5 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'plugins/pluginator/extensions/conversions'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'pre-commit/checks/plugin/config_file'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'pre-commit/line'
         
     | 
| 
       3 
4 
     | 
    
         | 
| 
       4 
5 
     | 
    
         
             
            module PreCommit
         
     | 
| 
       5 
6 
     | 
    
         
             
              module Checks
         
     | 
| 
         @@ -28,6 +29,17 @@ module PreCommit 
     | 
|
| 
       28 
29 
     | 
    
         
             
                  def alternate_config_file
         
     | 
| 
       29 
30 
     | 
    
         
             
                    ''
         
     | 
| 
       30 
31 
     | 
    
         
             
                  end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                  # group files in packs smaller then 127kB (1000 files)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  # 127k based on http://www.in-ulm.de/~mascheck/various/argmax/
         
     | 
| 
      
 35 
     | 
    
         
            +
                  # and 262144 limit on OSX - my env size /2 to be safe
         
     | 
| 
      
 36 
     | 
    
         
            +
                  # assuming mean file length shorter then 127 chars splitting to
         
     | 
| 
      
 37 
     | 
    
         
            +
                  # groups of 1000 files, each_slice for simplicity, doing real
         
     | 
| 
      
 38 
     | 
    
         
            +
                  # check could be to time consuming
         
     | 
| 
      
 39 
     | 
    
         
            +
                  def in_groups(files, group_size = 1000)
         
     | 
| 
      
 40 
     | 
    
         
            +
                    files.each_slice(group_size)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
       31 
43 
     | 
    
         
             
                end
         
     | 
| 
       32 
44 
     | 
    
         
             
              end
         
     | 
| 
       33 
45 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,5 +1,5 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'pre-commit/checks/plugin'
         
     | 
| 
       2 
     | 
    
         
            -
            require ' 
     | 
| 
      
 2 
     | 
    
         
            +
            require 'shellwords'
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            module PreCommit
         
     | 
| 
       5 
5 
     | 
    
         
             
              module Checks
         
     | 
| 
         @@ -7,9 +7,22 @@ module PreCommit 
     | 
|
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
                private
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                  def execute( 
     | 
| 
       11 
     | 
    
         
            -
                     
     | 
| 
       12 
     | 
    
         
            -
                     
     | 
| 
      
 10 
     | 
    
         
            +
                  def execute(*args)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    options = args.last.is_a?(::Hash) ? args.pop : {}
         
     | 
| 
      
 12 
     | 
    
         
            +
                    args = build_command(*args)
         
     | 
| 
      
 13 
     | 
    
         
            +
                    execute_raw(args, options)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                  def build_command(*args)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    args.flatten.map do |arg|
         
     | 
| 
      
 18 
     | 
    
         
            +
                      arg = arg.shellescape if arg != '|' && arg != '&&' && arg != '||'
         
     | 
| 
      
 19 
     | 
    
         
            +
                      arg
         
     | 
| 
      
 20 
     | 
    
         
            +
                    end.join(" ")
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  def execute_raw(command, options = {})
         
     | 
| 
      
 24 
     | 
    
         
            +
                    result = `#{command} 2>&1`
         
     | 
| 
      
 25 
     | 
    
         
            +
                    $?.success? == (options.fetch(:success_status, true)) ? nil : result
         
     | 
| 
       13 
26 
     | 
    
         
             
                  end
         
     | 
| 
       14 
27 
     | 
    
         
             
                end
         
     | 
| 
       15 
28 
     | 
    
         
             
              end
         
     |