pod-builder-y 2.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +13 -0
- data/README.md +385 -0
- data/Rakefile +2 -0
- data/bin/console +16 -0
- data/bin/setup +8 -0
- data/exe/pod_builder_y +406 -0
- data/lib/core_ext/string.rb +5 -0
- data/lib/pod_builder/analyze.rb +59 -0
- data/lib/pod_builder/analyzer.rb +16 -0
- data/lib/pod_builder/command.rb +14 -0
- data/lib/pod_builder/command/build.rb +228 -0
- data/lib/pod_builder/command/build_all.rb +15 -0
- data/lib/pod_builder/command/clean.rb +75 -0
- data/lib/pod_builder/command/deintegrate.rb +101 -0
- data/lib/pod_builder/command/generate_lldbinit.rb +128 -0
- data/lib/pod_builder/command/generate_podspec.rb +22 -0
- data/lib/pod_builder/command/info.rb +18 -0
- data/lib/pod_builder/command/init.rb +148 -0
- data/lib/pod_builder/command/install_sources.rb +79 -0
- data/lib/pod_builder/command/none.rb +16 -0
- data/lib/pod_builder/command/restore_all.rb +33 -0
- data/lib/pod_builder/command/switch.rb +224 -0
- data/lib/pod_builder/command/sync_podfile.rb +34 -0
- data/lib/pod_builder/command/update.rb +43 -0
- data/lib/pod_builder/configuration.rb +300 -0
- data/lib/pod_builder/core.rb +222 -0
- data/lib/pod_builder/info.rb +90 -0
- data/lib/pod_builder/install.rb +505 -0
- data/lib/pod_builder/licenses.rb +73 -0
- data/lib/pod_builder/podfile.rb +700 -0
- data/lib/pod_builder/podfile/pre_actions_swizzles.rb +84 -0
- data/lib/pod_builder/podfile_cp.rb +99 -0
- data/lib/pod_builder/podfile_item.rb +530 -0
- data/lib/pod_builder/podspec.rb +269 -0
- data/lib/pod_builder/rome/post_install.rb +446 -0
- data/lib/pod_builder/rome/pre_install.rb +6 -0
- data/lib/pod_builder/templates/build_podfile.template +70 -0
- data/lib/pod_builder/templates/build_podspec.template +19 -0
- data/lib/pod_builder/version.rb +4 -0
- data/pod-builder.gemspec +37 -0
- metadata +240 -0
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'pod_builder/core'
|
2
|
+
require 'digest'
|
3
|
+
|
4
|
+
module PodBuilder
|
5
|
+
module Command
|
6
|
+
class UpdateLldbInit
|
7
|
+
def self.call
|
8
|
+
Configuration.check_inited
|
9
|
+
if Configuration.build_using_repo_paths
|
10
|
+
raise "\n\nlldb shenanigans not supported when 'build_using_repo_paths' is enabled".red
|
11
|
+
end
|
12
|
+
|
13
|
+
arguments = ARGV.dup
|
14
|
+
|
15
|
+
if arguments.count > 0
|
16
|
+
source_path = arguments[0]
|
17
|
+
if !is_absolute_path(source_path)
|
18
|
+
source_path = PodBuilder::basepath(source_path)
|
19
|
+
end
|
20
|
+
source_path = File.expand_path(source_path)
|
21
|
+
|
22
|
+
raise "\n\nSpecified path does not exists" unless File.directory?(source_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
base_path = PodBuilder::basepath
|
26
|
+
app_podfile_content = File.read(PodBuilder::project_path("Podfile"))
|
27
|
+
|
28
|
+
lldbinit_path = File.expand_path(PodBuilder::basepath(Configuration.lldbinit_name))
|
29
|
+
|
30
|
+
puts "Extracting debug information".yellow
|
31
|
+
|
32
|
+
FileUtils.mkdir_p(Configuration.build_path)
|
33
|
+
compilation_base_path = Pathname.new(Configuration.build_path).realpath.to_s
|
34
|
+
|
35
|
+
pods_mappings = Hash.new
|
36
|
+
|
37
|
+
app_podfile_content.each_line do |line|
|
38
|
+
unless (name_match = line.match(/^\s*pod ['|"](.*?)['|"](.*)/)) && name_match.size == 3
|
39
|
+
next
|
40
|
+
end
|
41
|
+
|
42
|
+
pod_name = name_match[1].split("/").first
|
43
|
+
|
44
|
+
source = nil
|
45
|
+
destination = PodBuilder::basepath # puts some existing path, see lldbinit_content.reverse! comment
|
46
|
+
if (path_match = line.match(/:path\s?=>\s?['|"](.*?)['|"]/)) && path_match.size == 2
|
47
|
+
pod_path = path_match[1]
|
48
|
+
if !is_absolute_path(pod_path)
|
49
|
+
pod_path = File.expand_path("#{base_path}/#{pod_path}")
|
50
|
+
end
|
51
|
+
|
52
|
+
is_prebuilt = pod_path.start_with?(PodBuilder::prebuiltpath(pod_name))
|
53
|
+
if is_prebuilt
|
54
|
+
source = "#{compilation_base_path}/Pods/#{pod_name}"
|
55
|
+
destination = PodBuilder::prebuiltpath(pod_name)
|
56
|
+
|
57
|
+
info_path = "#{pod_path}/#{Configuration.prebuilt_info_filename}"
|
58
|
+
next unless File.exists?(info_path)
|
59
|
+
data = JSON.parse(File.read(info_path))
|
60
|
+
|
61
|
+
build_source_path_matches = data["entry"].match(/:path => '(.*?)'/)
|
62
|
+
if build_source_path_matches&.size == 2
|
63
|
+
build_source_path = build_source_path_matches[1]
|
64
|
+
if !is_absolute_path(build_source_path)
|
65
|
+
build_source_path = PodBuilder::basepath(build_source_path)
|
66
|
+
end
|
67
|
+
destination = File.expand_path(build_source_path)
|
68
|
+
end
|
69
|
+
elsif File.directory?(pod_path)
|
70
|
+
source = pod_path
|
71
|
+
destination = pod_path
|
72
|
+
end
|
73
|
+
else
|
74
|
+
pod_path = PodBuilder::project_path("Pods/#{pod_name}")
|
75
|
+
if File.directory?(pod_path)
|
76
|
+
source = pod_path
|
77
|
+
destination = pod_path
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
if !source.nil? && File.directory?(destination)
|
82
|
+
pods_mappings[source] = destination
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
prebuilt_source_map_entries = []
|
87
|
+
other_source_map_entries = []
|
88
|
+
pods_mappings.each do |source, destination|
|
89
|
+
if source.include?(compilation_base_path)
|
90
|
+
prebuilt_source_map_entries.push("settings append target.source-map '#{source}/' '#{destination}/'")
|
91
|
+
else
|
92
|
+
other_source_map_entries.push("settings append target.source-map '#{source}/' '#{destination}/'")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# There is a bug/unexpected behavior related to the target.source-map command
|
97
|
+
#
|
98
|
+
# If I have debug symbols for the following files:
|
99
|
+
# /tmp/pod_builder/Pods/SomeName/... which are now under /new/path/SomeName/
|
100
|
+
# /tmp/pod_builder/Pods/SomeNameCommon/... which are now under /new/path/SomeNameCommon/
|
101
|
+
#
|
102
|
+
# adding a remap as follows
|
103
|
+
# settings append '/tmp/pod_builder/Pods/SomeName/' '/new/path/SomeName/'
|
104
|
+
#
|
105
|
+
# causes breakpoints added to files under /new/path/SomeNameCommon/ to be incorrectly added to
|
106
|
+
# /tmp/pod_builder/Pods/SomeName/Common/Somefile
|
107
|
+
#
|
108
|
+
# LLDB evaluates remap in order so to workaround this issue we have to add a remap of
|
109
|
+
# /tmp/pod_builder/Pods/SomeNameCommon/ before remapping /tmp/pod_builder/Pods/SomeName/
|
110
|
+
# even if the remap isn't needed!
|
111
|
+
lldbinit_content = other_source_map_entries.sort.reverse + prebuilt_source_map_entries.sort.reverse
|
112
|
+
|
113
|
+
lldbinit_content.insert(0, "settings clear target.source-map\n")
|
114
|
+
|
115
|
+
File.write(lldbinit_path, lldbinit_content.join("\n"))
|
116
|
+
|
117
|
+
puts "\n\n🎉 done!\n".green
|
118
|
+
return 0
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
|
123
|
+
def self.is_absolute_path(path)
|
124
|
+
return ["~", "/"].any? { |t| path.start_with?(t) }
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'pod_builder/core'
|
2
|
+
|
3
|
+
module PodBuilder
|
4
|
+
module Command
|
5
|
+
class GeneratePodspec
|
6
|
+
def self.call
|
7
|
+
Configuration.check_inited
|
8
|
+
PodBuilder::prepare_basepath
|
9
|
+
|
10
|
+
installer, analyzer = Analyze.installer_at(PodBuilder::basepath, false)
|
11
|
+
all_buildable_items = Analyze.podfile_items(installer, analyzer)
|
12
|
+
|
13
|
+
install_using_frameworks = Podfile::install_using_frameworks(analyzer)
|
14
|
+
|
15
|
+
Podspec::generate(all_buildable_items, analyzer, install_using_frameworks)
|
16
|
+
|
17
|
+
puts "\n\n🎉 done!\n".green
|
18
|
+
return 0
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'pod_builder/core'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module PodBuilder
|
5
|
+
module Command
|
6
|
+
class Info
|
7
|
+
def self.call
|
8
|
+
Configuration.check_inited
|
9
|
+
|
10
|
+
info = PodBuilder::Info.generate_info()
|
11
|
+
|
12
|
+
puts JSON.pretty_generate(info)
|
13
|
+
|
14
|
+
return true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'pod_builder/core'
|
2
|
+
|
3
|
+
module PodBuilder
|
4
|
+
module Command
|
5
|
+
class Init
|
6
|
+
def self.call
|
7
|
+
raise "\n\nAlready initialized\n".red if Configuration.exists
|
8
|
+
|
9
|
+
xcworkspace = Dir.glob("*.xcworkspace")
|
10
|
+
raise "\n\nNo xcworkspace found in current folder\n".red if xcworkspace.count == 0
|
11
|
+
raise "\n\nToo many xcworkspaces found in current folder\n#{xcworkspace}\n".red if xcworkspace.count > 1
|
12
|
+
|
13
|
+
Configuration.project_name = File.basename(xcworkspace.first, ".*")
|
14
|
+
|
15
|
+
OPTIONS[:prebuild_path] ||= Configuration.base_path
|
16
|
+
|
17
|
+
if File.expand_path(OPTIONS[:prebuild_path]) != OPTIONS[:prebuild_path] # if not absolute
|
18
|
+
OPTIONS[:prebuild_path] = File.expand_path(PodBuilder::project_path(OPTIONS[:prebuild_path]))
|
19
|
+
end
|
20
|
+
|
21
|
+
FileUtils.mkdir_p(OPTIONS[:prebuild_path])
|
22
|
+
FileUtils.mkdir_p("#{OPTIONS[:prebuild_path]}/.pod_builder")
|
23
|
+
FileUtils.touch("#{OPTIONS[:prebuild_path]}/.pod_builder/pod_builder")
|
24
|
+
|
25
|
+
write_gitignore
|
26
|
+
write_gitattributes
|
27
|
+
|
28
|
+
project_podfile_path = PodBuilder::project_path("Podfile")
|
29
|
+
prebuilt_podfile_path = File.join(OPTIONS[:prebuild_path], "Podfile")
|
30
|
+
FileUtils.cp(project_podfile_path, prebuilt_podfile_path)
|
31
|
+
|
32
|
+
podfile_content = File.read(prebuilt_podfile_path)
|
33
|
+
|
34
|
+
podfile_content = Podfile.add_install_block(podfile_content)
|
35
|
+
podfile_content = Podfile.update_path_entries(podfile_content, Init.method(:podfile_path_transform))
|
36
|
+
podfile_content = Podfile.update_project_entries(podfile_content, Init.method(:podfile_path_transform))
|
37
|
+
podfile_content = Podfile.update_require_entries(podfile_content, Init.method(:podfile_path_transform))
|
38
|
+
|
39
|
+
if podfile_content.include?("/node_modules/react-native/")
|
40
|
+
podfile_content = Podfile.prepare_for_react_native(podfile_content)
|
41
|
+
update_react_native_podspecs()
|
42
|
+
end
|
43
|
+
|
44
|
+
File.write(prebuilt_podfile_path, podfile_content)
|
45
|
+
|
46
|
+
Configuration.write
|
47
|
+
|
48
|
+
update_gemfile
|
49
|
+
|
50
|
+
puts "\n\n🎉 done!\n".green
|
51
|
+
return 0
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def self.write_gitignore
|
57
|
+
source_path_rel_path = "Sources"
|
58
|
+
development_pods_config_rel_path = Configuration.dev_pods_configuration_filename
|
59
|
+
|
60
|
+
git_ignores = ["Pods/",
|
61
|
+
"*.xcworkspace",
|
62
|
+
"*.xcodeproj",
|
63
|
+
"Podfile.lock",
|
64
|
+
Configuration.lldbinit_name,
|
65
|
+
source_path_rel_path,
|
66
|
+
development_pods_config_rel_path]
|
67
|
+
|
68
|
+
File.write("#{OPTIONS[:prebuild_path]}/.gitignore", git_ignores.join("\n"))
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.write_gitattributes
|
72
|
+
git_attributes = ["#{Configuration.prebuilt_info_filename} binary"]
|
73
|
+
|
74
|
+
File.write("#{OPTIONS[:prebuild_path]}/.gitattributes", git_attributes.join("\n"))
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.podfile_path_transform(path)
|
78
|
+
use_absolute_paths = false
|
79
|
+
podfile_path = File.join(OPTIONS[:prebuild_path], "Podfile")
|
80
|
+
original_basepath = PodBuilder::project_path
|
81
|
+
|
82
|
+
podfile_base_path = Pathname.new(File.dirname(podfile_path))
|
83
|
+
|
84
|
+
original_path = Pathname.new(File.join(original_basepath, path))
|
85
|
+
replace_path = original_path.relative_path_from(podfile_base_path)
|
86
|
+
if use_absolute_paths
|
87
|
+
replace_path = replace_path.expand_path(podfile_base_path)
|
88
|
+
end
|
89
|
+
|
90
|
+
return replace_path
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.update_gemfile
|
94
|
+
gemfile_path = File.join(PodBuilder::home, "Gemfile")
|
95
|
+
unless File.exist?(gemfile_path)
|
96
|
+
FileUtils.touch(gemfile_path)
|
97
|
+
end
|
98
|
+
|
99
|
+
source_line = "source 'https://rubygems.org'"
|
100
|
+
podbuilder_line = "gem 'pod-builder'"
|
101
|
+
|
102
|
+
gemfile = File.read(gemfile_path)
|
103
|
+
|
104
|
+
gemfile_lines = gemfile.split("\n")
|
105
|
+
gemfile_lines.select! { |x| !trim_gemfile_line(x).include?(trim_gemfile_line(source_line)) }
|
106
|
+
gemfile_lines.select! { |x| !trim_gemfile_line(x).include?(trim_gemfile_line(podbuilder_line)) }
|
107
|
+
|
108
|
+
gemfile_lines.insert(0, source_line)
|
109
|
+
gemfile_lines.push(podbuilder_line)
|
110
|
+
|
111
|
+
File.write(gemfile_path, gemfile_lines.join("\n"))
|
112
|
+
|
113
|
+
Dir.chdir(PodBuilder::home)
|
114
|
+
system("bundle")
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.trim_gemfile_line(line)
|
118
|
+
return line.gsub("\"", "'").gsub(" ", "")
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.update_react_native_podspecs
|
122
|
+
# React-Core.podspec
|
123
|
+
file = "React-Core.podspec"
|
124
|
+
paths = Dir.glob("#{PodBuilder::git_rootpath}/node_modules/**/#{file}")
|
125
|
+
raise "Unexpected number of #{file} found" if paths.count != 1
|
126
|
+
|
127
|
+
content = File.read(paths[0])
|
128
|
+
expected_header_search_path_prefix = "s.pod_target_xcconfig = { \"HEADER_SEARCH_PATHS\" => \""
|
129
|
+
raise "Expected header search path entry not found" unless content.include?(expected_header_search_path_prefix)
|
130
|
+
|
131
|
+
content.sub!(expected_header_search_path_prefix, "#{expected_header_search_path_prefix}\\\"$(PODS_ROOT)/Headers/Public/Flipper-Folly\\\" ")
|
132
|
+
File.write(paths[0], content)
|
133
|
+
|
134
|
+
# React-CoreModules.podspec
|
135
|
+
file = "React-CoreModules.podspec"
|
136
|
+
paths = Dir.glob("#{PodBuilder::git_rootpath}/node_modules/**/#{file}")
|
137
|
+
raise "Unexpected number of #{file} found" if paths.count != 1
|
138
|
+
|
139
|
+
content = File.read(paths[0])
|
140
|
+
expected_header_search_path_prefix = "\"HEADER_SEARCH_PATHS\" => \""
|
141
|
+
raise "Expected header search path entry not found" unless content.include?(expected_header_search_path_prefix)
|
142
|
+
|
143
|
+
content.sub!(expected_header_search_path_prefix, "#{expected_header_search_path_prefix}\\\"$(PODS_ROOT)/Headers/Public/Flipper-Folly\\\" ")
|
144
|
+
File.write(paths[0], content)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'pod_builder/core'
|
2
|
+
|
3
|
+
module PodBuilder
|
4
|
+
module Command
|
5
|
+
class InstallSources
|
6
|
+
def self.call
|
7
|
+
Configuration.check_inited
|
8
|
+
if Configuration.build_using_repo_paths
|
9
|
+
raise "\n\nSource cannot be installed because lldb shenanigans not supported when 'build_using_repo_paths' is enabled".red
|
10
|
+
end
|
11
|
+
|
12
|
+
PodBuilder::prepare_basepath
|
13
|
+
|
14
|
+
install_update_repo = OPTIONS.fetch(:update_repos, true)
|
15
|
+
installer, analyzer = Analyze.installer_at(PodBuilder::basepath, install_update_repo)
|
16
|
+
podfile_items = Analyze.podfile_items(installer, analyzer).select { |x| !x.is_prebuilt }
|
17
|
+
podspec_names = podfile_items.map(&:podspec_name)
|
18
|
+
|
19
|
+
base_path = PodBuilder::prebuiltpath
|
20
|
+
framework_files = Dir.glob("#{base_path}/**/*.framework")
|
21
|
+
|
22
|
+
framework_files.each do |path|
|
23
|
+
rel_path = Pathname.new(path).relative_path_from(Pathname.new(base_path)).to_s
|
24
|
+
|
25
|
+
if podfile_spec = podfile_items.detect { |x| "#{x.root_name}/#{x.prebuilt_rel_path}" == rel_path }
|
26
|
+
update_repo(podfile_spec)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Clean::install_sources(podfile_items)
|
31
|
+
|
32
|
+
ARGV << PodBuilder::basepath("Sources")
|
33
|
+
|
34
|
+
puts "\n\n🎉 done!\n".green
|
35
|
+
return 0
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def self.update_repo(spec)
|
41
|
+
if spec.path != nil || spec.podspec_path != nil
|
42
|
+
return
|
43
|
+
end
|
44
|
+
|
45
|
+
dest_path = PodBuilder::basepath("Sources")
|
46
|
+
FileUtils.mkdir_p(dest_path)
|
47
|
+
|
48
|
+
current_dir = Dir.pwd
|
49
|
+
Dir.chdir(dest_path)
|
50
|
+
|
51
|
+
repo_dir = File.join(dest_path, spec.podspec_name)
|
52
|
+
if !File.directory?(repo_dir)
|
53
|
+
raise "\n\nFailed cloning #{spec.name}".red if !system("git clone #{spec.repo} #{spec.podspec_name}")
|
54
|
+
end
|
55
|
+
|
56
|
+
Dir.chdir(repo_dir)
|
57
|
+
puts "Checking out #{spec.podspec_name}".yellow
|
58
|
+
raise "\n\nFailed cheking out #{spec.name}".red if !system(git_hard_checkout_cmd(spec))
|
59
|
+
|
60
|
+
Dir.chdir(current_dir)
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.git_hard_checkout_cmd(spec)
|
64
|
+
prefix = "git fetch --all --tags --prune; git reset --hard"
|
65
|
+
if spec.tag
|
66
|
+
return "#{prefix} tags/#{spec.tag}"
|
67
|
+
end
|
68
|
+
if spec.commit
|
69
|
+
return "#{prefix} #{spec.commit}"
|
70
|
+
end
|
71
|
+
if spec.branch
|
72
|
+
return "#{prefix} origin/#{spec.branch}"
|
73
|
+
end
|
74
|
+
|
75
|
+
return nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'pod_builder/core'
|
2
|
+
|
3
|
+
module PodBuilder
|
4
|
+
module Command
|
5
|
+
class RestoreAll
|
6
|
+
def self.call
|
7
|
+
unless Configuration.restore_enabled
|
8
|
+
raise "\n\nRestore not enabled!".red
|
9
|
+
end
|
10
|
+
|
11
|
+
Configuration.check_inited
|
12
|
+
PodBuilder::prepare_basepath
|
13
|
+
|
14
|
+
begin
|
15
|
+
File.rename(PodBuilder::basepath("Podfile"), PodBuilder::basepath("Podfile.tmp2"))
|
16
|
+
File.rename(PodBuilder::basepath("Podfile.restore"), PodBuilder::basepath("Podfile"))
|
17
|
+
|
18
|
+
ARGV << "*"
|
19
|
+
OPTIONS[:skip_prebuild_update] = true
|
20
|
+
return Command::Build::call
|
21
|
+
rescue Exception => e
|
22
|
+
raise e
|
23
|
+
ensure
|
24
|
+
FileUtils.rm_f(PodBuilder::basepath("Podfile.restore"))
|
25
|
+
File.rename(PodBuilder::basepath("Podfile"), PodBuilder::basepath("Podfile.restore"))
|
26
|
+
File.rename(PodBuilder::basepath("Podfile.tmp2"), PodBuilder::basepath("Podfile"))
|
27
|
+
end
|
28
|
+
|
29
|
+
return -1
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|