cocoapods-binary-cache 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/cocoapods-binary-cache.rb +4 -0
- data/lib/cocoapods-binary-cache/cache/all.rb +9 -0
- data/lib/cocoapods-binary-cache/cache/validation_result.rb +69 -0
- data/lib/cocoapods-binary-cache/cache/validator.rb +21 -0
- data/lib/cocoapods-binary-cache/cache/validator_accumulated.rb +4 -0
- data/lib/cocoapods-binary-cache/cache/validator_base.rb +92 -0
- data/lib/cocoapods-binary-cache/cache/validator_dependencies_graph.rb +20 -0
- data/lib/cocoapods-binary-cache/cache/validator_dev_pods.rb +22 -0
- data/lib/cocoapods-binary-cache/cache/validator_exclusion.rb +14 -0
- data/lib/cocoapods-binary-cache/cache/validator_non_dev_pods.rb +13 -0
- data/lib/cocoapods-binary-cache/cache/validator_with_podfile.rb +9 -0
- data/lib/cocoapods-binary-cache/dependencies_graph/dependencies_graph.rb +95 -0
- data/lib/cocoapods-binary-cache/dependencies_graph/graph_visualizer.rb +74 -0
- data/lib/cocoapods-binary-cache/gem_version.rb +6 -0
- data/lib/cocoapods-binary-cache/helper/benchmark_show.rb +11 -0
- data/lib/cocoapods-binary-cache/helper/checksum.rb +12 -0
- data/lib/cocoapods-binary-cache/helper/json.rb +37 -0
- data/lib/cocoapods-binary-cache/helper/lockfile.rb +67 -0
- data/lib/cocoapods-binary-cache/helper/path_utils.rb +8 -0
- data/lib/cocoapods-binary-cache/helper/podspec.rb +17 -0
- data/lib/cocoapods-binary-cache/hooks/post_install.rb +16 -0
- data/lib/cocoapods-binary-cache/hooks/pre_install.rb +141 -0
- data/lib/cocoapods-binary-cache/main.rb +21 -0
- data/lib/cocoapods-binary-cache/pod-binary/LICENSE.txt +22 -0
- data/lib/cocoapods-binary-cache/pod-binary/helper/detected_prebuilt_pods/installer.rb +25 -0
- data/lib/cocoapods-binary-cache/pod-binary/helper/detected_prebuilt_pods/target_definition.rb +36 -0
- data/lib/cocoapods-binary-cache/pod-binary/helper/feature_switches.rb +90 -0
- data/lib/cocoapods-binary-cache/pod-binary/helper/names.rb +36 -0
- data/lib/cocoapods-binary-cache/pod-binary/helper/passer.rb +25 -0
- data/lib/cocoapods-binary-cache/pod-binary/helper/podfile_options.rb +2 -0
- data/lib/cocoapods-binary-cache/pod-binary/helper/prebuild_sandbox.rb +71 -0
- data/lib/cocoapods-binary-cache/pod-binary/helper/target_checker.rb +45 -0
- data/lib/cocoapods-binary-cache/pod-binary/integration.rb +12 -0
- data/lib/cocoapods-binary-cache/pod-binary/integration/alter_specs.rb +93 -0
- data/lib/cocoapods-binary-cache/pod-binary/integration/patch/embed_framework_script.rb +36 -0
- data/lib/cocoapods-binary-cache/pod-binary/integration/patch/resolve_dependencies.rb +23 -0
- data/lib/cocoapods-binary-cache/pod-binary/integration/patch/source_installation.rb +28 -0
- data/lib/cocoapods-binary-cache/pod-binary/integration/remove_target_files.rb +29 -0
- data/lib/cocoapods-binary-cache/pod-binary/integration/source_installer.rb +111 -0
- data/lib/cocoapods-binary-cache/pod-binary/integration/validation.rb +20 -0
- data/lib/cocoapods-binary-cache/pod-binary/prebuild.rb +224 -0
- data/lib/cocoapods-binary-cache/pod-binary/prebuild_dsl.rb +69 -0
- data/lib/cocoapods-binary-cache/pod-binary/prebuild_hook.rb +11 -0
- data/lib/cocoapods-binary-cache/pod-binary/tool/tool.rb +12 -0
- data/lib/cocoapods-binary-cache/pod-rome/LICENSE.txt +22 -0
- data/lib/cocoapods-binary-cache/pod-rome/build_framework.rb +247 -0
- data/lib/cocoapods-binary-cache/prebuild_cache.rb +49 -0
- data/lib/cocoapods-binary-cache/prebuild_output/metadata.rb +47 -0
- data/lib/cocoapods-binary-cache/prebuild_output/output.rb +71 -0
- data/lib/cocoapods-binary-cache/scheme_editor.rb +35 -0
- data/lib/cocoapods-binary-cache/state_store.rb +11 -0
- data/lib/cocoapods-binary-cache/ui.rb +9 -0
- data/lib/cocoapods_plugin.rb +5 -0
- data/lib/command/binary.rb +18 -0
- data/lib/command/config.rb +31 -0
- data/lib/command/executor/base.rb +20 -0
- data/lib/command/executor/fetcher.rb +44 -0
- data/lib/command/executor/prebuilder.rb +58 -0
- data/lib/command/executor/pusher.rb +19 -0
- data/lib/command/executor/visualizer.rb +20 -0
- data/lib/command/fetch.rb +23 -0
- data/lib/command/helper/zip.rb +20 -0
- data/lib/command/prebuild.rb +29 -0
- data/lib/command/visualize.rb +30 -0
- metadata +193 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
# Copyright 2019 Grabtaxi Holdings PTE LTE (GRAB), All rights reserved.
|
2
|
+
# Use of this source code is governed by an MIT-style license that can be found in the LICENSE file
|
3
|
+
|
4
|
+
require 'json'
|
5
|
+
require 'cocoapods'
|
6
|
+
require_relative "helper/checksum"
|
7
|
+
|
8
|
+
class PodCacheValidator
|
9
|
+
|
10
|
+
# Cache miss/hit checking for development pods
|
11
|
+
# Return 2 Hashes for cache miss and cache hit libraries
|
12
|
+
def self.verify_devpod_checksum(sandbox_root, generated_framework_path, lock_file)
|
13
|
+
devpod_path = "#{sandbox_root}/devpod/"
|
14
|
+
target_path = generated_framework_path
|
15
|
+
Pod::UI.puts "verify_devpod_checksum: #{devpod_path}"
|
16
|
+
external_sources = lock_file.to_hash["EXTERNAL SOURCES"]
|
17
|
+
unless File.directory?(target_path)
|
18
|
+
FileUtils.mkdir_p(target_path)
|
19
|
+
end
|
20
|
+
missing_pods_dic = Hash[]
|
21
|
+
dev_pods_count = 0
|
22
|
+
cachehit_pods_dic = Hash[]
|
23
|
+
if !external_sources
|
24
|
+
Pod::UI.puts 'No development pods!'
|
25
|
+
return missing_pods_dic, cachehit_pods
|
26
|
+
end
|
27
|
+
external_sources.each do |name, attribs|
|
28
|
+
if attribs.class == Hash
|
29
|
+
path = attribs[:path]
|
30
|
+
if path
|
31
|
+
hash = FolderChecksum.checksum(path)
|
32
|
+
dev_pods_count += 1
|
33
|
+
cached_path = "#{devpod_path}#{name}_#{hash}"
|
34
|
+
if !Dir.exists?(cached_path)
|
35
|
+
missing_pods_dic[name] = hash
|
36
|
+
else
|
37
|
+
cachehit_pods_dic[name] = hash
|
38
|
+
target_dir = "#{target_path}/#{name}"
|
39
|
+
FileUtils.rm_r(target_dir, :force => true)
|
40
|
+
FileUtils.cp_r(cached_path, target_dir)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
else
|
44
|
+
Pod::UI.puts "Error, wrong type: #{attribs}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
return missing_pods_dic, cachehit_pods_dic
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module PodPrebuild
|
2
|
+
class Metadata < JSONFile
|
3
|
+
def self.in_dir(dir)
|
4
|
+
PodPrebuild::Metadata.new(dir + "metadata.json")
|
5
|
+
end
|
6
|
+
|
7
|
+
def resources
|
8
|
+
@data["resources"] || []
|
9
|
+
end
|
10
|
+
|
11
|
+
def resources=(value)
|
12
|
+
@data["resources"] = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def framework_name
|
16
|
+
@data["framework_name"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def framework_name=(value)
|
20
|
+
@data["framework_name"] = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def static_framework?
|
24
|
+
@data["static_framework"] || false
|
25
|
+
end
|
26
|
+
|
27
|
+
def static_framework=(value)
|
28
|
+
@data["static_framework"] = value
|
29
|
+
end
|
30
|
+
|
31
|
+
def resource_bundles
|
32
|
+
@data["resource_bundles"] || []
|
33
|
+
end
|
34
|
+
|
35
|
+
def resource_bundles=(value)
|
36
|
+
@data["resource_bundles"] = value
|
37
|
+
end
|
38
|
+
|
39
|
+
def build_settings
|
40
|
+
@data["build_settings"] || {}
|
41
|
+
end
|
42
|
+
|
43
|
+
def build_settings=(value)
|
44
|
+
@data["build_settings"] = value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# Copyright 2019 Grabtaxi Holdings PTE LTE (GRAB), All rights reserved.
|
2
|
+
# Use of this source code is governed by an MIT-style license that can be found in the LICENSE file
|
3
|
+
|
4
|
+
module PodPrebuild
|
5
|
+
class Output
|
6
|
+
def initialize(prebuild_sandbox)
|
7
|
+
@sandbox = prebuild_sandbox
|
8
|
+
end
|
9
|
+
|
10
|
+
def delta_dir
|
11
|
+
@delta_dir ||= File.expand_path("#{@sandbox.root}/../_Prebuild_delta")
|
12
|
+
end
|
13
|
+
|
14
|
+
def delta_file_path
|
15
|
+
# TODO (thuyen): Unify this path with PodPrebuild::Config#delta_file_path
|
16
|
+
"#{delta_dir}/changes.json"
|
17
|
+
end
|
18
|
+
|
19
|
+
def clean_delta_file
|
20
|
+
puts "Clean delta file: #{delta_file_path}"
|
21
|
+
FileUtils.rm_rf(delta_file_path)
|
22
|
+
end
|
23
|
+
|
24
|
+
def create_dir_if_needed(dir)
|
25
|
+
FileUtils.mkdir_p dir unless File.directory?(dir)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Input 2 arrays of library names
|
29
|
+
def write_delta_file(updated, deleted)
|
30
|
+
if updated.empty? && deleted.empty?
|
31
|
+
Pod::UI.puts "No changes in prebuild"
|
32
|
+
return
|
33
|
+
end
|
34
|
+
|
35
|
+
Pod::UI.puts "Write prebuild changes to: #{delta_file_path}"
|
36
|
+
create_dir_if_needed(delta_dir)
|
37
|
+
changes = PodPrebuild::JSONFile.new(delta_file_path)
|
38
|
+
changes["updated"] = updated
|
39
|
+
changes["deleted"] = deleted
|
40
|
+
changes.save!
|
41
|
+
end
|
42
|
+
|
43
|
+
def process_prebuilt_dev_pods
|
44
|
+
devpod_output_path = "#{delta_dir}/devpod_prebuild_output/"
|
45
|
+
create_dir_if_needed(devpod_output_path)
|
46
|
+
Pod::UI.puts "Copy prebuilt devpod frameworks to output dir: #{devpod_output_path}"
|
47
|
+
|
48
|
+
# Inject project path (where the framework is built) to support generating code coverage later
|
49
|
+
project_root = PathUtils.remove_last_path_component(@sandbox.standard_sanbox_path.to_s)
|
50
|
+
template_file_path = devpod_output_path + "prebuilt_map"
|
51
|
+
File.open(template_file_path, "w") do |file|
|
52
|
+
file.write(project_root)
|
53
|
+
end
|
54
|
+
|
55
|
+
# FIXME (thuyen): Revise usage of cache_miss_dev_pods_dic
|
56
|
+
# The behavior of processing outputs of dev pods and non-dev pods should be very SIMILAR
|
57
|
+
cache_miss_dev_pods_dic = {}
|
58
|
+
|
59
|
+
cache_miss_dev_pods_dic.each do |name, hash|
|
60
|
+
Pod::UI.puts "Output dev pod lib: #{name} hash: #{hash}"
|
61
|
+
built_lib_path = @sandbox.framework_folder_path_for_target_name(name)
|
62
|
+
next unless File.directory?(built_lib_path)
|
63
|
+
|
64
|
+
FileUtils.cp(template_file_path, "#{built_lib_path}/#{name}.framework")
|
65
|
+
target_dir = "#{devpod_output_path}#{name}_#{hash}"
|
66
|
+
Pod::UI.puts "From: #{built_lib_path} -> #{target_dir}"
|
67
|
+
FileUtils.cp_r(built_lib_path, target_dir)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Copyright 2019 Grabtaxi Holdings PTE LTE (GRAB), All rights reserved.
|
2
|
+
# Use of this source code is governed by an MIT-style license that can be found in the LICENSE file
|
3
|
+
|
4
|
+
require 'rexml/document'
|
5
|
+
|
6
|
+
class SchemeEditor
|
7
|
+
def self.edit_to_support_code_coverage(sandbox)
|
8
|
+
pod_proj_path = sandbox.project_path
|
9
|
+
puts "Modify schemes of pod project to support code coverage of prebuilt local pod: #{pod_proj_path}"
|
10
|
+
scheme_files = Dir["#{pod_proj_path}/**/*.xcscheme"]
|
11
|
+
scheme_files.each do |file_path|
|
12
|
+
scheme_name = File.basename(file_path, '.*')
|
13
|
+
next unless sandbox.local?(scheme_name)
|
14
|
+
|
15
|
+
puts "Modify scheme to enable coverage symbol when prebuild: #{scheme_name}"
|
16
|
+
|
17
|
+
doc = File.open(file_path, 'r') { |f| REXML::Document.new(f) }
|
18
|
+
scheme = doc.elements['Scheme']
|
19
|
+
test_action = scheme.elements['TestAction']
|
20
|
+
next if test_action.attributes['codeCoverageEnabled'] == 'YES'
|
21
|
+
|
22
|
+
test_action.add_attribute('codeCoverageEnabled', 'YES')
|
23
|
+
test_action.add_attribute('onlyGenerateCoverageForSpecifiedTargets', 'YES')
|
24
|
+
coverage_targets = REXML::Element.new('CodeCoverageTargets')
|
25
|
+
buildable_ref = scheme.elements['BuildAction'] \
|
26
|
+
.elements['BuildActionEntries'] \
|
27
|
+
.elements['BuildActionEntry'] \
|
28
|
+
.elements['BuildableReference']
|
29
|
+
new_buildable_ref = buildable_ref.clone # Need to clone, otherwise the original one will be move to new place
|
30
|
+
coverage_targets.add_element(new_buildable_ref)
|
31
|
+
test_action.add_element(coverage_targets)
|
32
|
+
File.open(file_path, 'w') { |f| doc.write(f) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
require_relative "config"
|
3
|
+
require_relative "fetch"
|
4
|
+
require_relative "prebuild"
|
5
|
+
require_relative "visualize"
|
6
|
+
|
7
|
+
module Pod
|
8
|
+
class Command
|
9
|
+
class Binary < Command
|
10
|
+
self.abstract_command = true
|
11
|
+
self.default_subcommand = "fetch"
|
12
|
+
|
13
|
+
def prebuild_config
|
14
|
+
@prebuild_config ||= PodPrebuild::Config.new("PodBinaryCacheConfig.json")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative "../cocoapods-binary-cache/helper/json"
|
2
|
+
|
3
|
+
module PodPrebuild
|
4
|
+
class Config
|
5
|
+
attr_reader :cache_repo, :cache_path, :prebuild_path
|
6
|
+
|
7
|
+
def initialize(path)
|
8
|
+
@data = PodPrebuild::JSONFile.new(path)
|
9
|
+
@cache_repo = @data["cache_repo"] || @data["prebuilt_cache_repo"]
|
10
|
+
@cache_path = File.expand_path(@data["cache_path"])
|
11
|
+
@prebuild_path = @data["prebuild_path"] || "Pods/_Prebuild"
|
12
|
+
end
|
13
|
+
|
14
|
+
def manifest_path(in_cache: false)
|
15
|
+
root_dir(in_cache) + "/Manifest.lock"
|
16
|
+
end
|
17
|
+
|
18
|
+
def root_dir(in_cache)
|
19
|
+
in_cache ? @cache_path : @prebuild_path
|
20
|
+
end
|
21
|
+
|
22
|
+
def generated_frameworks_dir(in_cache: false)
|
23
|
+
root_dir(in_cache) + "/GeneratedFrameworks"
|
24
|
+
end
|
25
|
+
|
26
|
+
def delta_file_path
|
27
|
+
# TODO (thuyen): Unify this path with PodPrebuild::Output#delta_file_path
|
28
|
+
"Pods/_Prebuild_delta/changes.json"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module PodPrebuild
|
2
|
+
class CommandExecutor
|
3
|
+
def initialize(options)
|
4
|
+
@config = options[:config]
|
5
|
+
end
|
6
|
+
|
7
|
+
def git(cmd, options = {})
|
8
|
+
comps = ["git"]
|
9
|
+
comps << "-C" << @config.cache_path unless options[:cache_repo] == false
|
10
|
+
comps << cmd
|
11
|
+
comps << "&> /dev/null" if options[:ignore_output]
|
12
|
+
comps << "|| true" if options[:can_fail]
|
13
|
+
`#{comps.join(" ")}`
|
14
|
+
end
|
15
|
+
|
16
|
+
def git_clone(cmd, options = {})
|
17
|
+
git("clone #{cmd}", options.merge(:cache_repo => false))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
require_relative "../helper/zip"
|
3
|
+
|
4
|
+
module PodPrebuild
|
5
|
+
class CacheFetcher < CommandExecutor
|
6
|
+
def initialize(options)
|
7
|
+
super(options)
|
8
|
+
@cache_branch = options[:cache_branch]
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
Pod::UI.step("Fetching cache") do
|
13
|
+
fetch_cache(@config.cache_repo, @cache_branch, @config.cache_path)
|
14
|
+
unzip_cache
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def fetch_cache(repo, branch, dest_dir)
|
21
|
+
Pod::UI.puts "Fetching cache from #{repo} (branch: #{branch})".green
|
22
|
+
if Dir.exist?(dest_dir + "/.git")
|
23
|
+
git("fetch origin #{branch}")
|
24
|
+
git("checkout -f FETCH_HEAD", ignore_output: true)
|
25
|
+
git("branch -D #{branch} || true", ignore_output: true, can_fail: true)
|
26
|
+
git("checkout -b #{branch}")
|
27
|
+
else
|
28
|
+
FileUtils.rm_rf(dest_dir)
|
29
|
+
git_clone("--depth=1 --branch=#{branch} #{repo} #{dest_dir}")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def unzip_cache
|
34
|
+
Pod::UI.puts "Unzipping cache: #{@config.cache_path} -> #{@config.prebuild_path}".green
|
35
|
+
FileUtils.rm_rf(@config.prebuild_path)
|
36
|
+
FileUtils.mkdir_p(@config.prebuild_path)
|
37
|
+
|
38
|
+
FileUtils.cp(@config.manifest_path(in_cache: true), @config.manifest_path)
|
39
|
+
Dir[@config.generated_frameworks_dir(in_cache: true) + "/*.zip"].each do |path|
|
40
|
+
ZipUtils.unzip(path, to_dir: @config.generated_frameworks_dir)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
require_relative "fetcher"
|
3
|
+
require_relative "pusher"
|
4
|
+
|
5
|
+
module PodPrebuild
|
6
|
+
class CachePrebuilder < CommandExecutor
|
7
|
+
def initialize(options)
|
8
|
+
super(options)
|
9
|
+
@cache_branch = options[:cache_branch]
|
10
|
+
@push_cache = options[:push_cache]
|
11
|
+
@fetcher = PodPrebuild::CacheFetcher.new(options)
|
12
|
+
@pusher = PodPrebuild::CachePusher.new(options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
@fetcher.run
|
17
|
+
prebuild
|
18
|
+
changes = PodPrebuild::JSONFile.new(@config.delta_file_path)
|
19
|
+
return if changes.empty?
|
20
|
+
|
21
|
+
sync_cache(changes)
|
22
|
+
@pusher.run if @push_cache
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def prebuild
|
28
|
+
Pod::UI.step("Installation") do
|
29
|
+
Pod::Command::Install.new(CLAide::ARGV.new([])).run
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def sync_cache(changes)
|
34
|
+
Pod::UI.step("Syncing cache") do
|
35
|
+
FileUtils.cp(@config.manifest_path, @config.manifest_path(in_cache: true))
|
36
|
+
clean_cache(changes["deleted"])
|
37
|
+
zip_to_cache(changes["updated"])
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def zip_to_cache(pods_to_update)
|
42
|
+
pods_to_update.each do |pod|
|
43
|
+
Pod::UI.puts "- Update cache: #{pod}"
|
44
|
+
ZipUtils.zip(
|
45
|
+
"#{@config.generated_frameworks_dir}/#{pod}",
|
46
|
+
to_dir: @config.generated_frameworks_dir(in_cache: true)
|
47
|
+
)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def clean_cache(pods_to_delete)
|
52
|
+
pods_to_delete.each do |pod|
|
53
|
+
Pod::UI.puts "- Clean up cache: #{pod}"
|
54
|
+
FileUtils.rm_rf("#{@config.generated_frameworks_dir(in_cache: true)}/#{pod}.zip")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module PodPrebuild
|
4
|
+
class CachePusher < CommandExecutor
|
5
|
+
def initialize(options)
|
6
|
+
super(options)
|
7
|
+
@cache_branch = options[:cache_branch]
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
Pod::UI.step("Pushing cache") do
|
12
|
+
commit_message = "Update prebuilt cache".shellescape
|
13
|
+
git("add .")
|
14
|
+
git("commit -m '#{commit_message}'")
|
15
|
+
git("push origin head")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
require_relative "../../cocoapods-binary-cache/dependencies_graph/dependencies_graph"
|
3
|
+
|
4
|
+
module PodPrebuild
|
5
|
+
class Visualizer < CommandExecutor
|
6
|
+
def initialize(options)
|
7
|
+
super(options)
|
8
|
+
@lockfile = options[:lockfile]
|
9
|
+
@open = options[:open]
|
10
|
+
@output_dir = options[:output_dir]
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
FileUtils.mkdir_p(@output_dir)
|
15
|
+
graph = DependenciesGraph.new(@lockfile)
|
16
|
+
graph.write_graphic_file("png", "#{@output_dir}/graph", Set.new)
|
17
|
+
`open #{@output_dir}/graph.png` if @open
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|