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
@@ -0,0 +1,111 @@
1
+ require "dry/types"
2
+ require "dry/struct"
3
+ require "dry/logic"
4
+
5
+ module Rfix
6
+ module Rake
7
+ Dry::Types.define_builder(:not) do |type|
8
+ Dry::Types::Constrained.new(type.lax, rule: Dry::Logic::Operations::Negation.new(type.rule))
9
+ end
10
+
11
+ class Gemfile < Dry::Struct
12
+ include Dry::Core::Constants, FileUtils
13
+
14
+ module Types
15
+ include Dry::Types()
16
+
17
+ module Version
18
+ AST = Types::String.enum("0.84")
19
+ end
20
+ end
21
+
22
+ attribute :root_path, Types::Instance(Pathname)
23
+ attribute :version, Types::Version::AST.not
24
+
25
+ class AST < self
26
+ attribute :version, Types::Version::AST
27
+
28
+ def content
29
+ [super, 'gem "rubocop-ast", "< 0.7"'].join("\n")
30
+ end
31
+ end
32
+
33
+ FORMAT = "Gemfile.rubocop-%s%s"
34
+ VERSIONS = [
35
+ '0.82',
36
+ '0.83',
37
+ '0.84',
38
+ '0.92',
39
+ '0.93',
40
+ '1.0.0',
41
+ '1.7.0',
42
+ '1.5.0',
43
+ '1.5.1',
44
+ '1.5.2',
45
+ '1.6.1',
46
+ '1.8.1',
47
+ '1.8.0',
48
+ '1.9.0',
49
+ '1.10.0',
50
+ '1.11.0',
51
+ '1.12.0',
52
+ '1.12.1',
53
+ '1.13.0'
54
+ ]
55
+
56
+ def self.call(*args, **kwargs, &block)
57
+ (self | AST).call(*args, **kwargs, &block)
58
+ end
59
+
60
+ def self.files(root_path)
61
+ VERSIONS.map do |version|
62
+ Gemfile.call(root_path: root_path, version: version)
63
+ end
64
+ end
65
+
66
+ def call
67
+ puts "Working with #{version}"
68
+
69
+ gemfile.write(content)
70
+
71
+ if lockfile.exist?
72
+ lockfile.delete
73
+ end
74
+
75
+ bundle_lock
76
+ puts "Finished with #{version}"
77
+ end
78
+
79
+ def bundle_lock
80
+ sh *lock_args
81
+ rescue RuntimeError
82
+ sh *lock_args[0..-2]
83
+ end
84
+
85
+ def lock_args
86
+ ["bundle", "lock", "--gemfile", gemfile.to_path, "--local"]
87
+ end
88
+
89
+ def to_s
90
+ gemfile.to_s
91
+ end
92
+
93
+ private
94
+
95
+ def gemfile
96
+ root_path.join(FORMAT % [version, EMPTY_STRING])
97
+ end
98
+
99
+ def lockfile
100
+ root_path.join(FORMAT % [version, ".lock"])
101
+ end
102
+
103
+ def content
104
+ <<~GEMFILE
105
+ eval_gemfile("../Gemfile")
106
+ gem "rubocop", "#{version}"
107
+ GEMFILE
108
+ end
109
+ end
110
+ end
111
+ end
@@ -1,16 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Travis
2
- SETUP = "travis:setup".freeze
3
- INSTALL = "travis:install".freeze
4
- TASKS = "travis:tasks:all".freeze
5
- GIT = "travis:git:config".freeze
4
+ SETUP = "travis:setup"
5
+ INSTALL = "travis:install"
6
+ TASKS = "travis:tasks:all"
7
+ GIT = "travis:git:config"
6
8
  end
7
9
 
8
10
  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
11
+ INSTALL = "bundle:install"
12
+ ADD = "bundle:git:add"
13
+ TAG = "rally-point"
14
+ REBUILD = "bundle:rebuild"
15
+ BUILD = "bundle:build"
14
16
  ROOT = Dir.getwd
