cocoapods-bb-PodAssistant 0.3.8.0 → 0.3.9.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -1
- data/bin/bb_tools +99 -0
- data/lib/cocoapods-bb-PodAssistant/command.rb +3 -1
- data/lib/cocoapods-bb-PodAssistant/gem_version.rb +1 -1
- data/lib/cocoapods-bb-PodAssistant/helpers/pod_module_helper.rb +14 -2
- data/lib/cocoapods-bb-PodAssistant/tools/class_unuse_finder.rb +129 -0
- data/lib/cocoapods-bb-PodAssistant/tools/count_code_line.rb +55 -0
- data/lib/cocoapods-bb-PodAssistant/tools/file_handle.rb +78 -0
- data/lib/cocoapods-bb-PodAssistant/tools/find_unuse_img.rb +132 -0
- data/lib/cocoapods-bb-PodAssistant/tools/get_size.rb +94 -0
- data/lib/cocoapods-bb-PodAssistant/tools/git_sets.rb +42 -0
- data/lib/cocoapods-bb-PodAssistant/tools/link_map.rb +381 -0
- data/lib/cocoapods-bb-PodAssistant/tools/podfile_tiled.rb +98 -0
- data/lib/cocoapods-bb-PodAssistant/tools/string_searcher.rb +129 -0
- data/lib/cocoapods-bb-PodAssistant/tools/temple-commit-msg.dat +141 -0
- data/lib/cocoapods-bb-PodAssistant/tools.rb +10 -0
- data/lib/cocoapods-bb-PodAssistant.rb +2 -0
- metadata +60 -10
@@ -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
|
+
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'find'
|
2
|
+
require 'spreadsheet'
|
3
|
+
module BBItools
|
4
|
+
# 字符串操作类
|
5
|
+
class StringHandle
|
6
|
+
# originStr中是否包含targetStrs中的内容
|
7
|
+
def self.containsStr(originStr,targetStrs)
|
8
|
+
targetStrs.each_with_index {|item,idx|
|
9
|
+
if originStr.include?(item)
|
10
|
+
return idx
|
11
|
+
end
|
12
|
+
}
|
13
|
+
return -1
|
14
|
+
end
|
15
|
+
end
|
16
|
+
# 搜索结果类
|
17
|
+
class SearchResult
|
18
|
+
attr_accessor :file_name, :in_line, :result_str, :key_str
|
19
|
+
|
20
|
+
def initialize(tempName,tempInLine,tempResultStr,tempKeyStr)
|
21
|
+
@file_name = tempName
|
22
|
+
@in_line = tempInLine
|
23
|
+
@result_str = tempResultStr
|
24
|
+
@key_str = tempKeyStr
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Main class
|
29
|
+
class StringSearcher
|
30
|
+
attr_accessor :search_strs, :search_in, :result
|
31
|
+
def initialize(temp_SearchStrs,temp_SearchIn)
|
32
|
+
@search_strs = temp_SearchStrs
|
33
|
+
@search_in = temp_SearchIn
|
34
|
+
@result = []
|
35
|
+
end
|
36
|
+
# 第二步开始搜索
|
37
|
+
def search
|
38
|
+
if check_exist
|
39
|
+
handle_method = ''
|
40
|
+
if File.file?(@search_in) #如果是文件
|
41
|
+
handle_method = "search_in_file"
|
42
|
+
else
|
43
|
+
handle_method = "search_in_folder"
|
44
|
+
end
|
45
|
+
self.send(handle_method,@search_in)
|
46
|
+
else
|
47
|
+
puts "\033[31m文件不存在,请检查输入是否正确\033[0m"
|
48
|
+
return
|
49
|
+
end
|
50
|
+
end
|
51
|
+
# 从文件查找
|
52
|
+
def search_in_file(temp_file)
|
53
|
+
line_index = 1
|
54
|
+
File.read(temp_file).each_line do |line|
|
55
|
+
haveIndex = StringHandle.containsStr(line,@search_strs)
|
56
|
+
if haveIndex != -1
|
57
|
+
search_result = SearchResult.new(temp_file,line_index,line,@search_strs[haveIndex])
|
58
|
+
@result << search_result
|
59
|
+
end
|
60
|
+
line_index = line_index + 1
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# 从文件夹查找
|
65
|
+
def search_in_folder(unuse)
|
66
|
+
puts @search_in_folder
|
67
|
+
Find.find(@search_in) do |filename|
|
68
|
+
if File.file?(filename) #如果是文件,则从文件中查找,忽略文件夹
|
69
|
+
search_in_file(filename)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
# 第一步:检查是否存在
|
74
|
+
def check_exist
|
75
|
+
if File.file?(@search_in)
|
76
|
+
puts "\033[32m从文件中查找\033[0m"
|
77
|
+
return true
|
78
|
+
elsif File::directory?(@search_in)
|
79
|
+
puts "\033[32m从文件夹中查找\033[0m"
|
80
|
+
return true
|
81
|
+
else
|
82
|
+
return false
|
83
|
+
end
|
84
|
+
end
|
85
|
+
# 第一个参数为要搜索的文件或者文件夹名称
|
86
|
+
# 第二个参数为要搜索的字符串
|
87
|
+
def self.search_result(temp_search_in,temp_search_strs)
|
88
|
+
if temp_search_in.nil?
|
89
|
+
puts "\033[31m传入的参数有误,第一个参数为要搜索的文件或者文件夹名称,第二个参数为要搜索的字符串(如要查找多个str使用英文,分割),两个参数中间用空格区分\033[0m"
|
90
|
+
return
|
91
|
+
end
|
92
|
+
if temp_search_strs.nil?
|
93
|
+
puts "\033[31m传入的参数有误,第一个参数为要搜索的文件或者文件夹名称,第二个参数为要搜索的字符串(如要查找多个str使用英文,分割),两个参数中间用空格区分\033[0m"
|
94
|
+
return
|
95
|
+
end
|
96
|
+
# 传入的可能是字符串数组
|
97
|
+
searcher = StringSearcher.new(temp_search_strs.split(","),temp_search_in)
|
98
|
+
searcher.search
|
99
|
+
if searcher.result.size == 0
|
100
|
+
puts "\033[32m没有找到相关字段\033[0m"
|
101
|
+
return
|
102
|
+
end
|
103
|
+
# 输出搜索的内容
|
104
|
+
Spreadsheet.client_encoding = 'utf-8'
|
105
|
+
book = Spreadsheet::Workbook.new
|
106
|
+
sheet1 = book.create_worksheet
|
107
|
+
sheet1.row(0)[0] = "文件名"
|
108
|
+
sheet1.row(0)[1] = "包含字符串"
|
109
|
+
sheet1.row(0)[2] = "文件所在目录"
|
110
|
+
sheet1.row(0)[3] = "查找内容所在行"
|
111
|
+
sheet1.row(0)[4] = "查找结果Str"
|
112
|
+
|
113
|
+
searcher.result.each_with_index do |item,i|
|
114
|
+
sheet1.row(i+1)[0] = File.basename(item.file_name)
|
115
|
+
sheet1.row(i+1)[1] = item.key_str
|
116
|
+
sheet1.row(i+1)[2] = File.dirname(item.file_name)
|
117
|
+
sheet1.row(i+1)[3] = item.in_line
|
118
|
+
sheet1.row(i+1)[4] = item.result_str
|
119
|
+
if i < 10
|
120
|
+
puts "#{item.key_str} is in file:#{File.basename(item.file_name)} and Inline:#{item.in_line}"
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
puts "\033[32m查找成功,内容已经保存到#{File.dirname(searcher.search_in)},请点击查看\033[0m"
|
126
|
+
book.write "#{File.dirname(searcher.search_in)}/search_result.xls"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|