rfix 1.4.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (219) hide show
  1. checksums.yaml +4 -4
  2. data/exe/rfix +78 -34
  3. data/lib/rfix.rb +17 -28
  4. data/lib/rfix/branch.rb +3 -25
  5. data/lib/rfix/branch/base.rb +27 -0
  6. data/lib/rfix/branch/head.rb +15 -0
  7. data/lib/rfix/branch/main.rb +33 -0
  8. data/lib/rfix/branch/name.rb +21 -0
  9. data/lib/rfix/branch/reference.rb +15 -0
  10. data/lib/rfix/branch/upstream.rb +17 -0
  11. data/lib/rfix/cli/command.rb +19 -0
  12. data/lib/rfix/cli/command/base.rb +61 -0
  13. data/lib/rfix/cli/command/branch.rb +13 -0
  14. data/lib/rfix/cli/command/config.rb +22 -0
  15. data/lib/rfix/cli/command/extension.rb +25 -0
  16. data/lib/rfix/cli/command/help.rb +11 -0
  17. data/lib/rfix/cli/command/info.rb +11 -0
  18. data/lib/rfix/cli/command/lint.rb +17 -0
  19. data/lib/rfix/cli/command/local.rb +11 -0
  20. data/lib/rfix/cli/command/origin.rb +11 -0
  21. data/lib/rfix/cli/command/setup.rb +11 -0
  22. data/lib/rfix/error.rb +5 -1
  23. data/lib/rfix/extension/offense.rb +79 -0
  24. data/lib/rfix/extension/pastel.rb +11 -0
  25. data/lib/rfix/extension/string.rb +12 -0
  26. data/lib/rfix/extension/strings.rb +9 -0
  27. data/lib/rfix/file.rb +6 -41
  28. data/lib/rfix/file/base.rb +73 -0
  29. data/lib/rfix/file/deleted.rb +17 -0
  30. data/lib/rfix/file/ignored.rb +17 -0
  31. data/lib/rfix/file/tracked.rb +42 -0
  32. data/lib/rfix/file/untracked.rb +20 -0
  33. data/lib/rfix/formatter.rb +125 -86
  34. data/lib/rfix/highlighter.rb +118 -0
  35. data/lib/rfix/indicator.rb +19 -0
  36. data/lib/rfix/log.rb +12 -121
  37. data/lib/rfix/rake/gemfile.rb +111 -0
  38. data/lib/rfix/rake/paths.rb +25 -23
  39. data/lib/rfix/rake/support.rb +72 -57
  40. data/lib/rfix/repository.rb +114 -164
  41. data/lib/rfix/types.rb +52 -0
  42. data/lib/rfix/version.rb +1 -1
  43. data/rfix.gemspec +28 -38
  44. data/vendor/dry-cli/CHANGELOG.md +191 -0
  45. data/vendor/dry-cli/CODEOWNERS +1 -0
  46. data/vendor/dry-cli/CODE_OF_CONDUCT.md +13 -0
  47. data/vendor/dry-cli/CONTRIBUTING.md +29 -0
  48. data/vendor/dry-cli/Gemfile +14 -0
  49. data/vendor/dry-cli/Gemfile.devtools +18 -0
  50. data/vendor/dry-cli/LICENSE +20 -0
  51. data/vendor/dry-cli/README.md +29 -0
  52. data/vendor/dry-cli/Rakefile +13 -0
  53. data/vendor/dry-cli/bin/console +15 -0
  54. data/vendor/dry-cli/bin/setup +8 -0
  55. data/vendor/dry-cli/changelog.yml +97 -0
  56. data/vendor/dry-cli/docsite/source/arguments.html.md +57 -0
  57. data/vendor/dry-cli/docsite/source/callbacks.html.md +51 -0
  58. data/vendor/dry-cli/docsite/source/commands-with-subcommands-and-params.md +86 -0
  59. data/vendor/dry-cli/docsite/source/commands.html.md +41 -0
  60. data/vendor/dry-cli/docsite/source/index.html.md +302 -0
  61. data/vendor/dry-cli/docsite/source/options.html.md +51 -0
  62. data/vendor/dry-cli/docsite/source/subcommands.html.md +38 -0
  63. data/vendor/dry-cli/docsite/source/variadic-arguments.html.md +45 -0
  64. data/vendor/dry-cli/dry-cli.gemspec +36 -0
  65. data/vendor/dry-cli/lib/dry/cli.rb +224 -0
  66. data/vendor/dry-cli/lib/dry/cli/banner.rb +135 -0
  67. data/vendor/dry-cli/lib/dry/cli/command.rb +387 -0
  68. data/vendor/dry-cli/lib/dry/cli/command_registry.rb +253 -0
  69. data/vendor/dry-cli/lib/dry/cli/errors.rb +37 -0
  70. data/vendor/dry-cli/lib/dry/cli/inflector.rb +17 -0
  71. data/vendor/dry-cli/lib/dry/cli/inline.rb +75 -0
  72. data/vendor/dry-cli/lib/dry/cli/option.rb +131 -0
  73. data/vendor/dry-cli/lib/dry/cli/parser.rb +138 -0
  74. data/vendor/dry-cli/lib/dry/cli/program_name.rb +21 -0
  75. data/vendor/dry-cli/lib/dry/cli/registry.rb +338 -0
  76. data/vendor/dry-cli/lib/dry/cli/usage.rb +94 -0
  77. data/vendor/dry-cli/lib/dry/cli/version.rb +8 -0
  78. data/vendor/dry-cli/project.yml +13 -0
  79. data/vendor/dry-cli/spec/integration/commands_spec.rb +14 -0
  80. data/vendor/dry-cli/spec/integration/inherited_commands_spec.rb +24 -0
  81. data/vendor/dry-cli/spec/integration/inline_spec.rb +43 -0
  82. data/vendor/dry-cli/spec/integration/processes_errors_spec.rb +29 -0
  83. data/vendor/dry-cli/spec/integration/rendering_spec.rb +31 -0
  84. data/vendor/dry-cli/spec/integration/single_command_spec.rb +81 -0
  85. data/vendor/dry-cli/spec/integration/subcommands_spec.rb +60 -0
  86. data/vendor/dry-cli/spec/integration/third_party_gems_spec.rb +18 -0
  87. data/vendor/dry-cli/spec/spec_helper.rb +15 -0
  88. data/vendor/dry-cli/spec/support/coverage.rb +15 -0
  89. data/vendor/dry-cli/spec/support/files.rb +13 -0
  90. data/vendor/dry-cli/spec/support/fixtures/based +65 -0
  91. data/vendor/dry-cli/spec/support/fixtures/baz +9 -0
  92. data/vendor/dry-cli/spec/support/fixtures/baz_command.rb +19 -0
  93. data/vendor/dry-cli/spec/support/fixtures/foo +588 -0
  94. data/vendor/dry-cli/spec/support/fixtures/infinites +31 -0
  95. data/vendor/dry-cli/spec/support/fixtures/inline +20 -0
  96. data/vendor/dry-cli/spec/support/fixtures/registry.rb +15 -0
  97. data/vendor/dry-cli/spec/support/fixtures/shared_commands.rb +596 -0
  98. data/vendor/dry-cli/spec/support/fixtures/with_block.rb +86 -0
  99. data/vendor/dry-cli/spec/support/fixtures/with_registry.rb +90 -0
  100. data/vendor/dry-cli/spec/support/fixtures/with_zero_arity_block.rb +87 -0
  101. data/vendor/dry-cli/spec/support/helpers.rb +37 -0
  102. data/vendor/dry-cli/spec/support/path.rb +24 -0
  103. data/vendor/dry-cli/spec/support/rspec.rb +26 -0
  104. data/vendor/dry-cli/spec/support/rspec_options.rb +16 -0
  105. data/vendor/dry-cli/spec/support/shared_examples/commands.rb +300 -0
  106. data/vendor/dry-cli/spec/support/shared_examples/inherited_commands.rb +197 -0
  107. data/vendor/dry-cli/spec/support/shared_examples/rendering.rb +181 -0
  108. data/vendor/dry-cli/spec/support/shared_examples/subcommands.rb +226 -0
  109. data/vendor/dry-cli/spec/support/shared_examples/third_party_gems.rb +49 -0
  110. data/vendor/dry-cli/spec/support/warnings.rb +10 -0
  111. data/vendor/dry-cli/spec/unit/dry/cli/cli_spec.rb +123 -0
  112. data/vendor/dry-cli/spec/unit/dry/cli/inflector_spec.rb +26 -0
  113. data/vendor/dry-cli/spec/unit/dry/cli/registry_spec.rb +78 -0
  114. data/vendor/dry-cli/spec/unit/dry/cli/version_spec.rb +7 -0
  115. data/vendor/strings-ansi/CHANGELOG.md +24 -0
  116. data/vendor/strings-ansi/CODE_OF_CONDUCT.md +74 -0
  117. data/vendor/strings-ansi/Gemfile +11 -0
  118. data/{LICENSE.txt → vendor/strings-ansi/LICENSE.txt} +1 -1
  119. data/vendor/strings-ansi/README.md +155 -0
  120. data/vendor/strings-ansi/Rakefile +8 -0
  121. data/vendor/strings-ansi/appveyor.yml +32 -0
  122. data/vendor/strings-ansi/bin/console +14 -0
  123. data/vendor/strings-ansi/bin/setup +8 -0
  124. data/vendor/strings-ansi/lib/strings-ansi.rb +1 -0
  125. data/vendor/strings-ansi/lib/strings/ansi.rb +84 -0
  126. data/vendor/strings-ansi/lib/strings/ansi/extensions.rb +23 -0
  127. data/vendor/strings-ansi/lib/strings/ansi/version.rb +7 -0
  128. data/vendor/strings-ansi/spec/fixtures/ansi_codes.yaml +194 -0
  129. data/vendor/strings-ansi/spec/spec_helper.rb +51 -0
  130. data/vendor/strings-ansi/spec/unit/ansi_spec.rb +15 -0
  131. data/vendor/strings-ansi/spec/unit/extensions_spec.rb +19 -0
  132. data/vendor/strings-ansi/spec/unit/only_ansi_spec.rb +36 -0
  133. data/vendor/strings-ansi/spec/unit/sanitize_spec.rb +53 -0
  134. data/vendor/strings-ansi/strings-ansi.gemspec +34 -0
  135. data/vendor/strings-ansi/tasks/console.rake +11 -0
  136. data/vendor/strings-ansi/tasks/coverage.rake +11 -0
  137. data/vendor/strings-ansi/tasks/spec.rake +29 -0
  138. metadata +274 -188
  139. data/.github/workflows/main.yml +0 -26
  140. data/.gitignore +0 -43
  141. data/.rspec +0 -2
  142. data/.rubocop.yml +0 -87
  143. data/.travis.yml +0 -35
  144. data/Gemfile +0 -2
  145. data/Gemfile.base +0 -14
  146. data/Gemfile.base.lock +0 -172
  147. data/Gemfile.lock +0 -188
  148. data/Guardfile +0 -16
  149. data/Makefile +0 -12
  150. data/README.md +0 -85
  151. data/Rakefile +0 -31
  152. data/bin/bundle +0 -114
  153. data/bin/console +0 -29
  154. data/bin/guard +0 -29
  155. data/bin/rake +0 -29
  156. data/bin/rfix +0 -29
  157. data/bin/rspec +0 -29
  158. data/bin/setup +0 -29
  159. data/ci/Gemfile.rubocop-0.80 +0 -2
  160. data/ci/Gemfile.rubocop-0.80.lock +0 -170
  161. data/ci/Gemfile.rubocop-0.81 +0 -2
  162. data/ci/Gemfile.rubocop-0.81.lock +0 -170
  163. data/ci/Gemfile.rubocop-0.82 +0 -2
  164. data/ci/Gemfile.rubocop-0.82.lock +0 -170
  165. data/ci/Gemfile.rubocop-0.83 +0 -2
  166. data/ci/Gemfile.rubocop-0.83.lock +0 -168
  167. data/ci/Gemfile.rubocop-0.84 +0 -2
  168. data/ci/Gemfile.rubocop-0.84.lock +0 -171
  169. data/ci/Gemfile.rubocop-0.85 +0 -2
  170. data/ci/Gemfile.rubocop-0.85.1 +0 -2
  171. data/ci/Gemfile.rubocop-0.85.1.lock +0 -173
  172. data/ci/Gemfile.rubocop-0.85.lock +0 -173
  173. data/lib/rfix/box.rb +0 -112
  174. data/lib/rfix/branches/base.rb +0 -15
  175. data/lib/rfix/branches/head.rb +0 -13
  176. data/lib/rfix/branches/main.rb +0 -28
  177. data/lib/rfix/branches/name.rb +0 -23
  178. data/lib/rfix/branches/reference.rb +0 -21
  179. data/lib/rfix/branches/upstream.rb +0 -13
  180. data/lib/rfix/cmd.rb +0 -39
  181. data/lib/rfix/commands/branch.rb +0 -15
  182. data/lib/rfix/commands/extensions/options.rb +0 -8
  183. data/lib/rfix/commands/help.rb +0 -7
  184. data/lib/rfix/commands/helper/args.rb +0 -141
  185. data/lib/rfix/commands/helper/help.rb +0 -6
  186. data/lib/rfix/commands/helper/loader.rb +0 -6
  187. data/lib/rfix/commands/helper/option.rb +0 -0
  188. data/lib/rfix/commands/helper/params.rb +0 -0
  189. data/lib/rfix/commands/helper/rubocop.rb +0 -17
  190. data/lib/rfix/commands/info.rb +0 -30
  191. data/lib/rfix/commands/lint.rb +0 -22
  192. data/lib/rfix/commands/local.rb +0 -12
  193. data/lib/rfix/commands/origin.rb +0 -19
  194. data/lib/rfix/commands/setup.rb +0 -29
  195. data/lib/rfix/commands/welcome.rb +0 -24
  196. data/lib/rfix/deleted.rb +0 -13
  197. data/lib/rfix/extensions/extensions.rb +0 -18
  198. data/lib/rfix/extensions/offense.rb +0 -78
  199. data/lib/rfix/extensions/string.rb +0 -8
  200. data/lib/rfix/file_cache.rb +0 -59
  201. data/lib/rfix/git_helper.rb +0 -59
  202. data/lib/rfix/indentation.rb +0 -39
  203. data/lib/rfix/loader/bundler.rb +0 -37
  204. data/lib/rfix/loader/env.rb +0 -33
  205. data/lib/rfix/loader/spec.rb +0 -41
  206. data/lib/rfix/no_file.rb +0 -13
  207. data/lib/rfix/rfix.rb +0 -34
  208. data/lib/rfix/tracked.rb +0 -72
  209. data/lib/rfix/tracked_file.rb +0 -16
  210. data/lib/rfix/untracked.rb +0 -13
  211. data/resources/ps.png +0 -0
  212. data/tasks/bump.rake +0 -11
  213. data/tasks/bundle.rake +0 -17
  214. data/tasks/complex.rake +0 -54
  215. data/tasks/execute.rake +0 -38
  216. data/tasks/libgit2.rake +0 -33
  217. data/tasks/simple.rake +0 -62
  218. data/tasks/travis.rake +0 -74
  219. data/tasks/vendor.rake +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 94c6a5221d4beb6a82e2ec5993f4e6710f6797d44c5132804cb07963b8e1afd5
