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.
@@ -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