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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/.rspec +0 -1
  4. data/.rubocop.yml +46 -31
  5. data/.travis.yml +5 -12
  6. data/Gemfile.base +10 -3
  7. data/Gemfile.base.lock +172 -0
  8. data/Gemfile.lock +28 -7
  9. data/Guardfile +1 -1
  10. data/Makefile +4 -13
  11. data/Rakefile +16 -95
  12. data/ci/Gemfile.rubocop-0.80.lock +16 -1
  13. data/ci/Gemfile.rubocop-0.81.lock +16 -1
  14. data/ci/Gemfile.rubocop-0.82.lock +16 -1
  15. data/ci/Gemfile.rubocop-0.83.lock +19 -4
  16. data/ci/Gemfile.rubocop-0.84.lock +19 -4
  17. data/ci/Gemfile.rubocop-0.85.1.lock +19 -4
  18. data/ci/Gemfile.rubocop-0.85.lock +16 -1
  19. data/exe/rfix +18 -144
  20. data/lib/rfix.rb +10 -3
  21. data/lib/rfix/box.rb +112 -0
  22. data/lib/rfix/branch.rb +30 -0
  23. data/lib/rfix/branches/base.rb +29 -0
  24. data/lib/rfix/branches/head.rb +11 -0
  25. data/lib/rfix/branches/main.rb +33 -0
  26. data/lib/rfix/branches/name.rb +21 -0
  27. data/lib/rfix/branches/reference.rb +19 -0
  28. data/lib/rfix/branches/upstream.rb +11 -0
  29. data/lib/rfix/cmd.rb +9 -14
  30. data/lib/rfix/commands/all.rb +26 -0
  31. data/lib/rfix/commands/branch.rb +15 -0
  32. data/lib/rfix/commands/extensions/options.rb +8 -0
  33. data/lib/rfix/commands/help.rb +7 -0
  34. data/lib/rfix/commands/helper/args.rb +137 -0
  35. data/lib/rfix/commands/helper/help.rb +6 -0
  36. data/lib/rfix/commands/helper/loader.rb +6 -0
  37. data/lib/rfix/commands/helper/option.rb +0 -0
  38. data/lib/rfix/commands/helper/params.rb +0 -0
  39. data/lib/rfix/commands/helper/rubocop.rb +17 -0
  40. data/lib/rfix/commands/info.rb +30 -0
  41. data/lib/rfix/commands/lint.rb +23 -0
  42. data/lib/rfix/commands/local.rb +12 -0
  43. data/lib/rfix/commands/origin.rb +19 -0
  44. data/lib/rfix/commands/setup.rb +29 -0
  45. data/lib/rfix/commands/welcome.rb +24 -0
  46. data/lib/rfix/deleted.rb +13 -0
  47. data/lib/rfix/error.rb +2 -0
  48. data/lib/rfix/extensions/extensions.rb +4 -26
  49. data/lib/rfix/extensions/offense.rb +2 -1
  50. data/lib/rfix/extensions/string.rb +8 -0
  51. data/lib/rfix/file.rb +46 -0
  52. data/lib/rfix/file_cache.rb +59 -0
  53. data/lib/rfix/formatter.rb +37 -10
  54. data/lib/rfix/git_helper.rb +13 -1
  55. data/lib/rfix/log.rb +104 -7
  56. data/lib/rfix/no_file.rb +13 -0
  57. data/lib/rfix/rake/paths.rb +50 -0
  58. data/lib/rfix/rake/support.rb +75 -0
  59. data/lib/rfix/repository.rb +201 -0
  60. data/lib/rfix/rfix.rb +7 -198
  61. data/lib/rfix/tracked.rb +76 -0
  62. data/lib/rfix/tracked_file.rb +1 -1
  63. data/lib/rfix/untracked.rb +13 -0
  64. data/lib/rfix/version.rb +1 -1
  65. data/path.rb +7 -0
  66. data/rfix.gemspec +6 -2
  67. data/rugged.rb +206 -0
  68. data/tasks/bump.rake +11 -0
  69. data/tasks/bundle.rake +17 -0
  70. data/tasks/complex.rake +54 -0
  71. data/tasks/simple.rake +58 -0
  72. data/tasks/travis.rake +74 -0
  73. data/tasks/vendor.rake +34 -0
  74. metadata +136 -13
  75. data/file.rb +0 -1
  76. data/lib/rfix/gem_helper.rb +0 -12
  77. data/lib/rfix/git_file.rb +0 -36
  78. data/lib/rfix/rake_helper.rb +0 -56
  79. data/lib/rfix/untracked_file.rb +0 -13