4
- data.tar.gz: 36466eb65888062cba7c5b58a972ec546670d6c997aae5dac3f7df6aa6403a61
3
+ metadata.gz: 2a31f67814cde7855a4bd826d9825c942cd11841690fb6f2ffaedaf3e64a04ab
4
+ data.tar.gz: 6f9dea0ec8da3c8ce5074ad47d45d56ec0ad0219a958f9ee04db5a1f1cae4e81
5
5
  SHA512:
6
- metadata.gz: f5e6e043ae89ed1cfaac1ff174f772e07d180d1e5e2f0fc178a2f3e7db8f4a5cc991ace2118eb8ecc21ee92f7c7d5947a821f7e75a962d46c36c3623aae67c2b
7
- data.tar.gz: c1a48cb3b3372c82645c680123e83f7ec9551307fe723b194f99cd073001fd921eab4abf2a04bbff533f41f524c079bda1dfd5dfcfc21ef224e8c58fe400ab3c
6
+ metadata.gz: '09ef5d35b5bd597e3d0314a5b7d1184991f257bd954f8083b056a563f02e101897bb32ab615f8b0b2e881b7a787651f80d4395dbfd263a9f8460b700ac7d9b81'
7
+ data.tar.gz: 9ec45b74b60114e0d65debc6aba9a9569d407705e7e05555e38771a3fad3a3147a0f57d67a1966b165a78c68f935742f6084d72cacf5e2079633935463bfe7ce
data/exe/rfix CHANGED
@@ -1,51 +1,95 @@
1
- # #!/usr/bin/env ruby
1
+ #!/usr/bin/env -S ruby -W0 --disable-all
2
+ # frozen_string_literal: true
2
3
 