15
17
  CONFIG = File.join(ROOT, ".rubocop.yml")
16
18
  DIR = File.join(ROOT, "spec/fixtures")
@@ -19,21 +21,21 @@ module Bundle
19
21
  module Simple
20
22
  FILE = File.join(DIR, "simple.bundle")
21
23
  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
24
+ REBUILD = "bundle:simple:rebuild"
25
+ BUILD = "bundle:simple:build"
26
+ FLUSH = "bundle:simple:flush"
27
+ TEST = "bundle:simple:test"
26
28
  TAG = Bundle::TAG
27
29
  end
28
30
 
29
31
  module Complex
30
32
  FILE = File.join(DIR, "complex.bundle")
31
33
  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
34
+ GITHUB = "https://github.com/oleander/git-fame-rb"
35
+ REBUILD = "bundle:complex:rebuild"
36
+ BUILD = "bundle:complex:build"
37
+ FLUSH = "bundle:complex:flush"
38
+ TEST = "bundle:complex:test"
37
39
  TAG = Bundle::TAG
38
40
  end
39
41
  end
@@ -42,9 +44,9 @@ module Vendor
42
44
  ROOT = File.expand_path(File.join(__dir__, "../../.."))
43
45
  DIR = File.join(ROOT, "vendor/shopify")
44
46
  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
47
+ GITHUB = "https://github.com/shopify/cli-ui"
48
+ START = "6058c301bb144c2f33f7910734d08b1490ed8112"
49
+ BUILD = "vendor:shopify:build"
50
+ REBUILD = "vendor:shopify:rebuild"
51
+ TEST = "vendor:shopify:test"
50
52
  end
@@ -1,75 +1,90 @@
1
- require "colorize"
2
- require "fileutils"
1
+ # frozen_string_literal: true
2
+
3
+ require "rainbow/ext/string"
3
4
  require "shellwords"
5
+ require "fileutils"
4
6
 
5
- module Rfix::Support
6
- include FileUtils
7
+ module Rfix
8
+ module Rake
9
+ module Support
10
+ class Utils
11
+ include FileUtils
12
+ end
7
13
 
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
+ def self.extended(base)
15
+ super
14
16
 
15
- def gemfiles
16
- Dir["Gemfile*", "ci/Gemfile*"]
17
- end
17
+ utils = Utils.new
18
18
 
19
- def say(msg)
20
- $stderr.puts "#{'==>'.blue} #{to_relative(msg).italic}"
21
- end
19
+ %i[cd sh rm_rf rm_f rm mkdir_p chdir].each do |name|
20
+ base.define_singleton_method("_#{name}".to_sym, &utils.method(name))
21
+ end
22
+ end
22
23
 
23
- def sh(*args)
24
- args = args.map(&:shellsplit).flatten
25
- colorize args
26
- _sh(*args)
27
- end
24
+ def gemfiles
25
+ Dir["Gemfile*", "ci/Gemfile*"]
26
+ end
28
27
 
29
- def chdir(*args, &block)
30
- colorize :cd, args
31
- _chdir(*args, &block)
32
- end
28
+ def say(msg)
29
+ warn "#{'==>'.color(:blue)} #{to_relative(msg).italic}"
30
+ end
33
31
 
34
- def rm_rf(*args)
35
- colorize :rm, args
36
- _rm_rf(*args)
37
- end
32
+ def directory(*args)
33
+ mkdir_p args
34
+ end
38
35
 
39
- def rm_f(*args)
40
- colorize :rm, args
41
- _rm_f(*args)
42
- end
36
+ def sh(*args)
37
+ args = args.map(&:to_s).map(&:shellsplit).flatten
38
+ colorize args
39
+ _sh(*args)
40
+ end
43
41
 
44
- def cd(*args, &block)
45
- colorize :cd, args
46
- _cd(*args, &block)
47
- end
42
+ def chdir(*args, &block)
43
+ colorize :cd, args
44
+ _chdir(*args, &block)
45
+ end
48
46
 
