rabbitt-githooks 1.2.7 → 1.3.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 +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
|
|