4
+ require "rubygems"
5
+ require "pathname"
3
6
  require "bundler"
4
7
 
5
- require_relative "../lib/rfix/loader/spec.rb"
6
- require_relative "../lib/rfix/loader/bundler.rb"
7
- require_relative "../lib/rfix/loader/env.rb"
8
+ module Path
9
+ HOME = Pathname("~").expand_path
10
+ DIR = Pathname(__dir__)
11
+ LOCK = "Gemfile.lock"
12
+ PWD = Pathname.getwd
13
+ PROJECT = DIR.join("..").expand_path
14
+ end
15
+
16
+ def lock_path
17
+ Path::PWD.ascend.find do |path|
18
+ return if (path <=> Path::HOME) == -1
19
+
20
+ path.join(Path::LOCK).file?
21
+ end.join(Path::LOCK)
22
+ end
23
+
24
+ def find(name, env: Bundler.rubygems)
25
+ env.loaded_specs(name) || env.find_name(name).max_by(&:version)
26
+ end
27
+
28
+ def deactivate(spec)
29
+ Gem.loaded_specs.delete(spec.name)
8
30
 
9
- if spec = Bundler.find_locked("rubocop")
10
- Gem::Specification.deactivate(spec.name)
11
- unless spec.__materialize__&.activation
12
- abort "Could not load rubocop spec file"
31
+ $LOAD_PATH.reject! do |path|
32
+ spec.load_paths.include?(path)
13
33
  end
