rubocop-git 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/rubocop/git.rb +5 -1
- data/lib/rubocop/git/cli.rb +19 -14
- data/lib/rubocop/git/diff_parser.rb +31 -0
- data/lib/rubocop/git/options.rb +86 -0
- data/lib/rubocop/git/pseudo_pull_request.rb +4 -2
- data/lib/rubocop/git/pseudo_resource.rb +11 -1
- data/lib/rubocop/git/runner.rb +14 -42
- data/lib/rubocop/git/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c672dcd90e02f12fe912671d34296778f4c4126f
|
4
|
+
data.tar.gz: 7218bdfe3e468c96c93ebfe7b65761778d8bd097
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3aeafd917cf189510adc77bba476911ce0cc1bc4ea902305c68083e73967eabe23980984711c8ac02f559607b294b4431d8e730228546de27243121da50366cf
|
7
|
+
data.tar.gz: bb6f02b01e9eaf7331be756f07cef68aef73d4860c21be8551268a6e0175064537fd7707742ff4a3f979cd47e063faddf7eedc95961b8aa5e93a3cf85d58fc1f
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
Usage: rubocop-git [options]
|
21
|
+
Usage: rubocop-git [options] [[commit] commit]
|
22
22
|
-c, --config FILE Specify configuration file
|
23
23
|
-D, --display-cop-names Display cop names in offense messages
|
24
24
|
--cached git diff --cached
|
data/lib/rubocop/git.rb
CHANGED
@@ -3,7 +3,9 @@ require 'rubocop'
|
|
3
3
|
|
4
4
|
if defined?(Rubocop)
|
5
5
|
# rubocop 0.22.0
|
6
|
-
RuboCop::
|
6
|
+
RuboCop::ConfigLoader = Rubocop::ConfigLoader
|
7
|
+
RuboCop::Formatter = Rubocop::Formatter
|
8
|
+
RuboCop::Version = Rubocop::Version
|
7
9
|
else
|
8
10
|
# rubocop >= 0.23.0
|
9
11
|
Rubocop = RuboCop
|
@@ -12,8 +14,10 @@ end
|
|
12
14
|
module RuboCop
|
13
15
|
module Git
|
14
16
|
autoload :CommitFile, 'rubocop/git/commit_file'
|
17
|
+
autoload :DiffParser, 'rubocop/git/diff_parser'
|
15
18
|
autoload :FileViolation, 'rubocop/git/file_violation'
|
16
19
|
autoload :Line, 'rubocop/git/line'
|
20
|
+
autoload :Options, 'rubocop/git/options'
|
17
21
|
autoload :Patch, 'rubocop/git/patch'
|
18
22
|
autoload :PseudoPullRequest, 'rubocop/git/pseudo_pull_request'
|
19
23
|
autoload :PseudoResource, 'rubocop/git/pseudo_resource'
|
data/lib/rubocop/git/cli.rb
CHANGED
@@ -5,44 +5,49 @@ module RuboCop
|
|
5
5
|
module Git
|
6
6
|
class CLI
|
7
7
|
def run(args = ARGV)
|
8
|
-
options =
|
9
|
-
|
8
|
+
@options = Options.new
|
9
|
+
parse_arguments(args)
|
10
|
+
Runner.new.run(@options)
|
10
11
|
end
|
11
12
|
|
12
13
|
private
|
13
14
|
|
14
15
|
def parse_arguments(args)
|
15
|
-
options =
|
16
|
+
@options.commits = option_parser.parse(args)
|
17
|
+
rescue OptionParser::InvalidOption, Options::Invalid => ex
|
18
|
+
warn "ERROR: #{ex.message}"
|
19
|
+
$stderr.puts
|
20
|
+
warn option_parser
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
|
24
|
+
def option_parser
|
25
|
+
@option_parser ||= OptionParser.new do |opt|
|
26
|
+
opt.banner << ' [[commit] commit]'
|
16
27
|
|
17
|
-
OptionParser.new do |opt|
|
18
28
|
opt.on('-c', '--config FILE',
|
19
29
|
'Specify configuration file') do |config|
|
20
|
-
options
|
30
|
+
@options.config = config
|
21
31
|
end
|
22
32
|
|
23
33
|
opt.on('-D', '--display-cop-names',
|
24
34
|
'Display cop names in offense messages') do
|
25
|
-
options[:
|
26
|
-
options[:rubocop][:display_cop_names] = true
|
35
|
+
@options.rubocop[:display_cop_names] = true
|
27
36
|
end
|
28
37
|
|
29
38
|
opt.on('--cached', 'git diff --cached') do
|
30
|
-
options
|
39
|
+
@options.cached = true
|
31
40
|
end
|
32
41
|
|
33
42
|
opt.on('--staged', 'synonym of --cached') do
|
34
|
-
options
|
43
|
+
@options.cached = true
|
35
44
|
end
|
36
45
|
|
37
46
|
opt.on('--hound',
|
38
47
|
'Hound compatibility mode (require rubocop 0.22.0)') do
|
39
|
-
options
|
48
|
+
@options.hound = true
|
40
49
|
end
|
41
|
-
|
42
|
-
opt.parse(args)
|
43
50
|
end
|
44
|
-
|
45
|
-
options
|
46
51
|
end
|
47
52
|
end
|
48
53
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RuboCop
|
2
|
+
module Git
|
3
|
+
class DiffParser
|
4
|
+
class << self
|
5
|
+
def parse(diff)
|
6
|
+
new.parse(diff)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse(diff)
|
11
|
+
files = []
|
12
|
+
in_patch = false
|
13
|
+
|
14
|
+
diff.each_line do |line|
|
15
|
+
case line
|
16
|
+
when /^diff --git/
|
17
|
+
in_patch = false
|
18
|
+
when %r{^\+{3} b/(?<path>[^\t\n\r]+)}
|
19
|
+
files << PseudoResource.new(Regexp.last_match[:path])
|
20
|
+
when /^@@/
|
21
|
+
in_patch = true
|
22
|
+
end
|
23
|
+
|
24
|
+
files.last.patch << line if in_patch
|
25
|
+
end
|
26
|
+
|
27
|
+
files
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module RuboCop
|
2
|
+
module Git
|
3
|
+
class Options
|
4
|
+
class Invalid < StandardError; end
|
5
|
+
|
6
|
+
HOUND_DEFAULT_CONFIG_FILE =
|
7
|
+
File.expand_path('../../../../hound.yml', __FILE__)
|
8
|
+
|
9
|
+
attr_accessor :config
|
10
|
+
attr_reader :cached, :hound, :rubocop
|
11
|
+
|
12
|
+
def initialize(hash_options = nil)
|
13
|
+
@config = nil
|
14
|
+
@cached = false
|
15
|
+
@hound = false
|
16
|
+
@rubocop = {}
|
17
|
+
@commits = []
|
18
|
+
|
19
|
+
from_hash(hash_options) if hash_options
|
20
|
+
end
|
21
|
+
|
22
|
+
def cached=(cached_)
|
23
|
+
if cached_ && !@commits.empty?
|
24
|
+
fail Invalid, 'cached and commit cannot be specified together'
|
25
|
+
end
|
26
|
+
@cached = !!cached_
|
27
|
+
end
|
28
|
+
|
29
|
+
def hound=(hound_)
|
30
|
+
if hound_ && RuboCop::Version.version != '0.22.0'
|
31
|
+
fail Invalid, 'Hound compatibility mode requires rubocop 0.22.0'
|
32
|
+
end
|
33
|
+
@hound = !!hound_
|
34
|
+
end
|
35
|
+
|
36
|
+
def rubocop=(rubocop_)
|
37
|
+
unless rubocop_.is_a?(Hash)
|
38
|
+
fail Invalid, "invalid rubocop: #{rubocop_.inspect}"
|
39
|
+
end
|
40
|
+
@rubocop = rubocop_
|
41
|
+
end
|
42
|
+
|
43
|
+
def commits=(commits)
|
44
|
+
unless commits.is_a?(Array) && commits.length <= 2
|
45
|
+
fail Invalid, "invalid commits: #{commits.inspect}"
|
46
|
+
end
|
47
|
+
if !commits.empty? && cached
|
48
|
+
fail Invalid, 'cached and commit cannot be specified together'
|
49
|
+
end
|
50
|
+
@commits = commits
|
51
|
+
end
|
52
|
+
|
53
|
+
def config_path
|
54
|
+
if hound
|
55
|
+
HOUND_DEFAULT_CONFIG_FILE
|
56
|
+
elsif config
|
57
|
+
config
|
58
|
+
elsif File.exist?(RuboCop::ConfigLoader::DOTFILE)
|
59
|
+
RuboCop::ConfigLoader::DOTFILE
|
60
|
+
else
|
61
|
+
RuboCop::ConfigLoader::DEFAULT_FILE
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def commit_first
|
66
|
+
@commits.length == 1 ? @commits.first + '^' : @commits.first
|
67
|
+
end
|
68
|
+
|
69
|
+
def commit_last
|
70
|
+
@commits.last
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def from_hash(hash_options)
|
76
|
+
hash_options = hash_options.dup
|
77
|
+
%w(config cached hound rubocop commits).each do |key|
|
78
|
+
public_send("#{key}=", hash_options.delete(key))
|
79
|
+
end
|
80
|
+
unless hash_options.empty?
|
81
|
+
fail Invalid, "invalid keys: #{hash_options.keys.join(' ')}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -18,7 +18,7 @@ module RuboCop
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def config
|
21
|
-
return unless @options
|
21
|
+
return unless @options.hound
|
22
22
|
File.read(HOUND_CONFIG_FILE)
|
23
23
|
rescue Errno::ENOENT
|
24
24
|
nil
|
@@ -31,8 +31,10 @@ module RuboCop
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def file_contents(filename)
|
34
|
-
if @options
|
34
|
+
if @options.cached
|
35
35
|
`git show :#{filename.shellescape}`
|
36
|
+
elsif @options.commit_last
|
37
|
+
`git show #{@options.commit_last.shellescape}:#{filename.shellescape}`
|
36
38
|
else
|
37
39
|
File.read(filename)
|
38
40
|
end
|
@@ -1,6 +1,16 @@
|
|
1
1
|
module RuboCop
|
2
2
|
module Git
|
3
|
-
class PseudoResource
|
3
|
+
class PseudoResource
|
4
|
+
attr_reader :filename, :patch
|
5
|
+
|
6
|
+
def initialize(filename)
|
7
|
+
@filename = filename
|
8
|
+
@patch = ''
|
9
|
+
end
|
10
|
+
|
11
|
+
def status
|
12
|
+
'modified'
|
13
|
+
end
|
4
14
|
end
|
5
15
|
end
|
6
16
|
end
|
data/lib/rubocop/git/runner.rb
CHANGED
@@ -1,19 +1,14 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
1
3
|
module RuboCop
|
2
4
|
module Git
|
3
5
|
# ref. https://github.com/thoughtbot/hound/blob/be2dd34/app/services/build_runner.rb
|
4
6
|
class Runner
|
5
|
-
DEFAULT_CONFIG_FILE = '.rubocop.yml'
|
6
|
-
HOUND_DEFAULT_CONFIG_FILE =
|
7
|
-
File.expand_path('../../../../hound.yml', __FILE__)
|
8
|
-
|
9
7
|
def run(options)
|
10
|
-
|
11
|
-
warn 'Hound compatibility mode require rubocop 0.22.0'
|
12
|
-
exit 1
|
13
|
-
end
|
8
|
+
options = Options.new(options) unless options.is_a?(Options)
|
14
9
|
|
15
10
|
@options = options
|
16
|
-
@files =
|
11
|
+
@files = DiffParser.parse(git_diff(options))
|
17
12
|
|
18
13
|
display_violations($stdout)
|
19
14
|
end
|
@@ -26,8 +21,8 @@ module RuboCop
|
|
26
21
|
|
27
22
|
def style_checker
|
28
23
|
StyleChecker.new(pull_request.pull_request_files,
|
29
|
-
@options
|
30
|
-
config_path,
|
24
|
+
@options.rubocop,
|
25
|
+
@options.config_path,
|
31
26
|
pull_request.config)
|
32
27
|
end
|
33
28
|
|
@@ -35,40 +30,17 @@ module RuboCop
|
|
35
30
|
@pull_request ||= PseudoPullRequest.new(@files, @options)
|
36
31
|
end
|
37
32
|
|
38
|
-
def git_diff(
|
39
|
-
|
40
|
-
`git diff --diff-filter=AMCR --cached --find-renames --find-copies`
|
41
|
-
else
|
42
|
-
`git diff --diff-filter=AM`
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def parse_diff(diff)
|
47
|
-
files = []
|
48
|
-
in_patch = false
|
49
|
-
|
50
|
-
diff.each_line do |line|
|
51
|
-
case line
|
52
|
-
when /^diff --git/
|
53
|
-
in_patch = false
|
54
|
-
when %r{^\+{3} b/([^\t\n\r]+)}
|
55
|
-
files << PseudoResource.new($1, 'modified', '')
|
56
|
-
when /^@@/
|
57
|
-
in_patch = true
|
58
|
-
end
|
33
|
+
def git_diff(options)
|
34
|
+
args = %w(diff --diff-filter=AMCR --find-renames --find-copies)
|
59
35
|
|
60
|
-
|
36
|
+
if options.cached
|
37
|
+
args << '--cached'
|
38
|
+
elsif options.commit_last
|
39
|
+
args << options.commit_first.shellescape
|
40
|
+
args << options.commit_last.shellescape
|
61
41
|
end
|
62
42
|
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
def config_path
|
67
|
-
if @options[:hound]
|
68
|
-
HOUND_DEFAULT_CONFIG_FILE
|
69
|
-
else
|
70
|
-
@options[:config] || DEFAULT_CONFIG_FILE
|
71
|
-
end
|
43
|
+
`git #{args.join(' ')}`
|
72
44
|
end
|
73
45
|
|
74
46
|
def display_violations(io)
|
data/lib/rubocop/git/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-git
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaki Takeuchi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -76,8 +76,10 @@ files:
|
|
76
76
|
- lib/rubocop/git.rb
|
77
77
|
- lib/rubocop/git/cli.rb
|
78
78
|
- lib/rubocop/git/commit_file.rb
|
79
|
+
- lib/rubocop/git/diff_parser.rb
|
79
80
|
- lib/rubocop/git/file_violation.rb
|
80
81
|
- lib/rubocop/git/line.rb
|
82
|
+
- lib/rubocop/git/options.rb
|
81
83
|
- lib/rubocop/git/patch.rb
|
82
84
|
- lib/rubocop/git/pseudo_pull_request.rb
|
83
85
|
- lib/rubocop/git/pseudo_resource.rb
|