avm 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/lib/avm/executables.rb +24 -0
  3. data/lib/avm/files.rb +9 -0
  4. data/lib/avm/files/appendable.rb +55 -0
  5. data/lib/avm/files/appendable/file_content.rb +24 -0
  6. data/lib/avm/files/appendable/plain_directory.rb +25 -0
  7. data/lib/avm/files/appendable/resource_base.rb +13 -0
  8. data/lib/avm/files/appendable/tar_output_command.rb +26 -0
  9. data/lib/avm/files/appendable/templatized_directory.rb +29 -0
  10. data/lib/avm/files/appender.rb +11 -0
  11. data/lib/avm/files/deploy.rb +71 -0
  12. data/lib/avm/files/formatter.rb +90 -0
  13. data/lib/avm/files/formatter/formats.rb +13 -0
  14. data/lib/avm/files/formatter/formats/base.rb +62 -0
  15. data/lib/avm/files/formatter/formats/generic_plain.rb +34 -0
  16. data/lib/avm/files/formatter/formats/html.rb +45 -0
  17. data/lib/avm/files/formatter/formats/javascript.rb +23 -0
  18. data/lib/avm/files/formatter/formats/json.rb +27 -0
  19. data/lib/avm/files/formatter/formats/php.rb +21 -0
  20. data/lib/avm/files/formatter/formats/python.rb +21 -0
  21. data/lib/avm/files/formatter/formats/ruby.rb +22 -0
  22. data/lib/avm/files/formatter/formats/xml.rb +27 -0
  23. data/lib/avm/files/formatter/utf8_assert.rb +72 -0
  24. data/lib/avm/files/info.rb +24 -0
  25. data/lib/avm/files/rotate.rb +107 -0
  26. data/lib/avm/git.rb +10 -0
  27. data/lib/avm/git/auto_commit/commit_info.rb +23 -0
  28. data/lib/avm/git/auto_commit/rules.rb +31 -0
  29. data/lib/avm/git/auto_commit/rules/base.rb +39 -0
  30. data/lib/avm/git/auto_commit/rules/last.rb +19 -0
  31. data/lib/avm/git/auto_commit/rules/manual.rb +45 -0
  32. data/lib/avm/git/auto_commit/rules/new.rb +24 -0
  33. data/lib/avm/git/auto_commit/rules/nth.rb +31 -0
  34. data/lib/avm/git/auto_commit/rules/unique.rb +21 -0
  35. data/lib/avm/git/auto_commit_path.rb +28 -0
  36. data/lib/avm/git/auto_commit_path/ruby.rb +20 -0
  37. data/lib/avm/git/commit.rb +59 -0
  38. data/lib/avm/git/commit/class_methods.rb +31 -0
  39. data/lib/avm/git/commit/deploy.rb +38 -0
  40. data/lib/avm/git/commit/deploy_methods.rb +19 -0
  41. data/lib/avm/git/commit/diff_tree_line.rb +32 -0
  42. data/lib/avm/git/commit/file.rb +46 -0
  43. data/lib/avm/git/file_auto_fixup.rb +83 -0
  44. data/lib/avm/git/issue.rb +11 -0
  45. data/lib/avm/git/issue/complete.rb +51 -0
  46. data/lib/avm/git/issue/complete/commits.rb +42 -0
  47. data/lib/avm/git/issue/complete/git_subrepos.rb +23 -0
  48. data/lib/avm/git/issue/complete/local_branch.rb +54 -0
  49. data/lib/avm/git/issue/complete/local_tag.rb +39 -0
  50. data/lib/avm/git/issue/complete/push.rb +54 -0
  51. data/lib/avm/git/issue/complete/remote.rb +33 -0
  52. data/lib/avm/git/issue/complete/test.rb +45 -0
  53. data/lib/avm/git/issue/complete/tracker.rb +28 -0
  54. data/lib/avm/git/issue/complete/validation.rb +31 -0
  55. data/lib/avm/git/issue/complete/validations.rb +53 -0
  56. data/lib/avm/git/issue/complete/working_tree.rb +19 -0
  57. data/lib/avm/git/issue/deliver.rb +56 -0
  58. data/lib/avm/git/organize.rb +11 -0
  59. data/lib/avm/git/organize/reference_update.rb +34 -0
  60. data/lib/avm/git/organize/repository.rb +76 -0
  61. data/lib/avm/git/revision_test.rb +106 -0
  62. data/lib/avm/git/subrepo_check.rb +38 -0
  63. data/lib/avm/git/subrepo_check/parent.rb +51 -0
  64. data/lib/avm/git/subrepo_check/remote.rb +89 -0
  65. data/lib/avm/git/subrepo_check/show_result.rb +32 -0
  66. data/lib/avm/git/subrepo_checks.rb +59 -0
  67. data/lib/avm/result.rb +86 -0
  68. data/lib/avm/version.rb +1 -1
  69. metadata +123 -3
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module Git
7
+ class SubrepoCheck
8
+ require_sub __FILE__, include_modules: true
9
+ enable_speaker
10
+ enable_simple_cache
11
+
12
+ BLANK_TEXT = 'BLANK'
13
+
14
+ common_constructor :subrepo, :options
15
+
16
+ def blank_text
17
+ BLANK_TEXT
18
+ end
19
+
20
+ def check_remote?
21
+ options.fetch(:check_remote) ? true : false
22
+ end
23
+
24
+ def fix_parent?
25
+ options.fetch(:fix_parent) ? true : false
26
+ end
27
+
28
+ private
29
+
30
+ def result_uncached
31
+ return ::Avm::Result.error('Parent failed') if parent_result.error?
32
+ return ::Avm::Result.error('Remote failed') if remote_result.error?
33
+
34
+ ::Avm::Result.success('Parent and remote ok')
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/result'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Git
8
+ class SubrepoCheck
9
+ module Parent
10
+ def fix_parent
11
+ return if parent_result.success?
12
+
13
+ info(' Fixing...')
14
+ self.parent_hash = expected_parent_hash
15
+ info_banner
16
+ end
17
+
18
+ private
19
+
20
+ def expected_parent_hash_uncached
21
+ subrepo.local.rev_parse("#{last_file_change_rev}^")
22
+ end
23
+
24
+ def last_file_change_rev
25
+ subrepo.local.command('log', '-n', '1', '--pretty=format:%H', '--',
26
+ subrepo.config_relative_path.to_path).execute!.strip
27
+ end
28
+
29
+ def parent_hash
30
+ subrepo.parent_commit_id
31
+ end
32
+
33
+ def parent_hash=(new_hash)
34
+ subrepo.config.parent_commit_id = new_hash
35
+ subrepo.write_config
36
+ end
37
+
38
+ def parent_hash_ok?
39
+ return false if expected_parent_hash.blank? || parent_hash.blank?
40
+
41
+ expected_parent_hash == parent_hash
42
+ end
43
+
44
+ def parent_result_uncached
45
+ ::Avm::Result.success_or_error(parent_hash_ok?,
46
+ parent_hash.presence || blank_text)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/result'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Git
8
+ class SubrepoCheck
9
+ module Remote
10
+ private
11
+
12
+ def fetch_uncached
13
+ subrepo.command('clean').execute!
14
+ subrepo.command('fetch').execute!
15
+ end
16
+
17
+ def check_remote_disabled?
18
+ !check_remote?
19
+ end
20
+
21
+ def check_remote_disabled_result
22
+ ::Avm::Result.neutral('Check remote disabled')
23
+ end
24
+
25
+ def local_descend_remote?
26
+ local_id.present? && remote_id.present? && subrepo.local.descendant?(local_id, remote_id)
27
+ end
28
+
29
+ def local_descend_remote_result
30
+ ::Avm::Result.pending(remote_result_value)
31
+ end
32
+
33
+ def local_id_uncached
34
+ fetch
35
+ subrepo.command('branch', '--force').execute!
36
+ subrepo.local.rev_parse("subrepo/#{subrepo.subpath}")
37
+ end
38
+
39
+ def remote_descend_local?
40
+ local_id.present? && remote_id.present? && subrepo.local.descendant?(remote_id, local_id)
41
+ end
42
+
43
+ def remote_descend_local_result
44
+ ::Avm::Result.outdated(remote_result_value)
45
+ end
46
+
47
+ def remote_branches
48
+ ['', 'refs/heads/', 'refs/tags/'].map { |prefix| "#{prefix}#{subrepo.remote_branch}" }
49
+ end
50
+
51
+ def remote_id_uncached
52
+ ls_result = subrepo.remote.ls
53
+ remote_branches.each do |b|
54
+ return ls_result[b] if ls_result[b].present?
55
+ end
56
+ nil
57
+ end
58
+
59
+ def remote_result_uncached
60
+ %w[check_remote_disabled same_ids local_descend_remote remote_descend_local]
61
+ .each do |condition|
62
+ return send("#{condition}_result") if send("#{condition}?")
63
+ end
64
+
65
+ ::Avm::Result.error(remote_result_value)
66
+ end
67
+
68
+ def remote_result_value
69
+ local_s = local_id.presence || blank_text
70
+ remote_s = remote_id.presence || blank_text
71
+
72
+ if local_s == remote_s
73
+ "[L/R=#{local_s}]"
74
+ else
75
+ "[L=#{local_s}, R=#{remote_s}]"
76
+ end
77
+ end
78
+
79
+ def same_ids?
80
+ local_id.present? && remote_id.present? && local_id == remote_id
81
+ end
82
+
83
+ def same_ids_result
84
+ ::Avm::Result.success(remote_result_value)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module Git
7
+ class SubrepoCheck
8
+ module ShowResult
9
+ def show_result
10
+ out(subrepo.subpath.to_path.cyan)
11
+ out_attr('parent', parent_result.label)
12
+ run_fix_parent
13
+ out_attr('remote', remote_result.label)
14
+ out("\n")
15
+ end
16
+
17
+ def run_fix_parent
18
+ return unless fix_parent?
19
+ return unless parent_result.error?
20
+
21
+ out('|Fixing...'.white)
22
+ self.parent_hash = expected_parent_hash
23
+ out_attr('new parent', parent_result.label)
24
+ end
25
+
26
+ def out_attr(key, value)
27
+ out('|' + "#{key}=".white + value)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/git/subrepo_check'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module Git
8
+ class SubrepoChecks
9
+ enable_speaker
10
+ enable_simple_cache
11
+ attr_accessor :check_remote, :fix_parent
12
+ common_constructor :repository
13
+
14
+ def add_all_subrepos
15
+ add_subrepos(
16
+ *repository.command('subrepo', '-q', 'status').execute!.split("\n").map(&:strip)
17
+ .select(&:present?)
18
+ )
19
+ end
20
+
21
+ def add_subrepos(*subpath_list)
22
+ subpath_list.each do |subpath|
23
+ subpaths.add(subpath)
24
+ end
25
+ reset_cache
26
+ self
27
+ end
28
+
29
+ def check_options
30
+ { fix_parent: fix_parent, check_remote: check_remote }
31
+ end
32
+
33
+ def show_result
34
+ checks.each(&:show_result)
35
+ infov 'Result', result.label
36
+ end
37
+
38
+ private
39
+
40
+ def checks_uncached
41
+ subpaths.map do |subpath|
42
+ ::Avm::Git::SubrepoCheck.new(repository.subrepo(subpath), check_options)
43
+ end
44
+ end
45
+
46
+ def result_uncached
47
+ error_count = checks.count { |check| check.result.error? }
48
+ ::Avm::Result.success_or_error(
49
+ error_count.zero?,
50
+ "#{error_count} of #{checks.count} subrepos failed"
51
+ )
52
+ end
53
+
54
+ def subpaths
55
+ @subpaths ||= ::Set.new
56
+ end
57
+ end
58
+ end
59
+ end
data/lib/avm/result.rb ADDED
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'colorized_string'
4
+ require 'eac_ruby_utils/listable'
5
+ require 'eac_ruby_utils/core_ext'
6
+
7
+ module Avm
8
+ class Result < ::SimpleDelegator
9
+ include ::EacRubyUtils::Listable
10
+
11
+ lists.add_string :type, :success, :error, :neutral, :pending, :outdated
12
+
13
+ lists.type.values.each do |type| # rubocop:disable Style/HashEachMethods
14
+ class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
15
+ def self.#{type}(value)
16
+ new(value, TYPE_#{type.upcase})
17
+ end
18
+ RUBY_EVAL
19
+ end
20
+
21
+ TYPE_SUCCESS_COLOR = 'green'
22
+ TYPE_ERROR_COLOR = 'red'
23
+ TYPE_NEUTRAL_COLOR = 'light_black'
24
+ TYPE_PENDING_COLOR = 'yellow'
25
+ TYPE_OUTDATED_COLOR = 'blue'
26
+
27
+ class << self
28
+ # Return Avm::Result.success(success_value) if +success+ is truthy.
29
+ # Return Avm::Result.error(error_value || success_value) if +success+ is falsely.
30
+ # @return [Avm::Result]
31
+ def success_or_error(success, success_value, error_value = nil)
32
+ if success
33
+ self.success(success_value)
34
+ else
35
+ error(error_value.presence || success_value)
36
+ end
37
+ end
38
+ end
39
+
40
+ attr_reader :type
41
+
42
+ def initialize(value, type)
43
+ super(value)
44
+ validate_type(type)
45
+ @type = type
46
+ end
47
+
48
+ def label
49
+ label_fg
50
+ end
51
+
52
+ def label_fg
53
+ ColorizedString.new(to_s).send(type_color)
54
+ end
55
+
56
+ def label_bg
57
+ ColorizedString.new(to_s).light_white.send("on_#{type_color}")
58
+ end
59
+
60
+ def type_color
61
+ self.class.const_get("type_#{type}_color".upcase)
62
+ end
63
+
64
+ lists.type.values.each do |type| # rubocop:disable Style/HashEachMethods
65
+ class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
66
+ def #{type}?
67
+ @type == '#{type}'
68
+ end
69
+ RUBY_EVAL
70
+ end
71
+
72
+ private
73
+
74
+ def validate_type(type)
75
+ return if self.class.lists.type.values.include?(type)
76
+
77
+ raise "Tipo desconhecido: \"#{type}\" (Válido: #{self.class.lists.type.values.join(', ')})"
78
+ end
79
+
80
+ class Error < StandardError
81
+ def to_result
82
+ ::Avm::Result.error(message)
83
+ end
84
+ end
85
+ end
86
+ end
data/lib/avm/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Avm
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo H. Bogoni
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-07 00:00:00.000000000 Z
11
+ date: 2021-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eac_docker
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: eac_git
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.6'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: eac_ruby_utils
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,46 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0.68'
55
+ - !ruby/object:Gem::Dependency
56
+ name: eac_templates
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.1'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 0.1.1
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '0.1'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 0.1.1
75
+ - !ruby/object:Gem::Dependency
76
+ name: aranha-parsers
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.7'
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 0.7.2
85
+ type: :development
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '0.7'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 0.7.2
41
95
  - !ruby/object:Gem::Dependency
42
96
  name: eac_ruby_gem_support
43
97
  requirement: !ruby/object:Gem::Requirement
@@ -63,7 +117,73 @@ files:
63
117
  - lib/avm/docker/container.rb
64
118
  - lib/avm/docker/image.rb
65
119
  - lib/avm/docker/runner.rb
120
+ - lib/avm/executables.rb
121
+ - lib/avm/files.rb
122
+ - lib/avm/files/appendable.rb
123
+ - lib/avm/files/appendable/file_content.rb
124
+ - lib/avm/files/appendable/plain_directory.rb
125
+ - lib/avm/files/appendable/resource_base.rb
126
+ - lib/avm/files/appendable/tar_output_command.rb
127
+ - lib/avm/files/appendable/templatized_directory.rb
128
+ - lib/avm/files/appender.rb
129
+ - lib/avm/files/deploy.rb
130
+ - lib/avm/files/formatter.rb
131
+ - lib/avm/files/formatter/formats.rb
132
+ - lib/avm/files/formatter/formats/base.rb
133
+ - lib/avm/files/formatter/formats/generic_plain.rb
134
+ - lib/avm/files/formatter/formats/html.rb
135
+ - lib/avm/files/formatter/formats/javascript.rb
136
+ - lib/avm/files/formatter/formats/json.rb
137
+ - lib/avm/files/formatter/formats/php.rb
138
+ - lib/avm/files/formatter/formats/python.rb
139
+ - lib/avm/files/formatter/formats/ruby.rb
140
+ - lib/avm/files/formatter/formats/xml.rb
141
+ - lib/avm/files/formatter/utf8_assert.rb
142
+ - lib/avm/files/info.rb
143
+ - lib/avm/files/rotate.rb
144
+ - lib/avm/git.rb
145
+ - lib/avm/git/auto_commit/commit_info.rb
146
+ - lib/avm/git/auto_commit/rules.rb
147
+ - lib/avm/git/auto_commit/rules/base.rb
148
+ - lib/avm/git/auto_commit/rules/last.rb
149
+ - lib/avm/git/auto_commit/rules/manual.rb
150
+ - lib/avm/git/auto_commit/rules/new.rb
151
+ - lib/avm/git/auto_commit/rules/nth.rb
152
+ - lib/avm/git/auto_commit/rules/unique.rb
153
+ - lib/avm/git/auto_commit_path.rb
154
+ - lib/avm/git/auto_commit_path/ruby.rb
155
+ - lib/avm/git/commit.rb
156
+ - lib/avm/git/commit/class_methods.rb
157
+ - lib/avm/git/commit/deploy.rb
158
+ - lib/avm/git/commit/deploy_methods.rb
159
+ - lib/avm/git/commit/diff_tree_line.rb
160
+ - lib/avm/git/commit/file.rb
161
+ - lib/avm/git/file_auto_fixup.rb
162
+ - lib/avm/git/issue.rb
163
+ - lib/avm/git/issue/complete.rb
164
+ - lib/avm/git/issue/complete/commits.rb
165
+ - lib/avm/git/issue/complete/git_subrepos.rb
166
+ - lib/avm/git/issue/complete/local_branch.rb
167
+ - lib/avm/git/issue/complete/local_tag.rb
168
+ - lib/avm/git/issue/complete/push.rb
169
+ - lib/avm/git/issue/complete/remote.rb
170
+ - lib/avm/git/issue/complete/test.rb
171
+ - lib/avm/git/issue/complete/tracker.rb
172
+ - lib/avm/git/issue/complete/validation.rb
173
+ - lib/avm/git/issue/complete/validations.rb
174
+ - lib/avm/git/issue/complete/working_tree.rb
175
+ - lib/avm/git/issue/deliver.rb
176
+ - lib/avm/git/organize.rb
177
+ - lib/avm/git/organize/reference_update.rb
178
+ - lib/avm/git/organize/repository.rb
179
+ - lib/avm/git/revision_test.rb
180
+ - lib/avm/git/subrepo_check.rb
181
+ - lib/avm/git/subrepo_check/parent.rb
182
+ - lib/avm/git/subrepo_check/remote.rb
183
+ - lib/avm/git/subrepo_check/show_result.rb
184
+ - lib/avm/git/subrepo_checks.rb
66
185
  - lib/avm/instances/docker_image.rb
186
+ - lib/avm/result.rb
67
187
  - lib/avm/version.rb
68
188
  - lib/avm/version_number.rb
69
189
  homepage:
@@ -84,7 +204,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
204
  - !ruby/object:Gem::Version
85
205
  version: '0'
86
206
  requirements: []
87
- rubygems_version: 3.0.9
207
+ rubygems_version: 3.1.6
88
208
  signing_key:
89
209
  specification_version: 4
90
210
  summary: Ruby base library for Agora Vai! Methodology (https://avm.esquiloazul.tech).