14
34
  end
15
35
 
16
- if spec = Gem.loaded_specs.fetch("rubocop")
17
- unless Env.requirement === spec.version
18
- abort "RuboCop version #{Env.pretty_req} required by rfix but #{spec.version} was found in Gemfile"
36
+ def specs
37
+ return [] unless (path = lock_path)
38
+
39
+ Bundler::LockfileParser.new(path.read).specs
40
+ end
41
+
42
+ def overlapping_specs
43
+ specs.select do |spec|
44
+ spec.name.start_with?("rubocop")
19
45
  end
20
46
  end
21
47
 
22
- require "cri"
23
- require "rfix"
24
- require "rfix/log"
25
- require "rubocop"
26
- require "rfix/extensions/string"
27
- require "rfix/commands/extensions/options"
28
- require "rfix/commands/helper/loader"
29
- require "rfix/branch"
48
+ def rfix
49
+ find("rfix")
50
+ end
30
51
 
31
- include Rfix::Loader
32
- include Rfix::Log
52
+ def dev?
53
+ # $PROGRAM_NAME.end_with?("exe/rfix")
54
+ false
55
+ end
33
56
 
34
- root = Cri::Command.new
57
+ def rfix_path
58
+ return Pathname(__dir__).parent if dev?
35
59
 
