cocoapods-bb-PodAssistant 0.3.7.1 → 0.3.9.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,94 @@
1
+ require 'find'
2
+ module BBItools
3
+ class Memory
4
+ attr_accessor :pro
5
+ # 分发吹
6
+ def hand_cal_size(file,prop)
7
+ if prop.nil?
8
+ @pro = 1024
9
+ elsif prop == 0
10
+ @pro = 1024
11
+ else
12
+ @pro = prop
13
+ end
14
+ handle_method = ''
15
+ if File.file?(file)
16
+ puts "\033[32m开始计算文件的大小...\033[0m"
17
+ handle_method = 'cal_file'
18
+ elsif File::directory?(file)
19
+ handle_method = 'cal_folder'
20
+ puts "\033[32m开始计算文件夹的大小...\033[0m"
21
+ else
22
+ puts "\033[31m参数异常,请确保传入的第一个参数是文件路径或者文件夹路径\033[0m"
23
+ return
24
+ end
25
+ self.send(handle_method,file)
26
+ end
27
+ # 计算单个文件
28
+ def cal_file(file)
29
+ puts "\033[32m文件的大小为:#{get_show_size(File.size(file))}.\033[0m"
30
+ end
31
+ # 计算整个文件夹
32
+ def cal_folder(folder)
33
+ print "\033[32m请输入要查找文件后缀\033[0m(例如想文件夹中图片大小则输入:{png,jpg,gif},不输入则默认计算文件夹下所有文件大小之和):"
34
+ file_exts_string = STDIN.gets
35
+ file_exts_string.chomp! #过滤换行符
36
+ if file_exts_string.size == 0
37
+ file_exts = []
38
+ else
39
+ file_exts = file_exts_string.split(",")
40
+ end
41
+ sum = 0
42
+ file_count = 0
43
+ total_count = 0
44
+ total_size = 0
45
+ file_size = 0
46
+ Find.find(folder) do |filename|
47
+ if File.file?(filename)
48
+ total_count = total_count + 1
49
+ total_size = total_size + File.size(filename)
50
+ if file_exts.size == 0 #说明计算所有文件
51
+ sum = sum + File.size(filename)
52
+ file_count = file_count + 1
53
+ elsif file_exts.include?(File.extname(filename).delete(".")) #查找指定后缀的文件
54
+ sum = sum + File.size(filename)
55
+ file_count = file_count + 1
56
+ file_size = file_size + File.size(filename)
57
+ else
58
+ #不做任何处理
59
+ end
60
+ end
61
+ end
62
+ if file_exts.size == 0
63
+ puts "\033[32m文件夹中共#{total_count}个文件,共#{get_show_size(total_size)}(#{total_size})\033[0m"
64
+ else
65
+ puts "\033[32m文件夹中共#{total_count}个文件,共#{get_show_size(total_size)}(#{total_size});找到后缀为(#{file_exts_string})的文件#{file_count}个,共#{get_show_size(file_size)}(#{file_size}).\033[0m"
66
+ end
67
+
68
+ # puts `du -b #{folder} | awk '{print $1}'`.to_i
69
+ end
70
+ # get_show_size
71
+ def get_show_size(size)
72
+ if size > @pro * @pro * @pro
73
+ return format("%.2f",(size.to_f/(@pro*@pro*@pro))) + "GB"
74
+ elsif size > @pro * @pro
75
+ return format("%.2f",(size.to_f/(@pro*@pro))) + "MB"
76
+ elsif size > @pro
77
+ return format("%.2f",(size.to_f/@pro)) + "KB"
78
+ else
79
+ return size.to_s + "B"
80
+ end
81
+ end
82
+ # 对外暴露方法
83
+ def self.sizeFor(proport)
84
+ file = proport[0]
85
+ pro = proport[1].to_i
86
+ if file.nil?
87
+ puts "\033[31m参数异常,请传入一个参数\033[0m"
88
+ return
89
+ end
90
+ memory = Memory.new
91
+ memory.hand_cal_size(file,pro)
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,42 @@
1
+ require 'colored2'
2
+
3
+ module BBItools
4
+ class GitSets
5
+ def self.commit_msg_init(args)
6
+ # folder_path = args[0]
7
+ # if folder_path.nil?
8
+ # puts "传入的参数不能为空".red
9
+ # return
10
+ # end
11
+ # if !File::directory?(folder_path)
12
+ # puts "参数不是文件夹".red
13
+ # return
14
+ # end
15
+ puts "开始配置CommitLint,用于校验commit message的工具...".yellow
16
+ system('touch ./.git/commit_msg')
17
+ system('git config commit.template "`pwd`/.git/commit_msg"')
18
+ a = <<-EOF
19
+ #!/bin/sh
20
+ echo "$(git symbolic-ref --short HEAD) subject" > `pwd`/.git/commit_msg
21
+ echo "" >> `pwd`/.git/commit_msg
22
+ echo "Cause:" >> `pwd`/.git/commit_msg
23
+ echo "Solution:" >> `pwd`/.git/commit_msg
24
+ echo "Releated Doc Address:" >> `pwd`/.git/commit_msg
25
+ echo '''\n#TYPE类型\n#新功能 feature/feat\n#bug修复 bugfix/fixbug/fix\n#性能优化 perf\n#代码重构 refactor/review\n#线上修复 hotfix\n#发布版本 release\n#文档变更 docs\n#更新 update\n#新增 add\n#标签 tag\n#代码回退 revert\n#更新lock lock''' >> `pwd`/.git/commit_msg
26
+ EOF
27
+ File.open('.git/hooks/pre-commit', 'w') do |f|
28
+ f.puts a
29
+ end
30
+ puts "写入CommitLint规则"
31
+ logo_path = File.join( File.dirname(__FILE__), 'temple-commit-msg.dat' )
32
+ content = File.read( logo_path )
33
+ File.open('.git/hooks/commit-msg', 'w') do |f|
34
+ f.puts content
35
+ end
36
+ puts "更新权限"
37
+ system('chmod a+x .git/hooks/pre-commit')
38
+ system('chmod a+x .git/hooks/commit-msg')
39
+ puts "配置成功,后续请直接使用git commit ,不要加 -m".green
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,381 @@
1
+ require 'fileutils'
2
+ require 'pathname'
3
+ require 'find'
4
+ require 'spreadsheet'
5
+ module BBItools
6
+ # ---------------------------------ObjectFile class---------------------------------
7
+ class ObjectFile
8
+ # file_size:单个文件的大小
9
+ # o_name:某个文件的名字
10
+ # o_size: 某个o文件的大小
11
+ attr_accessor :serial_number, :file_path, :file_name, :file_size, :o_name, :o_size
12
+ def initialize()
13
+ @serial_number = []
14
+ @file_size = 0
15
+ @o_size = 0
16
+ end
17
+
18
+ end
19
+ # ---------------------------------Sections class---------------------------------
20
+ class Sections
21
+ attr_accessor :address, :size, :segment, :section
22
+
23
+ end
24
+ # ---------------------------------Symbols class---------------------------------
25
+ class Symbols
26
+ attr_accessor :s_address, :s_size, :s_file_serial_number, :s_name
27
+ def initialize
28
+ @s_file_serial_number = -1 #防止为0
29
+ end
30
+ end
31
+
32
+ # ---------------------------------DSSymbols class---------------------------------
33
+ class DSSymbols
34
+ attr_accessor :size, :file, :name
35
+ end
36
+
37
+ # ---------------------------------LinkMap class---------------------------------
38
+ class LinkMap
39
+ # 包含的属性
40
+ attr_accessor :l_name, :l_path, :l_arch, :l_obj_files, :l_sections, :l_symbols, :l_dead_stripped_symbols, :l_sym_map
41
+ # 初始化方法
42
+ def initialize(fName)
43
+ @l_name = fName
44
+ @l_obj_files = []
45
+ @l_symbols = []
46
+ @l_sections = []
47
+ @l_dead_stripped_symbols = []
48
+ end
49
+ # 得到path
50
+ def get_path(str)
51
+ splitparam = str.split(" ")
52
+ @l_path = splitparam.last
53
+ end
54
+ # 处理object文件
55
+ def handle_ojbect_files(str)
56
+ tempSplit = str.split("]")
57
+ if tempSplit.size > 1
58
+ obj_file = ObjectFile.new
59
+ obj_file.serial_number = tempSplit[0].delete("[").strip.to_i #设置serial_number
60
+ obj_file.file_path = tempSplit[1].strip
61
+ obj_file.file_name = tempSplit[1].split("/").last.chomp
62
+ obj_file.o_name = get_o_name(tempSplit[1].split("/").last.chomp)
63
+ l_obj_files << obj_file
64
+ end
65
+ end
66
+ # 得到o_ame 有待优化,可以使用正则表达式处理TODO
67
+ def get_o_name(str)
68
+ temp_arr = str.split("(")
69
+ if temp_arr.size > 1
70
+ temp_arr[1].split(".o)")[0]
71
+ else
72
+ return temp_arr[0].split(".o")[0]
73
+ end
74
+ end
75
+ # 处理sections
76
+ def handle_sections(str)
77
+ sectionSplit = str.split(" ")
78
+ if sectionSplit.size == 4
79
+ section = Sections.new
80
+ section.address = sectionSplit[0]
81
+ section.size = sectionSplit[1]
82
+ section.segment = sectionSplit[2]
83
+ section.section = sectionSplit[3]
84
+ l_sections << section
85
+ end
86
+ end
87
+ # get arch
88
+ def get_arch(str)
89
+ splitparam = str.split(" ")
90
+ @l_arch = splitparam.last
91
+ end
92
+ # 处理Symbols
93
+ def handle_symbols(str)
94
+ # 字符编码产生的异常处理
95
+ begin
96
+ symbolsSplit = str.split("\t")
97
+ rescue => exception
98
+ return
99
+ end
100
+ if symbolsSplit.size > 2
101
+ symbol = Symbols.new
102
+ symbol.s_address = symbolsSplit[0]
103
+ symbol.s_size = symbolsSplit[1]
104
+ # 获取编号和名字
105
+ serial_name_str = symbolsSplit[2]
106
+ file_and_name_split = serial_name_str.split("]")
107
+ if file_and_name_split.size > 1
108
+ symbol.s_file_serial_number = file_and_name_split[0].delete("[").strip.to_i #设置文件编号
109
+ symbol.s_name = file_and_name_split[1]
110
+ end
111
+
112
+ l_symbols << symbol
113
+ else
114
+ end
115
+ end
116
+ # 处理symbols的数组,把symbols转换成hashmap
117
+ def handle_l_sym_map
118
+ @l_sym_map = @l_symbols.group_by(&:s_file_serial_number)
119
+ if @l_sym_map.include?(-1)
120
+ puts "移除无用元素"
121
+ @l_sym_map.delete(-1)
122
+ end
123
+ end
124
+ # 处理link map file
125
+ def handle_map
126
+ handle_method_name = ""
127
+ File.read(@l_name).each_line do |line|
128
+ if line[0] == "#"
129
+ if line.include?("Path:")
130
+ handle_method_name = "get_path"
131
+ puts "处理path..."
132
+ elsif line.include?("Arch:")
133
+ handle_method_name = "get_arch"
134
+ puts "处理Arch..."
135
+ elsif line.include?("Object files")
136
+ handle_method_name = "handle_ojbect_files"
137
+ puts "处理Object files..."
138
+ elsif line.include?("Sections")
139
+ handle_method_name = "handle_sections"
140
+ puts "处理Sections..."
141
+ elsif line.include?("Symbols:") #symbols:和Dead Stripped Symbols处理一样
142
+ # 这里不处理Dead Stripped Symbols
143
+ if line.delete('#').strip.include?("Dead Stripped Symbols")
144
+ puts "不处理处理#{line.delete('#').strip}..."
145
+ break
146
+ end
147
+ puts "处理#{line.delete('#').strip}..."
148
+ handle_method_name = "handle_symbols"
149
+ end
150
+ end
151
+ self.send(handle_method_name, line)
152
+
153
+ end
154
+ end
155
+ # 对linkmap进行解析,然后输出结果
156
+ def self.parser(path_para)
157
+ start_time = Time.now.to_i #程序开始执行时间(以毫秒为单位)
158
+ # 获取link map file's name
159
+ link_map_file_name = path_para
160
+ puts "获取的文件路径为:#{link_map_file_name}"
161
+ if link_map_file_name.nil?
162
+ puts "请按照如下命令执行该脚本:"
163
+ puts "\033[31mItools parse **.txt \033[0m"
164
+ puts "**指代Link Map File的名字,例如LinkMapApp-LinkMap-normal-arm64.txt,parse后面为绝对路径"
165
+ return
166
+ end
167
+ if File.exist?(link_map_file_name)
168
+ puts "\033[32m获取LinkMap文件: #{link_map_file_name}成功,开始分析数据...\033[0m"
169
+ else
170
+ puts "\033[31m#{link_map_file_name}文件不存在,请重新输入文件 \033[0m"
171
+ return
172
+ end
173
+
174
+ link_map = LinkMap.new(link_map_file_name)
175
+ link_map.handle_map #处理文件为对象,然后继续后续操作
176
+ link_map.handle_l_sym_map #处理symbols为hashmap
177
+ sizeResultArr = []
178
+
179
+ link_map.l_obj_files.each do |obj|
180
+ temp_file_name = obj.file_name.split("(")[0]
181
+
182
+ last_file = sizeResultArr.last
183
+
184
+ if last_file && temp_file_name.eql?(last_file.file_name)
185
+ last_file.file_serial_numers << obj.serial_number
186
+ else
187
+ sz_obj = SizeResult.new
188
+ sz_obj.file_name = temp_file_name
189
+ sz_obj.file_serial_numers << obj.serial_number
190
+ sizeResultArr << sz_obj
191
+ end
192
+ end
193
+ data_analyze_time = Time.now.to_i
194
+ puts "\033[32m数据分析完成,耗时#{data_analyze_time - start_time}秒。开始计算结果\033[0m"
195
+
196
+ # 计算赋值size,此处耗时较长
197
+ total_size = 0
198
+ sizeResultArr.each do |obj|
199
+ # 处理方法2
200
+ obj.file_serial_numers.each do |s_number|
201
+ begin
202
+ link_map.l_sym_map[s_number].each do |symb|
203
+ obj.size = obj.size + symb.s_size.hex
204
+ total_size = total_size +symb.s_size.hex #统计总大小
205
+ end
206
+ rescue => exception
207
+ end
208
+ end
209
+ # 处理方法1 太过耗时
210
+ # link_map.l_symbols.each do |symb|
211
+ # if obj.file_serial_numers.include?(symb.s_file_serial_number)
212
+ # obj.size = obj.size + symb.s_size.hex
213
+ # end
214
+ # end
215
+ # puts "正在计算#{obj.file_name}的大小..."
216
+ end
217
+ data_handle_time = Time.now.to_i #处理数据时间
218
+ puts "\033[32m数据处理完成,耗时#{data_handle_time - data_analyze_time}秒。开始对结果进行大小排序(从大到小)...\033[0m"
219
+ # 按照从大到小排序
220
+ sizeResultArr.sort_by!{|obj|[-obj.size]}
221
+ sort_handle_time = Time.now.to_i #排序耗时
222
+ puts "\033[32m数据排序完成,耗时#{sort_handle_time - data_handle_time}秒。开始输出结果:\033[0m"
223
+ puts "\033[32m--------------------------------\033[0m"
224
+
225
+ # 判断文件是否存在
226
+ save_file_path = SizeResult.getSaveFileName(path_para)
227
+ if File.exist?(save_file_path)
228
+ File.delete(save_file_path)
229
+ end
230
+
231
+ # 创建要保存数据的文件
232
+ Spreadsheet.client_encoding = 'utf-8'
233
+ book = Spreadsheet::Workbook.new
234
+ sheet1 = book.create_worksheet
235
+ sheet1.row(0)[0] = "文件名"
236
+ sheet1.row(0)[1] = "文件大小(B)"
237
+ sheet1.row(0)[2] = "文件大小"
238
+ sizeResultArr.each_with_index{|item, idx|
239
+ sheet1.row(idx+1)[0] = item.file_name
240
+ sheet1.row(idx+1)[1] = item.size
241
+ sheet1.row(idx+1)[2] = SizeResult.handleSize(item.size)
242
+ puts "#{item.file_name} " + SizeResult.handleSize(item.size)
243
+ }
244
+ book.write "#{save_file_path}"
245
+ # save_file = File.new(save_file_path,"w+")
246
+ # # 打印结果
247
+ # sizeResultArr.each do |obj|
248
+ # puts "#{obj.file_name} " + SizeResult.handleSize(obj.size)
249
+ # save_file.puts("#{obj.file_name} #{SizeResult.handleSize(obj.size)}(#{obj.size})")
250
+ # end
251
+ # save_file.puts("总大小为:#{SizeResult.handleSize(total_size)}")
252
+ # save_file.close
253
+ puts "总大小为(仅供参考):#{SizeResult.handleSize(total_size)}"
254
+ puts "\033[32m--------------------------------\033[0m"
255
+ end_time = Time.now.to_i #程序执行结束时间
256
+ puts "分析结果已经保存为文件,位置为:\n\033[32m#{save_file_path}\033[0m"
257
+ puts " "
258
+ puts "\033[32m整个程序执行时间为:#{end_time - start_time}秒\033[0m"
259
+ end
260
+
261
+ # 根据linkmap && folder计算占用
262
+ # 第一个参数为linkmap路径,第二个参数为要分析的项目文件夹
263
+ def self.parser_by_folder(args)
264
+ link_map_file_name = args[0] #linkmap文件路径
265
+ project_folder = args[1] #项目文件夹
266
+ # 对参数进行校验
267
+ if File::directory?(project_folder)
268
+ puts "获取的项目目录路径为:#{project_folder}"
269
+ else
270
+ puts "\033[31m#{project_folder}文件夹不存在,请重新输入 \033[0m"
271
+ return
272
+ end
273
+ if File.exist?(link_map_file_name)
274
+ puts "获取的linkmap文件路径为:#{link_map_file_name}"
275
+ puts "\033[32m获取LinkMap文件: #{link_map_file_name}成功,开始分析数据...\033[0m"
276
+ else
277
+ puts "\033[31m#{link_map_file_name}文件不存在,请重新输入 \033[0m"
278
+ return
279
+ end
280
+ # 开始处理数据
281
+ link_map = LinkMap.new(link_map_file_name)
282
+ link_map.handle_map #处理文件为对象,然后继续后续操作
283
+ link_map.handle_l_sym_map #处理symbols为hashmap
284
+
285
+ # 所有的文件
286
+ link_map.l_obj_files
287
+ # 所有的symbols
288
+ link_map.l_symbols
289
+
290
+ # 处理得到每个obj_file的大小
291
+ link_map.l_obj_files.each do |obj|
292
+ if link_map.l_sym_map[obj.serial_number]
293
+ link_map.l_sym_map[obj.serial_number].each do |symb|
294
+ obj.o_size = obj.o_size + symb.s_size.hex
295
+ end
296
+ end
297
+ end
298
+ # key为文件名,value为ojbect
299
+ sort_by_obj_files_map = link_map.l_obj_files.group_by(&:o_name)
300
+ # save_file_path = SizeResult.getSaveFileName(project_folder)
301
+ # save_file = File.new(save_file_path,"w+")
302
+ # sort_by_obj_files_map.keys.each do |sss|
303
+
304
+ # save_file.puts("#{sort_by_obj_files_map[sss][0].o_name} #{sort_by_obj_files_map[sss][0].o_size}")
305
+ # end
306
+ # save_file.close
307
+ # exit
308
+
309
+
310
+
311
+ size_results = [] #盛放计算结果
312
+ size_files = []
313
+ space_index = 0
314
+ puts "计算开始"
315
+ traverse_dir(sort_by_obj_files_map,project_folder,size_results,size_files,space_index)
316
+ size_results.reverse!
317
+ # 存储为文件
318
+ save_file_path = SizeResult.getSaveFileName(project_folder)
319
+ if File.exist?(save_file_path)
320
+ File.delete(save_file_path)
321
+ end
322
+ save_file = File.new(save_file_path,"w+")
323
+ o_index = 2
324
+ size_results.each do |o|
325
+ result_str = "#{' ' * o.space_count}├── #{o.folder_name.split('/').last} #{SizeResult.handleSize(o.size)}(#{o.size})"
326
+ save_file.puts(result_str)
327
+ end
328
+ save_file.close
329
+ puts "分析结果已经保存为文件,位置为:\n\033[32m#{save_file_path}\033[0m"
330
+ end
331
+ def self.traverse_dir(sort_by_obj_files_map,file_path,results,size_files,space_index)
332
+ s_result = SizeResult.new
333
+ s_result.folder_name = file_path
334
+ space_index = space_index + 2
335
+ file_name_arr = [] #盛放计算过的类
336
+ Find.find(file_path) do |file|
337
+ # 不包含图片
338
+ if File.file?(file) && !(File.extname(file) =~ /(png|gif|jpg|bmp|jpeg)/)
339
+ file_name = File.basename(file,".*")
340
+ if !file_name_arr.include?(file_name) && sort_by_obj_files_map[file_name] #没有已经计算过
341
+ s_result.size = s_result.size + sort_by_obj_files_map[file_name][0].o_size
342
+ file_name_arr << file_name
343
+ end
344
+ elsif File::directory?(file) && file != file_path
345
+ traverse_dir(sort_by_obj_files_map,file,results,size_files,space_index)
346
+ end
347
+ end
348
+ if s_result.size > 0 && !size_files.include?(s_result.folder_name)
349
+ s_result.space_count = space_index
350
+ results << s_result
351
+ size_files << s_result.folder_name
352
+ end
353
+ end
354
+ end
355
+ class SizeResult
356
+ attr_accessor :file_name, :file_serial_numers, :size,:folder_name, :space_count
357
+ def initialize
358
+ @file_serial_numers = []
359
+ @size = 0
360
+ end
361
+ # size字符化
362
+ def self.handleSize(size)
363
+ if size > 1024 * 1024
364
+ return format("%.2f",(size.to_f/(1024*1024))) + "MB"
365
+ elsif size > 1024
366
+ return format("%.2f",(size.to_f/1024)) + "KB"
367
+ else
368
+ return size.to_s + "B"
369
+ end
370
+ end
371
+ # 获取结果文件保存到目录
372
+ def self.getSaveFileName(path_para)
373
+ path = Pathname.new(path_para)
374
+ # 要保存的地址
375
+ save_file_path = path.dirname.to_s + "/" + "parse_" + path.basename.to_s + "_result(#{Time.new.strftime("%Y%m%d%H%M%S")}).xls"
376
+ return save_file_path
377
+ end
378
+ end
379
+ end
380
+
381
+ # --------------------------------- Size utils class ---------------------------------
@@ -0,0 +1,98 @@
1
+ module BBItools
2
+ class PodInfo
3
+ attr_accessor :pod_name, :pod_version
4
+ def initialize(name, version)
5
+ @pod_name = name
6
+ @pod_version = version
7
+ end
8
+ end
9
+ class PodfileTiled
10
+ def self.podfile_tiled(args)
11
+ all_pods = [] #所有依赖的pod
12
+ exist_pods = [] #当前podfile已经存在的pod
13
+ need_add_pods = [] #当前需要添加到podfile中的pod
14
+ pod_tag = 1
15
+
16
+ fileInfo = File.open(args[0])
17
+
18
+ total_index = 0
19
+ fileInfo.each_line do |line|
20
+ line_string = line.delete("\n")
21
+ if line_string == 'PODS:'
22
+ # 配置成功,后续请直接使用git commit ,不要加 -m\033[0m
23
+ puts "\033[32m开始分析依赖\033[0m"
24
+ pod_tag = 1
25
+ next
26
+ elsif line_string == 'DEPENDENCIES:'
27
+ puts "\033[32m开始分析当前Podfile中已添加的依赖项\033[0m"
28
+ pod_tag = 2
29
+ next
30
+ elsif line_string == 'SPEC REPOS:'
31
+ pod_tag = 0
32
+ puts "\033[32mpodfile.lock分析结束\033[0m"
33
+ end
34
+
35
+ if pod_tag == 1 #分析所有pod
36
+ if line_string[0, 3] == ' -' && !line_string.include?('/')
37
+ # puts line_string
38
+ pod_version = line_string[/\((.*?)\)/, 1]
39
+ pod_name =
40
+ line_string.gsub(pod_version, '').delete('(').delete(')').delete(
41
+ ':'
42
+ ).delete('-').strip
43
+ temp_pod = PodInfo.new(pod_name, pod_version)
44
+ all_pods << temp_pod
45
+ puts "查找到pod库:#{pod_name}, 版本号为:'#{pod_version}' #{all_pods.length}"
46
+ end
47
+ end
48
+
49
+ if pod_tag == 2 #分析当前podfile已经有的pod
50
+ pod_name
51
+ pod_version = line_string[/\((.*?)\)/, 1]
52
+ if pod_version
53
+ pod_name =
54
+ line_string.gsub(pod_version, '').delete('(').delete(')').delete(
55
+ ':'
56
+ ).delete('-').strip
57
+ else
58
+ pod_name = line_string.delete('-').lstrip.rstrip
59
+ end
60
+ # if pod_name.length == 0 || pod_name.include?('/')
61
+ # next
62
+ # end
63
+ temp_pod = PodInfo.new(pod_name, pod_version)
64
+ if pod_version
65
+ temp_pod.pod_version = pod_version.delete('=').strip
66
+ end
67
+
68
+ exist_pods << temp_pod
69
+ puts "Podfile中已包含 #{pod_name}, 版本号为:'#{pod_version}'"
70
+ end
71
+ end
72
+ temp_exist_pods = []
73
+ all_pods.each do |all_pod|
74
+ exist_pods.each do |exist_pod|
75
+ exist_pod_name = exist_pod.pod_name
76
+ if exist_pod_name.include?('/')
77
+ exist_pod_name = exist_pod_name.split('/')[0]
78
+ end
79
+ if all_pod.pod_name == exist_pod_name
80
+ temp_exist_pods << all_pod
81
+ end
82
+ end
83
+ end
84
+
85
+ need_add_pods = all_pods - temp_exist_pods
86
+ if need_add_pods.length == 0
87
+ puts "\033[32m恭喜!!!无需平铺,当前已全部平铺\033[0m"
88
+ else
89
+ puts "\033[32m以下为要平铺的库,直接复制粘贴至Podfile中即可:\033[0m"
90
+ need_add_pods.each do |to_add|
91
+ puts "pod '#{to_add.pod_name}', '#{to_add.pod_version}'"
92
+ end
93
+ end
94
+
95
+ end
96
+ end
97
+ end
98
+