cocoapods-binary-cache 0.1.1

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.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/lib/cocoapods-binary-cache.rb +4 -0
  3. data/lib/cocoapods-binary-cache/cache/all.rb +9 -0
  4. data/lib/cocoapods-binary-cache/cache/validation_result.rb +69 -0
  5. data/lib/cocoapods-binary-cache/cache/validator.rb +21 -0
  6. data/lib/cocoapods-binary-cache/cache/validator_accumulated.rb +4 -0
  7. data/lib/cocoapods-binary-cache/cache/validator_base.rb +92 -0
  8. data/lib/cocoapods-binary-cache/cache/validator_dependencies_graph.rb +20 -0
  9. data/lib/cocoapods-binary-cache/cache/validator_dev_pods.rb +22 -0
  10. data/lib/cocoapods-binary-cache/cache/validator_exclusion.rb +14 -0
  11. data/lib/cocoapods-binary-cache/cache/validator_non_dev_pods.rb +13 -0
  12. data/lib/cocoapods-binary-cache/cache/validator_with_podfile.rb +9 -0
  13. data/lib/cocoapods-binary-cache/dependencies_graph/dependencies_graph.rb +95 -0
  14. data/lib/cocoapods-binary-cache/dependencies_graph/graph_visualizer.rb +74 -0
  15. data/lib/cocoapods-binary-cache/gem_version.rb +6 -0
  16. data/lib/cocoapods-binary-cache/helper/benchmark_show.rb +11 -0
  17. data/lib/cocoapods-binary-cache/helper/checksum.rb +12 -0
  18. data/lib/cocoapods-binary-cache/helper/json.rb +37 -0
  19. data/lib/cocoapods-binary-cache/helper/lockfile.rb +67 -0
  20. data/lib/cocoapods-binary-cache/helper/path_utils.rb +8 -0
  21. data/lib/cocoapods-binary-cache/helper/podspec.rb +17 -0
  22. data/lib/cocoapods-binary-cache/hooks/post_install.rb +16 -0
  23. data/lib/cocoapods-binary-cache/hooks/pre_install.rb +141 -0
  24. data/lib/cocoapods-binary-cache/main.rb +21 -0
  25. data/lib/cocoapods-binary-cache/pod-binary/LICENSE.txt +22 -0
  26. data/lib/cocoapods-binary-cache/pod-binary/helper/detected_prebuilt_pods/installer.rb +25 -0
  27. data/lib/cocoapods-binary-cache/pod-binary/helper/detected_prebuilt_pods/target_definition.rb +36 -0
  28. data/lib/cocoapods-binary-cache/pod-binary/helper/feature_switches.rb +90 -0
  29. data/lib/cocoapods-binary-cache/pod-binary/helper/names.rb +36 -0
  30. data/lib/cocoapods-binary-cache/pod-binary/helper/passer.rb +25 -0
  31. data/lib/cocoapods-binary-cache/pod-binary/helper/podfile_options.rb +2 -0
  32. data/lib/cocoapods-binary-cache/pod-binary/helper/prebuild_sandbox.rb +71 -0
  33. data/lib/cocoapods-binary-cache/pod-binary/helper/target_checker.rb +45 -0
  34. data/lib/cocoapods-binary-cache/pod-binary/integration.rb +12 -0
  35. data/lib/cocoapods-binary-cache/pod-binary/integration/alter_specs.rb +93 -0
  36. data/lib/cocoapods-binary-cache/pod-binary/integration/patch/embed_framework_script.rb +36 -0
  37. data/lib/cocoapods-binary-cache/pod-binary/integration/patch/resolve_dependencies.rb +23 -0
  38. data/lib/cocoapods-binary-cache/pod-binary/integration/patch/source_installation.rb +28 -0
  39. data/lib/cocoapods-binary-cache/pod-binary/integration/remove_target_files.rb +29 -0
  40. data/lib/cocoapods-binary-cache/pod-binary/integration/source_installer.rb +111 -0
  41. data/lib/cocoapods-binary-cache/pod-binary/integration/validation.rb +20 -0
  42. data/lib/cocoapods-binary-cache/pod-binary/prebuild.rb +224 -0
  43. data/lib/cocoapods-binary-cache/pod-binary/prebuild_dsl.rb +69 -0
  44. data/lib/cocoapods-binary-cache/pod-binary/prebuild_hook.rb +11 -0
  45. data/lib/cocoapods-binary-cache/pod-binary/tool/tool.rb +12 -0
  46. data/lib/cocoapods-binary-cache/pod-rome/LICENSE.txt +22 -0
  47. data/lib/cocoapods-binary-cache/pod-rome/build_framework.rb +247 -0
  48. data/lib/cocoapods-binary-cache/prebuild_cache.rb +49 -0
  49. data/lib/cocoapods-binary-cache/prebuild_output/metadata.rb +47 -0
  50. data/lib/cocoapods-binary-cache/prebuild_output/output.rb +71 -0
  51. data/lib/cocoapods-binary-cache/scheme_editor.rb +35 -0
  52. data/lib/cocoapods-binary-cache/state_store.rb +11 -0
  53. data/lib/cocoapods-binary-cache/ui.rb +9 -0
  54. data/lib/cocoapods_plugin.rb +5 -0
  55. data/lib/command/binary.rb +18 -0
  56. data/lib/command/config.rb +31 -0
  57. data/lib/command/executor/base.rb +20 -0
  58. data/lib/command/executor/fetcher.rb +44 -0
  59. data/lib/command/executor/prebuilder.rb +58 -0
  60. data/lib/command/executor/pusher.rb +19 -0
  61. data/lib/command/executor/visualizer.rb +20 -0
  62. data/lib/command/fetch.rb +23 -0
  63. data/lib/command/helper/zip.rb +20 -0
  64. data/lib/command/prebuild.rb +29 -0
  65. data/lib/command/visualize.rb +30 -0
  66. metadata +193 -0