36
- Dir.glob(File.join(__dir__, "../lib/rfix/commands/*.rb")).each do |command|
37
- root.add_command(Cri::Command.load_file(command, infer_name: true))
60
+ Pathname(rfix.full_gem_path)
38
61
  end
39
62
 
40
- begin
41
- if root.run(ARGV, {}, hard_exit: false)
42
- exit 0
43
- else
44
- prt root.help
45
- exit 1
63
+ def commands
64
+ rfix_path.glob("lib/rfix/commands/*.rb").map do |command|
65
+ Cri::Command.load_file(command.to_path, infer_name: true)
46
66
  end
47
- rescue RuntimeError => e
48
- say_abort e.to_s
49
- rescue Rfix::Error => e
50
- say_abort e.to_s
67
+ end
68
+
69
+ def deactivate_all!
70
+ Gem.loaded_specs.each do |_name, spec|
71
+ deactivate(spec)
72
+ end
73
+ end
74
+
75
+ deactivate_all!
76
+
77
+ require "bundler/inline"
78
+ gemfile(false, ui: Bundler::UI::Silent.new) do
79
+ overlapping_specs.each do |spec|
80
+ gem spec.name, spec.version
81
+ end
82
+
83
+ path rfix_path do
84
+ gem "rfix"
85
+ end
86
+
87
+ path rfix_path.join("vendor") do
88
+ gem "dry-cli", require: "dry/cli"
89
+ gem "strings-ansi"
90
+ end
91
+ end
92
+
93
+ module Rfix
94
+ Dry::CLI.new(CLI::Command).call
51
95
  end