49
- def mkdir_p(*args)
50
- colorize :mkdir, args
51
- _mkdir_p(*args)
52
- end
47
+ def rm_rf(*args)
48
+ colorize :rm, args
49
+ _rm_rf(*args)
50
+ end
53
51
 
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
52
+ def rm_f(*args)
53
+ colorize :rm, args
54
+ _rm_f(*args)
55
+ end
60
56
 
61
- private
57
+ def cd(*args, &block)
58
+ colorize :cd, args
59
+ _cd(*args, &block)
60
+ end
62
61
 
63
- def current_path
64
- File.join(Dir.getwd, "/")
65
- end
62
+ def mkdir_p(*args)
63
+ colorize :mkdir, args
64
+ _mkdir_p(*args)
65
+ end
66
66
 
67
- def to_relative(path)
68
- path.to_s.gsub(current_path, "")
69
- end
67
+ def clone_and_run(&block)
68
+ Dir.mktmpdir do |repo|
69
+ sh "git clone", Bundle::Complex::FILE, repo, "--branch", "master"
70
+ Dir.chdir(repo) { block.call(repo) }
71
+ end
72
+ end
70
73
 
71
- def colorize(*args)
72
- head, *tail = args.flatten.map(&method(:to_relative))
73
- say [head.yellow, tail.join(" ").italic].join(" ")
74
+ private
75
+
76
+ def current_path
77
+ ::File.join(Dir.getwd, "/")
78
+ end
79
+
80
+ def to_relative(path)
81
+ path.to_s.gsub(current_path, "")
82
+ end
83
+
84
+ def colorize(*args)
85
+ head, *tail = args.flatten.map(&method(:to_relative))
86
+ say [head.color(:yellow), tail.join(" ").italic].join(" ")
87
+ end
88
+ end
74
89
  end
75
90
  end
@@ -1,202 +1,152 @@
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, "Need Branch::Base, got {{error:#{reference.class}}}"
22
- end
1
+ # frozen_string_literal: true
23
2
 
24
- @files = FileCache.new(root_path)
25
- @repo = Rugged::Repository.new(root_path)
26
- @paths = paths
27
- @reference = reference
28
- @load_untracked = load_untracked
3
+ require "active_support/core_ext/module/delegation"
4
+ require "dry/core/constants"
5
+ require "dry/core/memoizable"
6
+ require "dry/struct"
7
+ require "rugged"
29
8
 
30
- load!
31
- end
9
+ module Rfix
10
+ class Repository < Dry::Struct
11
+ include Dry::Core::Constants
12
+ include Log
32
13
 
33
- def load_untracked?
34
- @load_untracked
35
- end
14
+ attribute :repository, Types.Instance(Rugged::Repository)
36
15
 
37
- def load_tracked?
38
- !!@reference
39
- end
16
+ attribute :reference, Types.Instance(Branch::Base)
40
17
 
41
- attr_reader :reference
18
+ delegate :head, :branches, :workdir, :rev_parse, :diff_workdir, to: :repository
42
19
 
43
- def refresh!(path)
44
- @files.get(path).refresh!
45
- end
20
+ OPTIONS = {
21
+ include_untracked_content: true,
22
+ ignore_whitespace_change: false,
23
+ recurse_untracked_dirs: true,
24
+ ignore_whitespace_eol: false,
25
+ include_unmodified: true,
26
+ include_untracked: true,
27
+ ignore_submodules: true,
28
+ include_ignored: false,
29
+ context_lines: 0
30
+ }.freeze
46
31
 
47
- def include?(path, line)
48
- say_debug "Checking #{path}:#{line}"
32
+ def initialize(*)
33
+ super
34
+ call
35
+ end
49
36
 
50
- if file = @files.get(path)
51
- return file.include?(line)
37
+ def origin
38
+ reference.resolve
52
39
  end
53
40
 