@@ -0,0 +1,6 @@
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 CocoapodsBinaryCache
5
+ VERSION = "0.1.1".freeze
6
+ end
@@ -0,0 +1,11 @@
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 "benchmark"
5
+
6
+ class BenchmarkShow
7
+ def self.benchmark
8
+ time = Benchmark.measure { yield }
9
+ Pod::UI.puts "🕛 Time elapsed: #{time}"
10
+ end
11
+ end
@@ -0,0 +1,12 @@
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 "digest/md5"
5
+
6
+ class FolderChecksum
7
+ def self.checksum(dir)
8
+ files = Dir["#{dir}/**/*"].reject { |f| File.directory?(f) }
9
+ content = files.map { |f| File.read(f) }.join
10
+ Digest::MD5.hexdigest(content).to_s
11
+ end
12
+ end
@@ -0,0 +1,37 @@
1
+ require "json"
2
+
3
+ module PodPrebuild
4
+ class JSONFile
5
+ attr_reader :path
6
+ attr_reader :data
7
+
8
+ def initialize(path)
9
+ @path = path
10
+ @data = load_json
11
+ end
12
+
13
+ def empty?
14
+ @data.empty?
15
+ end
16
+
17
+ def [](key)
18
+ @data[key]
19
+ end
20
+
21
+ def []=(key, value)
22
+ @data[key] = value
23
+ end
24
+
25
+ def save!
26
+ File.open(@path, "w") { |f| f.write(JSON.pretty_generate(@data)) }
27
+ end
28
+
29
+ private
30
+
31
+ def load_json
32
+ File.open(@path) { |f| JSON.parse(f.read) }
33
+ rescue
34
+ {}
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,67 @@
1
+ module PodPrebuild
2
+ class Lockfile
3
+ attr_reader :lockfile, :data
4
+
5
+ def initialize(lockfile)
6
+ @lockfile = lockfile
7
+ @data = lockfile.to_hash
8
+ end
9
+
10
+ def pods
11
+ @pods ||= (@data["PODS"] || []).map { |v| pod_from(v) }.to_h
12
+ end
13
+
14
+ def external_sources
15
+ @data["EXTERNAL SOURCES"] || {}
16
+ end
17
+
18
+ def dev_pod_names
19
+ # There are 2 types of external sources:
20
+ # - Development pods: declared with `:path` option in Podfile, corresponding to `:path` in the Lockfile
21
+ # - External remote pods: declared with `:git` option in Podfile, corresponding to `:git` in the Lockfile
22
+ # --------------------
23
+ # EXTERNAL SOURCES:
24
+ # ADevPod:
25
+ # :path: path/to/dev_pod
26
+ # AnExternalRemotePod:
27
+ # :git: git@remote_url
28
+ # :commit: abc1234
29
+ # --------------------
30
+ @dev_pod_names ||= external_sources.select { |_, attributes| attributes.key?(:path) }.keys.to_set
31
+ end
32
+
33
+ def dev_pods
34
+ dev_pod_names_ = dev_pod_names
35
+ @dev_pods ||= pods.select { |name, _| dev_pod_names_.include?(name) }
36
+ end
37
+
38
+ def non_dev_pods
39
+ dev_pod_names_ = dev_pod_names
40
+ @non_dev_pods ||= pods.reject { |name, _| dev_pod_names_.include?(name) }
41
+ end
42
+
43
+ def subspec_pods
44
+ pods.keys
45
+ .select { |k| k.include?("/") }
46
+ .group_by { |k| k.split("/")[0] }
47
+ end
48
+
49
+ private
50
+
51
+ # Parse an item under `PODS` section of a Lockfile
52
+ # @param hash_or_string: an item under `PODS` section, could be a Hash (if having dependencies) or a String
53
+ # Examples:
54
+ # --------------------------
55
+ # PODS:
56
+ # - FrameworkA (0.0.1)
57
+ # - FrameworkB (0.0.2):
58
+ # - DependencyOfB
59
+ # -------------------------
60
+ # @return [framework_name, version] (for ex. ["AFramework", "0.0.1"])
61
+ def pod_from(hash_or_string)
62
+ name_with_version = hash_or_string.is_a?(Hash) ? hash_or_string.keys[0] : hash_or_string
63
+ match = name_with_version.match(/(\S+) \((\S+)\)/)
64
+ [match[1], match[2]]
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,8 @@
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
+ class PathUtils
5
+ def self.remove_last_path_component(path, num_components = 1)
6
+ path.split("/")[0...-num_components].join("/")
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ module Pod
2
+ class Specification
3
+ def empty_source_files?
4
+ return subspecs.all?(&:empty_source_files?) unless subspecs.empty?
5
+
6
+ check = lambda do |patterns|
7
+ patterns = [patterns] if patterns.is_a?(String)
8
+ patterns.reject(&:empty?).all? do |pattern|
9
+ Xcodeproj::Constants::HEADER_FILES_EXTENSIONS.any? { |ext| pattern.end_with?(ext) }
10
+ end
11
+ end
12
+ available_platforms.all? do |platform|
13
+ check.call(consumer(platform).source_files)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module PodPrebuild
2
+ class PostInstallHook
3
+ def initialize(installer_context)
4
+ @installer_context = installer_context
5
+ end
6
+
7
+ def run
8
+ return unless Pod::Podfile::DSL.dev_pods_enabled && @installer_context.sandbox.instance_of?(Pod::PrebuildSandbox)
9
+
10
+ # Modify pods scheme to support code coverage
11
+ # If we don't prebuild dev pod -> no need to care about this in Pod project
12
+ # because we setup in the main project (ex. DriverCI scheme)
13
+ SchemeEditor.edit_to_support_code_coverage(@installer_context.sandbox) if Pod.is_prebuild_stage
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,141 @@
1
+ module PodPrebuild
2
+ class PreInstallHook
3
+ include ObjectSpace
4
+
5
+ attr_reader :installer_context, :podfile, :prebuild_sandbox, :cache_validation
6
+
7
+ def initialize(installer_context)
8
+ @installer_context = installer_context
9
+ @podfile = installer_context.podfile
10
+ @pod_install_options = {}
11
+ @prebuild_sandbox = nil
12
+ @cache_validation = nil
13
+ end
14
+
15
+ def run
16
+ require_relative "../pod-binary/helper/feature_switches"
17
+ return if Pod.is_prebuild_stage
18
+
19
+ log_section "🚀 Prebuild frameworks"
20
+ ensure_valid_podfile
21
+ save_installation_states
22
+ prepare_environment
23
+ create_prebuild_sandbox
24
+ Pod::UI.section("Detect implicit dependencies") { detect_implicit_dependencies }
25
+ Pod::UI.section("Validate prebuilt cache") { validate_cache }
26
+ prebuild! if Pod::Podfile::DSL.prebuild_job?
27
+ reset_environment
28
+ log_section "🤖 Resume pod installation"
29
+ require_relative "../pod-binary/integration"
30
+ end
31
+
32
+ private
33
+
34
+ def save_installation_states
35
+ save_pod_install_options
36
+ save_states_from_dsl
37
+ end
38
+
39
+ def save_pod_install_options
40
+ # Fetch original installer (which is running this pre-install hook) options,
41
+ # then pass them to our installer to perform update if needed
42
+ # Looks like this is the most appropriate way to figure out that something should be updated
43
+ @original_installer = ObjectSpace.each_object(Pod::Installer).first
44
+ @pod_install_options[:update] = @original_installer.update
45
+ @pod_install_options[:repo_update] = @original_installer.repo_update
46
+ end
47
+
48
+ def ensure_valid_podfile
49
+ podfile.target_definition_list.each do |target_definition|
50
+ next if target_definition.explicit_prebuilt_pod_names.empty?
51
+ raise "cocoapods-binary-cache requires `use_frameworks!`" unless target_definition.uses_frameworks?
52
+ end
53
+ end
54
+
55
+ def prepare_environment
56
+ Pod::UI.puts "Prepare environment"
57
+ Pod.is_prebuild_stage = true
58
+ Pod::Podfile::DSL.enable_prebuild_patch true # enable sikpping for prebuild targets
59
+ Pod::Installer.force_disable_integration true # don't integrate targets
60
+ Pod::Config.force_disable_write_lockfile true # disbale write lock file for perbuild podfile
61
+ Pod::Installer.disable_install_complete_message true # disable install complete message
62
+ end
63
+
64
+ def reset_environment
65
+ Pod::UI.puts "Reset environment"
66
+ Pod.is_prebuild_stage = false
67
+ Pod::Installer.force_disable_integration false
68
+ Pod::Podfile::DSL.enable_prebuild_patch false
69
+ Pod::Config.force_disable_write_lockfile false
70
+ Pod::Installer.disable_install_complete_message false
71
+ Pod::UserInterface.warnings = [] # clean the warning in the prebuild step, it's duplicated.
72
+ end
73
+
74
+ def save_states_from_dsl
75
+ # Note: DSL is reloaded when creating an installer (Pod::Installer.new).
76
+ # Any mutation to DSL is highly discouraged
77
+ # --> Rather, perform mutation on PodPrebuild::StateStore instead
78
+ PodPrebuild::StateStore.excluded_pods += Pod::Podfile::DSL.excluded_pods
79
+ end
80
+
81
+ def create_prebuild_sandbox
82
+ standard_sandbox = installer_context.sandbox
83
+ @prebuild_sandbox = Pod::PrebuildSandbox.from_standard_sandbox(standard_sandbox)
84
+ Pod::UI.puts "Create prebuild sandbox at #{@prebuild_sandbox.root}"
85
+ end
86
+
87
+ def detect_implicit_dependencies
88
+ @original_installer.resolve_dependencies
89
+ all_specs = @original_installer.analysis_result.specifications
90
+ pods_with_empty_source_files = all_specs
91
+ .group_by { |spec| spec.name.split("/")[0] }
92
+ .select { |_, specs| specs.all?(&:empty_source_files?) }
93
+ .keys
94
+
95
+ PodPrebuild::StateStore.excluded_pods += pods_with_empty_source_files
96
+ Pod::UI.puts "Exclude pods with empty source files: #{pods_with_empty_source_files.to_a}"
97
+
98
+ # TODO (thuyen): Detect dependencies of a prebuilt pod and treat them as prebuilt pods as well
99
+ end
100
+
101
+ def validate_cache
102
+ prebuilt_lockfile = Pod::Lockfile.from_file(prebuild_sandbox.root + "Manifest.lock")
103
+ @cache_validation = PodPrebuild::CacheValidator.new(
104
+ podfile: podfile,
105
+ pod_lockfile: installer_context.lockfile,
106
+ prebuilt_lockfile: prebuilt_lockfile,
107
+ validate_prebuilt_settings: Pod::Podfile::DSL.validate_prebuilt_settings,
108
+ generated_framework_path: prebuild_sandbox.generate_framework_path,
109
+ sandbox_root: prebuild_sandbox.root,
110
+ ignored_pods: PodPrebuild::StateStore.excluded_pods,
111
+ prebuilt_pod_names: @original_installer.prebuilt_pod_names
112
+ ).validate
113
+ path_to_save_cache_validation = Pod::Podfile::DSL.save_cache_validation_to
114
+ @cache_validation.update_to(path_to_save_cache_validation) unless path_to_save_cache_validation.nil?
115
+ cache_validation.print_summary
116
+ PodPrebuild::StateStore.cache_validation = cache_validation
117
+ end
118
+
119
+ def prebuild!
120
+ binary_installer = Pod::PrebuildInstaller.new(
121
+ sandbox: prebuild_sandbox,
122
+ podfile: podfile,
123
+ lockfile: installer_context.lockfile,
124
+ cache_validation: cache_validation
125
+ )
126
+ binary_installer.update = @pod_install_options[:update]
127
+ binary_installer.repo_update = @pod_install_options[:repo_update]
128
+
129
+ Pod::UI.title("Prebuilding...") do
130
+ binary_installer.clean_delta_file
131
+ binary_installer.install!
132
+ end
133
+ end
134
+
135
+ def log_section(message)
136
+ Pod::UI.puts "-----------------------------------------"
137
+ Pod::UI.puts message
138
+ Pod::UI.puts "-----------------------------------------"
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,21 @@
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_relative "ui"
5
+ require_relative "dependencies_graph/dependencies_graph"
6
+ require_relative "cache/all"
7
+ require_relative "helper/benchmark_show"
8
+ require_relative "helper/json"
9
+ require_relative "helper/lockfile"
10
+ require_relative "helper/path_utils"
11
+ require_relative "helper/podspec"
12
+ require_relative "state_store"
13
+ require_relative "hooks/post_install"
14
+ require_relative "hooks/pre_install"
15
+ require_relative "pod-binary/prebuild_dsl"
16
+ require_relative "pod-binary/prebuild_hook"
17
+ require_relative "pod-binary/prebuild"
18
+ require_relative "prebuild_cache"
19
+ require_relative "prebuild_output/metadata"
20
+ require_relative "prebuild_output/output"
21
+ require_relative "scheme_editor"
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2018 leavez <gaojiji@gmail.com>
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,25 @@
1
+ module Pod
2
+ class Installer
3
+ # Returns the names of pod targets detected as prebuilt, including
4
+ # those declared in Podfile and their dependencies
5
+ def prebuilt_pod_names
6
+ prebuilt_pod_targets.map(&:name)
7
+ end
8
+
9
+ # Returns the pod targets detected as prebuilt, including
10
+ # those declared in Podfile and their dependencies
11
+ def prebuilt_pod_targets
12
+ @prebuilt_pod_targets ||= begin
13
+ explicit_prebuilt_pod_names = aggregate_targets
14
+ .flat_map { |target| target.target_definition.explicit_prebuilt_pod_names }
15
+ .uniq
16
+
17
+ targets = pod_targets.select { |target| explicit_prebuilt_pod_names.include?(target.pod_name) }
18
+ dependencies = targets.flat_map(&:recursive_dependent_targets) # Treat dependencies as prebuilt pods
19
+ all = (targets + dependencies).uniq
20
+ all = all.reject { |target| sandbox.local?(target.pod_name) } unless Podfile::DSL.dev_pods_enabled?
21
+ all
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,36 @@
1
+ module Pod
2
+ class Podfile
3
+ class TargetDefinition
4
+ def detect_prebuilt_pod(name, requirements)
5
+ @explicit_prebuilt_pod_names ||= []
6
+ options = requirements.last
7
+ if Pod::Podfile::DSL.prebuild_all?
8
+ @explicit_prebuilt_pod_names << Specification.root_name(name)
9
+ elsif options.is_a?(Hash) && options[:binary]
10
+ @explicit_prebuilt_pod_names << Specification.root_name(name)
11
+ end
12
+ options.delete(:binary) if options.is_a?(Hash)
13
+ requirements.pop if options.empty?
14
+ end
15
+
16
+ # Returns the names of pod targets explicitly declared as prebuilt in Podfile
17
+ # using `:binary => true`.
18
+ # In case `prebuild_all` is ON via `config_cocoapods_binary_cache`, returns the
19
+ # name of all pod targets
20
+ def explicit_prebuilt_pod_names
21
+ names = @explicit_prebuilt_pod_names || []
22
+ names += parent.explicit_prebuilt_pod_names if !parent.nil? && parent.is_a?(TargetDefinition)
23
+ names
24
+ end
25
+
26
+ # ---- patch method ----
27
+ # We want modify `store_pod` method, but it's hard to insert a line in the
28
+ # implementation. So we patch a method called in `store_pod`.
29
+ original_parse_inhibit_warnings = instance_method(:parse_inhibit_warnings)
30
+ define_method(:parse_inhibit_warnings) do |name, requirements|
31
+ detect_prebuilt_pod(name, requirements)
32
+ original_parse_inhibit_warnings.bind(self).call(name, requirements)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,90 @@
1
+ require_relative "../tool/tool"
2
+ require_relative "prebuild_sandbox"
3
+
4
+ module Pod
5
+
6
+ # a flag that indicate stages
7
+ class_attr_accessor :is_prebuild_stage
8
+
9
+ # a switch for the `pod` DSL to make it only valid for ':binary => true'
10
+ class Podfile
11
+ module DSL
12
+ @@enable_prebuild_patch = false
13
+
14
+ # when enable, `pod` function will skip all pods without 'prebuild => true'
15
+ def self.enable_prebuild_patch(value)
16
+ @@enable_prebuild_patch = value
17
+ end
18
+
19
+ # --- patch ---
20
+ old_method = instance_method(:pod)
21
+
22
+ define_method(:pod) do |name, *args|
23
+ if !@@enable_prebuild_patch
24
+ old_method.bind(self).(name, *args)
25
+ return
26
+ end
27
+
28
+ # patched content
29
+ should_prebuild = Pod::Podfile::DSL.prebuild_all
30
+ local = false
31
+
32
+ options = args.last
33
+ if options.is_a?(Hash) and options[Pod::Prebuild.keyword] != nil
34
+ should_prebuild = options[Pod::Prebuild.keyword]
35
+ local = (options[:path] != nil)
36
+ end
37
+
38
+ old_method.bind(self).call(name, *args) if should_prebuild && (!local || Podfile::DSL.dev_pods_enabled)
39
+ end
40
+ end
41
+ end
42
+
43
+ # a force disable option for integral
44
+ class Installer
45
+ def self.force_disable_integration(value)
46
+ @@force_disable_integration = value
47
+ end
48
+
49
+ old_method = instance_method(:integrate_user_project)
50
+ define_method(:integrate_user_project) do
51
+ if @@force_disable_integration
52
+ return
53
+ end
54
+ old_method.bind(self).()
55
+ end
56
+ end
57
+
58
+ # a option to disable install complete message
59
+ class Installer
60
+ def self.disable_install_complete_message(value)
61
+ @@disable_install_complete_message = value
62
+ end
63
+
64
+ old_method = instance_method(:print_post_install_message)
65
+ define_method(:print_post_install_message) do
66
+ if @@disable_install_complete_message
67
+ return
68
+ end
69
+ old_method.bind(self).()
70
+ end
71
+ end
72
+
73
+ # option to disable write lockfiles
74
+ class Config
75
+ @@force_disable_write_lockfile = false
76
+ def self.force_disable_write_lockfile(value)
77
+ @@force_disable_write_lockfile = value
78
+ end
79
+
80
+ old_method = instance_method(:lockfile_path)
81
+ define_method(:lockfile_path) do
82
+ if @@force_disable_write_lockfile
83
+ # As config is a singleton, sandbox_root refer to the standard sandbox.
84
+ return PrebuildSandbox.from_standard_sanbox_path(sandbox_root).root + "Manifest.lock.tmp"
85
+ else
86
+ return old_method.bind(self).()
87
+ end
88
+ end
89
+ end
90
+ end