data/lib/rfix.rb CHANGED
@@ -1,35 +1,24 @@
1
- #!/usr/bin/env ruby
2
1
  # frozen_string_literal: true
3
2
 
4
- # https://gist.github.com/skanev/9d4bec97d5a6825eaaf6
3
+ $LOAD_PATH.push Pathname(__dir__).join("../vendor/strings-ansi/lib")
4
+ $LOAD_PATH.push Pathname(__dir__).join("../vendor/dry-cli/lib")
5
5
 
6
- require "cli/ui"
7
- require "require_all"
8
- require "rfix/version"
9
- require "rfix/log"
10
- require "rfix/cmd"
11
- require "rfix/repository"
12
- require "rfix/formatter"
13
- require "rfix/indentation"
14
- require "rfix/extensions/extensions"
15
- require "rfix/extensions/offense"
16
- require "rfix/branch"
17
- require "rfix/rfix"
18
- require "rfix/box"
19
- require "rfix/error"
6
+ require "active_support/core_ext/module/attribute_accessors"
7
+ require "rubocop-ast"
8
+ require "zeitwerk"
9
+ require "rubocop"
20
10
 
21
- module Rfix
22
- module Ext; end
23
- extend self
24
- end
11
+ loader = Zeitwerk::Loader.for_gem
12
+ loader.ignore("#{__dir__}/rfix/rake/paths")
13
+ loader.ignore("#{__dir__}/rfix/rake/support")
14
+ loader.ignore("#{__dir__}/rfix/loader")
15
+ loader.ignore("#{__dir__}/rfix/commands")
16
+ loader.ignore("#{__dir__}/rfix/extension/strings")
17
+ loader.ignore("#{__dir__}/rfix/extension/pastel")
18
+ loader.inflector.inflect "cli" => "CLI"
25
19
 
26
- RuboCop::CommentConfig.prepend(Rfix::Ext::CommentConfig)
27
- RuboCop::Cop::Offense.prepend(Rfix::Ext::Offense)
20
+ loader.setup
28
21
 
29
- CLI::UI::StdoutRouter.enable
30
-
31
- # TODO: Handle cases where color can't be resolved by CLI::UI
32
- RuboCop::Formatter::SimpleTextFormatter::COLOR_FOR_SEVERITY.each do |severity, color|
33
- id = RuboCop::Cop::Severity::CODE_TABLE.invert.fetch(severity)
34
- CLI::UI::Glyph.new(id.to_s, 0x25cf, CLI::UI.resolve_color(color))
22
+ module Rfix
23
+ mattr_accessor :repo, :test
35
24
  end
data/lib/rfix/branch.rb CHANGED
@@ -1,31 +1,9 @@
1
- require "rfix/repository"
2
- require "rfix/error"
3
- autoload_rel "branches/*.rb"
1
+ # frozen_string_literal: true
4
2
 
5
- module Rfix
6
- module Branch
7
- class UnknownBranchError < Rfix::Error
8
- end
9
-
10
- class NotYetImplementedError < Rfix::Error
11
- end
12
- end
13
- end
14
-
15
- Pathname(__dir__).glob("branches/*.rb").each(&method(:require))
3
+ require "rugged"
16
4
 
17
5
  module Rfix
18
6
  module Branch
19
- UPSTREAM = Branch::Upstream.new
20
- MAIN = Branch::Main.new
21
- HEAD = Branch::Head.new
22
-
23
- def self.local(at: Dir.pwd)
24
- repo(at: at).branches.each_name(:local).sort
25
- end
26
-
27
- def self.repo(at:)
28
- Rugged::Repository.new(at)
29
- end
7
+ # NOP
30
8
  end
