pd1_tools 0.43.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +12 -0
- data/exe/pd1 +8 -0
- data/lib/avmtrf1/active_directory/user.rb +28 -0
- data/lib/avmtrf1/active_directory.rb +8 -0
- data/lib/avmtrf1/ad_user.rb +11 -0
- data/lib/avmtrf1/check_point/session/login.rb +57 -0
- data/lib/avmtrf1/check_point/session.rb +60 -0
- data/lib/avmtrf1/check_point.rb +3 -0
- data/lib/avmtrf1/default_esosti.rb +20 -0
- data/lib/avmtrf1/default_jira.rb +18 -0
- data/lib/avmtrf1/default_redmine.rb +16 -0
- data/lib/avmtrf1/docker/image.rb +49 -0
- data/lib/avmtrf1/docker/image_runner.rb +83 -0
- data/lib/avmtrf1/docker.rb +9 -0
- data/lib/avmtrf1/esosti/entities/issue.rb +24 -0
- data/lib/avmtrf1/esosti/entities.rb +9 -0
- data/lib/avmtrf1/esosti/instance/changed.rb +33 -0
- data/lib/avmtrf1/esosti/instance.rb +22 -0
- data/lib/avmtrf1/esosti/raw_data_sanitizer.rb +47 -0
- data/lib/avmtrf1/esosti/session/action_base.rb +34 -0
- data/lib/avmtrf1/esosti/session/atividades.rb +35 -0
- data/lib/avmtrf1/esosti/session/login.rb +47 -0
- data/lib/avmtrf1/esosti/session/solicitacao/main.rb +49 -0
- data/lib/avmtrf1/esosti/session/solicitacao.rb +81 -0
- data/lib/avmtrf1/esosti/session.rb +36 -0
- data/lib/avmtrf1/esosti.rb +8 -0
- data/lib/avmtrf1/executables.rb +23 -0
- data/lib/avmtrf1/forponto/parsers/day_registers.rb +19 -0
- data/lib/avmtrf1/forponto/parsers/espelho/day_node.rb +50 -0
- data/lib/avmtrf1/forponto/parsers/espelho/methods_as_fields.rb +21 -0
- data/lib/avmtrf1/forponto/parsers/espelho/row_node.rb +34 -0
- data/lib/avmtrf1/forponto/parsers/espelho/rows_consumer.rb +71 -0
- data/lib/avmtrf1/forponto/parsers/espelho/sub_node.rb +20 -0
- data/lib/avmtrf1/forponto/parsers/espelho/summary_node.rb +55 -0
- data/lib/avmtrf1/forponto/parsers/espelho/utils.rb +32 -0
- data/lib/avmtrf1/forponto/parsers/espelho.rb +26 -0
- data/lib/avmtrf1/forponto/session/day_registers.rb +39 -0
- data/lib/avmtrf1/forponto/session/interval.rb +27 -0
- data/lib/avmtrf1/forponto/session/login.rb +45 -0
- data/lib/avmtrf1/forponto/session.rb +32 -0
- data/lib/avmtrf1/forponto/user/balance.rb +155 -0
- data/lib/avmtrf1/forponto/user/day_registers.rb +32 -0
- data/lib/avmtrf1/forponto/user/month.rb +141 -0
- data/lib/avmtrf1/forponto/user.rb +22 -0
- data/lib/avmtrf1/git/cached_repository.rb +27 -0
- data/lib/avmtrf1/git/gitlab.rb +11 -0
- data/lib/avmtrf1/git/issue_on_repository.rb +100 -0
- data/lib/avmtrf1/git/push_large/_utils.rb +16 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/cache.rb +21 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/checkout_previous_revision.rb +35 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/commit_changes.rb +48 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/helpers.rb +29 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/pick_source_revision.rb +103 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/push.rb +90 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/track_large_files.rb +53 -0
- data/lib/avmtrf1/git/push_large/lfs_commit.rb +47 -0
- data/lib/avmtrf1/git/push_large/source_commit/push.rb +42 -0
- data/lib/avmtrf1/git/push_large/source_commit.rb +58 -0
- data/lib/avmtrf1/git/push_large.rb +69 -0
- data/lib/avmtrf1/git/reference.rb +34 -0
- data/lib/avmtrf1/git.rb +10 -0
- data/lib/avmtrf1/gitlab/commit.rb +37 -0
- data/lib/avmtrf1/gitlab/repository.rb +41 -0
- data/lib/avmtrf1/ini/profile.rb +42 -0
- data/lib/avmtrf1/ini.rb +55 -0
- data/lib/avmtrf1/inventario_sistemas/parser/body.rb +27 -0
- data/lib/avmtrf1/inventario_sistemas/parser/body_row.rb +12 -0
- data/lib/avmtrf1/inventario_sistemas/parser/header.rb +38 -0
- data/lib/avmtrf1/inventario_sistemas/parser/header_column.rb +27 -0
- data/lib/avmtrf1/inventario_sistemas/parser.rb +40 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base/elements.rb +54 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base/layout.rb +55 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base/stylesheet.css +57 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/html_page_base.rb +41 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/index.rb +20 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/sistema.rb +62 -0
- data/lib/avmtrf1/inventario_sistemas/site_build/sistemas_index.rb +31 -0
- data/lib/avmtrf1/inventario_sistemas/site_build.rb +71 -0
- data/lib/avmtrf1/inventario_sistemas.rb +38 -0
- data/lib/avmtrf1/issues/factory.rb +22 -0
- data/lib/avmtrf1/issues.rb +7 -0
- data/lib/avmtrf1/jira/entities/issue.rb +30 -0
- data/lib/avmtrf1/jira/entities.rb +9 -0
- data/lib/avmtrf1/jira/instance.rb +28 -0
- data/lib/avmtrf1/jira.rb +8 -0
- data/lib/avmtrf1/node_js/docker_image.rb +14 -0
- data/lib/avmtrf1/node_js.rb +9 -0
- data/lib/avmtrf1/openvpn/config/builder.rb +59 -0
- data/lib/avmtrf1/openvpn/config/parser/builder.rb +62 -0
- data/lib/avmtrf1/openvpn/config/parser/line.rb +47 -0
- data/lib/avmtrf1/openvpn/config/parser/simple.rb +27 -0
- data/lib/avmtrf1/openvpn/config/parser/tag.rb +39 -0
- data/lib/avmtrf1/openvpn/config/parser.rb +20 -0
- data/lib/avmtrf1/oracle/connection/base.rb +66 -0
- data/lib/avmtrf1/oracle/connection/string_builder.rb +44 -0
- data/lib/avmtrf1/oracle/connection.rb +12 -0
- data/lib/avmtrf1/oracle/object/base.rb +39 -0
- data/lib/avmtrf1/oracle/object/table.rb +15 -0
- data/lib/avmtrf1/oracle/object/user.rb +15 -0
- data/lib/avmtrf1/oracle/object/view.rb +15 -0
- data/lib/avmtrf1/oracle/object.rb +25 -0
- data/lib/avmtrf1/oracle/objects/relation.rb +23 -0
- data/lib/avmtrf1/oracle/objects/sql_builder.rb +64 -0
- data/lib/avmtrf1/oracle/objects.rb +53 -0
- data/lib/avmtrf1/oracle/oci8.rb +29 -0
- data/lib/avmtrf1/oracle.rb +10 -0
- data/lib/avmtrf1/patches/avm/git/issue/complete.rb +50 -0
- data/lib/avmtrf1/patches/avm/git/issue.rb +4 -0
- data/lib/avmtrf1/patches/avm/git/launcher/base.rb +46 -0
- data/lib/avmtrf1/patches/avm/git/launcher.rb +4 -0
- data/lib/avmtrf1/patches/avm/git.rb +4 -0
- data/lib/avmtrf1/patches/avm.rb +4 -0
- data/lib/avmtrf1/patches/inifile.rb +13 -0
- data/lib/avmtrf1/patches.rb +4 -0
- data/lib/avmtrf1/php/docker_images/base.rb +49 -0
- data/lib/avmtrf1/php/docker_images/factory.rb +37 -0
- data/lib/avmtrf1/php/docker_images/v5.rb +47 -0
- data/lib/avmtrf1/php/docker_images/v7.rb +27 -0
- data/lib/avmtrf1/php/docker_images/v7_v4.rb +30 -0
- data/lib/avmtrf1/php/docker_images/v8.rb +19 -0
- data/lib/avmtrf1/php/docker_images.rb +11 -0
- data/lib/avmtrf1/php.rb +9 -0
- data/lib/avmtrf1/red/client/authorization.xml.erb +4 -0
- data/lib/avmtrf1/red/client.rb +38 -0
- data/lib/avmtrf1/red/helper.rb +35 -0
- data/lib/avmtrf1/red/profile/put_file.xml.erb +19 -0
- data/lib/avmtrf1/red/profile.rb +58 -0
- data/lib/avmtrf1/red/server.rb +33 -0
- data/lib/avmtrf1/red.rb +5 -0
- data/lib/avmtrf1/redmine/entities/issue.rb +29 -0
- data/lib/avmtrf1/redmine/entities/issue_status.rb +23 -0
- data/lib/avmtrf1/redmine/entities.rb +10 -0
- data/lib/avmtrf1/redmine/instance.rb +41 -0
- data/lib/avmtrf1/redmine.rb +7 -0
- data/lib/avmtrf1/rest_provider/entity.rb +18 -0
- data/lib/avmtrf1/rest_provider/instance/issues.rb +30 -0
- data/lib/avmtrf1/rest_provider/instance.rb +30 -0
- data/lib/avmtrf1/rest_provider/request.rb +44 -0
- data/lib/avmtrf1/rest_provider/response.rb +73 -0
- data/lib/avmtrf1/rest_provider.rb +7 -0
- data/lib/avmtrf1/result.rb +44 -0
- data/lib/avmtrf1/ruby.rb +9 -0
- data/lib/avmtrf1/tools/application.rb +13 -0
- data/lib/avmtrf1/tools/core_ext.rb +4 -0
- data/lib/avmtrf1/tools/msgraph/api/entity.rb +35 -0
- data/lib/avmtrf1/tools/msgraph/api/member.rb +31 -0
- data/lib/avmtrf1/tools/msgraph/api/root.rb +27 -0
- data/lib/avmtrf1/tools/msgraph/api/team/member_add.rb +36 -0
- data/lib/avmtrf1/tools/msgraph/api/team.rb +40 -0
- data/lib/avmtrf1/tools/msgraph/api.rb +55 -0
- data/lib/avmtrf1/tools/msgraph/error.rb +31 -0
- data/lib/avmtrf1/tools/msgraph/request_mixin.rb +18 -0
- data/lib/avmtrf1/tools/msgraph/response_mixin.rb +23 -0
- data/lib/avmtrf1/tools/msgraph/token_retrieve.rb +42 -0
- data/lib/avmtrf1/tools/msgraph.rb +11 -0
- data/lib/avmtrf1/tools/rubygems/dependency.rb +20 -0
- data/lib/avmtrf1/tools/rubygems/not_found_error.rb +17 -0
- data/lib/avmtrf1/tools/rubygems.rb +11 -0
- data/lib/avmtrf1/tools/runner/check_point/login.rb +33 -0
- data/lib/avmtrf1/tools/runner/check_point.rb +17 -0
- data/lib/avmtrf1/tools/runner/esosti/changed.rb +39 -0
- data/lib/avmtrf1/tools/runner/esosti/fetch.rb +39 -0
- data/lib/avmtrf1/tools/runner/esosti/request.rb +76 -0
- data/lib/avmtrf1/tools/runner/esosti.rb +27 -0
- data/lib/avmtrf1/tools/runner/forponto/espelho.rb +47 -0
- data/lib/avmtrf1/tools/runner/forponto/marcacoes.rb +32 -0
- data/lib/avmtrf1/tools/runner/forponto/resumos.rb +87 -0
- data/lib/avmtrf1/tools/runner/forponto/saldo.rb +91 -0
- data/lib/avmtrf1/tools/runner/forponto.rb +70 -0
- data/lib/avmtrf1/tools/runner/git/gitlab/commit_link.rb +81 -0
- data/lib/avmtrf1/tools/runner/git/gitlab.rb +20 -0
- data/lib/avmtrf1/tools/runner/git/issues_check.rb +59 -0
- data/lib/avmtrf1/tools/runner/git/push_large.rb +46 -0
- data/lib/avmtrf1/tools/runner/git.rb +14 -0
- data/lib/avmtrf1/tools/runner/inventario_sistemas.rb +71 -0
- data/lib/avmtrf1/tools/runner/msgraph/joined_teams.rb +39 -0
- data/lib/avmtrf1/tools/runner/msgraph/request.rb +45 -0
- data/lib/avmtrf1/tools/runner/msgraph/team/member/add.rb +48 -0
- data/lib/avmtrf1/tools/runner/msgraph/team/member.rb +25 -0
- data/lib/avmtrf1/tools/runner/msgraph/team/members.rb +38 -0
- data/lib/avmtrf1/tools/runner/msgraph/team.rb +27 -0
- data/lib/avmtrf1/tools/runner/msgraph/token.rb +31 -0
- data/lib/avmtrf1/tools/runner/msgraph.rb +43 -0
- data/lib/avmtrf1/tools/runner/node_js/docker.rb +15 -0
- data/lib/avmtrf1/tools/runner/node_js.rb +18 -0
- data/lib/avmtrf1/tools/runner/openvpn.rb +91 -0
- data/lib/avmtrf1/tools/runner/oracle/query.rb +71 -0
- data/lib/avmtrf1/tools/runner/oracle/source_get.rb +51 -0
- data/lib/avmtrf1/tools/runner/oracle/user_clear.rb +59 -0
- data/lib/avmtrf1/tools/runner/oracle.rb +37 -0
- data/lib/avmtrf1/tools/runner/php/docker.rb +20 -0
- data/lib/avmtrf1/tools/runner/php.rb +18 -0
- data/lib/avmtrf1/tools/runner/red.rb +83 -0
- data/lib/avmtrf1/tools/runner/source.rb +14 -0
- data/lib/avmtrf1/tools/runner.rb +43 -0
- data/lib/avmtrf1/tools.rb +4 -0
- data/lib/pd1_tools/version.rb +5 -0
- data/lib/pd1_tools.rb +7 -0
- data/template/avmtrf1/node_js/docker_image/Dockerfile.template +25 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/config_banner.sh +15 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/init.sh +18 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/lib.sh +30 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/ng_serve.sh +16 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/npm_install.sh +21 -0
- data/template/avmtrf1/node_js/docker_image/auxiliary/start.sh +17 -0
- data/template/avmtrf1/php/docker_images/base/Dockerfile.template +104 -0
- data/template/avmtrf1/php/docker_images/base/aux/apache_foreground.sh +16 -0
- data/template/avmtrf1/php/docker_images/base/aux/apache_user.sh +54 -0
- data/template/avmtrf1/php/docker_images/base/aux/app_user_run.sh +17 -0
- data/template/avmtrf1/php/docker_images/base/aux/config_banner.sh +20 -0
- data/template/avmtrf1/php/docker_images/base/aux/init.sh +39 -0
- data/template/avmtrf1/php/docker_images/base/aux/laravel.sh +58 -0
- data/template/avmtrf1/php/docker_images/base/aux/lib.sh +70 -0
- data/template/avmtrf1/php/docker_images/base/aux/pear.sh +35 -0
- data/template/avmtrf1/php/docker_images/base/aux/php_composer.sh +31 -0
- data/template/avmtrf1/php/docker_images/base/aux/php_values.sh +41 -0
- data/template/avmtrf1/php/docker_images/base/aux/setup_apache_site.sh +16 -0
- data/template/avmtrf1/php/docker_images/base/aux/start.sh +26 -0
- data/template/avmtrf1/php/docker_images/base/aux/templates/apache_site.conf +12 -0
- data/template/avmtrf1/tools/msgraph/token_retrieve/python_retriever.py +85 -0
- metadata +460 -0
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Git
|
5
|
+
class PushLarge
|
6
|
+
class LfsCommit
|
7
|
+
module PickSourceRevision
|
8
|
+
private
|
9
|
+
|
10
|
+
def add_cacheinfo_fail?(result)
|
11
|
+
!result.fetch(:exit_code).zero? && result.fetch(:stderr).include?('add_cacheinfo')
|
12
|
+
end
|
13
|
+
|
14
|
+
def cherry_pick_source_revision_uncached
|
15
|
+
checkout_base
|
16
|
+
return if previous_revision.blank?
|
17
|
+
|
18
|
+
infom message("Cherry pick #{source_commit.sha1}")
|
19
|
+
result = git.execute('cherry-pick', '--allow-empty', '--allow-empty-message',
|
20
|
+
'-Xtheirs', source_commit.sha1)
|
21
|
+
check_cherry_pick_result(result)
|
22
|
+
end
|
23
|
+
|
24
|
+
def check_cherry_pick_result(result)
|
25
|
+
return if result.fetch(:exit_code).zero?
|
26
|
+
return on_cherry_pick_conflict if cherry_pick_conflict?
|
27
|
+
return on_add_cacheinfo_fail if add_cacheinfo_fail?(result)
|
28
|
+
|
29
|
+
raise "Cherry pick failed: #{result}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def cherry_pick_conflict?
|
33
|
+
::File.exist?(::File.join(git, '.git', 'CHERRY_PICK_HEAD'))
|
34
|
+
end
|
35
|
+
|
36
|
+
def on_add_cacheinfo_fail
|
37
|
+
warn message('"add_cacheinfo" fail')
|
38
|
+
end
|
39
|
+
|
40
|
+
def on_cherry_pick_conflict
|
41
|
+
warn message('Cherry pick failed with conflict')
|
42
|
+
resolve_cherry_pick_conflicts
|
43
|
+
|
44
|
+
check_dirty_files
|
45
|
+
check_cherry_continue
|
46
|
+
end
|
47
|
+
|
48
|
+
def resolve_cherry_pick_conflicts
|
49
|
+
git.status_files.each do |scf|
|
50
|
+
if scf.dirty == 'D'
|
51
|
+
remove_file(scf.path)
|
52
|
+
elsif scf.dirty.present?
|
53
|
+
add_file(scf.path)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def remove_file(path)
|
59
|
+
infov message('Removing file'), path
|
60
|
+
git.execute!('rm', path)
|
61
|
+
end
|
62
|
+
|
63
|
+
def add_file(path)
|
64
|
+
infov message('Adding file'), path
|
65
|
+
git.execute!('add', path)
|
66
|
+
end
|
67
|
+
|
68
|
+
def check_dirty_files
|
69
|
+
infom message('Checking dirty files...')
|
70
|
+
df = dirty_files
|
71
|
+
infov message('Dirty files?'), df.any?
|
72
|
+
return unless df.any?
|
73
|
+
|
74
|
+
df.each do |f|
|
75
|
+
infov message(f.path, 1), "|#{f.stage}|#{f.dirty}|"
|
76
|
+
end
|
77
|
+
raise 'There are dirty files'
|
78
|
+
end
|
79
|
+
|
80
|
+
def dirty_files
|
81
|
+
git.status_files.select { |scf| scf.dirty.present? }
|
82
|
+
end
|
83
|
+
|
84
|
+
def check_cherry_continue
|
85
|
+
infom message('Continuing cherry pick')
|
86
|
+
git.execute!('-c', "core.editor=#{bash_editor}", 'cherry-pick', '--continue')
|
87
|
+
raise 'Still in cherry-pick conflict' if cherry_pick_conflict?
|
88
|
+
|
89
|
+
infom message('Cherry pick continue successful')
|
90
|
+
end
|
91
|
+
|
92
|
+
def bash_editor
|
93
|
+
if source_commit.subject.present?
|
94
|
+
'true'
|
95
|
+
else
|
96
|
+
'bash -c "printf \\"Mensagem original em branco.\\n\\" > $1"'
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Git
|
5
|
+
class PushLarge
|
6
|
+
class LfsCommit
|
7
|
+
module Push
|
8
|
+
private
|
9
|
+
|
10
|
+
PACK_ERROR_MESSAGE = 'pack exceeds maximum allowed size'
|
11
|
+
PACK_ERROR_TRUE = 'true'
|
12
|
+
PACK_ERROR_FALSE = 'false'
|
13
|
+
|
14
|
+
def push_ok_uncached
|
15
|
+
commit
|
16
|
+
fresh_push if push_pack_error_cache.read.blank?
|
17
|
+
after_push_banner
|
18
|
+
push_pack_error_cache.read != PACK_ERROR_TRUE
|
19
|
+
end
|
20
|
+
|
21
|
+
def after_push_banner
|
22
|
+
infov message('Commit SHA1'), commit.sha1
|
23
|
+
raise 'Cache of files size not found' if files_size_cache.read.blank?
|
24
|
+
|
25
|
+
infov message('Files size'), PushLarge.bytes_size(files_size_cache.read)
|
26
|
+
end
|
27
|
+
|
28
|
+
def fresh_push
|
29
|
+
fresh_push_banner
|
30
|
+
check_push_result(
|
31
|
+
git.execute(
|
32
|
+
'push', push_large.remote_name, '--force',
|
33
|
+
"#{commit.sha1}:#{push_reference}"
|
34
|
+
)
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
def fresh_push_banner
|
39
|
+
infom message('Pushing...')
|
40
|
+
fresh_push_commit_banner
|
41
|
+
fresh_push_remote_banner
|
42
|
+
end
|
43
|
+
|
44
|
+
def fresh_push_commit_banner
|
45
|
+
infov message('SHA1', 1), commit.sha1
|
46
|
+
infov message('Files size', 1), PushLarge.bytes_size(commit.files_size)
|
47
|
+
end
|
48
|
+
|
49
|
+
def fresh_push_remote_banner
|
50
|
+
infov message('Remote', 1), push_large.remote_name
|
51
|
+
infov message('Reference', 1), push_reference
|
52
|
+
end
|
53
|
+
|
54
|
+
def push_reference
|
55
|
+
"refs/heads/#{push_large.target_ref}"
|
56
|
+
end
|
57
|
+
|
58
|
+
def check_push_result(result)
|
59
|
+
if result.fetch(:exit_code).zero?
|
60
|
+
on_push_result_ok
|
61
|
+
elsif result.fetch(:stderr).include?(PACK_ERROR_MESSAGE)
|
62
|
+
on_push_result_pack_error
|
63
|
+
else
|
64
|
+
on_push_result_arbitrary_error(result)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def on_push_result_ok
|
69
|
+
push_pack_error_cache.write(PACK_ERROR_FALSE)
|
70
|
+
success(push_message('successful'))
|
71
|
+
end
|
72
|
+
|
73
|
+
def on_push_result_pack_error
|
74
|
+
push_pack_error_cache.write(PACK_ERROR_TRUE)
|
75
|
+
warn(push_message("failed with message \"#{PACK_ERROR_MESSAGE}\""))
|
76
|
+
end
|
77
|
+
|
78
|
+
def on_push_result_arbitrary_error(result)
|
79
|
+
raise result.pretty_inspect.to_s
|
80
|
+
end
|
81
|
+
|
82
|
+
def push_message(suffix)
|
83
|
+
message("Push of #{commit.sha1} (Size: #{commit.files_size}, " \
|
84
|
+
"Files: #{commit.files.count}): #{suffix}.")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Git
|
5
|
+
class PushLarge
|
6
|
+
class LfsCommit
|
7
|
+
module TrackLargeFiles
|
8
|
+
private
|
9
|
+
|
10
|
+
EXTENSIONS_REQUIRED_TO_TRACK = %w[
|
11
|
+
bak bkp bmp bpm cfm chm dat db doc fla flv gz jar log mp3 mp4 otf pdf ppt psd rar rtf
|
12
|
+
swf ttf wav wmf wmv wmz woff woff2 xmind z zip
|
13
|
+
].freeze
|
14
|
+
|
15
|
+
def track_large_files_uncached
|
16
|
+
cherry_pick_source_revision
|
17
|
+
if lfs_file_min_size.present?
|
18
|
+
|
19
|
+
source_commit.files.each do |file|
|
20
|
+
next unless track_file_with_lfs?(file)
|
21
|
+
|
22
|
+
track_file(file)
|
23
|
+
end
|
24
|
+
raise 'None file was tracked' unless tracked_files.positive?
|
25
|
+
end
|
26
|
+
infov message('Tracked files'), @tracked_files
|
27
|
+
end
|
28
|
+
|
29
|
+
def track_file(file)
|
30
|
+
infov message('Tracking with LFS'), file
|
31
|
+
git.execute!('rm', '--cached', file.path)
|
32
|
+
git.execute!('lfs', 'track', file.path) unless tracked_file?(file)
|
33
|
+
@tracked_files += 1
|
34
|
+
end
|
35
|
+
|
36
|
+
def track_file_with_lfs?(file)
|
37
|
+
return false unless file.dst_size.positive?
|
38
|
+
|
39
|
+
required_extesion_to_track?(file) || (file.dst_size >= lfs_file_min_size)
|
40
|
+
end
|
41
|
+
|
42
|
+
def required_extesion_to_track?(file)
|
43
|
+
EXTENSIONS_REQUIRED_TO_TRACK.include?(::File.extname(file.path).gsub(/\A\./, ''))
|
44
|
+
end
|
45
|
+
|
46
|
+
def tracked_file?(file)
|
47
|
+
git.execute!('check-attr', '--all', '--', file.path).strip.present?
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avmtrf1/tools/core_ext'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Git
|
7
|
+
class PushLarge
|
8
|
+
class LfsCommit
|
9
|
+
require_sub __FILE__, include_modules: true
|
10
|
+
enable_simple_cache
|
11
|
+
enable_speaker
|
12
|
+
|
13
|
+
common_constructor :source_commit, :lfs_file_min_size do
|
14
|
+
@tracked_files = 0
|
15
|
+
@commit = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def push_ok?
|
19
|
+
push_ok
|
20
|
+
end
|
21
|
+
|
22
|
+
def start_banner
|
23
|
+
infov ' * LFS push', "revision: #{source_revision}" \
|
24
|
+
", lfs_file_min_size: #{PushLarge.bytes_size(lfs_file_min_size)}"
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def git
|
30
|
+
source_commit.git
|
31
|
+
end
|
32
|
+
|
33
|
+
def push_large
|
34
|
+
source_commit.push_large
|
35
|
+
end
|
36
|
+
|
37
|
+
def previous_revision
|
38
|
+
push_large.last_pushed_revision
|
39
|
+
end
|
40
|
+
|
41
|
+
def source_revision
|
42
|
+
source_commit.sha1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'filesize'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Git
|
7
|
+
class PushLarge
|
8
|
+
class SourceCommit
|
9
|
+
module Push
|
10
|
+
private
|
11
|
+
|
12
|
+
LFS_FILE_MIN_SIZES = [nil, 1_048_576, 524_288, 131_072].freeze
|
13
|
+
|
14
|
+
def pushed_revision_uncached
|
15
|
+
fs_cache.child('pushed_revision')
|
16
|
+
end
|
17
|
+
|
18
|
+
def run_pushs
|
19
|
+
return if LFS_FILE_MIN_SIZES.any? do |lfs_file_min_size|
|
20
|
+
lfs_commit = ::Avmtrf1::Git::PushLarge::LfsCommit.new(self, lfs_file_min_size)
|
21
|
+
lfs_commit.start_banner
|
22
|
+
push_with_lfs(lfs_commit)
|
23
|
+
end
|
24
|
+
|
25
|
+
raise 'Push de todos os commits falharam'
|
26
|
+
end
|
27
|
+
|
28
|
+
def push_with_lfs(lfs_commit)
|
29
|
+
if lfs_commit.push_ok?
|
30
|
+
pushed_revision.write(lfs_commit.commit.sha1)
|
31
|
+
success " * Pushed: #{pushed_revision.read}"
|
32
|
+
true
|
33
|
+
else
|
34
|
+
warn ' * Push failed'
|
35
|
+
false
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/git/commit'
|
4
|
+
require 'avmtrf1/tools/core_ext'
|
5
|
+
|
6
|
+
module Avmtrf1
|
7
|
+
module Git
|
8
|
+
class PushLarge
|
9
|
+
class SourceCommit < ::Avm::Git::Commit
|
10
|
+
require_sub __FILE__, include_modules: true
|
11
|
+
enable_simple_cache
|
12
|
+
enable_speaker
|
13
|
+
|
14
|
+
attr_reader :push_large, :sha1, :no_lfs_max_size
|
15
|
+
|
16
|
+
def initialize(push_large, sha1)
|
17
|
+
super(push_large.git, sha1)
|
18
|
+
@push_large = push_large
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
start_banner
|
23
|
+
if pushed_revision.read.present?
|
24
|
+
success ' * Target revision already pushed'
|
25
|
+
else
|
26
|
+
before_pushs_banner
|
27
|
+
run_pushs
|
28
|
+
after_pushs_banner
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def fs_cache
|
33
|
+
@fs_cache ||= push_large.fs_cache.child(sha1)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def start_banner
|
39
|
+
infov ' * SHA1', sha1
|
40
|
+
infov ' * Subject', subject
|
41
|
+
infov ' * Author', author_all
|
42
|
+
infov ' * Commiter', commiter_all
|
43
|
+
infov ' * Files', files.count
|
44
|
+
end
|
45
|
+
|
46
|
+
def before_pushs_banner
|
47
|
+
infov ' * Files size', PushLarge.bytes_size(files_size)
|
48
|
+
infov ' * Pushed revision (BEFORE)', pushed_revision.read
|
49
|
+
end
|
50
|
+
|
51
|
+
def after_pushs_banner
|
52
|
+
infov ' * Pushed revision (AFTER)', pushed_revision.read
|
53
|
+
raise 'Target revision is blank' if pushed_revision.read.blank?
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
require 'eac_ruby_utils/patches/module/speaker'
|
6
|
+
require 'eac_ruby_utils/require_sub'
|
7
|
+
require 'eac_ruby_utils/simple_cache'
|
8
|
+
require 'avmtrf1/patches/avm/git/launcher/base'
|
9
|
+
|
10
|
+
module Avmtrf1
|
11
|
+
module Git
|
12
|
+
class PushLarge
|
13
|
+
include ::EacRubyUtils::SimpleCache
|
14
|
+
enable_speaker
|
15
|
+
|
16
|
+
::EacRubyUtils.require_sub(__FILE__)
|
17
|
+
|
18
|
+
attr_reader :git, :remote_name, :source_ref, :target_ref, :last_pushed_revision
|
19
|
+
|
20
|
+
def initialize(git_local_path, remote_name, source_ref, target_ref)
|
21
|
+
@git = ::Avm::Git::Launcher::Base.new(git_local_path)
|
22
|
+
@remote_name = remote_name
|
23
|
+
@source_ref = source_ref
|
24
|
+
@target_ref = target_ref
|
25
|
+
@last_pushed_revision = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def run
|
29
|
+
start_banner
|
30
|
+
push_revisions
|
31
|
+
end
|
32
|
+
|
33
|
+
def fs_cache_object_id
|
34
|
+
::File.expand_path(git).parameterize
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def start_banner
|
40
|
+
infov 'Git local', git
|
41
|
+
infov 'Remote name', remote_name
|
42
|
+
infov 'Source ref.', source_ref
|
43
|
+
infov 'Source rev.', source_rev
|
44
|
+
infov 'Target ref.', target_ref
|
45
|
+
infov 'Revisions to push', revisions.count
|
46
|
+
end
|
47
|
+
|
48
|
+
def push_revisions
|
49
|
+
count = 1
|
50
|
+
revisions.each do |rev|
|
51
|
+
infom "Pushing commit #{count}/#{revisions.count}..."
|
52
|
+
source_commit = ::Avmtrf1::Git::PushLarge::SourceCommit.new(self, rev)
|
53
|
+
source_commit.run
|
54
|
+
@last_pushed_revision = source_commit.pushed_revision.read
|
55
|
+
count += 1
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def source_rev
|
60
|
+
git.rev_parse(source_ref)
|
61
|
+
end
|
62
|
+
|
63
|
+
def revisions_uncached
|
64
|
+
git.execute!('--no-pager', 'log', '--reverse', '--pretty=format:%H', source_rev)
|
65
|
+
.each_line.map(&:strip)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Git
|
7
|
+
class Reference
|
8
|
+
include ::EacRubyUtils::SimpleCache
|
9
|
+
|
10
|
+
attr_reader :revision, :fullname
|
11
|
+
|
12
|
+
def initialize(git, fullname, revision)
|
13
|
+
@git = git
|
14
|
+
@fullname = fullname
|
15
|
+
@revision = revision
|
16
|
+
end
|
17
|
+
|
18
|
+
def type_uncached
|
19
|
+
parsed_fullname.type
|
20
|
+
end
|
21
|
+
|
22
|
+
delegate :name, to: :parsed_fullname
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def parsed_fullname_uncached
|
27
|
+
m = %r{\Arefs/([^/]+)s/(.+)\z}.match(fullname)
|
28
|
+
return ::OpenStruct.new(name: m[2], type: m[1]) if m # rubocop:disable Style/OpenStructUse
|
29
|
+
|
30
|
+
raise "\"#{fullname}\" not match ref pattern"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/avmtrf1/git.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Gitlab
|
5
|
+
class Commit
|
6
|
+
enable_speaker
|
7
|
+
enable_simple_cache
|
8
|
+
common_constructor :repository, :git, :source
|
9
|
+
|
10
|
+
delegate :id, to: :git_commit
|
11
|
+
|
12
|
+
def to_s
|
13
|
+
source
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [String]
|
17
|
+
def markdown_link(object_type = 'commit')
|
18
|
+
"[#{git_commit.abbreviated_commit_hash}|#{web_url(object_type)}]"
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [String]
|
22
|
+
def textile_link(object_type = 'commit')
|
23
|
+
"\"#{git_commit.abbreviated_commit_hash}\":#{web_url(object_type)}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def web_url(object_type = 'commit')
|
27
|
+
"#{repository.web_url}/#{object_type}/#{git_commit.commit_hash}"
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def git_commit_uncached
|
33
|
+
git.commit(git.rev_parse(source))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avmtrf1/tools/core_ext'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Gitlab
|
7
|
+
class Repository
|
8
|
+
class << self
|
9
|
+
# @param uri [String]
|
10
|
+
# @return [Avmtrf1::Gitlab::Address, nil]
|
11
|
+
def by_uri(uri)
|
12
|
+
by_git_uri(uri) || by_https_uri(uri)
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param uri [String]
|
16
|
+
# @return [Avmtrf1::Gitlab::Address, nil]
|
17
|
+
def by_git_uri(uri)
|
18
|
+
/\Agit@(.+):(.+)\z/i.if_match(uri, false) do |m|
|
19
|
+
new(:git, m[1], m[2])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# @param uri [String]
|
24
|
+
# @return [Avmtrf1::Gitlab::Address, nil]
|
25
|
+
def by_https_uri(uri)
|
26
|
+
%r{\Ahttps?://([^\/]+)/(.+)\z}i.if_match(uri, false) do |m|
|
27
|
+
new(:https, m[1], m[2])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
common_constructor :protocol, :authority, :path do
|
33
|
+
self.path = '/' + path.to_s.gsub(/\.git\Z/, '').gsub(%r{\A/+}, '') # rubocop:disable Style/StringConcatenation
|
34
|
+
end
|
35
|
+
|
36
|
+
def web_url
|
37
|
+
"https://#{authority}#{path}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/simple_cache'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
class Ini
|
7
|
+
class Profile
|
8
|
+
include ::EacRubyUtils::SimpleCache
|
9
|
+
|
10
|
+
attr_reader :ini, :name, :parent_name, :self_data
|
11
|
+
|
12
|
+
# @param profiles [Avmtrf1::Ini::Profiles
|
13
|
+
def initialize(ini, name, parent_name, self_data)
|
14
|
+
@ini = ini
|
15
|
+
@name = name
|
16
|
+
@parent_name = parent_name
|
17
|
+
@self_data = self_data
|
18
|
+
end
|
19
|
+
|
20
|
+
delegate :[], to: :data
|
21
|
+
|
22
|
+
delegate :fetch, to: :data
|
23
|
+
|
24
|
+
def to_h(prefix = '')
|
25
|
+
data.select { |k, _v| k.start_with?(prefix) }
|
26
|
+
.map { |e| [e[0].gsub(/\A#{Regexp.quote(prefix)}/, ''), e[1]] }.to_h # rubocop:disable Style/MapToHash
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def data_uncached
|
32
|
+
r = self_data
|
33
|
+
r = parent.data.merge(r) if parent
|
34
|
+
r
|
35
|
+
end
|
36
|
+
|
37
|
+
def parent
|
38
|
+
parent_name ? ini.profiles[parent_name] : nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/avmtrf1/ini.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/simple_cache'
|
4
|
+
require 'pp' # rubocop:disable Lint/RedundantRequireStatement
|
5
|
+
require 'avmtrf1/ini/profile'
|
6
|
+
require 'avmtrf1/patches/inifile'
|
7
|
+
|
8
|
+
module Avmtrf1
|
9
|
+
# Leitor de arquivos .ini com suporte a herança de seções/perfis.
|
10
|
+
class Ini
|
11
|
+
include ::EacRubyUtils::SimpleCache
|
12
|
+
|
13
|
+
class << self
|
14
|
+
SECTION_NAME_PATTERN = /\A([^\:]+)(?::([^\:]+))?\z/.freeze
|
15
|
+
|
16
|
+
# @return Um [Array] em que o primeiro elemento é o perfil e o segundo é seu super-perfil.
|
17
|
+
def parse_section_name(section_name)
|
18
|
+
m = SECTION_NAME_PATTERN.match(section_name)
|
19
|
+
return [m[1], m[2]] if m
|
20
|
+
|
21
|
+
raise "Section name pattern \"#{SECTION_NAME_PATTERN}\" not match \"#{section_name}\""
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [IniFile].
|
25
|
+
def inifile_from_file(path)
|
26
|
+
raise "\"#{path}\" does not exist or is not a file" unless ::File.file?(path)
|
27
|
+
|
28
|
+
r = ::IniFile.load(path)
|
29
|
+
return r if r.is_a?(::IniFile)
|
30
|
+
|
31
|
+
raise "\"#{path}\" not converted to Inifile"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader :inifile
|
36
|
+
|
37
|
+
# @param ini Um [IniFile] ou um caminho de arquivo .ini.
|
38
|
+
def initialize(inifile)
|
39
|
+
@inifile = inifile.is_a?(::IniFile) ? inifile : self.class.inifile_from_file(inifile.to_s)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def profiles_uncached
|
45
|
+
r = {}
|
46
|
+
inifile.each_section do |section|
|
47
|
+
profile_name, profile_parent_name = self.class.parse_section_name(section)
|
48
|
+
r[profile_name] = ::Avmtrf1::Ini::Profile.new(
|
49
|
+
self, profile_name, profile_parent_name, inifile[section]
|
50
|
+
)
|
51
|
+
end
|
52
|
+
r.sort.to_h.freeze
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|