rfix 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/main.yml +38 -0
  3. data/.gitignore +43 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +87 -0
  6. data/.travis.yml +37 -0
  7. data/Gemfile +2 -0
  8. data/Gemfile.base +14 -0
  9. data/Gemfile.base.lock +172 -0
  10. data/Gemfile.lock +181 -0
  11. data/Guardfile +16 -0
  12. data/LICENSE.txt +21 -0
  13. data/Makefile +4 -0
  14. data/README.md +92 -0
  15. data/Rakefile +27 -0
  16. data/bin/bundle +114 -0
  17. data/bin/console +29 -0
  18. data/bin/guard +29 -0
  19. data/bin/rake +29 -0
  20. data/bin/rfix +29 -0
  21. data/bin/rspec +29 -0
  22. data/bin/setup +29 -0
  23. data/ci/Gemfile.rubocop-0.80 +2 -0
  24. data/ci/Gemfile.rubocop-0.80.lock +170 -0
  25. data/ci/Gemfile.rubocop-0.81 +2 -0
  26. data/ci/Gemfile.rubocop-0.81.lock +170 -0
  27. data/ci/Gemfile.rubocop-0.82 +2 -0
  28. data/ci/Gemfile.rubocop-0.82.lock +170 -0
  29. data/ci/Gemfile.rubocop-0.83 +2 -0
  30. data/ci/Gemfile.rubocop-0.83.lock +168 -0
  31. data/ci/Gemfile.rubocop-0.84 +2 -0
  32. data/ci/Gemfile.rubocop-0.84.lock +171 -0
  33. data/ci/Gemfile.rubocop-0.85 +2 -0
  34. data/ci/Gemfile.rubocop-0.85.1 +2 -0
  35. data/ci/Gemfile.rubocop-0.85.1.lock +173 -0
  36. data/ci/Gemfile.rubocop-0.85.lock +173 -0
  37. data/exe/rfix +30 -0
  38. data/lib/rfix.rb +34 -0
  39. data/lib/rfix/box.rb +112 -0
  40. data/lib/rfix/branch.rb +31 -0
  41. data/lib/rfix/branches/base.rb +29 -0
  42. data/lib/rfix/branches/head.rb +13 -0
  43. data/lib/rfix/branches/main.rb +34 -0
  44. data/lib/rfix/branches/name.rb +23 -0
  45. data/lib/rfix/branches/reference.rb +21 -0
  46. data/lib/rfix/branches/upstream.rb +13 -0
  47. data/lib/rfix/cmd.rb +39 -0
  48. data/lib/rfix/commands/branch.rb +15 -0
  49. data/lib/rfix/commands/extensions/options.rb +8 -0
  50. data/lib/rfix/commands/help.rb +7 -0
  51. data/lib/rfix/commands/helper/args.rb +137 -0
  52. data/lib/rfix/commands/helper/help.rb +6 -0
  53. data/lib/rfix/commands/helper/loader.rb +6 -0
  54. data/lib/rfix/commands/helper/option.rb +0 -0
  55. data/lib/rfix/commands/helper/params.rb +0 -0
  56. data/lib/rfix/commands/helper/rubocop.rb +17 -0
  57. data/lib/rfix/commands/info.rb +30 -0
  58. data/lib/rfix/commands/lint.rb +23 -0
  59. data/lib/rfix/commands/local.rb +12 -0
  60. data/lib/rfix/commands/origin.rb +19 -0
  61. data/lib/rfix/commands/setup.rb +29 -0
  62. data/lib/rfix/commands/welcome.rb +24 -0
  63. data/lib/rfix/deleted.rb +13 -0
  64. data/lib/rfix/error.rb +2 -0
  65. data/lib/rfix/extensions/extensions.rb +18 -0
  66. data/lib/rfix/extensions/offense.rb +78 -0
  67. data/lib/rfix/extensions/string.rb +8 -0
  68. data/lib/rfix/file.rb +46 -0
  69. data/lib/rfix/file_cache.rb +59 -0
  70. data/lib/rfix/formatter.rb +126 -0
  71. data/lib/rfix/git_helper.rb +59 -0
  72. data/lib/rfix/log.rb +131 -0
  73. data/lib/rfix/no_file.rb +13 -0
  74. data/lib/rfix/rake/paths.rb +50 -0
  75. data/lib/rfix/rake/support.rb +75 -0
  76. data/lib/rfix/repository.rb +204 -0
  77. data/lib/rfix/rfix.rb +34 -0
  78. data/lib/rfix/tracked.rb +72 -0
  79. data/lib/rfix/tracked_file.rb +16 -0
  80. data/lib/rfix/untracked.rb +13 -0
  81. data/lib/rfix/version.rb +5 -0
  82. data/resources/ps.png +0 -0
  83. data/rfix.gemspec +68 -0
  84. data/tasks/bump.rake +11 -0
  85. data/tasks/bundle.rake +17 -0
  86. data/tasks/complex.rake +54 -0
  87. data/tasks/execute.rake +38 -0
  88. data/tasks/libgit2.rake +33 -0
  89. data/tasks/simple.rake +62 -0
  90. data/tasks/travis.rake +74 -0
  91. data/tasks/vendor.rake +34 -0
  92. metadata +350 -0
