rabbitt-githooks 1.2.7 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/{hooks → .hooks}/commit-messages.rb +0 -0
- data/{hooks → .hooks}/formatting.rb +6 -15
- data/.rubocop.yml +18 -4
- data/Gemfile.lock +20 -14
- data/README.md +109 -3
- data/bin/githooks +1 -1
- data/bin/githooks-runner +1 -0
- data/lib/githooks.rb +11 -11
- data/lib/githooks/action.rb +20 -11
- data/lib/githooks/cli.rb +15 -6
- data/lib/githooks/core_ext/process.rb +7 -5
- data/lib/githooks/hook.rb +24 -7
- data/lib/githooks/repository.rb +35 -18
- data/lib/githooks/repository/config.rb +122 -115
- data/lib/githooks/repository/diff_index_entry.rb +60 -62
- data/lib/githooks/repository/file.rb +77 -75
- data/lib/githooks/repository/limiter.rb +34 -25
- data/lib/githooks/runner.rb +17 -19
- data/lib/githooks/section.rb +17 -4
- data/lib/githooks/system_utils.rb +1 -1
- data/lib/githooks/terminal_colors.rb +5 -6
- data/lib/githooks/version.rb +1 -1
- data/rabbitt-githooks.gemspec +2 -1
- metadata +35 -21
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZmVlMTFhYmNmYjA2YmM3NWJiMTA1YWNhMjk2MmE5ODhmZjQwZjZlYQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZDQ3ZGMwYTI1MGY3NDc3ZmM2NTk0NGJkMjg1NjBlYWU5NTgyN2MwOQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NDQ0YzkzNWQ4Yjc3NjQwYWYzNWQ5ZjIwZmM1MGZlOTQxYTJhNDFiODhjMTNl
|
10
|
+
ZWVkOGNmOTJhZmNhZGI1NjQ2ZDYxMTNiYzU5ZTA0MTFhMTUwODhkMmQ4MWZk
|
11
|
+
NzExZTY3MDQyNzAxMzNhMzA4MzU2YTdmOGE5YmUwOWQ1Y2E5YTI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NDZiMTMyZDllMDZjZmE3Yjg2ZTcyODJiMWJkNDAzYjAxNDRjYjViYWY2ZjBm
|
14
|
+
YWRkNmY5MTc2ZGEyMGRlNDRiZmRiMjAzOGMyOGE0MTk5NDFhMmFlNDliODdj
|
15
|
+
N2I0MzI4NDY5MTkxNGFmMDhiMWIzZDFmMDA5MWE5NWVlYmFiY2I=
|
File without changes
|
@@ -3,11 +3,11 @@ require 'githooks'
|
|
3
3
|
RUBY_FILE_REGEXP = %r{^((app|lib)/.+\.rb|bin/.+)$}.freeze
|
4
4
|
|
5
5
|
GitHooks::Hook.register 'pre-commit' do
|
6
|
-
commands
|
6
|
+
commands :ruby, :rubocop
|
7
7
|
|
8
|
-
|
8
|
+
section 'Standards' do
|
9
9
|
action 'Validate Ruby Syntax' do
|
10
|
-
limit(:type).to :modified, :added, :untracked
|
10
|
+
limit(:type).to :modified, :added, :untracked, :tracked
|
11
11
|
limit(:path).to RUBY_FILE_REGEXP
|
12
12
|
|
13
13
|
on_each_file do |file|
|
@@ -16,16 +16,16 @@ GitHooks::Hook.register 'pre-commit' do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
action 'Validate Ruby Standards' do
|
19
|
-
limit(:type).to :modified, :added, :untracked
|
19
|
+
limit(:type).to :modified, :added, :untracked, :tracked
|
20
20
|
limit(:path).to RUBY_FILE_REGEXP
|
21
21
|
|
22
22
|
on_all_files do |files|
|
23
|
-
rubocop '-D', '--format', 'clang', files, strip_empty_lines: true
|
23
|
+
rubocop '-D', '--format', 'clang', files.collect(&:path), strip_empty_lines: true
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
action 'No Leading Tabs in Ruby files' do
|
28
|
-
limit(:type).to :modified, :added, :untracked
|
28
|
+
limit(:type).to :modified, :added, :untracked, :tracked
|
29
29
|
limit(:path).to RUBY_FILE_REGEXP
|
30
30
|
|
31
31
|
on_each_file do |file|
|
@@ -40,14 +40,5 @@ GitHooks::Hook.register 'pre-commit' do
|
|
40
40
|
end.empty?
|
41
41
|
end
|
42
42
|
end
|
43
|
-
|
44
|
-
action 'Validate CSS Syntax' do
|
45
|
-
limit(:type).to :modified, :added, :untracked
|
46
|
-
limit(:path).to %r{^(app|lib)/.+css$}
|
47
|
-
|
48
|
-
on_all_files do |files|
|
49
|
-
scss_lint files.collect(&:path)
|
50
|
-
end
|
51
|
-
end
|
52
43
|
end
|
53
44
|
end
|
data/.rubocop.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
AllCops:
|
2
|
-
|
2
|
+
Include:
|
3
3
|
- Rakefile
|
4
|
-
|
4
|
+
Exclude:
|
5
5
|
- test.rb
|
6
6
|
- bin/**
|
7
7
|
|
@@ -34,9 +34,9 @@ RegexpLiteral:
|
|
34
34
|
DotPosition:
|
35
35
|
Enabled: false
|
36
36
|
|
37
|
-
MethodLength:
|
37
|
+
Style/MethodLength:
|
38
38
|
CountComments: false
|
39
|
-
Max:
|
39
|
+
Max: 20
|
40
40
|
|
41
41
|
ParameterLists:
|
42
42
|
Max: 5
|
@@ -71,3 +71,17 @@ EmptyLinesAroundAccessModifier:
|
|
71
71
|
EndAlignment:
|
72
72
|
AlignWith: variable
|
73
73
|
|
74
|
+
Style/DoubleNegation:
|
75
|
+
Enabled: false
|
76
|
+
|
77
|
+
Style/PercentLiteralDelimiters:
|
78
|
+
Enabled: false
|
79
|
+
|
80
|
+
Style/FormatString:
|
81
|
+
Enabled: false
|
82
|
+
|
83
|
+
Lint/UnusedMethodArgument:
|
84
|
+
Enabled: false
|
85
|
+
|
86
|
+
Style/EachWithObject:
|
87
|
+
Enabled: false
|
data/Gemfile.lock
CHANGED
@@ -1,36 +1,41 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rabbitt-githooks (1.
|
4
|
+
rabbitt-githooks (1.3.0)
|
5
5
|
colorize (~> 0.5.8)
|
6
6
|
thor (~> 0.18)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: http://rubygems.org/
|
10
10
|
specs:
|
11
|
-
ast (
|
11
|
+
ast (2.0.0)
|
12
12
|
colorize (0.5.8)
|
13
13
|
diff-lcs (1.2.5)
|
14
14
|
json (1.8.1)
|
15
|
-
parser (2.1.
|
16
|
-
ast (
|
15
|
+
parser (2.1.9)
|
16
|
+
ast (>= 1.1, < 3.0)
|
17
17
|
slop (~> 3.4, >= 3.4.5)
|
18
18
|
powerpack (0.0.9)
|
19
19
|
rainbow (2.0.0)
|
20
|
-
rake (10.
|
21
|
-
rspec (2.
|
22
|
-
rspec-core (~> 2.
|
23
|
-
rspec-expectations (~> 2.
|
24
|
-
rspec-mocks (~> 2.
|
25
|
-
rspec-core (2.
|
26
|
-
rspec-expectations (2.
|
20
|
+
rake (10.3.2)
|
21
|
+
rspec (2.99.0)
|
22
|
+
rspec-core (~> 2.99.0)
|
23
|
+
rspec-expectations (~> 2.99.0)
|
24
|
+
rspec-mocks (~> 2.99.0)
|
25
|
+
rspec-core (2.99.1)
|
26
|
+
rspec-expectations (2.99.1)
|
27
27
|
diff-lcs (>= 1.1.3, < 2.0)
|
28
|
-
rspec-mocks (2.
|
29
|
-
rubocop (0.
|
28
|
+
rspec-mocks (2.99.1)
|
29
|
+
rubocop (0.23.0)
|
30
30
|
json (>= 1.7.7, < 2)
|
31
|
-
parser (~> 2.1.
|
31
|
+
parser (~> 2.1.9)
|
32
32
|
powerpack (~> 0.0.6)
|
33
33
|
rainbow (>= 1.99.1, < 3.0)
|
34
|
+
ruby-progressbar (~> 1.4)
|
35
|
+
ruby-lint (2.0.1)
|
36
|
+
parser (~> 2.1, >= 2.1.1)
|
37
|
+
slop (~> 3.4, >= 3.4.7)
|
38
|
+
ruby-progressbar (1.5.1)
|
34
39
|
slop (3.5.0)
|
35
40
|
thor (0.19.1)
|
36
41
|
|
@@ -43,3 +48,4 @@ DEPENDENCIES
|
|
43
48
|
rake (~> 10.1)
|
44
49
|
rspec (~> 2.14)
|
45
50
|
rubocop (~> 0.18)
|
51
|
+
ruby-lint (~> 2.0.1)
|
data/README.md
CHANGED
@@ -1,4 +1,110 @@
|
|
1
|
-
githooks
|
2
|
-
|
1
|
+
rabbitt-githooks
|
2
|
+
================
|
3
|
+
|
4
|
+
# GitHooks
|
5
|
+
|
6
|
+
Githooks provides a framework for creating standard pre-commit and commit-msg hooks for your git repository. These hooks run
|
7
|
+
client side (not on a remote server), and can be used to validate your commits (actual deltas and commit messages), reducing
|
8
|
+
the possibility of broken commits (or bad commit messages) making it into your repository.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
1. gem install rabbitt-githooks
|
13
|
+
2. add rabbitt-githooks to the development group of your project's Gemfile
|
14
|
+
2. setup your `project` to use githooks:
|
15
|
+
|
16
|
+
```
|
17
|
+
cd /path/to/project
|
18
|
+
mkdir commit-hooks
|
19
|
+
githooks attach --path /path/to/commit-hooks
|
20
|
+
```
|
21
|
+
|
22
|
+
With the hooks installed, you can run the checks against your staged or unstaged deltas before you commit, or just commit
|
23
|
+
your deltas and have the checks run automatically.
|
24
|
+
|
25
|
+
## Creating Tests
|
26
|
+
|
27
|
+
### Tests Path
|
28
|
+
|
29
|
+
All tests should be located under the path that was defined when attaching githooks to your project. In the following
|
30
|
+
examples we'll assume a project root of `/work/projects/railsapp` and a hooks path of `/work/projects/railsapp/.hooks`.
|
31
|
+
|
32
|
+
### Registration
|
33
|
+
|
34
|
+
All hooks must be registered via ```GitHooks::Hook.register <PHASE>, <BLOCK>```
|
35
|
+
|
36
|
+
### Commands
|
37
|
+
### Sections
|
38
|
+
### Actions
|
39
|
+
#### Limiters (aka filters)
|
40
|
+
#### on* (action executors)
|
41
|
+
|
42
|
+
<dl>
|
43
|
+
<dt><strong>on_each_file(&block)</strong></dt>
|
44
|
+
<dd></dd>
|
45
|
+
<dt><strong>on_all_files(&block)</strong></dt>
|
46
|
+
<dd></dd>
|
47
|
+
<dt><strong>on_argv(&block)</strong></dt>
|
48
|
+
<dd></dd>
|
49
|
+
</dl>
|
50
|
+
|
51
|
+
#### pre-commit vs commit-msg
|
52
|
+
|
53
|
+
## Command-Line Usage
|
54
|
+
|
55
|
+
### Listing Attached Tests
|
56
|
+
To view the list of checks currently attached to your repository:
|
57
|
+
|
58
|
+
```
|
59
|
+
$ cd /path/to/cms ; githooks list
|
60
|
+
|
61
|
+
Main Testing Library with Tests (in execution order):
|
62
|
+
Tests loaded from:
|
63
|
+
/Users/jdoe/work/repos/myproject/commit-hooks
|
64
|
+
|
65
|
+
Phase PreCommit:
|
66
|
+
1: Standards
|
67
|
+
1: Validate Ruby Syntax
|
68
|
+
Limiter 1: :type -> [:modified, :added]
|
69
|
+
Limiter 2: :path -> /^(app|lib)\/.+\.rb$/
|
70
|
+
2: No Leading Spaces in Ruby files
|
71
|
+
Limiter 1: :type -> [:modified, :added]
|
72
|
+
Limiter 2: :path -> /^(app|lib)\/.+\.rb$/
|
73
|
+
3: Validate CSS Syntax
|
74
|
+
Limiter 1: :type -> [:modified, :added]
|
75
|
+
Limiter 2: :path -> /^(app|lib)\/.+css$/
|
76
|
+
Phase CommitMsg:
|
77
|
+
1: Commit Message
|
78
|
+
1: Message Length > 5 characters
|
79
|
+
2: Verify no simple commit messages
|
80
|
+
```
|
81
|
+
|
82
|
+
### Manually Running Tests
|
83
|
+
|
84
|
+
To run the pre-commit hook on unstaged deltas, run the following command:
|
85
|
+
|
86
|
+
```
|
87
|
+
$ cd /path/to/cms ; githooks exec --unstaged
|
88
|
+
===== PreCommit :: Standards =====
|
89
|
+
1. [ X ] Validate Ruby Syntax
|
90
|
+
X app/models/element.rb:245: syntax error, unexpected keyword_end, expecting end-of-input
|
91
|
+
2. [ X ] No Leading Spaces in Ruby files
|
92
|
+
X app/models/element.rb:4: _______# something here
|
93
|
+
X app/models/element.rb:5: __a = 1
|
94
|
+
X app/models/element.rb:6: ____
|
95
|
+
3. [ X ] Validate CSS Syntax
|
96
|
+
X app/assets/stylesheets/application.css.scss:4 [W] Prefer single quoted strings
|
97
|
+
X app/assets/stylesheets/application.css.scss:8 [W] Use // comments everywhere
|
98
|
+
X app/assets/stylesheets/application.css.scss:10 [W] Line should be indented 1 spaces, but was indented 2 spaces
|
99
|
+
X app/assets/stylesheets/application.css.scss:19 [W] Each selector in a comma sequence should be on its own line
|
100
|
+
X app/assets/stylesheets/application.css.scss:20 [W] Properties should be sorted in alphabetical order, with vendor-prefixed extensions before the standardized CSS property
|
101
|
+
X app/assets/stylesheets/application.css.scss:22 [W] `0.75` should be written without a leading zero as `.75`
|
102
|
+
X app/assets/stylesheets/application.css.scss:23 [W] `border: 0;` is preferred over `border: none;`
|
103
|
+
X app/assets/stylesheets/elements.css.scss:35 [W] Commas in function arguments should be followed by a single space
|
104
|
+
X app/assets/stylesheets/elements.css.scss:35 [W] Colon after property should be followed by 1 space instead of 0 spaces
|
105
|
+
X app/assets/stylesheets/elements.css.scss:35 [W] Commas in function arguments should be followed by a single space
|
106
|
+
|
107
|
+
Commit failed due to errors listed above.
|
108
|
+
Please fix and attempt your commit again.
|
109
|
+
```
|
3
110
|
|
4
|
-
GitHooks Gem
|
data/bin/githooks
CHANGED
data/bin/githooks-runner
CHANGED
data/lib/githooks.rb
CHANGED
@@ -25,17 +25,17 @@ require 'githooks/version'
|
|
25
25
|
module GitHooks
|
26
26
|
AUTHOR = 'Carl P. Corliss <rabbitt@gmail.com>'
|
27
27
|
|
28
|
-
autoload :Config,
|
29
|
-
autoload :CommandRunner,
|
30
|
-
autoload :Command,
|
31
|
-
autoload :CLI,
|
32
|
-
autoload :Hook,
|
33
|
-
autoload :Section,
|
34
|
-
autoload :Action,
|
35
|
-
autoload :Repository,
|
36
|
-
autoload :Runner,
|
37
|
-
autoload :SystemUtils,
|
38
|
-
autoload :TerminalColors,
|
28
|
+
autoload :Config, 'githooks/config'
|
29
|
+
autoload :CommandRunner, 'githooks/command'
|
30
|
+
autoload :Command, 'githooks/command'
|
31
|
+
autoload :CLI, 'githooks/cli'
|
32
|
+
autoload :Hook, 'githooks/hook'
|
33
|
+
autoload :Section, 'githooks/section'
|
34
|
+
autoload :Action, 'githooks/action'
|
35
|
+
autoload :Repository, 'githooks/repository'
|
36
|
+
autoload :Runner, 'githooks/runner'
|
37
|
+
autoload :SystemUtils, 'githooks/system_utils'
|
38
|
+
autoload :TerminalColors, 'githooks/terminal_colors'
|
39
39
|
|
40
40
|
class << self
|
41
41
|
attr_reader :debug, :verbose, :ignore_script
|
data/lib/githooks/action.rb
CHANGED
@@ -19,25 +19,28 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|
19
19
|
|
20
20
|
require 'stringio'
|
21
21
|
require 'open3'
|
22
|
+
require 'set'
|
22
23
|
|
23
24
|
module GitHooks
|
24
|
-
class Action
|
25
|
+
class Action # rubocop:disable Style/ClassLength
|
25
26
|
include TerminalColors
|
26
27
|
|
27
|
-
attr_reader :title, :section, :on, :limiters
|
28
|
+
attr_reader :title, :section, :on, :limiters
|
29
|
+
attr_reader :success, :errors, :warnings, :benchmark
|
28
30
|
private :section, :on
|
29
31
|
alias_method :success?, :success
|
30
32
|
|
31
33
|
def initialize(title, section, &block)
|
32
34
|
fail ArgumentError, 'Missing required block' unless block_given?
|
33
35
|
|
34
|
-
@title
|
35
|
-
@section
|
36
|
-
@on
|
37
|
-
@limiters
|
38
|
-
@success
|
39
|
-
@errors
|
40
|
-
@warnings
|
36
|
+
@title = title
|
37
|
+
@section = section
|
38
|
+
@on = nil
|
39
|
+
@limiters = Set.new
|
40
|
+
@success = true
|
41
|
+
@errors = []
|
42
|
+
@warnings = []
|
43
|
+
@benchmark = 0
|
41
44
|
|
42
45
|
instance_eval(&block)
|
43
46
|
|
@@ -73,6 +76,7 @@ module GitHooks
|
|
73
76
|
begin
|
74
77
|
running!
|
75
78
|
$stdout, $stderr = warnings, errors
|
79
|
+
time_start = Time.now
|
76
80
|
@success &= @on.call
|
77
81
|
rescue => error
|
78
82
|
errors.puts "Exception thrown during action call: #{error.class.name}: #{error.message}"
|
@@ -87,6 +91,7 @@ module GitHooks
|
|
87
91
|
|
88
92
|
@success = false
|
89
93
|
ensure
|
94
|
+
@benchmark = Time.now - time_start
|
90
95
|
@errors, @warnings = [errors, warnings].collect do |io|
|
91
96
|
io.rewind
|
92
97
|
io.read.split(/\n/)
|
@@ -107,8 +112,8 @@ module GitHooks
|
|
107
112
|
|
108
113
|
# DSL Methods
|
109
114
|
|
110
|
-
def limit(
|
111
|
-
Repository::Limiter.new(
|
115
|
+
def limit(type)
|
116
|
+
(find_limiter(type) || Repository::Limiter.new(type)).tap do |limiter|
|
112
117
|
@limiters << limiter
|
113
118
|
end
|
114
119
|
end
|
@@ -131,6 +136,10 @@ module GitHooks
|
|
131
136
|
|
132
137
|
private
|
133
138
|
|
139
|
+
def find_limiter(type)
|
140
|
+
@limiters.select { |l| l.type == type }.first
|
141
|
+
end
|
142
|
+
|
134
143
|
def run_command(command, *args, &block)
|
135
144
|
options = args.extract_options
|
136
145
|
prefix = options.delete(:prefix_output)
|
data/lib/githooks/cli.rb
CHANGED
@@ -59,13 +59,14 @@ module GitHooks
|
|
59
59
|
Runner.list(options['repo'])
|
60
60
|
end
|
61
61
|
|
62
|
-
# githooks
|
62
|
+
# githooks execute [--[no-]staged] [--tracked] [--untracked] [--args -- one two three ...]
|
63
63
|
# -- runs the selected hooks (or pre-commit, if none specified) passing
|
64
64
|
# the argument list to the script
|
65
65
|
|
66
66
|
desc :execute, 'Runs the selected hooks, passing the argument list to the script'
|
67
|
-
method_option :
|
68
|
-
method_option :
|
67
|
+
method_option :staged, aliases: '-S', type: :boolean, desc: 'test staged files', default: nil
|
68
|
+
method_option :tracked, aliases: '-A', type: :boolean, desc: 'test all tracked files', default: false
|
69
|
+
method_option :untracked, aliases: '-T', type: :boolean, desc: 'test untracked files', default: false
|
69
70
|
method_option :script, aliases: '-s', type: :string, desc: 'Path to script to run', default: nil
|
70
71
|
method_option :path, aliases: '-p', type: :string, desc: 'Path to library of tests', default: nil
|
71
72
|
method_option :repo, aliases: '-r', type: :string, desc: 'Path to repo to run tests on', default: Dir.getwd
|
@@ -78,11 +79,19 @@ module GitHooks
|
|
78
79
|
GitHooks.debug = !!options['debug']
|
79
80
|
|
80
81
|
opts = (options).dup
|
81
|
-
|
82
|
-
|
83
|
-
opts['
|
82
|
+
|
83
|
+
if opts['staged']
|
84
|
+
if opts['tracked']
|
85
|
+
warn %q|--tracked conflicts with --staged. Dropping --tracked...|
|
86
|
+
opts['tracked'] = false
|
87
|
+
elsif opts['untracked']
|
88
|
+
warn %q|--untracked conflicts with --staged. Dropping --untracked...|
|
89
|
+
opts['untracked'] = false
|
90
|
+
end
|
84
91
|
end
|
85
92
|
|
93
|
+
opts['staged'] = !(opts['tracked'] || opts['untracked']) if opts['staged'].nil?
|
94
|
+
|
86
95
|
GitHooks::Runner.run(opts)
|
87
96
|
end
|
88
97
|
|