@@ -0,0 +1,30 @@
1
+ require "rfix/repository"
2
+ require "rfix/error"
3
+
4
+ module Rfix
5
+ module Branch
6
+ class UnknownBranchError < Rfix::Error
7
+ end
8
+
9
+ class NotYetImplementedError < Rfix::Error
10
+ end
11
+ end
12
+ end
13
+
14
+ Pathname(__dir__).glob("branches/*.rb").each(&method(:require))
15
+
16
+ module Rfix
17
+ module Branch
18
+ UPSTREAM = Branch::Upstream.new
19
+ MAIN = Branch::Main.new
20
+ HEAD = Branch::Head.new
21
+
22
+ def self.local(at: Dir.pwd)
23
+ repo(at: at).branches.each_name(:local).sort
24
+ end
25
+
26
+ def self.repo(at:)
27
+ Rugged::Repository.new(at)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ class Rfix::Branch::Base
2
+ def resolve(with:)
3
+ raise Rfix::NotYetImplementedError.new("#resolved")
4
+ end
5
+
6
+ def to_s
7
+ raise Rfix::NotYetImplementedError.new("#to_s")
8
+ end
9
+
10
+ def branch(using:)
11
+ names(using: using).last or raise Rfix::Error.new("No named branch found for {{error:#{self}}}")
12
+ end
13
+
14
+ def names(using:)
15
+ oid = resolve(with: using).oid
16
+ locals = using.branches.each_name(:local).to_a
17
+
18
+ using.branches.select do |branch|
19
+ next false unless locals.include?(branch.name)
20
+ branch.target_id == oid
21
+ end
22
+ end
23
+
24
+ def revparse(using:, ref:)
25
+ using.rev_parse(ref)
26
+ rescue Rugged::InvalidError
27
+ raise Rfix::Branch::UnknownBranchError.new("Could not find reference {{error:#{ref}}}")
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ module Rfix
2
+ class Branch::Head < Branch::Base
3
+ def resolve(with:)
4
+ with.lookup(with.head.target_id)
5
+ end
6
+
7
+ def to_s
8
+ "HEAD"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,33 @@
1
+ require "rugged"
2
+
3
+ module Rfix
4
+ class Branch::Main < Branch::Base
5
+ KEY = "rfix.main.branch"
6
+
7
+ def resolve(with:)
8
+ unless name = with.config[KEY]
9
+ raise Error.new("Please run {{command:rfix setup}} first")
10
+ end
11
+
12
+ String.new(name).resolve(with: with)
13
+ end
14
+
15
+ def self.set(branch, at: Dir.pwd)
16
+ unless branch.is_a?(String)
17
+ raise Rfix::Error.new("Branch must be a string, got {{error:#{branch.class}}}")
18
+ end
19
+
20
+ check = Branch::Name.new(branch)
21
+ repo = Branch.repo(at: at)
22
+ Branch.repo(at: at).config[KEY] = check.branch(using: repo).name
23
+ end
24
+
25
+ def self.get(at: Dir.pwd)
26
+ Branch.repo(at: at).config[KEY]
27
+ end
28
+
29
+ def to_s
30
+ "configured main branch"
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ module Rfix
2
+ class Branch::Name < Branch::Base
3
+ attr_reader :name
4
+
5
+ def initialize(name)
6
+ @name = name
7
+ end
8
+
9
+ def resolve(with:)
10
+ unless branch = with.branches[name]
11
+ raise Branch::UnknownBranchError.new("Could not find branch {{error:#{name}}}")
12
+ end
13
+
14
+ with.lookup(with.merge_base(branch.target_id, with.head.target_id))
15
+ rescue Rugged::ReferenceError
16
+ raise Branch::UnknownBranchError.new("Could not find branch {{error:#{name}}}")
17
+ end
18
+
19
+ alias to_s name
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Rfix
2
+ class Branch::Reference < Branch::Base
3
+ attr_reader :reference
4
+
5
+ def initialize(reference)
6
+ @reference = reference
7
+ end
8
+
9
+ def resolve(with:)
10
+ Branch::Name.new(reference).resolve(with: with)
11
+ rescue Branch::UnknownBranchError
12
+ revparse(using: with, ref: reference)
13
+ rescue Rugged::InvalidError
14
+ raise Branch::UnknownBranchError.new("Branch with reference {{error:#{reference}}} not found")
15
+ end
16
+
17
+ alias to_s reference
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ module Rfix
2
+ class Branch::Upstream < Branch::Base
3
+ def resolve(with:)
4
+ with.rev_parse("@{upstream}")
5
+ end
6
+
7
+ def to_s
8
+ "upstream"
9
+ end
10
+ end
11
+ end
@@ -9,20 +9,15 @@ module Rfix::Cmd
9
9
 