54
- say_debug "\tSkip file (return false)"
55
- return false
56
- end
41
+ def status(found = EMPTY_HASH.dup)
42
+ @status ||= begin
43
+ repository.status do |path, statuses|
44
+ statuses.each do |status|
45
+ (found[path] ||= []) << status
46
+ end
47
+ end
48
+
49
+ if repository.head_unborn?
50
+ return found
51
+ end
52
+
53
+ origin.diff_workdir(**OPTIONS.dup).tap do |diff|
54
+ diff.find_similar!(
55
+ renames_from_rewrites: true,
56
+ renames: true,
57
+ copies: true
58
+ )
59
+ end.each_delta.each_with_object(found) do |delta, acc|
60
+ (acc[delta.new_file[:path]] ||= []) << delta.status
61
+ end
62
+ end
63
+ end
57
64
 
58
- def set_root(_path_path)
59
- using_path(root_path)
60
- end
65
+ def call
66
+ status.each do |path, statuses|
67
+ build(path, statuses)
68
+ end
69
+ end
61
70
 
62
- def paths
63
- files.pluck(&:absolute_path)
64
- end
71
+ def path
72
+ Pathname(workdir)
73
+ end
65
74
 
66
- def current_branch
67
- repo.head.name
68
- end
75
+ # @path [String]
76
+ def refresh!(*)
77
+ # NOP
78
+ end
69
79
 
70
- def has_reference?(reference)
71
- repo.rev_parse(reference)
72
- rescue Rugged::ReferenceError
73
- return false
74
- end
80
+ # @path [String]
81
+ # @line [Integer]
82
+ # @return Bool
83
+ def include?(path, line)
84
+ get(path).include?(line)
85
+ rescue KeyError
86
+ false
87
+ end
75
88
 
76
- def local_branches
77
- repo.branches.each_name(:local).to_a
78
- end
89
+ def skipped
90
+ ignored + deleted
91
+ end
79
92
 
80
- def git_path
81
- repo.workdir
82
- end
93
+ def tracked
94
+ files.values.select(&:tracked?)
95
+ end
83
96
 
84
- def head
85
- @head ||= repo.rev_parse("HEAD")
86
- end
97
+ def ignored
98
+ files.values.select(&:ignored?)
99
+ end
87
100
 
88
- def upstream
89
- @upstream ||= reference.resolve(with: repo)
90
- end
101
+ def untracked
102
+ files.values.select(&:untracked?)
103
+ end
91
104
 
92
- private
105
+ def deleted
106
+ files.values.select(&:deleted?)
107
+ end
93
108
 
94
- def load_tracked!
95
- params = {
96
- # ignore_whitespace_change: true,
97
- include_untracked_content: true,
98
- recurse_untracked_dirs: true,
99
- # ignore_whitespace_eol: true,
100
- include_unmodified: false,
101
- include_untracked: true,
102
- ignore_submodules: true,
103
- # ignore_whitespace: true,
104
- include_ignored: false,
105
- context_lines: 0
106
- }
107
-
108
- unless @paths.empty?
109
- say_debug("Use @paths #{@paths.join(', ')}")
110
- params[:disable_pathspec_match] = false
111
- params[:paths] = @paths
112
- end
113
-
114
- say_debug("Run diff on {{info:#{reference}}}")
115
- upstream.diff(head, **params).tap do |diff|
116
- diff.find_similar!(
117
- renames_from_rewrites: true,
118
- renames: true,
119
- copies: true
120
- )
121
- end.each_delta do |delta|
122
- path = delta.new_file.fetch(:path)
123
- say_debug("Found #{path} while diff")
124
- try_store(path, [delta.status])
125
- end
126
- rescue Rugged::ReferenceError
127
- abort_box($ERROR_INFO.to_s) do
128
- prt "Reference {{error:#{reference}}} cannot be found in repository"
129
- end
130
- rescue Rugged::ConfigError
131
- abort_box($ERROR_INFO.to_s) do
132
- prt "No upstream branch set for {{error:#{current_branch}}}"
133
- end
134
- rescue TypeError
135
- abort_box($ERROR_INFO.to_s) do
136
- prt "Reference {{error:#{reference}}} is not pointing to a tree or commit"
109
+ def permitted
110
+ untracked + tracked
137
111
  end
