cocoapods-swordfish 0.1.6

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 (55) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +35 -0
  3. data/lib/cocoapods_plugin.rb +86 -0
  4. data/lib/gem_version.rb +11 -0
  5. data/lib/swordfish/command/archive.rb +187 -0
  6. data/lib/swordfish/command/auto.rb +192 -0
  7. data/lib/swordfish/command/config.rb +70 -0
  8. data/lib/swordfish/command/repo/update.rb +42 -0
  9. data/lib/swordfish/command/spec/create.rb +78 -0
  10. data/lib/swordfish/command/spec/push.rb +114 -0
  11. data/lib/swordfish/command/swordfish.rb +41 -0
  12. data/lib/swordfish/command.rb +2 -0
  13. data/lib/swordfish/config/config.rb +137 -0
  14. data/lib/swordfish/config/config_asker.rb +57 -0
  15. data/lib/swordfish/config/config_builder.rb +216 -0
  16. data/lib/swordfish/helpers/build_helper.rb +160 -0
  17. data/lib/swordfish/helpers/build_utils.rb +94 -0
  18. data/lib/swordfish/helpers/framework.rb +85 -0
  19. data/lib/swordfish/helpers/framework_builder.rb +451 -0
  20. data/lib/swordfish/helpers/library.rb +54 -0
  21. data/lib/swordfish/helpers/library_builder.rb +90 -0
  22. data/lib/swordfish/helpers/sources_helper.rb +38 -0
  23. data/lib/swordfish/helpers/spec_creator.rb +167 -0
  24. data/lib/swordfish/helpers/spec_files_helper.rb +76 -0
  25. data/lib/swordfish/helpers/spec_source_creator.rb +266 -0
  26. data/lib/swordfish/helpers/upload_helper.rb +94 -0
  27. data/lib/swordfish/hmap/hmap_generator.rb +59 -0
  28. data/lib/swordfish/hmap/pod_target.rb +92 -0
  29. data/lib/swordfish/hmap/podfile_dsl.rb +36 -0
  30. data/lib/swordfish/hmap/post_install_hook_context.rb +41 -0
  31. data/lib/swordfish/hmap/xcconfig.rb +99 -0
  32. data/lib/swordfish/hmap.rb +4 -0
  33. data/lib/swordfish/native/acknowledgements.rb +27 -0
  34. data/lib/swordfish/native/analyzer.rb +55 -0
  35. data/lib/swordfish/native/file_accessor.rb +28 -0
  36. data/lib/swordfish/native/installation_options.rb +25 -0
  37. data/lib/swordfish/native/installer.rb +135 -0
  38. data/lib/swordfish/native/linter.rb +25 -0
  39. data/lib/swordfish/native/path_source.rb +33 -0
  40. data/lib/swordfish/native/pod_source_installer.rb +19 -0
  41. data/lib/swordfish/native/pod_target_installer.rb +94 -0
  42. data/lib/swordfish/native/podfile.rb +105 -0
  43. data/lib/swordfish/native/podfile_env.rb +36 -0
  44. data/lib/swordfish/native/podfile_generator.rb +195 -0
  45. data/lib/swordfish/native/podspec_finder.rb +24 -0
  46. data/lib/swordfish/native/resolver.rb +223 -0
  47. data/lib/swordfish/native/source.rb +35 -0
  48. data/lib/swordfish/native/sources_manager.rb +19 -0
  49. data/lib/swordfish/native/specification.rb +31 -0
  50. data/lib/swordfish/native/target_architectures.rb +79 -0
  51. data/lib/swordfish/native/target_validator.rb +41 -0
  52. data/lib/swordfish/native/validator.rb +39 -0
  53. data/lib/swordfish/native.rb +16 -0
  54. data/lib/swordfish.rb +2 -0
  55. metadata +167 -0