10
10
  def cmd(*args, quiet: false)
11
11
  out, err, status = Open3.capture3(*args)
12
- say_debug "[Cmd] {{command:#{args.join(' ')}}}"
13
-
14
- unless status.success?
15
- return yield if block_given?
16
- return if quiet
17
-
18
- say_error "[Cmd] {{italic:#{args.join(' ')}}}"
19
- say_error "[Pwd] {{italic:#{Dir.pwd}}}"
20
- say_error "[Err] {{error:#{err.strip}}}"
21
-
22
- exit status.exitstatus
23
- end
24
-
25
- out.lines.map(&:chomp)
12
+ box = Rfix::Box.new(out, err, status, args, quiet)
13
+ return box.stdout if box.success?
14
+ return yield if block_given?
15
+ return if quiet
16
+
17
+ box.render(color: :red)
18
+ exit box.exit_status
19
+ ensure
20
+ # box.render(debug: false)
26
21
  end
27
22
 
28
23
  def cmd_succeeded?(*cmd)
@@ -0,0 +1,26 @@
1
+ # helper("help", binding)
2
+ # helper("rubocop", binding)
3
+ # helper("args", binding)
4
+ #
5
+ # summary "All"
6
+ #
7
+ # run do |opts, args, cmd|
8
+ # setup(opts, args) do |repo, files|
9
+ # q1 = "Are you sure you want to {{warning:auto-fix}} the {{warning:the entire folder}}"
10
+ # q2 = "Are you sure you want to {{warning:auto-fix}} everything in {{warning:#{files.join(", ")}?}}"
11
+ #
12
+ # begin
13
+ # if files.empty?
14
+ # unless CLI::UI.confirm(q1)
15
+ # exit 1
16
+ # end
17
+ # elsif CLI::UI.confirm(q2)
18
+ # exit 1
19
+ # end
20
+ # rescue Interrupt
21
+ # exit 1
22
+ # end
23
+ #
24
+ # Rfix.global_enable!
25
+ # end
26
+ # end
@@ -0,0 +1,15 @@
1
+ r_args = []
2
+
3
+ helper("help", binding)
4
+ helper("rubocop", binding)
5
+ helper("args", binding)
6
+
7
+ param :branch
8
+ usage "rfix branch BRANCH [opts] [-p path ..]"
9
+ option :p, :path, "Path to be passed to RuboCop", argument: :required, multiple: true
10
+ summary "Fix changes made between HEAD and <branch>"
11
+
12
+ run do |opts, args, _cmd|
13
+ branch = Rfix::Branch::Reference.new(args[:branch])
14
+ setup(r_args, opts, args, files: opts[:path] || [], reference: branch)
15
+ end
@@ -0,0 +1,8 @@
1
+ module Rfix::Ext::Opt
2
+ def define_options
3
+ @define_options ||= super
4
+ end
5
+ alias opts define_options
6
+ end
7
+
8
+ RuboCop::Options.prepend(Rfix::Ext::Opt)
@@ -0,0 +1,7 @@
1
+ extend Rfix::Log
2
+
3
+ summary "Displays help"
4
+
5
+ run do |_opts, _args, cmd|
6
+ prt cmd.supercommand.help
7
+ end
@@ -0,0 +1,137 @@
1
+ option :r, :root, "{{*}} Project root path", default: Dir.pwd, argument: :required
2
+ option :b, :"main-branch", "{{*}} Branch to use", default: "master", argument: :required
3
+ option :l, :limit, "{{*}} Limit number of files", argument: :required, transform: method(:Integer)
4
+
5
+ flag nil, :dry, "{{*}} Run in dry mode"
6
+ flag nil, :untracked, "{{*}} Load untracked files"
7
+ flag nil, :"clear-cache", "{{*}} Clear Rubocop`s cache"
8
+ flag nil, :test, "{{*}} Used in tests"
9
+
10
+ def validate!(files:)
11
+ return [] unless files.is_a?(Array)
12
+
13
+ files.each do |file|
14
+ unless File.exist?(file)
15
+ say_abort "Passed file {{error:#{file}}} does not exist"
16
+ end
17
+ end
18
+
19
+ files
20
+ end
21
+
22
+ def setup(r_args = [], opts, _args, files: [], reference:)
23
+ # files = validate!(files: files)
24
+ options = RuboCop::Options.new
25
+ store = RuboCop::ConfigStore.new
26
+
27
+ params = {
28
+ force_exclusion: true,
29
+ formatters: ["Rfix::Formatter"],
30
+ auto_correct: true
31
+ }
32
+
33
+ if opts.key?(:format)
34
+ params.delete(:formatters)
35
+ end
36
+
37
+ if opts.key?(:dry)
38
+ params[:auto_correct] = false
39
+ end
40
+
41
+ if opts.key?(:test)
42
+ params.delete(:formatters)
43
+ params[:format] = "json"
44
+ params[:cache] = "false"
45
+ Rfix.test = true
46
+
47
+ unless opts.key?(:root)
48
+ raise "No --root passed with --test"
49
+ end
50
+
51
+ unless opts.key?(:config)
52
+ raise "No --config passed with --test"
53
+ end
54
+ end
55
+
56
+ if opts[:cache] == "false"
57
+ params[:cache] = "false"
58
+ end
59
+
60
+ begin
61
+ Rfix.repo = repo = Rfix::Repository.new(
62
+ root_path: opts[:root],
63
+ load_untracked: opts[:untracked],
64
+ reference: reference,
65
+ paths: files || []
66
+ )
67
+ rescue Rugged::RepositoryError => e
68
+ say_abort e.to_s
69
+ rescue Rfix::Error => e
70
+ say_abort e.to_s
71
+ end
72
+
73
+ # RuboCop::ResultCache.cleanup(store, true)
74
+
75
+ if opts[:"clear-cache"]
76
+ RuboCop::ResultCache.cleanup(store, true)
77
+ params[:cache] = "false"
78
+ say_debug "Cleared Rubocop`s cache"
79
+ end
80
+
81
+ if block_given?
82
+ yield(repo, [])
83
+ end
84
+
85
+ begin
86
+ params2, paths = options.parse(r_args)
87
+ rescue OptionParser::MissingArgument => e
88
+ say_abort e.to_s
89
+ end
90
+
91
+ params2.merge!(params)
92
+
93
+ begin
94
+ if config = opts[:config]
95
+ store.options_config = config
96
+ elsif root_path = opts[:root]
97
+ store.for(root_path)
98
+ end
99
+ rescue RuboCop::Error => e
100
+ say_abort e.to_s
101
+ rescue TypeError => e
102
+ say_abort e.to_s
103
+ rescue Psych::SyntaxError => e
104
+ say_abort e.to_s
105
+ end
106
+
107
+ # unless files.empty?
108
+ # say "Loading files from {{italic:#{files.join(', ')}}}"
109
+ # end
110
+
111
+ if !files.empty?
112
+ paths = files
113
+ elsif paths.empty? && repo.paths.empty?
114
+ if opts[:format] == "json"
115
+ prt JSON.pretty_generate({"files": []})
116
+ exit 0
117
+ else
118
+ say_exit "Everything looks good, nothing to lint"
119
+ end
120
+ elsif paths.empty?
121
+ paths = repo.paths
122
+ end
123
+
124
+ if limit = opts[:limit]
125
+ paths = paths.take(limit)
126
+ end
127
+
128
+ env = RuboCop::CLI::Environment.new(params2, store, paths)
129
+
130
+ begin
131
+ exit RuboCop::CLI::Command::ExecuteRunner.new(env).run
132
+ rescue RuboCop::Runner::InfiniteCorrectionLoop => e
133
+ say_abort e.to_s
134
+ rescue RuboCop::Error => e
135
+ say_abort e.to_s
136
+ end
137
+ end
@@ -0,0 +1,6 @@
1
+ extend Rfix::Log
2
+
3
+ flag :h, :help, "show help for this command" do |_value, cmd|
4
+ prt cmd.help
5
+ exit 0
6
+ end
@@ -0,0 +1,6 @@
1
+ module Rfix::Loader
2
+ def helper(file, bind)
3
+ path = File.join(__dir__, file + ".rb")
4
+ eval(IO.read(path), bind, path)
5
+ end
6
+ end
File without changes
File without changes
@@ -0,0 +1,17 @@
1
+ RuboCop::Options.new.opts.instance_eval("@stack", __FILE__, __LINE__).map(&:list).flatten.each do |opt|
2
+ short = opt.short.map { |arg| arg.delete_prefix("-") }
3
+ long = opt.long.map { |arg| arg.delete_prefix("--") }
4
+
5
+ short.unshift(nil) if opt.short.empty?
6
+ long.unshift(nil) if opt.long.empty?
7
+
8
+ if opt.arg
9
+ option(*short, *long, opt.desc.join(" "), argument: :optional) do |value|
10
+ r_args.append(*opt.long, value)
11
+ end
12
+ else
13
+ flag(*short, *long, opt.desc.join(" ")) do
14
+ r_args.append(*opt.long)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,30 @@
1
+ require "rbconfig"
2
+ require "rugged"
3
+
4
+ extend Rfix::Log
5
+ extend Rfix::Cmd
6
+
7
+ def git_version
8
+ cmd("git --version").last.split(/\s+/, 3).last
9
+ end
10
+
11
+ def ruby_version
12
+ RbConfig::CONFIG["ruby_version"] || "<unknown>"
13
+ end
14
+
15
+ def current_os
16
+ RbConfig::CONFIG["host_os"] || "<unknown>"
17
+ end
18
+
19
+ helper("help", binding)
20
+
21
+ summary "Display runtime dependencies and their version"
22
+
23
+ run do |_opts, _args|
24
+ say "Using RuboCop {{info:#{RuboCop::Version.version}}}"
25
+ say "Using Rugged {{info:#{Rugged::VERSION}}}"
26
+ say "Using Rfix {{info:#{Rfix::VERSION}}}"
27
+ say "Using OS {{info:#{current_os}}}"
28
+ say "Using Git {{info:#{git_version}}}"
29
+ say "Using Ruby {{info:#{ruby_version}}}"
30
+ end