31
9
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/struct"
4
+
5
+ module Rfix
6
+ module Branch
7
+ class Base < Dry::Struct
8
+ attribute? :repository, Types::Rugged.default { Rugged::Repository.discover }
9
+
10
+ class UnknownBranchError < Error
11
+ def initialize(name)
12
+ super("Could not find branch {{error:#{name}}}")
13
+ end
14
+ end
15
+
16
+ # @abstract
17
+ def resolve(*)
18
+ raise NotYetImplementedError, self.class.name
19
+ end
20
+
21
+ # @abstract
22
+ def to_s
23
+ raise NotYetImplementedError, self.class.name
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rfix
4
+ module Branch
5
+ class Head < Base
6
+ def resolve
7
+ repository.lookup(repository.head.target_id)
8
+ end
9
+
10
+ def to_s
11
+ "HEAD"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rfix
4
+ module Branch
5
+ class Main < Name
6
+ KEY = "rfix.main.branch"
7
+
8
+ class NoMainBranchSetError < Error
9
+ def initialize
10
+ super("Run 'rfix setup' to set the main branch")
11
+ end
12
+ end
13
+
14
+ def self.call(repository: Rugged::Repository.discover)
15
+ unless (name = repository.config[KEY])
16
+ raise NoMainBranchSetError
17
+ end
18
+
19
+ super(repository: repository, name: name)
20
+ rescue NoMainBranchSetError
21
+ if repository.head_detached?
22
+ raise Error, "HEAD is detached"
23
+ end
24
+
25
+ repository.branches[repository.head.name].then do |branch|
26
+ repository.config[KEY] = branch.name
27
+ end
28
+
29
+ retry
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rfix
4
+ module Branch
5
+ class Name < Base
6
+ attribute :name, Types::String
7
+
8
+ def resolve
9
+ unless (branch = repository.branches[name])
10
+ raise UnknownBranchError, branch
11
+ end
12
+
13
+ repository.lookup(repository.merge_base(branch.target_id, repository.head.target_id))
14
+ rescue Rugged::ReferenceError
15
+ raise UnknownBranchError, name
16
+ end
17
+
18
+ alias to_s name
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rfix
4
+ module Branch
5
+ class Reference < Base
6
+ attribute :name, Types::String
7
+
8
+ def resolve
9
+ repository.lookup(repository.rev_parse(name).oid)
10
+ rescue Rugged::Error, Rugged::InvalidError
11
+ raise Error, name
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rfix
4
+ module Branch
5
+ class Upstream < Base
6
+ def resolve
7
+ repository.rev_parse("@{upstream}")
8
+ rescue Rugged::ConfigError
9
+ raise Error, "No upstream branch defined"
10
+ end
11
+
12
+ def to_s
13
+ "upstream"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/cli"
4
+
5
+ module Rfix
6
+ module CLI
7
+ module Command
8
+ extend Dry::CLI::Registry
9
+
10
+ register "origin", Origin
11
+ register "branch", Branch
12
+ register "local", Local
13
+ register "setup", Setup
14
+ register "lint", Lint
15
+ register "info", Info
16
+ register "help", Help
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/module/concerning"
4
+ require "dry/core/constants"
5
+ require "rubocop"
6
+ require "rainbow"
7
+ require "rugged"
8
+
9
+ require "rfix/extension/pastel"
10
+ require "rfix/extension/strings"
11
+
12
+ module Rfix
13
+ module CLI
14
+ module Command
15
+ class Base < Dry::CLI::Command
16
+ include Log
17
+ include Dry::Core::Constants
18
+
19
+ class RuboCop::CommentConfig
20
+ concerning :Verification, prepend: true do
21
+ def cop_enabled_at_line?(cop, line)
22
+ repository.include?(processed_source.file_path, line) && super(cop, line)
23
+ rescue StandardError => e
24
+ abort e.full_message(highlight: true)
25
+ end
26
+ end
27
+ end
28
+
29
+ option :formatters, type: :array, default: ["Rfix::Formatter"]
30
+ option :format, type: :string, default: "Rfix::Formatter"
31
+ option :auto_correct_all, type: :boolean, default: true
32
+ option :auto_correct, type: :boolean, default: true
33
+ option :cache, type: :boolean, default: true
34
+ option :debug, type: :boolean, default: false
35
+ option :only_recognized_file_types, type: :boolean, default: true
36
+ option :force_exclusion, type: :boolean, default: true
37
+
38
+ private
39
+
40
+ def define(reference, args: Undefined, **params)
41
+ handler = Rfix::Repository.new(
42
+ repository: reference.repository,
43
+ reference: reference
44
+ )
45
+
46
+ RuboCop::CommentConfig.class_eval do
47
+ concerning :Repository do
48
+ define_method(:repository, &handler.method(:itself))
49
+ end
50
+ end
51
+
52
+ Undefined.default(args, handler.paths).then do |paths|
53
+ RuboCop::CLI::Environment.new(params, RuboCop::ConfigStore.new, paths)
54
+ end.then do |env|
55
+ RuboCop::CLI::Command::ExecuteRunner.new(env).run
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end