@@ -0,0 +1,23 @@
1
+ require_relative "base"
2
+
3
+ module Rfix
4
+ class Branch::Name < Branch::Base
5
+ attr_reader :name
6
+
7
+ def initialize(name)
8
+ @name = name
9
+ end
10
+
11
+ def resolve(with:)
12
+ unless branch = with.branches[name]
13
+ raise Branch::UnknownBranchError.new("Could not find branch {{error:#{name}}}")
14
+ end
15
+
16
+ with.lookup(with.merge_base(branch.target_id, with.head.target_id))
17
+ rescue Rugged::ReferenceError
18
+ raise Branch::UnknownBranchError.new("Could not find branch {{error:#{name}}}")
19
+ end
20
+
21
+ alias to_s name
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ require_relative "base"
2
+
3
+ module Rfix
4
+ class Branch::Reference < Branch::Base
5
+ attr_reader :reference
6
+
7
+ def initialize(reference)
8
+ @reference = reference
9
+ end
10
+
11
+ def resolve(with:)
12
+ Branch::Name.new(reference).resolve(with: with)
13
+ rescue Branch::UnknownBranchError
14
+ revparse(using: with, ref: reference)
15
+ rescue Rugged::InvalidError
16
+ raise Branch::UnknownBranchError.new("Branch with reference {{error:#{reference}}} not found")
17
+ end
18
+
19
+ alias to_s reference
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "base"
2
+
3
+ module Rfix
4
+ class Branch::Upstream < Branch::Base
5
+ def resolve(with:)
6
+ with.rev_parse("@{upstream}")
7
+ end
8
+
9
+ def to_s
10
+ "upstream"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+ require "rfix"
5
+ require "rfix/log"
6
+
7
+ module Rfix::Cmd
8
+ include Rfix::Log
9
+
10
+ def cmd(*args, quiet: false)
11
+ out, err, status = Open3.capture3(*args)
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)
21
+ end
22
+
23
+ def cmd_succeeded?(*cmd)
24
+ Open3.capture2e(*cmd).last.success?
25
+ end
26
+
27
+ def params
28
+ [
29
+ "--word-diff-regex=[^[:space:]]",
30
+ "--no-renames",
31
+ "--no-merges",
32
+ "--first-parent",
33
+ "--diff-filter=AM",
34
+ "-U0",
35
+ "--no-color",
36
+ "-p"
37
+ ]
38
+ end
39
+ 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
@@ -0,0 +1,23 @@
1
+ r_args = []
2
+
3
+ helper("help", binding)
4
+ helper("rubocop", binding)
5
+ helper("args", binding)
6
+
7
+ summary "Lints commits and untracked files not yet pushed to upstream"
8
+ usage "rfix lint [opts] [path ..]"
9
+ description "Lint (read-only) files"
10
+
11
+
12
+ run do |opts, args, _cmd|
13
+ opts[:dry] = true
14
+ opts[:untracked] = true
15
+
16
+ if main = opts[:"main-branch"]
17
+ branch = Rfix::Branch::Name.new(main)
18
+ else
19
+ branch = Rfix::Branch::MAIN
20
+ end
21
+
22
+ setup(r_args, opts, args, files: args.each.to_a, reference: branch)
23
+ end
@@ -0,0 +1,12 @@
1
+ r_args = []
2
+
3
+ helper("help", binding)
4
+ helper("rubocop", binding)
5
+ helper("args", binding)
6
+
7
+ summary "Auto-fixes commits not yet pushed to upstream"
8
+ usage "rfix local [opts] [path ..]"
9
+
10
+ run do |opts, args, _cmd|
11
+ setup(r_args, opts, args, files: args.each.to_a, reference: Rfix::Branch::UPSTREAM)
12
+ end
@@ -0,0 +1,19 @@
1
+ r_args = []
2
+
3
+ helper("help", binding)
4
+ helper("rubocop", binding)
5
+ helper("args", binding)
6
+
7
+ summary "Auto-fixes commits between HEAD and origin branch"
8
+ usage "rfix origin [opts] [path ..]"
9
+
10
+ run do |opts, args, _cmd|
11
+ if main = opts[:"main-branch"]
12
+ branch = Rfix::Branch::Name.new(main)
13
+ else
14
+ branch = Rfix::Branch::MAIN
15
+ end
16
+
17
+ # say "Using {{red:#{branch}}} as main branch"
18
+ setup(r_args, opts, args, files: args.each.to_a, reference: branch)
19
+ end
@@ -0,0 +1,29 @@
1
+ helper("help", binding)
2
+
3
+ option :r, :root, "{{*}} Project root path", default: Dir.pwd, argument: :required
4
+ option :b, :"main-branch", "{{*}} Branch to use", argument: :optional
5
+
6
+ summary "Sets the default branch for {{command:rfix local}}"
7
+
8
+ def set_branch(root_path, branch)
9
+ Rfix::Branch::Main.set(branch, at: root_path)
10
+ say "Main branch was set to {{italic:#{branch}}}"
11
+ end
12
+
13
+ run do |opts, _args|
14
+ if branch = Rfix::Branch::Main.get(at: opts[:root])
15
+ say "Current main branch set to {{info:#{branch}}}"
16
+ end
17
+
18
+ if branch = opts[:"main-branch"]
19
+ next set_branch(opts[:root], branch)
20
+ end
21
+
22
+ CLI::UI::Prompt.ask("Which one is your main branch?") do |handler|
23
+ Rfix::Branch.local(at: opts[:root]).each do |branch|
24
+ handler.option(branch) do |selection|
25
+ set_branch(opts[:root], selection)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ r_args = []
2
+
3
+ helper("help", binding)
4
+
5
+ summary "This is how you get started with {{command:rfix}}"
6
+
7
+ run do |_opts, _args, _cmd|
8
+ indent = " " * 2
9
+ prt "{{v}} Thank you for installing {{green:rfix v#{Rfix::VERSION}}}!\n"
10
+ prt ""
11
+ prt "{{i}} Run {{command:rfix help}} for avalible commands or any of the following to get started:"
12
+ prt ""
13
+ prt "#{indent}{{command:$ rfix local}} {{italic:# Auto-fixes commits not yet pushed to upstream}}"
14
+ prt "#{indent}{{command:$ rfix origin}} {{italic:# Auto-fixes commits between HEAD and origin branch}}"
15
+ prt "#{indent}{{command:$ rfix lint}} {{italic:# Lints commits and untracked files not yet pushed to upstream}}"
16
+ prt ""
17
+ prt "{{*}} {{bold:ProTip:}} Append {{command:--dry}} to run {{command:rfix}} in {{warning:read-only}} mode"
18
+ prt ""
19
+ prt "{{i}} {{bold:Issues}} {{italic:https://github.com/oleander/rfix-rb/issues}}"
20
+ prt "{{i}} {{bold:Readme}} {{italic:https://github.com/oleander/rfix-rb/blob/master/README.md}}"
21
+ prt "{{i}} {{bold:Travis}} {{italic:https://travis-ci.org/github/oleander/rfix-rb}}"
22
+ prt ""
23
+ prt "{{italic:~ Linus}}\n"
24
+ end