luna-binary-uploader 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,410 @@
1
+ require "luna/binary/uploader/version"
2
+ require "cocoapods"
3
+ require 'cocoapods-imy-bin/native/sources_manager'
4
+ require 'cocoapods-imy-bin/config/config'
5
+ require 'cocoapods-imy-bin'
6
+ require 'json'
7
+ require 'luna/binary/common/common'
8
+
9
+
10
+ module Luna
11
+ module Binary
12
+ module Uploader
13
+ class SingleUploader
14
+ # '2.git地址 3.git节点 5.二进制缓存地址
15
+ attr_reader :gitUrl
16
+ attr_reader :gitNode
17
+ attr_reader :binaryPath
18
+ attr_reader :rootName
19
+ attr_reader :podspecName
20
+ attr_accessor :specification
21
+
22
+ def initialize(podspecName, gitUrl, gitNode, binaryPath)
23
+ @podspecName = podspecName
24
+ @gitUrl = gitUrl
25
+ @gitNode = gitNode
26
+ @binaryPath = binaryPath
27
+ @rootName = Luna::Binary::Common.instance.tempLunaUploaderPath + "/#{podspecName}/"
28
+ validate!
29
+ end
30
+
31
+ def validate!
32
+ raise '缺少gitUrl参数' unless gitUrl
33
+ raise '缺少gitNode参数' unless gitNode
34
+ raise '缺少binaryPath参数' unless binaryPath
35
+ raise '缺少podspecName参数' unless podspecName
36
+ end
37
+
38
+ def upload
39
+ specificationWork
40
+ push
41
+ end
42
+
43
+ def specification
44
+ if @specification != nil
45
+ return @specification
46
+ end
47
+ puts "#{rootName + "**/#{podspecName}.podspec"}"
48
+ podspecPathArr = Dir.glob(rootName + "**/#{podspecName}.podspec")
49
+ puts "#{podspecPathArr}"
50
+ if podspecPathArr.length == 1
51
+ podspecPath = podspecPathArr[0]
52
+ p "模块路径为" + podspecPath
53
+ @specification = Pod::Specification.from_file(podspecPath)
54
+ return @specification
55
+ else
56
+ raise podspecPathArr + "有多个spec文件不知道是哪个"
57
+ end
58
+ end
59
+
60
+ def specificationWork
61
+ begin
62
+ clearTempFile
63
+ rescue => exception
64
+
65
+ ensure
66
+ if gitUrl && gitUrl.length > 0
67
+ command = "git clone #{gitUrl} #{@rootName}temp; cd #{@rootName}temp; git fetch --all;git stash; git checkout #{gitNode};"
68
+ p command
69
+ result = system command
70
+ end
71
+
72
+ if isHasSpecInRepo == false && isHasFrameworkInService == false
73
+ @spec = createFrameworkSpec
74
+ write_spec_file(@spec)
75
+ else
76
+ raise "已存在repo or 二进制服务 #{specification.name} #{specification.version}"
77
+ end
78
+ end
79
+ end
80
+
81
+ def push
82
+ if isLocalHasFramework && isLocalHasPodSpec
83
+ pushRepo
84
+ uploadFramework
85
+ else
86
+ raise "#{specification.name} #{specification.version} repo或framework缺失"
87
+ end
88
+ end
89
+
90
+ def printPreUploadCommand
91
+ if isLocalHasFramework && isLocalHasPodSpec
92
+ if gitUrl && gitUrl.length == 0
93
+ Pod::UserInterface.puts "lbu single #{podspecName} #{specification.version} #{binaryPath}"
94
+ else
95
+ Pod::UserInterface.puts "lbu single #{podspecName} #{gitUrl} #{gitNode} #{binaryPath}"
96
+ end
97
+ else
98
+ raise "#{specification.name} #{specification.version} repo或framework缺失"
99
+ end
100
+ end
101
+
102
+
103
+ def moduleDirPath
104
+ return rootName + (specification.root.name)
105
+ end
106
+
107
+ def isLocalHasFramework
108
+ return Dir.glob("#{rootName}#{moduleFrameworkName}").length > 0
109
+ end
110
+
111
+ def isLocalHasPodSpec
112
+ return Dir.glob("#{filename}").length > 0
113
+ end
114
+
115
+ def moduleFrameworkName
116
+ moduleName = specification.root.name
117
+ return "#{moduleName}/#{moduleName.sub('-', '_')}.framework"
118
+ end
119
+
120
+ def findFramework
121
+ frameworkPaths = Dir.glob("#{binaryPath}/**/#{specification.root.name.sub('-', '_')}.framework")
122
+ if frameworkPaths.length > 1
123
+ raise "findFramework:#{frameworkPaths},不知道取哪个"
124
+ end
125
+
126
+ if frameworkPaths.length == 0
127
+ raise "findFramework:#{frameworkPaths},没有"
128
+ end
129
+
130
+ frameworkPaths.each { |item|
131
+ command = "mkdir -p #{moduleDirPath}; cp -r #{item} #{moduleDirPath}"
132
+ system command
133
+ p command
134
+
135
+ }
136
+ return frameworkPaths
137
+ end
138
+
139
+ def findBundle
140
+ bundlePaths = Dir.glob("#{binaryPath}/**/#{specification.root.name}.bundle")
141
+ if bundlePaths.length > 1
142
+ # raise "findBundle:#{bundlePaths},不知道取哪个"
143
+ Pod::UserInterface.puts "findBundle:#{bundlePaths},不知道取哪个,做合并"
144
+ end
145
+ bundlePaths.each { |item|
146
+ system "cp -r #{item} #{moduleDirPath}"
147
+ }
148
+ return bundlePaths
149
+ end
150
+
151
+ def createFrameworkSpec
152
+ @spec = specification.dup
153
+ moduleName = specification.root.name
154
+ # Source Location
155
+ @spec.source = binary_source
156
+ # Source Code
157
+ @spec.source_files = source_files("/Headers/**/*")
158
+ @spec.public_header_files = source_files("/Headers/**/*")
159
+
160
+ findFramework
161
+
162
+ bundlePaths = findBundle
163
+ spec_hash = @spec.to_hash
164
+ framework_contents = [moduleFrameworkName]
165
+ puts "framework_contents : #{framework_contents}"
166
+ subspecsMapper = {
167
+ 'vendored_frameworks' => framework_contents
168
+ }
169
+ spec_hash['vendored_frameworks'] = framework_contents
170
+
171
+ libA_contents = []
172
+ if spec_hash["vendored_library"] != nil
173
+ libA_contents = libA_contents + copyDependcyFramework(spec_hash["vendored_library"], moduleName)
174
+ end
175
+
176
+ if spec_hash["vendored_libraries"] != nil
177
+ if spec_hash["vendored_libraries"].respond_to?(:each)
178
+ spec_hash["vendored_libraries"].each { |framework|
179
+ libA_contents = libA_contents + copyDependcyFramework(framework, moduleName)
180
+ }
181
+ else
182
+ libA_contents = libA_contents + copyDependcyFramework(spec_hash["vendored_libraries"], moduleName)
183
+ end
184
+ end
185
+
186
+ if libA_contents.length > 0
187
+ spec_hash['vendored_libraries'] = libA_contents
188
+ subspecsMapper['vendored_libraries'] = libA_contents
189
+ else
190
+ spec_hash.delete('vendored_libraries')
191
+ end
192
+
193
+
194
+ spec_hash.delete('resource_bundles')
195
+ spec_hash.delete('resources')
196
+ spec_hash.delete('resource_bundle')
197
+ spec_hash.delete('resource')
198
+ if bundlePaths.length > 0
199
+ spec_hash['resources'] = ["#{moduleName}/#{specification.root.name}.bundle"]
200
+ subspecsMapper['resources'] = ["#{moduleName}/#{specification.root.name}.bundle"]
201
+ end
202
+
203
+ spec_hash.delete('exclude_files')
204
+ spec_hash.delete('private_header_files')
205
+ spec_hash.delete('preserve_paths')
206
+ spec_hash.delete('pod_target_xcconfig')
207
+ platforms = spec_hash['platforms']
208
+ selected_platforms = platforms.select { |k, _v| platforms.include?(k) }
209
+ spec_hash['platforms'] = selected_platforms.empty? ? platforms : selected_platforms
210
+ if spec_hash['subspecs'] != nil
211
+ tempSpec = []
212
+ spec_hash['subspecs'].each { |item|
213
+ mapper = item.to_hash
214
+ mapper.delete('private_header_files')
215
+ mapper.delete('exclude_files')
216
+ mapper.delete('pod_target_xcconfig')
217
+ mapper["name"] = item["name"]
218
+ mapper["source_files"] = source_files("/Headers/**/*")
219
+ mapper["public_header_files"] = source_files("/Headers/**/*")
220
+
221
+ framework_contents = [moduleFrameworkName]
222
+ libA_contents = []
223
+ if mapper["vendored_framework"] != nil
224
+ framework_contents = framework_contents + copyDependcyFramework(mapper["vendored_framework"], moduleName)
225
+ end
226
+
227
+
228
+ if mapper["vendored_frameworks"] != nil
229
+ if mapper["vendored_frameworks"].respond_to?(:each)
230
+ mapper["vendored_frameworks"].each { |framework|
231
+ framework_contents = framework_contents + copyDependcyFramework(framework, moduleName)
232
+ }
233
+ else
234
+ framework_contents = framework_contents + copyDependcyFramework(mapper["vendored_frameworks"], moduleName)
235
+ end
236
+
237
+ end
238
+
239
+ if mapper["vendored_library"] != nil
240
+ libA_contents = libA_contents + copyDependcyFramework(mapper["vendored_library"], moduleName)
241
+ end
242
+
243
+ if mapper["vendored_libraries"] != nil
244
+ if mapper["vendored_libraries"].respond_to?(:each)
245
+ mapper["vendored_libraries"].each { |framework|
246
+ libA_contents = libA_contents + copyDependcyFramework(framework, moduleName)
247
+ }
248
+ else
249
+ libA_contents = libA_contents + copyDependcyFramework(mapper["vendored_libraries"], moduleName)
250
+ end
251
+ end
252
+
253
+ if framework_contents.length > 0
254
+ mapper["vendored_frameworks"] = framework_contents
255
+ end
256
+
257
+ if libA_contents.length > 0
258
+ mapper["vendored_libraries"] = libA_contents
259
+ end
260
+
261
+ if subspecsMapper["resources"] != nil
262
+ mapper["resources"] = subspecsMapper["resources"]
263
+ end
264
+
265
+
266
+ tempSpec << mapper
267
+ }
268
+ spec_hash["subspecs"] = tempSpec
269
+ end
270
+ @spec1 = Pod::Specification.from_hash(spec_hash)
271
+ @spec1
272
+ end
273
+
274
+ def copyDependcyFramework(path, moduleName)
275
+ frameworkPath = rootName + '/**/' + path
276
+ p "copyDependcyFramework " + frameworkPath
277
+ frameworkpaths = Dir.glob(frameworkPath)
278
+ if frameworkpaths.length
279
+ command = "mkdir -p #{rootName}#{moduleName}/depencyFrameworks;"
280
+ system command;
281
+ p command;
282
+ end
283
+ frameworkDepencyFrameworks = []
284
+ frameworkpaths.each { |item|
285
+ system "cp -r #{item} #{rootName}#{moduleName}/depencyFrameworks"
286
+ p "cp -r #{item} #{rootName}#{moduleName}/depencyFrameworks"
287
+ p "#{moduleName}/depencyFrameworks/#{File.basename(item)}"
288
+ frameworkDepencyFrameworks = frameworkDepencyFrameworks + ["#{moduleName}/depencyFrameworks/#{File.basename(item)}"]
289
+ }
290
+ return frameworkDepencyFrameworks
291
+ end
292
+
293
+ def binary_source
294
+ { http: format(CBin.config.binary_download_url, specification.root.name, specification.version), type: CBin.config.download_file_type }
295
+ end
296
+
297
+ def source_files(suffix)
298
+ moduleName = specification.root.name
299
+ ["#{moduleName}/#{moduleName.sub('-', '_')}.framework" + suffix]
300
+ end
301
+
302
+ def write_spec_file(specification)
303
+ file = filename
304
+ createSpec unless specification
305
+
306
+ FileUtils.mkdir_p(binary_json_dir) unless File.exist?(binary_json_dir)
307
+ FileUtils.rm_rf(file) if File.exist?(file)
308
+
309
+ File.open(file, 'w+') do |f|
310
+ # f.write("# MARK: converted automatically by plugin cocoapods-imy-bin @slj \r\n")
311
+ f.write(specification.to_pretty_json)
312
+ end
313
+
314
+ @filename = file
315
+ end
316
+
317
+ def createSpec(spec)
318
+ Pod::UI.message '生成二进制 podspec 内容: '
319
+ spec.to_pretty_json.split("\n").each do |text|
320
+ Pod::UI.message text
321
+ end
322
+
323
+ spec
324
+ end
325
+
326
+ def binary_json_dir
327
+ frameworkPath = rootName + "bin-json"
328
+ end
329
+
330
+ def filename
331
+ @filename ||= "#{binary_json_dir}/#{specification.root.name}.podspec.json"
332
+ end
333
+
334
+
335
+ def repoPath
336
+ return Luna::Binary::Common.instance.repoPath
337
+ end
338
+
339
+ def isHasSpecInRepo
340
+ moduleName = specification.root.name
341
+ tag = specification.version
342
+ p "#{repoPath}/#{moduleName}/#{tag}/*.podspec.json"
343
+ paths = Dir.glob("#{repoPath}/#{moduleName}/#{tag}/**/*.podspec.json")
344
+ return paths.length != 0
345
+ end
346
+
347
+ def pushRepo
348
+ moduleName = specification.root.name
349
+ tag = specification.version
350
+ targetDirname = "#{repoPath}/#{moduleName}/#{tag}"
351
+ command = "cd #{repoPath};git stash;git checkout master;git pull origin master; mkdir -p #{targetDirname}; cp -r #{filename} #{targetDirname};cd #{repoPath};git add .; git commit -m 'MOD::#{moduleName}-#{tag} by LBU';git push -f origin master;"
352
+ p command
353
+ system command
354
+ end
355
+
356
+ def isHasFrameworkInService
357
+ command = "curl #{format(CBin.config.binary_download_url, specification.root.name, specification.version).sub("#{CBin.config.download_file_type}","")}"
358
+ p command
359
+ result = %x(#{command})
360
+ resultHash = JSON.parse(result)
361
+ isHasFrameWork = false
362
+ if resultHash[specification.root.name] != nil
363
+ p "版本号#{resultHash[specification.root.name]}"
364
+ resultHash[specification.root.name].each { |item|
365
+ if item == specification.version.version
366
+ isHasFrameWork = true
367
+ end
368
+ }
369
+ end
370
+ return isHasFrameWork
371
+ end
372
+
373
+ def uploadFramework
374
+ zipCommand = "cd #{rootName};zip -r #{specification.root.name}.zip #{specification.root.name}"
375
+ p zipCommand
376
+ system zipCommand
377
+ command = "cd #{rootName};curl #{CBin.config.binary_upload_url} -F \"name=#{specification.root.name}\" -F \"version=#{specification.version}\" -F \"annotate=#{specification.root.name}_#{specification.version}_log\" -F \"file=@#{specification.root.name}.zip\""
378
+ p command
379
+ system command
380
+ end
381
+
382
+ def clearTempFile
383
+ p rootName
384
+ begin
385
+ Luna::Binary::Common.instance.deleteDirectory("#{rootName}bin-json")
386
+ rescue => exception
387
+
388
+ ensure
389
+ begin
390
+ Luna::Binary::Common.instance.deleteDirectory("#{rootName}#{podspecName}.zip")
391
+ rescue => exception
392
+
393
+ ensure
394
+ begin
395
+ Luna::Binary::Common.instance.deleteDirectory("#{rootName}#{podspecName}")
396
+ rescue => exception
397
+
398
+ ensure
399
+
400
+ end
401
+ end
402
+ end
403
+ end
404
+
405
+ class Error < StandardError; end
406
+ # Your code goes here...cd
407
+ end
408
+ end
409
+ end
410
+ end
@@ -0,0 +1,39 @@
1
+ require File.join([File.dirname(__FILE__),'lib','luna','binary','uploader','version.rb'])
2
+ Gem::Specification.new do |spec|
3
+ spec.name = "luna-binary-uploader"
4
+ spec.version = Luna::Binary::Uploader::VERSION
5
+ spec.authors = ["车德超"]
6
+ spec.email = ["chedechao333@163.com"]
7
+
8
+ spec.summary = '词典上传二进制控件'
9
+ spec.description = '词典上传二进制控件'
10
+ spec.homepage = 'https://github.com/YoudaoMobile/luna-binary-uploader'
11
+ spec.license = "MIT"
12
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
13
+
14
+ # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
15
+
16
+ # spec.metadata["homepage_uri"] = spec.homepage
17
+ # spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
18
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ # spec.files = `git ls-files`.split("
26
+ # ")
27
+
28
+ spec.bindir = "bin"
29
+ spec.executables << 'lbu'
30
+ spec.add_development_dependency('rake')
31
+ spec.add_development_dependency('rdoc')
32
+ spec.add_development_dependency('aruba')
33
+ spec.add_dependency 'parallel'
34
+ spec.add_dependency 'cocoapods'
35
+ spec.add_dependency 'cocoapods-imy-bin','0.3.1.3'
36
+ spec.add_dependency "cocoapods-generate",'~>2.0.1'
37
+ spec.add_runtime_dependency('gli','2.19.0')
38
+ spec.require_paths = ["lib"]
39
+ end
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: luna-binary-uploader
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - 车德超
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-10-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rdoc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: aruba
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: parallel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: cocoapods
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: cocoapods-imy-bin
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.3.1.3
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.3.1.3
97
+ - !ruby/object:Gem::Dependency
98
+ name: cocoapods-generate
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 2.0.1
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 2.0.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: gli
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 2.19.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 2.19.0
125
+ description: 词典上传二进制控件
126
+ email:
127
+ - chedechao333@163.com
128
+ executables:
129
+ - lbu
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - ".gitignore"
134
+ - CODE_OF_CONDUCT.md
135
+ - Gemfile
136
+ - Gemfile.lock
137
+ - LICENSE.txt
138
+ - README.md
139
+ - Rakefile
140
+ - bin/lbu
141
+ - bin/setup
142
+ - lib/luna/binary/analysis.rb
143
+ - lib/luna/binary/build.rb
144
+ - lib/luna/binary/common/common.rb
145
+ - lib/luna/binary/delete.rb
146
+ - lib/luna/binary/refresh.rb
147
+ - lib/luna/binary/update.rb
148
+ - lib/luna/binary/uploader.rb
149
+ - lib/luna/binary/uploader/version.rb
150
+ - luna-binary-uploader.gemspec
151
+ homepage: https://github.com/YoudaoMobile/luna-binary-uploader
152
+ licenses:
153
+ - MIT
154
+ metadata: {}
155
+ post_install_message:
156
+ rdoc_options: []
157
+ require_paths:
158
+ - lib
159
+ required_ruby_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: 2.3.0
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ requirements: []
170
+ rubygems_version: 3.0.3
171
+ signing_key:
172
+ specification_version: 4
173
+ summary: 词典上传二进制控件
174
+ test_files: []