@@ -0,0 +1,167 @@
1
+
2
+ require 'cocoapods'
3
+ require 'swordfish/config/config'
4
+
5
+ module Ocean
6
+ class Specification
7
+ class Creator
8
+ attr_reader :code_spec
9
+ attr_reader :template_spec
10
+ attr_reader :spec
11
+
12
+ def initialize(code_spec, template_spec, platforms = 'ios')
13
+ @code_spec = code_spec
14
+ @template_spec = template_spec
15
+ @platforms = Array(platforms)
16
+ validate!
17
+ end
18
+
19
+ def validate!
20
+ raise Pod::Informative, '源码 podspec 不能为空 .' unless code_spec
21
+ if code_spec.subspecs.any? && template_spec.nil?
22
+ raise Pod::Informative, "不支持自动生成存在 subspec 的二进制 podspec , 需要提供模版文件 #{code_spec.name}.binary.podspec.template ."
23
+ end
24
+ end
25
+
26
+ def create
27
+ spec = template_spec ? create_from_code_spec_and_template_spec : create_from_code_spec
28
+
29
+ Pod::UI.message '生成二进制 podspec 内容: '
30
+ spec.to_pretty_json.split("\n").each do |text|
31
+ Pod::UI.message text
32
+ end
33
+
34
+ spec
35
+ end
36
+
37
+ def write_spec_file(file = filename)
38
+ create unless spec
39
+
40
+ File.open(file, 'w+') do |f|
41
+ f.write(spec.to_pretty_json)
42
+ end
43
+
44
+ @filename = file
45
+ end
46
+
47
+ def clear_spec_file
48
+ File.delete(filename) if File.exist?(filename)
49
+ end
50
+
51
+ def filename
52
+ @filename ||= "#{spec.name}.binary.podspec.json"
53
+ end
54
+
55
+ private
56
+
57
+ def create_from_code_spec
58
+ @spec = code_spec.dup
59
+ # vendored_frameworks | resources | source | source_files | public_header_files
60
+ # license | resource_bundles | vendored_libraries
61
+
62
+ # Project Linkin
63
+ @spec.vendored_frameworks = "#{code_spec.root.name}.framework"
64
+
65
+ # Resources
66
+ extnames = []
67
+ extnames << '*.bundle' if code_spec_consumer.resource_bundles.any?
68
+ if code_spec_consumer.resources.any?
69
+ extnames += code_spec_consumer.resources.map { |r| File.basename(r) }
70
+ end
71
+ if extnames.any?
72
+ @spec.resources = framework_contents('Resources').flat_map { |r| extnames.map { |e| "#{r}/#{e}" } }
73
+ end
74
+
75
+ # Source Location
76
+ @spec.source = binary_source
77
+
78
+ # Source Code
79
+ @spec.source_files = framework_contents('Headers/*')
80
+ @spec.public_header_files = framework_contents('Headers/*')
81
+
82
+ # Unused for binary
83
+ spec_hash = @spec.to_hash
84
+ # spec_hash.delete('license')
85
+ spec_hash.delete('resource_bundles')
86
+ spec_hash.delete('exclude_files')
87
+ spec_hash.delete('preserve_paths')
88
+ # 这里不确定 vendored_libraries 指定的时动态/静态库
89
+ # 如果是静态库的话,需要移除,否则就不移除
90
+ # 最好是静态库都独立成 Pod ,cocoapods-package 打静态库去 collect 目标文件时好做过滤
91
+ # 这里统一只对命名后缀 .a 文件做处理
92
+ # spec_hash.delete('vendored_libraries')
93
+ # libraries 只能假设为动态库不做处理了,如果有例外,需要开发者自行处理
94
+ spec_hash.delete('vendored_libraries')
95
+ spec_hash['vendored_libraries'] = binary_vendored_libraries
96
+
97
+ # vendored_libraries = Array(vendored_libraries).reject { |l| l.end_with?('.a') }
98
+ # if vendored_libraries.any?
99
+ # spec_hash['vendored_libraries'] = vendored_libraries
100
+ # end
101
+
102
+ # Filter platforms
103
+ platforms = spec_hash['platforms']
104
+ selected_platforms = platforms.select { |k, _v| @platforms.include?(k) }
105
+ spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms
106
+
107
+ @spec = Pod::Specification.from_hash(spec_hash)
108
+ @spec
109
+ end
110
+
111
+ def create_from_code_spec_and_template_spec
112
+ @spec = template_spec.dup
113
+
114
+ @spec.version = code_spec.version
115
+ @spec.source = binary_source
116
+
117
+ @spec.source_files = binary_source_files
118
+ @spec.public_header_files = binary_public_header_files
119
+ @spec.vendored_libraries = binary_vendored_libraries
120
+
121
+ @spec.resources = binary_resources if @spec.attributes_hash.keys.include?("resources")
122
+
123
+ @spec
124
+ end
125
+
126
+ def binary_source
127
+ { http: format(Ocean.config.binary_download_url, code_spec.root.name, code_spec.version), type: Ocean.config.download_file_type }
128
+ end
129
+
130
+ def code_spec_consumer(_platform = :ios)
131
+ code_spec.consumer(:ios)
132
+ end
133
+
134
+ def framework_contents(name)
135
+ ["#{code_spec.root.name}.framework", "#{code_spec.root.name}.framework/Versions/A"].map { |path| "#{path}/#{name}" }
136
+ end
137
+
138
+ def binary_source_files
139
+ { http: format(Ocean.config.binary_download_url, code_spec.root.name, code_spec.version), type: Ocean.config.download_file_type }
140
+ end
141
+
142
+ def binary_source_files
143
+ "swordfish_#{code_spec.name}_#{code_spec.version}/Headers/*"
144
+ end
145
+
146
+ def binary_public_header_files
147
+ "swordfish_#{code_spec.name}_#{code_spec.version}/Headers/*.h"
148
+ end
149
+
150
+ def binary_vendored_libraries
151
+ "swordfish_#{code_spec.name}_#{code_spec.version}/*.a"
152
+ end
153
+
154
+ def binary_resources
155
+ "swordfish_#{code_spec.name}_#{code_spec.version}/Resources/*"
156
+ end
157
+
158
+ end
159
+ end
160
+ end
161
+ #模板框架begin
162
+ # s.source_files = "bin_#{s.name}_#{s.version}/Headers/*"
163
+ # s.public_header_files = "bin_#{s.name}_#{s.version}/Headers/*.h"
164
+ # s.vendored_libraries = "bin_#{s.name}_#{s.version}/*.a"
165
+ #有图片资源的,要带上
166
+ #s.resources = 'bin_#{s.name}_#{s.version}/Resources/*.{json,png,jpg,gif,js,xib,eot,svg,ttf,woff,db,sqlite,mp3,bundle}'
167
+ #模板框架end
@@ -0,0 +1,76 @@
1
+
2
+ require 'swordfish/native/sources_manager.rb'
3
+ require 'swordfish/helpers/spec_creator'
4
+
5
+ module Ocean
6
+ module SpecFilesHelper
7
+ def spec_files
8
+ @spec_files ||= Pathname.glob('*.podspec{,.json}')
9
+ end
10
+
11
+ def binary_spec_files
12
+ @binary_spec_files ||= Pathname.glob('*.binary.podspec{,.json}')
13
+ end
14
+
15
+ def binary_template_spec_files
16
+ @binary_spec_template_files ||= Pathname.glob('*.binary-template.podspec{,.json}')
17
+ end
18
+
19
+ def binary_template_spec_file
20
+ @binary_spec_template_file ||= binary_template_spec_files.first
21
+ end
22
+
23
+ def code_spec_files
24
+ @code_spec_files ||= spec_files - binary_spec_files - binary_template_spec_files
25
+ end
26
+
27
+ def code_spec
28
+ if code_spec_files.first
29
+ Pod::Specification.from_file(code_spec_files.first)
30
+ end
31
+ end
32
+
33
+ def binary_spec
34
+ if binary_spec_files.first
35
+ Pod::Specification.from_file(binary_spec_files.first)
36
+ end
37
+ end
38
+
39
+ def binary_template_spec
40
+ if binary_template_spec_file
41
+ Pod::Specification.from_file(binary_template_spec_file)
42
+ end
43
+ end
44
+
45
+ def find_spec_file(podspec)
46
+ path = Pathname(podspec)
47
+ raise Pod::Informative, "无法找到 #{podspec}" unless path.exist?
48
+
49
+ path
50
+ end
51
+
52
+ def create_binary_spec_file(code_spec, template_spec)
53
+ # 1. code spec 是否有 subpsec
54
+ # 1.1 有,查找 template spec,并生成
55
+ # 1.2 没有,是否有 template spec
56
+ # 1.2.1 有,根据 template spec 生成
57
+ # 1.2.2 没有,根据 code spec 生成
58
+
59
+ unless code_spec
60
+ raise Pod::Informative, '没有二进制 podspec 的情况下,必须要提供源码 podspec.'
61
+ end
62
+ if code_spec.subspecs.any? && template_spec.nil?
63
+ raise Pod::Informative, '拥有 subspec 的组件,在生成二进制 podspec 时,必须要提供模版 podspec.'
64
+ end
65
+
66
+ @spec_creator = Ocean::Specification::Creator.new(code_spec, template_spec)
67
+ @spec_creator.create
68
+ @spec_creator.write_spec_file
69
+ @spec_creator.filename
70
+ end
71
+
72
+ def clear_binary_spec_file_if_needed
73
+ @spec_creator&.clear_spec_file
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,266 @@
1
+
2
+
3
+ require 'cocoapods'
4
+ require 'swordfish/config/config'
5
+
6
+ module Ocean
7
+ class SpecificationSource
8
+ class Creator
9
+ attr_reader :code_spec
10
+ attr_reader :spec
11
+
12
+ def initialize(code_spec, platforms = 'ios')
13
+ @code_spec = code_spec
14
+ @platforms = Array(platforms)
15
+ validate!
16
+ end
17
+
18
+ def validate!
19
+ raise Pod::Informative, '源码 podspec 不能为空 .' unless code_spec
20
+ end
21
+
22
+ def create(is_framework)
23
+ # spec = nil
24
+ if is_framework
25
+ spec = create_framework_from_code_spec
26
+ else
27
+ spec = create_from_code_spec
28
+ end
29
+
30
+ spec
31
+ end
32
+
33
+ def write_spec_file(file = filename)
34
+
35
+ FileUtils.mkdir_p(Ocean::Config::Builder.instance.binary_json_dir) unless File.exist?(Ocean::Config::Builder.instance.binary_json_dir)
36
+ FileUtils.rm_rf(file) if File.exist?(file)
37
+
38
+ File.open(file, 'w+') do |f|
39
+ # f.write("# MARK: converted automatically by plugin cocoapods-swordfish @slj \r\n")
40
+ f.write(spec.to_pretty_json)
41
+ end
42
+
43
+ @filename = file
44
+ end
45
+
46
+ def clear_spec_file
47
+ File.delete(filename) if File.exist?(filename)
48
+ end
49
+
50
+ def filename
51
+ @filename ||= "#{Ocean::Config::Builder.instance.binary_json_dir_name}/#{spec.name}.binary.podspec.json"
52
+ end
53
+
54
+ private
55
+
56
+ def create_from_code_spec
57
+ @spec = code_spec.dup
58
+ # vendored_frameworks | resources | source | source_files | public_header_files
59
+ # license | resource_bundles | vendored_libraries
60
+
61
+ # Project Linkin
62
+ # @spec.vendored_frameworks = "#{code_spec.root.name}.framework"
63
+
64
+ # Resources
65
+ extnames = []
66
+ extnames << '*.bundle' if code_spec_consumer.resource_bundles.any?
67
+ if code_spec_consumer.resources.any?
68
+ extnames += code_spec_consumer.resources.map { |r| File.basename(r) }
69
+ end
70
+ if extnames.any?
71
+ @spec.resources = framework_contents('Resources').flat_map { |r| extnames.map { |e| "#{r}/#{e}" } }
72
+ end
73
+
74
+ # Source Location
75
+ @spec.source = binary_source
76
+
77
+ # Source Code
78
+ # @spec.source_files = framework_contents('Headers/*')
79
+ # @spec.public_header_files = framework_contents('Headers/*')
80
+
81
+ # Unused for binary
82
+ spec_hash = @spec.to_hash
83
+ # spec_hash.delete('license')
84
+ spec_hash.delete('resource_bundles')
85
+ spec_hash.delete('exclude_files')
86
+ spec_hash.delete('preserve_paths')
87
+ spec_hash.delete('vendored_frameworks')
88
+ spec_hash.delete('vendored_framework')
89
+
90
+ # 这里不确定 vendored_libraries 指定的时动态/静态库
91
+ # 如果是静态库的话,需要移除,否则就不移除
92
+ # 最好是静态库都独立成 Pod ,cocoapods-package 打静态库去 collect 目标文件时好做过滤
93
+ # 这里统一只对命名后缀 .a 文件做处理
94
+ # spec_hash.delete('vendored_libraries')
95
+ # libraries 只能假设为动态库不做处理了,如果有例外,需要开发者自行处理
96
+ spec_hash.delete('vendored_libraries')
97
+
98
+ # vendored_libraries = Array(vendored_libraries).reject { |l| l.end_with?('.a') }
99
+ # if vendored_libraries.any?
100
+ # spec_hash['vendored_libraries'] = vendored_libraries
101
+ # end
102
+
103
+ # Filter platforms
104
+ platforms = spec_hash['platforms']
105
+ selected_platforms = platforms.select { |k, _v| @platforms.include?(k) }
106
+ spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms
107
+
108
+ @spec = Pod::Specification.from_hash(spec_hash)
109
+
110
+ #把命令 prepare_command 移除掉,如ReactiveCocoa会执行修改重命令的脚步
111
+ @spec.prepare_command = "" if @spec.prepare_command
112
+ @spec.version = code_spec.version
113
+ @spec.source = binary_source
114
+ @spec.source_files = binary_source_files
115
+ @spec.public_header_files = binary_public_header_files
116
+ @spec.vendored_libraries = binary_vendored_libraries
117
+ @spec.resources = binary_resources if @spec.attributes_hash.keys.include?("resources")
118
+ @spec.description = <<-EOF
119
+ 「 converted automatically by cocoapods-swordfish 」
120
+ #{@spec.description}
121
+ EOF
122
+
123
+ # 处理一下 subspecs ,使用相同的配置
124
+ if @spec.subspecs
125
+ @spec.subspecs.each do |subspec|
126
+ subspec.source_files = binary_source_files
127
+ subspec.public_header_files = binary_public_header_files
128
+ subspec.vendored_libraries = binary_vendored_libraries
129
+ subspec.resources = binary_resources if @spec.attributes_hash.keys.include?("resources")
130
+ end
131
+ end
132
+ @spec
133
+ end
134
+
135
+ def create_framework_from_code_spec
136
+ @spec = code_spec.dup
137
+ # vendored_frameworks | resources | source | source_files | public_header_files
138
+ # license | resource_bundles | vendored_libraries
139
+
140
+ # Project Linkin
141
+ @spec.vendored_frameworks = "#{code_spec.root.name}.framework"
142
+
143
+ # Resources
144
+ resources = []
145
+ extnames = []
146
+ extnames << '*.bundle' if code_spec_consumer.resource_bundles.any?
147
+ if code_spec_consumer.resources.any?
148
+ extnames += code_spec_consumer.resources.map { |r| File.basename(r) }
149
+ end
150
+ if extnames.any?
151
+ resources = framework_contents('Resources').flat_map { |r| extnames.map { |e| "#{r}/#{e}" } }
152
+ end
153
+ @spec.resources = resources
154
+
155
+ # Source Location
156
+ @spec.source = binary_source
157
+
158
+ # Source Code
159
+ @spec.source_files = framework_contents('Headers/*')
160
+ @spec.public_header_files = framework_contents('Headers/*')
161
+
162
+ # 去除prepare_command
163
+ if @spec.prepare_command.nil? == false
164
+ @spec.prepare_command = ''
165
+ end
166
+
167
+ # Unused for binary
168
+ spec_hash = @spec.to_hash
169
+ # spec_hash.delete('license')
170
+ spec_hash.delete('resource_bundles')
171
+ spec_hash.delete('exclude_files')
172
+ spec_hash.delete('preserve_paths')
173
+ # 这里不确定 vendored_libraries 指定的时动态/静态库
174
+ # 如果是静态库的话,需要移除,否则就不移除
175
+ # 最好是静态库都独立成 Pod ,cocoapods-package 打静态库去 collect 目标文件时好做过滤
176
+ # 这里统一只对命名后缀 .a 文件做处理
177
+ # spec_hash.delete('vendored_libraries')
178
+ # libraries 只能假设为动态库不做处理了,如果有例外,需要开发者自行处理
179
+ vendored_libraries = spec_hash.delete('vendored_libraries')
180
+ vendored_libraries = Array(vendored_libraries).reject { |l| l.end_with?('.a') }
181
+ if vendored_libraries.any?
182
+ spec_hash['vendored_frameworks'] = vendored_libraries
183
+ end
184
+
185
+ # 解决不规范头文件引用问题
186
+ pod_target_xcconfig = spec_hash['pod_target_xcconfig'] || {}
187
+ pod_target_xcconfig['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
188
+
189
+ # Filter platforms
190
+ platforms = spec_hash['platforms']
191
+ selected_platforms = platforms.select { |k, _v| @platforms.include?(k) }
192
+ spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms
193
+
194
+ @spec = Pod::Specification.from_hash(spec_hash)
195
+ @spec.description = <<-EOF
196
+ 「 converted automatically by cocoapods-swordfish 」
197
+ #{@spec.description}
198
+ EOF
199
+
200
+ # 处理一下 subspecs ,使用相同的配置
201
+ if @spec.subspecs
202
+ @spec.subspecs.each do |subspec|
203
+ subspec.vendored_frameworks = "#{code_spec.root.name}.framework"
204
+ subspec.source_files = framework_contents('Headers/*')
205
+ subspec.public_header_files = framework_contents('Headers/*')
206
+ subspec.resources = resources
207
+
208
+
209
+ # if subspec.subspecs.empty? == false
210
+ # # 嵌套subspec
211
+ # subspec.subspecs.each do |subspec2|
212
+ # subspec2.vendored_frameworks = subspec.vendored_frameworks
213
+ # subspec2.source_files = subspec.source_files
214
+ # subspec2.public_header_files = subspec.public_header_files
215
+ # subspec2.resources = subspec.resources
216
+ # end
217
+ # end
218
+ end
219
+ end
220
+
221
+ @spec
222
+ end
223
+
224
+
225
+ def binary_source
226
+ { http: format(Ocean.config.binary_download_url, code_spec.root.name, code_spec.version), type: Ocean.config.download_file_type }
227
+ end
228
+
229
+ def code_spec_consumer(_platform = :ios)
230
+ code_spec.consumer(:ios)
231
+ end
232
+
233
+ def framework_contents(name)
234
+ ["#{code_spec.root.name}.framework", "#{code_spec.root.name}.framework/Versions/A"].map { |path| "#{path}/#{name}" }
235
+ end
236
+
237
+ def binary_source_files
238
+ { http: format(Ocean.config.binary_download_url, code_spec.root.name, code_spec.version), type: Ocean.config.download_file_type }
239
+ end
240
+
241
+ def binary_source_files
242
+ "swordfish_#{code_spec.name}_#{code_spec.version}/Headers/*"
243
+ end
244
+
245
+ def binary_public_header_files
246
+ "swordfish_#{code_spec.name}_#{code_spec.version}/Headers/*.h"
247
+ end
248
+
249
+ def binary_vendored_libraries
250
+ "swordfish_#{code_spec.name}_#{code_spec.version}/*.a"
251
+ end
252
+
253
+ def binary_resources
254
+ "swordfish_#{code_spec.name}_#{code_spec.version}/Resources/*"
255
+ end
256
+
257
+ end
258
+ end
259
+ end
260
+ #模板框架begin
261
+ # s.source_files = "bin_#{s.name}_#{s.version}/Headers/*"
262
+ # s.public_header_files = "bin_#{s.name}_#{s.version}/Headers/*.h"
263
+ # s.vendored_libraries = "bin_#{s.name}_#{s.version}/*.a"
264
+ #有图片资源的,要带上
265
+ #s.resources = 'bin_#{s.name}_#{s.version}/Resources/*.{json,png,jpg,gif,js,xib,eot,svg,ttf,woff,db,sqlite,mp3,bundle}'
266
+ #模板框架end
@@ -0,0 +1,94 @@
1
+
2
+
3
+ # copy from https://github.com/CocoaPods/cocoapods-packager
4
+
5
+ require 'cocoapods/command/gen'
6
+ require 'cocoapods/generate'
7
+
8
+ require 'swordfish/native/podfile'
9
+ require 'swordfish/helpers/framework_builder'
10
+ require 'swordfish/helpers/library_builder'
11
+ require 'swordfish/helpers/sources_helper'
12
+ require 'swordfish/command/spec/push'
13
+ require 'swordfish/helpers/spec_source_creator'
14
+
15
+ module Ocean
16
+ class Upload
17
+ class Helper
18
+ include Ocean::SourcesHelper
19
+
20
+ def initialize(spec,code_dependencies,sources)
21
+ @spec = spec
22
+ @code_dependencies = code_dependencies
23
+ @sources = sources
24
+ end
25
+
26
+ def upload(is_framework)
27
+ Dir.chdir(Ocean::Config::Builder.instance.root_dir) do
28
+ # 创建binary-template.podsepc
29
+ # 上传二进制文件
30
+ # 上传二进制 podspec
31
+ res_zip = curl_zip
32
+ if res_zip
33
+ filename = spec_creator(is_framework)
34
+ push_binary_repo(filename)
35
+ end
36
+ res_zip
37
+ end
38
+ end
39
+
40
+ def spec_creator(is_framework)
41
+ spec_creator = Ocean::SpecificationSource::Creator.new(@spec)
42
+ spec_creator.create(is_framework)
43
+ spec_creator.write_spec_file
44
+ spec_creator.filename
45
+
46
+ end
47
+
48
+ #推送二进制
49
+ # curl http://ci.xxx:9192/frameworks -F "name=IMYFoundation" -F "version=7.7.4.2" -F "annotate=IMYFoundation_7.7.4.2_log" -F "file=@bin-zip/bin_IMYFoundation_7.7.4.2.zip"
50
+ def curl_zip
51
+ zip_file = "#{Ocean::Config::Builder.instance.library_file(@spec)}.zip"
52
+ res = File.exist?(zip_file)
53
+ unless res
54
+ zip_file = Ocean::Config::Builder.instance.framework_zip_file(@spec) + ".zip"
55
+ res = File.exist?(zip_file)
56
+ end
57
+ if res
58
+ command = "curl #{Ocean.config.binary_upload_url} -F \"name=#{@spec.name}\" -F \"version=#{@spec.version}\" -F \"annotate=#{@spec.name}_#{@spec.version}_log\" -F \"file=@#{zip_file}\""
59
+ print <<EOF
60
+ 上传二进制文件
61
+ #{command}
62
+ EOF
63
+ upload_result = `#{command}`
64
+ puts "#{upload_result}"
65
+ end
66
+
67
+ res
68
+ end
69
+
70
+
71
+ # 上传二进制 podspec
72
+ def push_binary_repo(binary_podsepc_json)
73
+ argvs = [
74
+ "#{binary_podsepc_json}",
75
+ "--binary",
76
+ "--sources=#{sources_option(@code_dependencies, @sources)}",
77
+ "--skip-import-validation",
78
+ "--use-libraries",
79
+ "--allow-warnings",
80
+ "--verbose",
81
+ "--code-dependencies"
82
+ ]
83
+ if @verbose
84
+ argvs += ['--verbose']
85
+ end
86
+
87
+ push = Pod::Command::Swordfish::Repo::Push.new(CLAide::ARGV.new(argvs))
88
+ push.validate!
89
+ push.run
90
+ end
91
+
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,59 @@
1
+ # !/usr/bin/env ruby
2
+
3
+ module Ocean
4
+ class HmapGenerator
5
+ QUOTE = 1 # 001
6
+ ANGLE_BRACKET = 2 # 010
7
+ BOTH = 3 # 011
8
+ def initialize
9
+ @hmap = Hash.new
10
+ end
11
+ # header_mapping : [Hash{FileAccessor => Hash}] Hash of file accessors by header mappings.
12
+ def add_hmap_with_header_mapping(header_mapping, type, target_name=nil, module_name=nil)
13
+ header_mapping.each do |facc, headers|
14
+ headers.each do |key, value|
15
+ value.each do |path|
16
+ pn = Pathname.new(path)
17
+ name = pn.basename.to_s
18
+ dirname = pn.dirname.to_s + '/'
19
+ # construct hmap hash info
20
+ path_info = Hash['suffix' => name, 'prefix' => dirname]
21
+ if type & QUOTE > 0
22
+ # import with quote
23
+ @hmap[name] = path_info
24
+ end
25
+ if type & ANGLE_BRACKET > 0
26
+ if target_name != nil
27
+ # import with angle bracket
28
+ @hmap["#{target_name}/#{name}"] = path_info
29
+ end
30
+ if module_name != nil && module_name != target_name
31
+ @hmap["#{module_name}/#{name}"] = path_info
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ # @path : path/to/xxx.hmap
39
+ # @return : succeed
40
+ def save_to(path)
41
+ if path != nil && @hmap.empty? == false
42
+ pn=Pathname(path)
43
+ json_path=pn.dirname.to_s + '/' + 'temp.json'
44
+ # write hmap json to file
45
+ File.open(json_path, 'w') { |file| file << @hmap.to_json }
46
+ # json to hmap
47
+ suc=system("hmap convert #{json_path} #{path}")
48
+ # delete json file
49
+ File.delete(json_path)
50
+ suc
51
+ else
52
+ false
53
+ end
54
+ end
55
+ def empty?
56
+ @hmap.empty?
57
+ end
58
+ end
59
+ end