luna-binary-uploader 0.1.2

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.
@@ -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: []