138
- end
139
112
 
140
- def load!
141
- load_tracked!
142
- load_untracked!
143
- end
113
+ def to_s
114
+ options = {
115
+ untracked: untracked.map(&:basename).join(", "),
116
+ tracked: tracked.map(&:basename).join(", "),
117
+ ignored: ignored.map(&:basename).join(", "),
118
+ deleted: deleted.map(&:basename).join(", ")
119
+ }
144
120
 
145
- # https://github.com/libgit2/rugged/blob/35102c0ca10ab87c4c4ffe2e25221d26993c069c/test/status_test.rb
146
- # - +:index_new+: the file is new in the index
147
- # - +:index_modified+: the file has been modified in the index
148
- # - +:index_deleted+: the file has been deleted from the index
149
- # - +:worktree_new+: the file is new in the working directory
150
- # - +:worktree_modified+: the file has been modified in the working directory
151
- # - +:worktree_deleted+: the file has been deleted from the working directory
152
-
153
- MODIFIED = [:modified, :worktree_modified, :index_modified].freeze
154
- IGNORED = [:ignored].freeze
155
- STAGED = [:added, :index_new].freeze
156
- UNTRACKED = [:worktree_new, :untracked].freeze
157
- COPIED = [:copied].freeze
158
- DELETED = [:deleted, :worktree_deleted, :index_deleted].freeze
159
- RENAMED = [:renamed].freeze
160
-
161
- SKIP = [*DELETED, *RENAMED, *COPIED, *IGNORED].freeze
162
- ACCEPT = [*MODIFIED].freeze
163
-
164
- def load_untracked!
165
- repo.status do |path, status|
166
- try_store(path, status)
121
+ "Repository<Untracked: %<untracked>s, Tracked: %<tracked>s, Ignored: %<ignored>s, Deleted: %<deleted>s>" % options
167
122
  end
168
- end
169
123
 
170
- def store(file)
171
- say_debug("Trying to add #{file.absolute_path}")
172
- if File.exist?(file.absolute_path)
173
- @files.add(file)
174
- else
175
- say_debug "#{file} does not exist"
124
+ def files
125
+ @files ||= EMPTY_HASH.dup
176
126
  end
177
- end
178
127
 
179
- def try_store(path, status)
180
- if SKIP.any?(&status.method(:include?))
181
- return say_debug("Ignored {{warning:#{status.join(', ')}}} #{path}")
128
+ def paths
129
+ permitted.map(&:basename)
182
130
  end
183
131
 
184
- if STAGED.any?(&status.method(:include?))
185
- return store(Rfix::Untracked.new(path, repo, nil))
132
+ def include_file?(path)
133
+ permitted.include?(files.fetch(path, Undefined))
186
134
  end
187
135
 
188
- if UNTRACKED.any?(&status.method(:include?))
189
- unless load_untracked?
190
- return say_debug("Ignore #{path} as untracked files are ignored: #{status}")
191
- end
136
+ private
192
137
 
193
- return store(Rfix::Untracked.new(path, repo, nil))
138
+ def store(file)
139
+ files.store(file.key, file)
194
140
  end
195
141
 
196
- if ACCEPT.any?(&status.method(:include?))
197
- return store(Rfix::Tracked.new(path, repo, reference))
142
+ def get(path)
143
+ files.fetch(path)
198
144
  end
199
145
 
200
- say_debug "Status not found {{error:#{status.join(', ')}}} for {{italic:#{path}}}"
146
+ def build(path, status)
147
+ store(Rfix::File.call(basename: path, status: status, repository: self))
148
+ rescue Dry::Struct::Error => e
149
+ raise Error, { path: path, status: status, message: e.message }.inspect
150
+ end
201
151
  end
202
152
  end