avmtrf1-tools 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/avmtrf1.rb +2 -0
- data/lib/avmtrf1/filesystem_cache.rb +53 -0
- data/lib/avmtrf1/fs_cache.rb +11 -0
- data/lib/avmtrf1/git.rb +1 -0
- data/lib/avmtrf1/git/push_large.rb +69 -0
- data/lib/avmtrf1/git/push_large/_utils.rb +16 -0
- data/lib/avmtrf1/git/push_large/lfs_commit.rb +52 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/_00_checkout_previous_revision.rb +33 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/_01_cherry_pick_source_revision.rb +89 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/_02_track_large_files.rb +51 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/_03_commit_changes.rb +46 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/_04_push.rb +88 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/_cache.rb +17 -0
- data/lib/avmtrf1/git/push_large/lfs_commit/_helpers.rb +27 -0
- data/lib/avmtrf1/git/push_large/source_commit.rb +61 -0
- data/lib/avmtrf1/git/push_large/source_commit/_push.rb +40 -0
- data/lib/avmtrf1/patches/eac_launcher/git/base.rb +58 -0
- data/lib/avmtrf1/tools/runner/git.rb +1 -0
- data/lib/avmtrf1/tools/runner/git/push_large.rb +37 -0
- data/lib/avmtrf1/tools/version.rb +1 -1
- metadata +69 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 777ea2b3c50e09553565dffe045f75d83355b6b80a44e3ee390f4fc9bc39401a
|
4
|
+
data.tar.gz: 5323ea0237c1d9136c74dd9a227663184be4cd9822e204ae11d56c4e8e8b2a8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c18ec390a1b12454422a6f973efcdba70708eb5f99f12ac2663bca459b6ff72819580e70485766256eda64992cc1e10cf4c75a2040601859c6f630a8517543d1
|
7
|
+
data.tar.gz: d10352ab9f7c69141fa9fda14a18432a70f21787a1db0a23bde067661df90147c8678cd302b965154ff7aa6508abf7444ea49b158588968f793f6580e1dcb62f
|
data/lib/avmtrf1.rb
CHANGED
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
class FilesystemCache
|
5
|
+
attr_reader :path
|
6
|
+
|
7
|
+
def initialize(*path_parts)
|
8
|
+
raise ArgumentError, "\"#{path_parts}\" is empty" if path_parts.empty?
|
9
|
+
|
10
|
+
@path = ::File.join(*path_parts.map(&:to_s))
|
11
|
+
end
|
12
|
+
|
13
|
+
def read
|
14
|
+
check_file
|
15
|
+
return nil unless ::File.exist?(path)
|
16
|
+
|
17
|
+
::File.read(path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def write(value)
|
21
|
+
raise "\"#{value}\" is blank" if value.blank?
|
22
|
+
|
23
|
+
check_file
|
24
|
+
::File.write(path, value)
|
25
|
+
value
|
26
|
+
end
|
27
|
+
|
28
|
+
def sub(*path_parts)
|
29
|
+
self.class.new(absolute_path, *path_parts)
|
30
|
+
end
|
31
|
+
|
32
|
+
def absolute_path
|
33
|
+
::File.expand_path(path)
|
34
|
+
end
|
35
|
+
|
36
|
+
def dirname
|
37
|
+
::File.dirname
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def check_file
|
43
|
+
dirname = ::File.dirname(absolute_path)
|
44
|
+
raise "#{dirname}|#{dirname.class}" unless dirname.is_a?(String)
|
45
|
+
|
46
|
+
::FileUtils.mkdir_p(dirname)
|
47
|
+
return unless ::File.exist?(absolute_path)
|
48
|
+
return if ::File.file?(absolute_path)
|
49
|
+
|
50
|
+
raise "\"#{absolute_path}\" exist and is not a path"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/avmtrf1/git.rb
CHANGED
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
require 'eac_ruby_utils/console/speaker'
|
6
|
+
require 'eac_ruby_utils/require_sub'
|
7
|
+
require 'eac_ruby_utils/simple_cache'
|
8
|
+
require 'avmtrf1/patches/eac_launcher/git/base'
|
9
|
+
|
10
|
+
module Avmtrf1
|
11
|
+
module Git
|
12
|
+
class PushLarge
|
13
|
+
include ::EacRubyUtils::SimpleCache
|
14
|
+
include ::EacRubyUtils::Console::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 = ::EacLauncher::Git::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
|
34
|
+
@fs_cache ||= ::Avmtrf1.fs_cache.sub(::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,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/require_sub'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Git
|
7
|
+
class PushLarge
|
8
|
+
class LfsCommit
|
9
|
+
include ::EacRubyUtils::Console::Speaker
|
10
|
+
include ::EacRubyUtils::SimpleCache
|
11
|
+
|
12
|
+
::EacRubyUtils.require_sub(__FILE__)
|
13
|
+
|
14
|
+
attr_reader :source_commit, :lfs_file_min_size, :tracked_files
|
15
|
+
|
16
|
+
def initialize(source_commit, lfs_file_min_size)
|
17
|
+
@source_commit = source_commit
|
18
|
+
@lfs_file_min_size = lfs_file_min_size
|
19
|
+
@tracked_files = 0
|
20
|
+
@commit = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def push_ok?
|
24
|
+
push_ok
|
25
|
+
end
|
26
|
+
|
27
|
+
def start_banner
|
28
|
+
infov ' * LFS push', "revision: #{source_revision}" \
|
29
|
+
", lfs_file_min_size: #{PushLarge.bytes_size(lfs_file_min_size)}"
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def git
|
35
|
+
source_commit.git
|
36
|
+
end
|
37
|
+
|
38
|
+
def push_large
|
39
|
+
source_commit.push_large
|
40
|
+
end
|
41
|
+
|
42
|
+
def previous_revision
|
43
|
+
push_large.last_pushed_revision
|
44
|
+
end
|
45
|
+
|
46
|
+
def source_revision
|
47
|
+
source_commit.sha1
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Git
|
5
|
+
class PushLarge
|
6
|
+
class LfsCommit
|
7
|
+
private
|
8
|
+
|
9
|
+
def checkout_base_uncached
|
10
|
+
if previous_revision.blank?
|
11
|
+
checkout_orphan
|
12
|
+
else
|
13
|
+
checkout_previous_revision
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def checkout_orphan
|
18
|
+
infom message('Checkout orphan')
|
19
|
+
git.execute!('reset', '--hard')
|
20
|
+
git.execute!('clean', '-df')
|
21
|
+
git.execute!('checkout', source_commit.sha1)
|
22
|
+
end
|
23
|
+
|
24
|
+
def checkout_previous_revision
|
25
|
+
infom message("Checkout previous revision #{previous_revision}")
|
26
|
+
git.execute!('reset', '--hard')
|
27
|
+
git.execute!('clean', '-df')
|
28
|
+
git.execute!('checkout', previous_revision)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Git
|
5
|
+
class PushLarge
|
6
|
+
class LfsCommit
|
7
|
+
private
|
8
|
+
|
9
|
+
def cherry_pick_source_revision_uncached
|
10
|
+
checkout_base
|
11
|
+
return unless previous_revision.present?
|
12
|
+
|
13
|
+
infom message("Cherry pick #{source_commit.sha1}")
|
14
|
+
result = git.execute('cherry-pick', '--allow-empty', '--allow-empty-message', '-Xtheirs',
|
15
|
+
source_commit.sha1)
|
16
|
+
check_cherry_pick_result(result)
|
17
|
+
end
|
18
|
+
|
19
|
+
def check_cherry_pick_result(result)
|
20
|
+
return if result.fetch(:exit_code).zero?
|
21
|
+
|
22
|
+
raise "Cherry pick failed: #{result}" unless cherry_pick_conflict?
|
23
|
+
|
24
|
+
warn message('Cherry pick failed with conflict')
|
25
|
+
resolve_cherry_pick_conflicts
|
26
|
+
|
27
|
+
check_dirty_files
|
28
|
+
check_cherry_continue
|
29
|
+
end
|
30
|
+
|
31
|
+
def cherry_pick_conflict?
|
32
|
+
::File.exist?(::File.join(git, '.git', 'CHERRY_PICK_HEAD'))
|
33
|
+
end
|
34
|
+
|
35
|
+
def resolve_cherry_pick_conflicts
|
36
|
+
git.status_files.each do |scf|
|
37
|
+
if scf.dirty == 'D'
|
38
|
+
remove_file(scf.path)
|
39
|
+
elsif scf.dirty.present?
|
40
|
+
add_file(scf.path)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def remove_file(path)
|
46
|
+
infov message('Removing file'), path
|
47
|
+
git.execute!('rm', path)
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_file(path)
|
51
|
+
infov message('Adding file'), path
|
52
|
+
git.execute!('add', path)
|
53
|
+
end
|
54
|
+
|
55
|
+
def check_dirty_files
|
56
|
+
infom message('Checking dirty files...')
|
57
|
+
df = dirty_files
|
58
|
+
infov message('Dirty files?'), df.any?
|
59
|
+
return unless df.any?
|
60
|
+
|
61
|
+
df.each do |f|
|
62
|
+
infov message(f.path, 1), "|#{f.stage}|#{f.dirty}|"
|
63
|
+
end
|
64
|
+
raise 'There are dirty files'
|
65
|
+
end
|
66
|
+
|
67
|
+
def dirty_files
|
68
|
+
git.status_files.select { |scf| scf.dirty.present? }
|
69
|
+
end
|
70
|
+
|
71
|
+
def check_cherry_continue
|
72
|
+
infom message('Continuing cherry pick')
|
73
|
+
git.execute!('-c', "core.editor=#{bash_editor}", 'cherry-pick', '--continue')
|
74
|
+
raise 'Still in cherry-pick conflict' if cherry_pick_conflict?
|
75
|
+
|
76
|
+
infom message('Cherry pick continue successful')
|
77
|
+
end
|
78
|
+
|
79
|
+
def bash_editor
|
80
|
+
if source_commit.subject.present?
|
81
|
+
'true'
|
82
|
+
else
|
83
|
+
'bash -c "printf \\"Mensagem original em branco.\\n\\" > $1"'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Git
|
5
|
+
class PushLarge
|
6
|
+
class LfsCommit
|
7
|
+
private
|
8
|
+
|
9
|
+
EXTENSIONS_REQUIRED_TO_TRACK = %w[
|
10
|
+
bak bkp bmp bpm cfm chm dat db doc fla flv gz jar log mp3 mp4 otf pdf ppt psd rar rtf swf
|
11
|
+
ttf wav wmf wmv wmz woff woff2 xmind z zip
|
12
|
+
].freeze
|
13
|
+
|
14
|
+
def track_large_files_uncached
|
15
|
+
cherry_pick_source_revision
|
16
|
+
if lfs_file_min_size.present?
|
17
|
+
|
18
|
+
source_commit.files.each do |file|
|
19
|
+
next unless track_file_with_lfs?(file)
|
20
|
+
|
21
|
+
track_file(file)
|
22
|
+
end
|
23
|
+
raise 'None file was tracked' unless tracked_files.positive?
|
24
|
+
end
|
25
|
+
infov message('Tracked files'), @tracked_files
|
26
|
+
end
|
27
|
+
|
28
|
+
def track_file(file)
|
29
|
+
infov message('Tracking with LFS'), file
|
30
|
+
git.execute!('rm', '--cached', file.path)
|
31
|
+
git.execute!('lfs', 'track', file.path) unless tracked_file?(file)
|
32
|
+
@tracked_files += 1
|
33
|
+
end
|
34
|
+
|
35
|
+
def track_file_with_lfs?(file)
|
36
|
+
return false unless file.dst_size.positive?
|
37
|
+
|
38
|
+
required_extesion_to_track?(file) || (file.dst_size >= lfs_file_min_size)
|
39
|
+
end
|
40
|
+
|
41
|
+
def required_extesion_to_track?(file)
|
42
|
+
EXTENSIONS_REQUIRED_TO_TRACK.include?(::File.extname(file.path).gsub(/\A\./, ''))
|
43
|
+
end
|
44
|
+
|
45
|
+
def tracked_file?(file)
|
46
|
+
git.execute!('check-attr', '--all', '--', file.path).strip.present?
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Git
|
5
|
+
class PushLarge
|
6
|
+
class LfsCommit
|
7
|
+
# @return [Avm::Git::Commit]
|
8
|
+
def commit
|
9
|
+
commit_changes
|
10
|
+
@commit
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def commit_changes_uncached
|
16
|
+
if sha1_cache.read.present?
|
17
|
+
@commit = ::Avm::Git::Commit.new(git, sha1_cache.read)
|
18
|
+
return
|
19
|
+
end
|
20
|
+
track_large_files
|
21
|
+
add_files
|
22
|
+
commit_amend
|
23
|
+
store_commit
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_files
|
27
|
+
infom ' * Adding files'
|
28
|
+
git.system!('add', '.')
|
29
|
+
end
|
30
|
+
|
31
|
+
def commit_amend
|
32
|
+
infom message('Commiting')
|
33
|
+
git.command('commit', '--amend', '--allow-empty', '--allow-empty-message')
|
34
|
+
.envvar('GIT_EDITOR', true).execute!
|
35
|
+
end
|
36
|
+
|
37
|
+
def store_commit
|
38
|
+
@commit = ::Avm::Git::Commit.new(git, git.rev_parse('HEAD'))
|
39
|
+
infov message('Commited (SHA1)'), @commit.sha1
|
40
|
+
sha1_cache.write(@commit.sha1)
|
41
|
+
files_size_cache.write(@commit.files_size)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Git
|
5
|
+
class PushLarge
|
6
|
+
class LfsCommit
|
7
|
+
private
|
8
|
+
|
9
|
+
PACK_ERROR_MESSAGE = 'pack exceeds maximum allowed size'
|
10
|
+
PACK_ERROR_TRUE = 'true'
|
11
|
+
PACK_ERROR_FALSE = 'false'
|
12
|
+
|
13
|
+
def push_ok_uncached
|
14
|
+
commit
|
15
|
+
fresh_push if push_pack_error_cache.read.blank?
|
16
|
+
after_push_banner
|
17
|
+
push_pack_error_cache.read != PACK_ERROR_TRUE
|
18
|
+
end
|
19
|
+
|
20
|
+
def after_push_banner
|
21
|
+
infov message('Commit SHA1'), commit.sha1
|
22
|
+
raise 'Cache of files size not found' if files_size_cache.read.blank?
|
23
|
+
|
24
|
+
infov message('Files size'), PushLarge.bytes_size(files_size_cache.read)
|
25
|
+
end
|
26
|
+
|
27
|
+
def fresh_push
|
28
|
+
fresh_push_banner
|
29
|
+
check_push_result(
|
30
|
+
git.execute(
|
31
|
+
'push', push_large.remote_name, '--force',
|
32
|
+
"#{commit.sha1}:#{push_reference}"
|
33
|
+
)
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def fresh_push_banner
|
38
|
+
infom message('Pushing...')
|
39
|
+
fresh_push_commit_banner
|
40
|
+
fresh_push_remote_banner
|
41
|
+
end
|
42
|
+
|
43
|
+
def fresh_push_commit_banner
|
44
|
+
infov message('SHA1', 1), commit.sha1
|
45
|
+
infov message('Files size', 1), PushLarge.bytes_size(commit.files_size)
|
46
|
+
end
|
47
|
+
|
48
|
+
def fresh_push_remote_banner
|
49
|
+
infov message('Remote', 1), push_large.remote_name
|
50
|
+
infov message('Reference', 1), push_reference
|
51
|
+
end
|
52
|
+
|
53
|
+
def push_reference
|
54
|
+
"refs/heads/#{push_large.target_ref}"
|
55
|
+
end
|
56
|
+
|
57
|
+
def check_push_result(result)
|
58
|
+
if result.fetch(:exit_code).zero?
|
59
|
+
on_push_result_ok
|
60
|
+
elsif result.fetch(:stderr).include?(PACK_ERROR_MESSAGE)
|
61
|
+
on_push_result_pack_error
|
62
|
+
else
|
63
|
+
on_push_result_arbitrary_error(result)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def on_push_result_ok
|
68
|
+
push_pack_error_cache.write(PACK_ERROR_FALSE)
|
69
|
+
success(push_message('successful'))
|
70
|
+
end
|
71
|
+
|
72
|
+
def on_push_result_pack_error
|
73
|
+
push_pack_error_cache.write(PACK_ERROR_TRUE)
|
74
|
+
warn(push_message("failed with message \"#{PACK_ERROR_MESSAGE}\""))
|
75
|
+
end
|
76
|
+
|
77
|
+
def on_push_result_arbitrary_error(result)
|
78
|
+
raise result.pretty_inspect.to_s
|
79
|
+
end
|
80
|
+
|
81
|
+
def push_message(suffix)
|
82
|
+
message("Push of #{commit.sha1} (Size: #{commit.files_size}, " \
|
83
|
+
"Files: #{commit.files.count}): #{suffix}.")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Git
|
5
|
+
class PushLarge
|
6
|
+
class LfsCommit
|
7
|
+
def fs_cache_uncached
|
8
|
+
source_commit.fs_cache.sub(lfs_file_min_size.present? ? lfs_file_min_size : 'nil')
|
9
|
+
end
|
10
|
+
|
11
|
+
%w[sha1 files_size push_pack_error].each do |attr|
|
12
|
+
define_method("#{attr}_cache_uncached") { fs_cache.sub(attr) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Avmtrf1
|
4
|
+
module Git
|
5
|
+
class PushLarge
|
6
|
+
class LfsCommit
|
7
|
+
private
|
8
|
+
|
9
|
+
def message(suffix, padding = 0)
|
10
|
+
"#{(' ' * (padding + 2))}* #{suffix}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def git
|
14
|
+
source_commit.git
|
15
|
+
end
|
16
|
+
|
17
|
+
def push_large
|
18
|
+
source_commit.push_large
|
19
|
+
end
|
20
|
+
|
21
|
+
def previous_revision
|
22
|
+
push_large.last_pushed_revision
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'avm/git/commit'
|
4
|
+
require 'eac_ruby_utils/console/speaker'
|
5
|
+
require 'eac_ruby_utils/simple_cache'
|
6
|
+
require 'eac_ruby_utils/require_sub'
|
7
|
+
|
8
|
+
module Avmtrf1
|
9
|
+
module Git
|
10
|
+
class PushLarge
|
11
|
+
class SourceCommit < ::Avm::Git::Commit
|
12
|
+
include ::EacRubyUtils::SimpleCache
|
13
|
+
include ::EacRubyUtils::Console::Speaker
|
14
|
+
|
15
|
+
::EacRubyUtils.require_sub(__FILE__)
|
16
|
+
|
17
|
+
attr_reader :push_large, :sha1, :no_lfs_max_size
|
18
|
+
|
19
|
+
def initialize(push_large, sha1)
|
20
|
+
super(push_large.git, sha1)
|
21
|
+
@push_large = push_large
|
22
|
+
end
|
23
|
+
|
24
|
+
def run
|
25
|
+
start_banner
|
26
|
+
if pushed_revision.read.present?
|
27
|
+
success ' * Target revision already pushed'
|
28
|
+
else
|
29
|
+
before_pushs_banner
|
30
|
+
run_pushs
|
31
|
+
after_pushs_banner
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def fs_cache
|
36
|
+
@fs_cache ||= push_large.fs_cache.sub(sha1)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def start_banner
|
42
|
+
infov ' * SHA1', sha1
|
43
|
+
infov ' * Subject', subject
|
44
|
+
infov ' * Author', author_all
|
45
|
+
infov ' * Commiter', commiter_all
|
46
|
+
infov ' * Files', files.count
|
47
|
+
end
|
48
|
+
|
49
|
+
def before_pushs_banner
|
50
|
+
infov ' * Files size', PushLarge.bytes_size(files_size)
|
51
|
+
infov ' * Pushed revision (BEFORE)', pushed_revision.read
|
52
|
+
end
|
53
|
+
|
54
|
+
def after_pushs_banner
|
55
|
+
infov ' * Pushed revision (AFTER)', pushed_revision.read
|
56
|
+
raise 'Target revision is blank' if pushed_revision.read.blank?
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'filesize'
|
4
|
+
|
5
|
+
module Avmtrf1
|
6
|
+
module Git
|
7
|
+
class PushLarge
|
8
|
+
class SourceCommit
|
9
|
+
private
|
10
|
+
|
11
|
+
LFS_FILE_MIN_SIZES = [nil, 1_048_576, 524_288, 131_072].freeze
|
12
|
+
|
13
|
+
def pushed_revision_uncached
|
14
|
+
fs_cache.sub('pushed_revision')
|
15
|
+
end
|
16
|
+
|
17
|
+
def run_pushs
|
18
|
+
return if LFS_FILE_MIN_SIZES.any? do |lfs_file_min_size|
|
19
|
+
lfs_commit = ::Avmtrf1::Git::PushLarge::LfsCommit.new(self, lfs_file_min_size)
|
20
|
+
lfs_commit.start_banner
|
21
|
+
push_with_lfs(lfs_commit)
|
22
|
+
end
|
23
|
+
|
24
|
+
raise 'Push de todos os commits falharam'
|
25
|
+
end
|
26
|
+
|
27
|
+
def push_with_lfs(lfs_commit)
|
28
|
+
if lfs_commit.push_ok?
|
29
|
+
pushed_revision.write(lfs_commit.commit.sha1)
|
30
|
+
success " * Pushed: #{pushed_revision.read}"
|
31
|
+
true
|
32
|
+
else
|
33
|
+
warn ' * Push failed'
|
34
|
+
false
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_launcher/git/base'
|
4
|
+
require 'eac_ruby_utils/patch'
|
5
|
+
require 'active_support/concern'
|
6
|
+
|
7
|
+
module Avmtrf1
|
8
|
+
module Patches
|
9
|
+
module EacLauncher
|
10
|
+
module Git
|
11
|
+
module Base
|
12
|
+
extend ActiveSupport::Concern
|
13
|
+
|
14
|
+
included do
|
15
|
+
include InstanceMethods
|
16
|
+
end
|
17
|
+
|
18
|
+
module InstanceMethods
|
19
|
+
def execute(*args)
|
20
|
+
args, options = build_args(args)
|
21
|
+
::EacRubyUtils::Envs.local.command(*args).execute(options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def system(*args)
|
25
|
+
args, options = build_args(args)
|
26
|
+
::EacRubyUtils::Envs.local.command(*args).system(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def command(*args)
|
30
|
+
args, _options = build_args(args)
|
31
|
+
::EacRubyUtils::Envs.local.command(*args)
|
32
|
+
end
|
33
|
+
|
34
|
+
def status_files
|
35
|
+
execute!('-c', 'core.quotepath=off', 'status', '--porcelain').each_line.map do |line|
|
36
|
+
parse_status_file(line)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def parse_status_file(line)
|
43
|
+
m = /\A(.)(.)\s*(\S.*)\z/.match(line.strip)
|
44
|
+
return ::OpenStruct.new(stage: m[1], dirty: m[2], path: m[3]) if m
|
45
|
+
|
46
|
+
raise "\"#{line.strip}\" did not match pattern"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
::EacRubyUtils.patch(
|
56
|
+
::EacLauncher::Git::Base,
|
57
|
+
::Avmtrf1::Patches::EacLauncher::Git::Base
|
58
|
+
)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/console/docopt_runner'
|
4
|
+
require 'avmtrf1/git/push_large'
|
5
|
+
|
6
|
+
module Avmtrf1
|
7
|
+
module Tools
|
8
|
+
class Runner < ::EacRubyUtils::Console::DocoptRunner
|
9
|
+
class Git < ::EacRubyUtils::Console::DocoptRunner
|
10
|
+
class PushLarge < ::EacRubyUtils::Console::DocoptRunner
|
11
|
+
DOC = <<~DOCOPT
|
12
|
+
Realiza push de repositórios grandes
|
13
|
+
(Que falham com "pack exceeds maximum allowed size").
|
14
|
+
|
15
|
+
Usage:
|
16
|
+
__PROGRAM__ [options] <source-ref> <target-ref>
|
17
|
+
__PROGRAM__ -h | --help
|
18
|
+
|
19
|
+
Options:
|
20
|
+
-h --help Mostra esta ajuda.
|
21
|
+
-C <git-local> Caminho do repositório local [default: .].
|
22
|
+
-r --remote <remote-name> Nome do remoto [default: origin].
|
23
|
+
DOCOPT
|
24
|
+
|
25
|
+
def run
|
26
|
+
::Avmtrf1::Git::PushLarge.new(
|
27
|
+
::File.expand_path(options.fetch('-C')),
|
28
|
+
options.fetch('--remote'),
|
29
|
+
options.fetch('<source-ref>'),
|
30
|
+
options.fetch('<target-ref>')
|
31
|
+
).run
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,63 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: avmtrf1-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eduardo H. Bogoni
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: aranha
|
14
|
+
name: aranha-parsers
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: '0.1'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.1.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.1'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.1.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: aranha-selenium
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.1.0
|
20
40
|
type: :runtime
|
21
41
|
prerelease: false
|
22
42
|
version_requirements: !ruby/object:Gem::Requirement
|
23
43
|
requirements:
|
24
44
|
- - "~>"
|
25
45
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
46
|
+
version: 0.1.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: avm-tools
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0.12'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0.12'
|
27
61
|
- !ruby/object:Gem::Dependency
|
28
62
|
name: curb
|
29
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,20 +92,28 @@ dependencies:
|
|
58
92
|
requirements:
|
59
93
|
- - "~>"
|
60
94
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
62
|
-
- - ">="
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: 0.10.1
|
95
|
+
version: '0.12'
|
65
96
|
type: :runtime
|
66
97
|
prerelease: false
|
67
98
|
version_requirements: !ruby/object:Gem::Requirement
|
68
99
|
requirements:
|
69
100
|
- - "~>"
|
70
101
|
- !ruby/object:Gem::Version
|
71
|
-
version: '0.
|
102
|
+
version: '0.12'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: filesize
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
72
107
|
- - ">="
|
73
108
|
- !ruby/object:Gem::Version
|
74
|
-
version: 0
|
109
|
+
version: '0'
|
110
|
+
type: :runtime
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
75
117
|
- !ruby/object:Gem::Dependency
|
76
118
|
name: inifile
|
77
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -187,9 +229,23 @@ files:
|
|
187
229
|
- lib/avmtrf1/esosti/session/login.rb
|
188
230
|
- lib/avmtrf1/esosti/session/solicitacao.rb
|
189
231
|
- lib/avmtrf1/esosti/session/solicitacao/main.rb
|
232
|
+
- lib/avmtrf1/filesystem_cache.rb
|
233
|
+
- lib/avmtrf1/fs_cache.rb
|
190
234
|
- lib/avmtrf1/git.rb
|
191
235
|
- lib/avmtrf1/git/cached_repository.rb
|
192
236
|
- lib/avmtrf1/git/issue_on_repository.rb
|
237
|
+
- lib/avmtrf1/git/push_large.rb
|
238
|
+
- lib/avmtrf1/git/push_large/_utils.rb
|
239
|
+
- lib/avmtrf1/git/push_large/lfs_commit.rb
|
240
|
+
- lib/avmtrf1/git/push_large/lfs_commit/_00_checkout_previous_revision.rb
|
241
|
+
- lib/avmtrf1/git/push_large/lfs_commit/_01_cherry_pick_source_revision.rb
|
242
|
+
- lib/avmtrf1/git/push_large/lfs_commit/_02_track_large_files.rb
|
243
|
+
- lib/avmtrf1/git/push_large/lfs_commit/_03_commit_changes.rb
|
244
|
+
- lib/avmtrf1/git/push_large/lfs_commit/_04_push.rb
|
245
|
+
- lib/avmtrf1/git/push_large/lfs_commit/_cache.rb
|
246
|
+
- lib/avmtrf1/git/push_large/lfs_commit/_helpers.rb
|
247
|
+
- lib/avmtrf1/git/push_large/source_commit.rb
|
248
|
+
- lib/avmtrf1/git/push_large/source_commit/_push.rb
|
193
249
|
- lib/avmtrf1/git/reference.rb
|
194
250
|
- lib/avmtrf1/ini.rb
|
195
251
|
- lib/avmtrf1/ini/profile.rb
|
@@ -204,6 +260,7 @@ files:
|
|
204
260
|
- lib/avmtrf1/oracle/connection/base.rb
|
205
261
|
- lib/avmtrf1/oracle/connection/string_builder.rb
|
206
262
|
- lib/avmtrf1/patches.rb
|
263
|
+
- lib/avmtrf1/patches/eac_launcher/git/base.rb
|
207
264
|
- lib/avmtrf1/patches/inifile.rb
|
208
265
|
- lib/avmtrf1/red.rb
|
209
266
|
- lib/avmtrf1/red/client.rb
|
@@ -228,6 +285,7 @@ files:
|
|
228
285
|
- lib/avmtrf1/tools/runner/esosti.rb
|
229
286
|
- lib/avmtrf1/tools/runner/git.rb
|
230
287
|
- lib/avmtrf1/tools/runner/git/issues_check.rb
|
288
|
+
- lib/avmtrf1/tools/runner/git/push_large.rb
|
231
289
|
- lib/avmtrf1/tools/runner/oracle.rb
|
232
290
|
- lib/avmtrf1/tools/runner/oracle/source_get.rb
|
233
291
|
- lib/avmtrf1/tools/runner/red.rb
|