rfix 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/main.yml +38 -0
- data/.gitignore +43 -0
- data/.rspec +2 -0
- data/.rubocop.yml +87 -0
- data/.travis.yml +37 -0
- data/Gemfile +2 -0
- data/Gemfile.base +14 -0
- data/Gemfile.base.lock +172 -0
- data/Gemfile.lock +181 -0
- data/Guardfile +16 -0
- data/LICENSE.txt +21 -0
- data/Makefile +4 -0
- data/README.md +92 -0
- data/Rakefile +27 -0
- data/bin/bundle +114 -0
- data/bin/console +29 -0
- data/bin/guard +29 -0
- data/bin/rake +29 -0
- data/bin/rfix +29 -0
- data/bin/rspec +29 -0
- data/bin/setup +29 -0
- data/ci/Gemfile.rubocop-0.80 +2 -0
- data/ci/Gemfile.rubocop-0.80.lock +170 -0
- data/ci/Gemfile.rubocop-0.81 +2 -0
- data/ci/Gemfile.rubocop-0.81.lock +170 -0
- data/ci/Gemfile.rubocop-0.82 +2 -0
- data/ci/Gemfile.rubocop-0.82.lock +170 -0
- data/ci/Gemfile.rubocop-0.83 +2 -0
- data/ci/Gemfile.rubocop-0.83.lock +168 -0
- data/ci/Gemfile.rubocop-0.84 +2 -0
- data/ci/Gemfile.rubocop-0.84.lock +171 -0
- data/ci/Gemfile.rubocop-0.85 +2 -0
- data/ci/Gemfile.rubocop-0.85.1 +2 -0
- data/ci/Gemfile.rubocop-0.85.1.lock +173 -0
- data/ci/Gemfile.rubocop-0.85.lock +173 -0
- data/exe/rfix +30 -0
- data/lib/rfix.rb +34 -0
- data/lib/rfix/box.rb +112 -0
- data/lib/rfix/branch.rb +31 -0
- data/lib/rfix/branches/base.rb +29 -0
- data/lib/rfix/branches/head.rb +13 -0
- data/lib/rfix/branches/main.rb +34 -0
- data/lib/rfix/branches/name.rb +23 -0
- data/lib/rfix/branches/reference.rb +21 -0
- data/lib/rfix/branches/upstream.rb +13 -0
- data/lib/rfix/cmd.rb +39 -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 +18 -0
- data/lib/rfix/extensions/offense.rb +78 -0
- 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 +126 -0
- data/lib/rfix/git_helper.rb +59 -0
- data/lib/rfix/log.rb +131 -0
- 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 +204 -0
- data/lib/rfix/rfix.rb +34 -0
- data/lib/rfix/tracked.rb +72 -0
- data/lib/rfix/tracked_file.rb +16 -0
- data/lib/rfix/untracked.rb +13 -0
- data/lib/rfix/version.rb +5 -0
- data/resources/ps.png +0 -0
- data/rfix.gemspec +68 -0
- data/tasks/bump.rake +11 -0
- data/tasks/bundle.rake +17 -0
- data/tasks/complex.rake +54 -0
- data/tasks/execute.rake +38 -0
- data/tasks/libgit2.rake +33 -0
- data/tasks/simple.rake +62 -0
- data/tasks/travis.rake +74 -0
- data/tasks/vendor.rake +34 -0
- metadata +350 -0
data/lib/rfix/no_file.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
module Travis
|
2
|
+
SETUP = "travis:setup".freeze
|
3
|
+
INSTALL = "travis:install".freeze
|
4
|
+
TASKS = "travis:tasks:all".freeze
|
5
|
+
GIT = "travis:git:config".freeze
|
6
|
+
end
|
7
|
+
|
8
|
+
module Bundle
|
9
|
+
INSTALL = "bundle:install".freeze
|
10
|
+
ADD = "bundle:git:add".freeze
|
11
|
+
TAG = "rally-point".freeze
|
12
|
+
REBUILD = "bundle:rebuild".freeze
|
13
|
+
BUILD = "bundle:build".freeze
|
14
|
+
ROOT = Dir.getwd
|
15
|
+
CONFIG = File.join(ROOT, ".rubocop.yml")
|
16
|
+
DIR = File.join(ROOT, "spec/fixtures")
|
17
|
+
TMP = File.join(ROOT, "tmp")
|
18
|
+
|
19
|
+
module Simple
|
20
|
+
FILE = File.join(DIR, "simple.bundle")
|
21
|
+
REPO = File.join(TMP, "simple")
|
22
|
+
REBUILD = "bundle:simple:rebuild".freeze
|
23
|
+
BUILD = "bundle:simple:build".freeze
|
24
|
+
FLUSH = "bundle:simple:flush".freeze
|
25
|
+
TEST = "bundle:simple:test".freeze
|
26
|
+
TAG = Bundle::TAG
|
27
|
+
end
|
28
|
+
|
29
|
+
module Complex
|
30
|
+
FILE = File.join(DIR, "complex.bundle")
|
31
|
+
REPO = File.join(TMP, "complex")
|
32
|
+
GITHUB = "https://github.com/oleander/git-fame-rb".freeze
|
33
|
+
REBUILD = "bundle:complex:rebuild".freeze
|
34
|
+
BUILD = "bundle:complex:build".freeze
|
35
|
+
FLUSH = "bundle:complex:flush".freeze
|
36
|
+
TEST = "bundle:complex:test".freeze
|
37
|
+
TAG = Bundle::TAG
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
module Vendor
|
42
|
+
ROOT = File.expand_path(File.join(__dir__, "../../.."))
|
43
|
+
DIR = File.join(ROOT, "vendor/shopify")
|
44
|
+
REPO = File.join(DIR, "cli-ui")
|
45
|
+
GITHUB = "https://github.com/shopify/cli-ui".freeze
|
46
|
+
START = "ef976d".freeze
|
47
|
+
BUILD = "vendor:shopify:build".freeze
|
48
|
+
REBUILD = "vendor:shopify:rebuild".freeze
|
49
|
+
TEST = "vendor:shopify:test".freeze
|
50
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require "colorize"
|
2
|
+
require "fileutils"
|
3
|
+
require "shellwords"
|
4
|
+
|
5
|
+
module Rfix::Support
|
6
|
+
include FileUtils
|
7
|
+
|
8
|
+
alias _sh sh
|
9
|
+
alias _cd cd
|
10
|
+
alias _rm_rf rm_rf
|
11
|
+
alias _rm_f rm_f
|
12
|
+
alias _mkdir_p mkdir_p
|
13
|
+
alias _chdir chdir
|
14
|
+
|
15
|
+
def gemfiles
|
16
|
+
Dir["Gemfile*", "ci/Gemfile*"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def say(msg)
|
20
|
+
$stderr.puts "#{'==>'.blue} #{to_relative(msg).italic}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def sh(*args)
|
24
|
+
args = args.map(&:shellsplit).flatten
|
25
|
+
colorize args
|
26
|
+
_sh(*args)
|
27
|
+
end
|
28
|
+
|
29
|
+
def chdir(*args, &block)
|
30
|
+
colorize :cd, args
|
31
|
+
_chdir(*args, &block)
|
32
|
+
end
|
33
|
+
|
34
|
+
def rm_rf(*args)
|
35
|
+
colorize :rm, args
|
36
|
+
_rm_rf(*args)
|
37
|
+
end
|
38
|
+
|
39
|
+
def rm_f(*args)
|
40
|
+
colorize :rm, args
|
41
|
+
_rm_f(*args)
|
42
|
+
end
|
43
|
+
|
44
|
+
def cd(*args, &block)
|
45
|
+
colorize :cd, args
|
46
|
+
_cd(*args, &block)
|
47
|
+
end
|
48
|
+
|
49
|
+
def mkdir_p(*args)
|
50
|
+
colorize :mkdir, args
|
51
|
+
_mkdir_p(*args)
|
52
|
+
end
|
53
|
+
|
54
|
+
def clone_and_run(&block)
|
55
|
+
Dir.mktmpdir do |repo|
|
56
|
+
sh "git clone", Bundle::Complex::FILE, repo, "--branch", "master"
|
57
|
+
Dir.chdir(repo) { block.call(repo) }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def current_path
|
64
|
+
File.join(Dir.getwd, "/")
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_relative(path)
|
68
|
+
path.to_s.gsub(current_path, "")
|
69
|
+
end
|
70
|
+
|
71
|
+
def colorize(*args)
|
72
|
+
head, *tail = args.flatten.map(&method(:to_relative))
|
73
|
+
say [head.yellow, tail.join(" ").italic].join(" ")
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
require "rugged"
|
2
|
+
require "rfix/file"
|
3
|
+
require "rfix/file_cache"
|
4
|
+
require "rfix/untracked"
|
5
|
+
require "rfix/tracked"
|
6
|
+
|
7
|
+
class Rfix::Repository
|
8
|
+
include Rfix::Log
|
9
|
+
attr_reader :files, :repo
|
10
|
+
|
11
|
+
def initialize(root_path:, load_untracked: false, reference: Rfix::Branch::HEAD, paths: [])
|
12
|
+
unless File.exist?(root_path)
|
13
|
+
raise Rfix::Error, "#{root_path} does not exist"
|
14
|
+
end
|
15
|
+
|
16
|
+
unless Pathname.new(root_path).absolute?
|
17
|
+
raise Rfix::Error, "#{root_path} is not absolute"
|
18
|
+
end
|
19
|
+
|
20
|
+
unless reference.is_a?(Rfix::Branch::Base)
|
21
|
+
raise Rfix::Error.new("Need Branch::Base, got {{error:#{reference.class}}}")
|
22
|
+
end
|
23
|
+
|
24
|
+
@files = FileCache.new(root_path)
|
25
|
+
@repo = Rugged::Repository.new(root_path)
|
26
|
+
@paths = paths
|
27
|
+
@reference = reference
|
28
|
+
@load_untracked = load_untracked
|
29
|
+
|
30
|
+
load!
|
31
|
+
end
|
32
|
+
|
33
|
+
def load_untracked?
|
34
|
+
@load_untracked
|
35
|
+
end
|
36
|
+
|
37
|
+
def load_tracked?
|
38
|
+
!! @reference
|
39
|
+
end
|
40
|
+
|
41
|
+
def reference
|
42
|
+
@reference
|
43
|
+
end
|
44
|
+
|
45
|
+
def refresh!(path)
|
46
|
+
@files.get(path).refresh!
|
47
|
+
end
|
48
|
+
|
49
|
+
def include?(path, line)
|
50
|
+
say_debug "Checking #{path}:#{line}"
|
51
|
+
|
52
|
+
if file = @files.get(path)
|
53
|
+
return file.include?(line)
|
54
|
+
end
|
55
|
+
|
56
|
+
say_debug "\tSkip file (return false)"
|
57
|
+
return false
|
58
|
+
end
|
59
|
+
|
60
|
+
def set_root(_path_path)
|
61
|
+
using_path(root_path)
|
62
|
+
end
|
63
|
+
|
64
|
+
def paths
|
65
|
+
files.pluck(&:absolute_path)
|
66
|
+
end
|
67
|
+
|
68
|
+
def current_branch
|
69
|
+
repo.head.name
|
70
|
+
end
|
71
|
+
|
72
|
+
def has_reference?(reference)
|
73
|
+
repo.rev_parse(reference)
|
74
|
+
rescue Rugged::ReferenceError
|
75
|
+
return false
|
76
|
+
end
|
77
|
+
|
78
|
+
def local_branches
|
79
|
+
repo.branches.each_name(:local).to_a
|
80
|
+
end
|
81
|
+
|
82
|
+
def git_path
|
83
|
+
repo.workdir
|
84
|
+
end
|
85
|
+
|
86
|
+
def head
|
87
|
+
@head ||= repo.rev_parse("HEAD")
|
88
|
+
end
|
89
|
+
|
90
|
+
def upstream
|
91
|
+
@upstream ||= reference.resolve(with: repo)
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def load_tracked!
|
97
|
+
params = {
|
98
|
+
# ignore_whitespace_change: true,
|
99
|
+
include_untracked_content: true,
|
100
|
+
recurse_untracked_dirs: true,
|
101
|
+
# ignore_whitespace_eol: true,
|
102
|
+
include_unmodified: false,
|
103
|
+
include_untracked: true,
|
104
|
+
ignore_submodules: true,
|
105
|
+
# ignore_whitespace: true,
|
106
|
+
include_ignored: false,
|
107
|
+
context_lines: 0
|
108
|
+
}
|
109
|
+
|
110
|
+
unless @paths.empty?
|
111
|
+
say_debug("Use @paths #{@paths.join(", ")}")
|
112
|
+
params[:disable_pathspec_match] = false
|
113
|
+
params[:paths] = @paths
|
114
|
+
end
|
115
|
+
|
116
|
+
say_debug("Run diff on #{reference}")
|
117
|
+
upstream.diff(head, **params).tap do |diff|
|
118
|
+
diff.find_similar!(
|
119
|
+
renames_from_rewrites: true,
|
120
|
+
renames: true,
|
121
|
+
copies: true
|
122
|
+
)
|
123
|
+
end.each_delta do |delta|
|
124
|
+
path = delta.new_file.fetch(:path)
|
125
|
+
say_debug("Found #{path} while diff")
|
126
|
+
try_store(path, [delta.status])
|
127
|
+
end
|
128
|
+
rescue Rugged::ReferenceError
|
129
|
+
abort_box($ERROR_INFO.to_s) do
|
130
|
+
prt "Reference {{error:#{reference}}} cannot be found in repository"
|
131
|
+
end
|
132
|
+
rescue Rugged::ConfigError
|
133
|
+
abort_box($ERROR_INFO.to_s) do
|
134
|
+
prt "No upstream branch set for {{error:#{current_branch}}}"
|
135
|
+
end
|
136
|
+
rescue TypeError
|
137
|
+
abort_box($ERROR_INFO.to_s) do
|
138
|
+
prt "Reference {{error:#{reference}}} is not pointing to a tree or commit"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def load!
|
143
|
+
load_tracked!
|
144
|
+
load_untracked!
|
145
|
+
end
|
146
|
+
|
147
|
+
# https://github.com/libgit2/rugged/blob/35102c0ca10ab87c4c4ffe2e25221d26993c069c/test/status_test.rb
|
148
|
+
# - +:index_new+: the file is new in the index
|
149
|
+
# - +:index_modified+: the file has been modified in the index
|
150
|
+
# - +:index_deleted+: the file has been deleted from the index
|
151
|
+
# - +:worktree_new+: the file is new in the working directory
|
152
|
+
# - +:worktree_modified+: the file has been modified in the working directory
|
153
|
+
# - +:worktree_deleted+: the file has been deleted from the working directory
|
154
|
+
|
155
|
+
MODIFIED = [:modified, :worktree_modified, :index_modified].freeze
|
156
|
+
IGNORED = [:ignored].freeze
|
157
|
+
STAGED = [:added, :index_new].freeze
|
158
|
+
UNTRACKED = [:worktree_new, :untracked].freeze
|
159
|
+
COPIED = [:copied].freeze
|
160
|
+
DELETED = [:deleted, :worktree_deleted, :index_deleted].freeze
|
161
|
+
RENAMED = [:renamed].freeze
|
162
|
+
|
163
|
+
SKIP = [*DELETED, *RENAMED, *COPIED, *IGNORED].freeze
|
164
|
+
ACCEPT = [*MODIFIED].freeze
|
165
|
+
|
166
|
+
def load_untracked!
|
167
|
+
repo.status do |path, status|
|
168
|
+
try_store(path, status)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def store(file)
|
173
|
+
say_debug("Trying to add #{file.absolute_path}")
|
174
|
+
if File.exist?(file.absolute_path)
|
175
|
+
@files.add(file)
|
176
|
+
else
|
177
|
+
say_debug "#{file} does not exist"
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def try_store(path, status)
|
182
|
+
if SKIP.any?(&status.method(:include?))
|
183
|
+
return say_debug("Ignored {{warning:#{status.join(', ')}}} #{path}")
|
184
|
+
end
|
185
|
+
|
186
|
+
if STAGED.any?(&status.method(:include?))
|
187
|
+
return store(Rfix::Untracked.new(path, repo, nil))
|
188
|
+
end
|
189
|
+
|
190
|
+
if UNTRACKED.any?(&status.method(:include?))
|
191
|
+
unless load_untracked?
|
192
|
+
return say_debug("Ignore #{path} as untracked files are ignored: #{status}")
|
193
|
+
end
|
194
|
+
|
195
|
+
return store(Rfix::Untracked.new(path, repo, nil))
|
196
|
+
end
|
197
|
+
|
198
|
+
if ACCEPT.any?(&status.method(:include?))
|
199
|
+
return store(Rfix::Tracked.new(path, repo, reference))
|
200
|
+
end
|
201
|
+
|
202
|
+
say_debug "Status not found {{error:#{status.join(', ')}}} for {{italic:#{path}}}"
|
203
|
+
end
|
204
|
+
end
|
data/lib/rfix/rfix.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rubocop"
|
4
|
+
require "rfix/log"
|
5
|
+
|
6
|
+
module Rfix
|
7
|
+
include Log
|
8
|
+
attr_accessor :repo
|
9
|
+
attr_accessor :test
|
10
|
+
|
11
|
+
alias test? test
|
12
|
+
|
13
|
+
def global_enable!
|
14
|
+
@global_enable = true
|
15
|
+
end
|
16
|
+
|
17
|
+
def global_enable?
|
18
|
+
@global_enable
|
19
|
+
end
|
20
|
+
|
21
|
+
def refresh!(source)
|
22
|
+
return true if global_enable?
|
23
|
+
|
24
|
+
repo.refresh!(source.file_path)
|
25
|
+
end
|
26
|
+
|
27
|
+
def enabled?(path, line)
|
28
|
+
return true if global_enable?
|
29
|
+
|
30
|
+
repo.include?(path, line)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# rubocop:enable Layout/LineLength
|
data/lib/rfix/tracked.rb
ADDED
@@ -0,0 +1,72 @@
|
|
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
|
+
say_debug "Does {{yellow:#{set}}} contain {{red:#{line}}}"
|
9
|
+
set.include?(line)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
# def set
|
15
|
+
# return NoFile.new(path) if @set.empty?
|
16
|
+
# return @set
|
17
|
+
# end
|
18
|
+
|
19
|
+
# def refresh!
|
20
|
+
# @changes = diff.each_line.to_a.map{ |l| l.new_lineno }.to_set
|
21
|
+
#
|
22
|
+
# if @changes.empty?
|
23
|
+
# @changes = NoFile.new(path)
|
24
|
+
# end
|
25
|
+
# rescue Rugged::TreeError
|
26
|
+
# @changed = NoFile.new(path)
|
27
|
+
# end
|
28
|
+
|
29
|
+
# def changes
|
30
|
+
# @changes or raise(Rfix::Error, "No changes found: #{self}")
|
31
|
+
# end
|
32
|
+
|
33
|
+
# def needs_update?
|
34
|
+
# current_changed_at = changed_at
|
35
|
+
# if @changed_at != current_changed_at
|
36
|
+
# @changed_at = current_changed_at
|
37
|
+
# return true
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# return false
|
41
|
+
# end
|
42
|
+
|
43
|
+
# def changed_at
|
44
|
+
# File.new(absolute_path).ctime
|
45
|
+
# end
|
46
|
+
|
47
|
+
def upstream
|
48
|
+
@upstream ||= ref.resolve(with: repo)
|
49
|
+
end
|
50
|
+
|
51
|
+
def head
|
52
|
+
@head ||= repo.rev_parse("HEAD")
|
53
|
+
end
|
54
|
+
|
55
|
+
def diff
|
56
|
+
upstream.diff_workdir({
|
57
|
+
include_untracked_content: true,
|
58
|
+
recurse_untracked_dirs: true,
|
59
|
+
include_untracked: true,
|
60
|
+
ignore_submodules: true,
|
61
|
+
include_ignored: false,
|
62
|
+
context_lines: 0,
|
63
|
+
paths: [path]
|
64
|
+
}).tap do |diff|
|
65
|
+
diff.find_similar!(
|
66
|
+
renames_from_rewrites: true,
|
67
|
+
renames: true,
|
68
|
+
copies: true
|
69
|
+
)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|