rfix 1.0.15 → 1.1.0.pre.147
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/.rspec +0 -1
- data/.rubocop.yml +46 -31
- data/.travis.yml +5 -12
- data/Gemfile.base +10 -3
- data/Gemfile.base.lock +172 -0
- data/Gemfile.lock +28 -7
- data/Guardfile +1 -1
- data/Makefile +4 -13
- data/Rakefile +16 -95
- data/ci/Gemfile.rubocop-0.80.lock +16 -1
- data/ci/Gemfile.rubocop-0.81.lock +16 -1
- data/ci/Gemfile.rubocop-0.82.lock +16 -1
- data/ci/Gemfile.rubocop-0.83.lock +19 -4
- data/ci/Gemfile.rubocop-0.84.lock +19 -4
- data/ci/Gemfile.rubocop-0.85.1.lock +19 -4
- data/ci/Gemfile.rubocop-0.85.lock +16 -1
- data/exe/rfix +18 -144
- data/lib/rfix.rb +10 -3
- data/lib/rfix/box.rb +112 -0
- data/lib/rfix/branch.rb +30 -0
- data/lib/rfix/branches/base.rb +29 -0
- data/lib/rfix/branches/head.rb +11 -0
- data/lib/rfix/branches/main.rb +33 -0
- data/lib/rfix/branches/name.rb +21 -0
- data/lib/rfix/branches/reference.rb +19 -0
- data/lib/rfix/branches/upstream.rb +11 -0
- data/lib/rfix/cmd.rb +9 -14
- data/lib/rfix/commands/all.rb +26 -0
- data/lib/rfix/commands/branch.rb +15 -0
- data/lib/rfix/commands/extensions/options.rb +8 -0
- data/lib/rfix/commands/help.rb +7 -0
- data/lib/rfix/commands/helper/args.rb +137 -0
- data/lib/rfix/commands/helper/help.rb +6 -0
- data/lib/rfix/commands/helper/loader.rb +6 -0
- data/lib/rfix/commands/helper/option.rb +0 -0
- data/lib/rfix/commands/helper/params.rb +0 -0
- data/lib/rfix/commands/helper/rubocop.rb +17 -0
- data/lib/rfix/commands/info.rb +30 -0
- data/lib/rfix/commands/lint.rb +23 -0
- data/lib/rfix/commands/local.rb +12 -0
- data/lib/rfix/commands/origin.rb +19 -0
- data/lib/rfix/commands/setup.rb +29 -0
- data/lib/rfix/commands/welcome.rb +24 -0
- data/lib/rfix/deleted.rb +13 -0
- data/lib/rfix/error.rb +2 -0
- data/lib/rfix/extensions/extensions.rb +4 -26
- data/lib/rfix/extensions/offense.rb +2 -1
- data/lib/rfix/extensions/string.rb +8 -0
- data/lib/rfix/file.rb +46 -0
- data/lib/rfix/file_cache.rb +59 -0
- data/lib/rfix/formatter.rb +37 -10
- data/lib/rfix/git_helper.rb +13 -1
- data/lib/rfix/log.rb +104 -7
- data/lib/rfix/no_file.rb +13 -0
- data/lib/rfix/rake/paths.rb +50 -0
- data/lib/rfix/rake/support.rb +75 -0
- data/lib/rfix/repository.rb +201 -0
- data/lib/rfix/rfix.rb +7 -198
- data/lib/rfix/tracked.rb +76 -0
- data/lib/rfix/tracked_file.rb +1 -1
- data/lib/rfix/untracked.rb +13 -0
- data/lib/rfix/version.rb +1 -1
- data/path.rb +7 -0
- data/rfix.gemspec +6 -2
- data/rugged.rb +206 -0
- data/tasks/bump.rake +11 -0
- data/tasks/bundle.rake +17 -0
- data/tasks/complex.rake +54 -0
- data/tasks/simple.rake +58 -0
- data/tasks/travis.rake +74 -0
- data/tasks/vendor.rake +34 -0
- metadata +136 -13
- data/file.rb +0 -1
- data/lib/rfix/gem_helper.rb +0 -12
- data/lib/rfix/git_file.rb +0 -36
- data/lib/rfix/rake_helper.rb +0 -56
- data/lib/rfix/untracked_file.rb +0 -13
data/lib/rfix/tracked.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require "rfix/no_file"
|
2
|
+
|
3
|
+
class Rfix::Tracked < Rfix::File
|
4
|
+
include Rfix::Log
|
5
|
+
|
6
|
+
def include?(line)
|
7
|
+
set = diff.each_line.to_a.map{ |l| l.new_lineno }.reject { |l| l == -1 }.to_set
|
8
|
+
set.include?(line - 1)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
# def set
|
14
|
+
# return NoFile.new(path) if @set.empty?
|
15
|
+
# return @set
|
16
|
+
# end
|
17
|
+
|
18
|
+
# def refresh!
|
19
|
+
# @changes = diff.each_line.to_a.map{ |l| l.new_lineno }.to_set
|
20
|
+
#
|
21
|
+
# if @changes.empty?
|
22
|
+
# @changes = NoFile.new(path)
|
23
|
+
# end
|
24
|
+
# rescue Rugged::TreeError
|
25
|
+
# @changed = NoFile.new(path)
|
26
|
+
# end
|
27
|
+
|
28
|
+
# def changes
|
29
|
+
# @changes or raise(Rfix::Error, "No changes found: #{self}")
|
30
|
+
# end
|
31
|
+
|
32
|
+
# def needs_update?
|
33
|
+
# current_changed_at = changed_at
|
34
|
+
# if @changed_at != current_changed_at
|
35
|
+
# @changed_at = current_changed_at
|
36
|
+
# return true
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# return false
|
40
|
+
# end
|
41
|
+
|
42
|
+
# def changed_at
|
43
|
+
# File.new(absolute_path).ctime
|
44
|
+
# end
|
45
|
+
|
46
|
+
def upstream
|
47
|
+
@upstream ||= ref.resolve(with: repo)
|
48
|
+
end
|
49
|
+
|
50
|
+
def head
|
51
|
+
@head ||= repo.rev_parse("HEAD")
|
52
|
+
end
|
53
|
+
|
54
|
+
def diff
|
55
|
+
upstream.diff(head, {
|
56
|
+
include_untracked_content: true,
|
57
|
+
# ignore_whitespace_change: true,
|
58
|
+
recurse_untracked_dirs: true,
|
59
|
+
disable_pathspec_match: false,
|
60
|
+
# ignore_whitespace_eol: false,
|
61
|
+
include_untracked: true,
|
62
|
+
# ignore_whitespace: true,
|
63
|
+
ignore_submodules: true,
|
64
|
+
include_ignored: false,
|
65
|
+
context_lines: 0,
|
66
|
+
paths: [path]
|
67
|
+
}).tap do |diff|
|
68
|
+
diff.find_similar!(
|
69
|
+
renames_from_rewrites: true,
|
70
|
+
# ignore_whitespace: true,
|
71
|
+
renames: true,
|
72
|
+
copies: true
|
73
|
+
)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/rfix/tracked_file.rb
CHANGED
@@ -4,7 +4,7 @@ require "rfix/git_file"
|
|
4
4
|
|
5
5
|
class Rfix::TrackedFile < Rfix::GitFile
|
6
6
|
def refresh!
|
7
|
-
@ranges = git("--no-pager", "diff", *params, "#{ref}
|
7
|
+
@ranges = git("--no-pager", "diff", *params, "#{ref}..HEAD", path)
|
8
8
|
.grep(/^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/) do
|
9
9
|
Regexp.last_match(1).to_i...(Regexp.last_match(1).to_i + (Regexp.last_match(2) || 1).to_i)
|
10
10
|
end
|
data/lib/rfix/version.rb
CHANGED
data/path.rb
ADDED
data/rfix.gemspec
CHANGED
@@ -19,8 +19,6 @@ Gem::Specification.new do |spec|
|
|
19
19
|
|
20
20
|
spec.authors = ["Linus Oleander"]
|
21
21
|
spec.email = ["linus@oleander.nu"]
|
22
|
-
|
23
|
-
# rubocop:disable Layout/LineLength
|
24
22
|
spec.summary = "RuboCop CLI that only lints and auto-fixes code you committed by utilizing `git-log` and `git-diff`"
|
25
23
|
# rubocop:enable Layout/LineLength
|
26
24
|
|
@@ -51,11 +49,17 @@ Gem::Specification.new do |spec|
|
|
51
49
|
|
52
50
|
spec.requirements << "git, v2.0+"
|
53
51
|
|
52
|
+
spec.add_runtime_dependency "cri", "~> 2.15.10"
|
53
|
+
spec.add_runtime_dependency "listen", "~> 3.0"
|
54
54
|
spec.add_runtime_dependency "rainbow", "~> 3.0"
|
55
55
|
spec.add_runtime_dependency "rouge", "~> 3.20"
|
56
56
|
spec.add_runtime_dependency "rubocop", ">= 0.80"
|
57
|
+
spec.add_runtime_dependency "rugged", "~> 1.0.0"
|
57
58
|
|
58
59
|
spec.add_development_dependency "rspec", "~> 3.0"
|
59
60
|
spec.add_development_dependency "aruba", "~> 1.0"
|
61
|
+
spec.add_development_dependency "colorize", "~> 0.8.1"
|
62
|
+
spec.add_development_dependency "git", "~> 1.7.0"
|
60
63
|
spec.add_development_dependency "rake", "~> 12.3"
|
64
|
+
spec.add_development_dependency "pry", "~> 0.13.1"
|
61
65
|
end
|
data/rugged.rb
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
require "rugged"
|
2
|
+
require "fileutils"
|
3
|
+
require "rainbow"
|
4
|
+
require "tmpdir"
|
5
|
+
require "rfix"
|
6
|
+
require 'shellwords'
|
7
|
+
require "set"
|
8
|
+
|
9
|
+
extend Rfix::Log
|
10
|
+
|
11
|
+
# root_path = Dir.mktmpdir
|
12
|
+
# at_exit { FileUtils.remove_dir(root_path) }
|
13
|
+
|
14
|
+
|
15
|
+
# Dir.chdir(root_path) do
|
16
|
+
# File.write(".gitignore", "# empty")
|
17
|
+
# system "git init"
|
18
|
+
# system "git add .gitignore"
|
19
|
+
# system "git commit -a -m 'Test'"
|
20
|
+
# end
|
21
|
+
|
22
|
+
|
23
|
+
# class Git
|
24
|
+
#
|
25
|
+
# class Blob < Struct.new(:repo, :tree)
|
26
|
+
# def commit(msg)
|
27
|
+
# author = {:email=>"tanoku@gmail.com", :time=>Time.now, :name=>"Vicent Mart\303\255"}
|
28
|
+
#
|
29
|
+
# Rugged::Commit.create(repo,
|
30
|
+
# :author => author,
|
31
|
+
# :message => msg,
|
32
|
+
# :committer => author,
|
33
|
+
# :parents => parents,
|
34
|
+
# :tree => tree,
|
35
|
+
# :update_ref => "HEAD")
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# def parents
|
39
|
+
# repo.empty? ? [] : [ repo.head.target ].compact
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# attr_reader :repo
|
44
|
+
#
|
45
|
+
# def initialize(root_path)
|
46
|
+
# @repo = Rugged::Repository.new(root_path)
|
47
|
+
# # @repo.index.read_tree(@repo.head.target.tree)
|
48
|
+
# # @repo.index.reload
|
49
|
+
# # @repo.index.write_tree(@repo)
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# def blob(params)
|
53
|
+
# abort "Must be a hash" unless params.is_a?(Hash)
|
54
|
+
# debug("New blob")
|
55
|
+
# index = repo.index
|
56
|
+
# index.reload
|
57
|
+
#
|
58
|
+
# params.each do |path, content|
|
59
|
+
# oid = repo.write(content, :blob)
|
60
|
+
# index.read_tree(repo.head.target.tree)
|
61
|
+
# index.add(path: path, oid: oid, mode: 0100644)
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# Blob.new(repo, index.write_tree(repo))
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# def has_branch?(name)
|
68
|
+
# repo.branches.each_name().include?(name)
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# def branch(name)
|
72
|
+
# debug("Checkout branch #{name}")
|
73
|
+
# if branch = repo.branches[name]
|
74
|
+
# return repo.checkout(branch)
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# repo.create_branch(name)
|
78
|
+
# end
|
79
|
+
#
|
80
|
+
# def tag(name)
|
81
|
+
# debug("Add tag #{name}")
|
82
|
+
# repo.tags.create(name, "HEAD")
|
83
|
+
# end
|
84
|
+
#
|
85
|
+
# def checkout(ref)
|
86
|
+
# debug "Checkout ref #{ref}"
|
87
|
+
# repo.checkout(ref)
|
88
|
+
# end
|
89
|
+
#
|
90
|
+
# def status
|
91
|
+
# debug "-- Get status"
|
92
|
+
# repo.status do |file, status|
|
93
|
+
# say "#{file} => #{status}"
|
94
|
+
# end
|
95
|
+
#
|
96
|
+
# repo.index.entries.each do |entry|
|
97
|
+
# say "Staged: #{entry}"
|
98
|
+
# end
|
99
|
+
# debug "-- End of status"
|
100
|
+
# end
|
101
|
+
#
|
102
|
+
# def say(msg)
|
103
|
+
# puts Rainbow("[LOG]").blue + " #{msg}"
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
# def debug(msg)
|
107
|
+
# puts Rainbow("[DEBUG]").red + " #{msg}"
|
108
|
+
# end
|
109
|
+
#
|
110
|
+
# def new_file(file, content)
|
111
|
+
# debug "New file #{file}"
|
112
|
+
# Dir.chdir(repo.workdir) do
|
113
|
+
# File.write(file, content)
|
114
|
+
# end
|
115
|
+
#
|
116
|
+
# file
|
117
|
+
# end
|
118
|
+
#
|
119
|
+
# def add(file)
|
120
|
+
# debug "Add file #{file}"
|
121
|
+
# index = Rugged::Index.new(file)
|
122
|
+
# index.write_tree(repo)
|
123
|
+
# Blob.new(repo, index.write_tree(repo))
|
124
|
+
# end
|
125
|
+
# end
|
126
|
+
|
127
|
+
# repo = Git.new(root_path)
|
128
|
+
# repo.status
|
129
|
+
# puts "------"
|
130
|
+
# repo.branch("master")
|
131
|
+
# repo.tag("v2")
|
132
|
+
# repo.branch("mastsdkfjfsd")
|
133
|
+
# repo.blob("example.rb" => "This is content").commit("This is my message")
|
134
|
+
# repo.status
|
135
|
+
# repo.checkout("v2")
|
136
|
+
# repo.blob("valid.rb" => "This is content")
|
137
|
+
# .commit("This is my message")
|
138
|
+
# repo.blob("this.rb" => "This is content").commit("This is my message")
|
139
|
+
# file = repo.new_file("valid.rb", "this is content")
|
140
|
+
# repo.status
|
141
|
+
# blob = repo.add(file)
|
142
|
+
# repo.status
|
143
|
+
# puts "----"
|
144
|
+
# blob.commit("Okay!")
|
145
|
+
# repo.status
|
146
|
+
|
147
|
+
class AFile
|
148
|
+
include Rfix::Log
|
149
|
+
attr_reader :repo, :path
|
150
|
+
|
151
|
+
def initialize(path, repo)
|
152
|
+
@repo = repo
|
153
|
+
@path = Shellwords.escape(path)
|
154
|
+
refresh!
|
155
|
+
end
|
156
|
+
|
157
|
+
def include?(line)
|
158
|
+
return true unless @changes
|
159
|
+
@changes.include?(line)
|
160
|
+
end
|
161
|
+
|
162
|
+
def refresh!
|
163
|
+
@changes = changed_lines
|
164
|
+
rescue Rugged::TreeError
|
165
|
+
@changed = nil
|
166
|
+
end
|
167
|
+
|
168
|
+
private
|
169
|
+
|
170
|
+
def upstream
|
171
|
+
@repo.rev_parse("@{u}:#{@path}")
|
172
|
+
end
|
173
|
+
|
174
|
+
def head
|
175
|
+
@repo.rev_parse("HEAD:#{@path}")
|
176
|
+
end
|
177
|
+
|
178
|
+
def diff
|
179
|
+
upstream.diff(head)
|
180
|
+
end
|
181
|
+
|
182
|
+
def changed_lines
|
183
|
+
diff.each_hunk
|
184
|
+
.to_a
|
185
|
+
.map(&:lines)
|
186
|
+
.flatten
|
187
|
+
.map(&:new_lineno)
|
188
|
+
.to_set
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
repo = Rugged::Repository.new(".")
|
193
|
+
|
194
|
+
repo.diff("83800375874a5ebd55b48283cef9245c32103aef", "HEAD").each_delta do |delta|
|
195
|
+
pp delta.new_file.fetch(:path)
|
196
|
+
end
|
197
|
+
# files = `git ls-tree -r master --name-only`.lines.map(&:chomp)
|
198
|
+
#
|
199
|
+
# result = files.each_with_object({}) do |path, acc|
|
200
|
+
# acc[path] = AFile.new(path, repo)
|
201
|
+
# end
|
202
|
+
#
|
203
|
+
# pp reslt
|
204
|
+
|
205
|
+
# binding.pry
|
206
|
+
# repo.branches
|
data/tasks/bump.rake
ADDED
data/tasks/bundle.rake
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
namespace :bundle do
|
2
|
+
task :install do
|
3
|
+
gemfiles.each do |gemfile|
|
4
|
+
next if gemfile.end_with?(".lock")
|
5
|
+
|
6
|
+
sh "bundle install", "--gemfile", gemfile, "--jobs 3"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
namespace :git do
|
11
|
+
task :add do
|
12
|
+
gemfiles.each do |gemfile|
|
13
|
+
sh "git add", gemfile
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/tasks/complex.rake
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require "tmpdir"
|
2
|
+
|
3
|
+
namespace :bundle do
|
4
|
+
namespace :complex do
|
5
|
+
directory Bundle::TMP
|
6
|
+
|
7
|
+
desc "Build complex bundle"
|
8
|
+
task build: [Bundle::Complex::FILE, Bundle::Complex::TEST] do
|
9
|
+
say "Complex bundle has been stored @ #{Bundle::Complex::FILE}"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Rebuild complex bundle"
|
13
|
+
task rebuild: [:flush, Bundle::Complex::BUILD]
|
14
|
+
|
15
|
+
desc "Remove complex bundle"
|
16
|
+
task :flush do
|
17
|
+
rm_f Bundle::Complex::FILE
|
18
|
+
rm_rf Bundle::Complex::REPO
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Test repo by cloning to local directory"
|
22
|
+
task test: Bundle::Complex::FILE do
|
23
|
+
Dir.mktmpdir do |repo|
|
24
|
+
sh "git clone", Bundle::Complex::FILE, repo, "--branch master"
|
25
|
+
cd repo do
|
26
|
+
sh "git rev-list --count HEAD"
|
27
|
+
sh "git ls-files"
|
28
|
+
sh "git status"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
say "Finished testing complex bundle"
|
33
|
+
end
|
34
|
+
|
35
|
+
file Bundle::Complex::FILE => Bundle::Complex::REPO do
|
36
|
+
cd Bundle::Complex::REPO do
|
37
|
+
sh "git bundle create", Bundle::Complex::FILE, "--branches --tags"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
file Bundle::Complex::REPO do
|
42
|
+
sh "git clone", Bundle::Complex::GITHUB, Bundle::Complex::REPO, "--branch", "master"
|
43
|
+
|
44
|
+
cd Bundle::Complex::REPO do
|
45
|
+
sh "git", "reset --hard 27fec8"
|
46
|
+
|
47
|
+
sh "git config user.email 'not-my@real-email.com'"
|
48
|
+
sh "git config user.name 'John Doe'"
|
49
|
+
|
50
|
+
sh "git tag", Bundle::Complex::TAG
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/tasks/simple.rake
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
namespace :bundle do
|
2
|
+
namespace :simple do
|
3
|
+
directory Bundle::Simple::REPO
|
4
|
+
|
5
|
+
desc "Build complex bundle"
|
6
|
+
task build: [Bundle::Simple::FILE, Bundle::Simple::TEST] do
|
7
|
+
say "Simple bundle has been stored @ #{Bundle::Simple::FILE}"
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Rebuild complex bundle"
|
11
|
+
task rebuild: [:flush, Bundle::Simple::BUILD]
|
12
|
+
|
13
|
+
desc "Remove complex bundle"
|
14
|
+
task :flush do
|
15
|
+
rm_f Bundle::Simple::FILE
|
16
|
+
rm_rf Bundle::Simple::REPO
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Test repo by cloning to local directory"
|
20
|
+
task test: Bundle::Simple::FILE do
|
21
|
+
Dir.mktmpdir do |repo|
|
22
|
+
sh "git clone", Bundle::Simple::FILE, repo, "--branch master"
|
23
|
+
cd repo do
|
24
|
+
sh "git rev-list --count HEAD"
|
25
|
+
sh "git ls-files"
|
26
|
+
sh "git status"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
say "Finished testing simple bundle"
|
31
|
+
end
|
32
|
+
|
33
|
+
file Bundle::Simple::FILE => Bundle::Simple::REPO do
|
34
|
+
cd Bundle::Simple::REPO do
|
35
|
+
sh "git bundle create", Bundle::Simple::FILE, "--branches --tags"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
file Bundle::Simple::REPO do
|
40
|
+
cd Bundle::Simple::REPO do
|
41
|
+
touch ".gitignore"
|
42
|
+
|
43
|
+
sh "git init"
|
44
|
+
sh "git add .gitignore"
|
45
|
+
sh "git commit -m 'A Commit Message'"
|
46
|
+
|
47
|
+
sh "git config push.default current"
|
48
|
+
sh "git config branch.autosetupmerge always"
|
49
|
+
sh "git config branch.autosetuprebase always"
|
50
|
+
|
51
|
+
sh "git config user.email 'not-my@real-email.com'"
|
52
|
+
sh "git config user.name 'John Doe'"
|
53
|
+
|
54
|
+
sh "git tag", Bundle::Simple::TAG
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|