pindo 5.13.7 → 5.13.10

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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/git_handler.rb +247 -42
  3. data/lib/pindo/command/android/autobuild.rb +104 -31
  4. data/lib/pindo/command/android/autoresign.rb +23 -322
  5. data/lib/pindo/command/android/keystore.rb +7 -130
  6. data/lib/pindo/command/appstore/adhocbuild.rb +52 -15
  7. data/lib/pindo/command/appstore/autobuild.rb +104 -8
  8. data/lib/pindo/command/appstore/autoresign.rb +3 -5
  9. data/lib/pindo/command/ios/autobuild.rb +96 -32
  10. data/lib/pindo/command/ios/build.rb +8 -186
  11. data/lib/pindo/command/jps/media.rb +146 -0
  12. data/lib/pindo/command/jps/upload.rb +49 -21
  13. data/lib/pindo/command/jps.rb +1 -0
  14. data/lib/pindo/command/unity/autobuild.rb +141 -32
  15. data/lib/pindo/command/unity/packpush.rb +5 -8
  16. data/lib/pindo/command/utils/repoinit.rb +0 -2
  17. data/lib/pindo/command/utils/tag.rb +58 -26
  18. data/lib/pindo/command/utils.rb +0 -1
  19. data/lib/pindo/command/web/autobuild.rb +98 -34
  20. data/lib/pindo/command.rb +0 -56
  21. data/lib/pindo/config/build_info_manager.rb +7 -8
  22. data/lib/pindo/module/android/android_config_helper.rb +2 -11
  23. data/lib/pindo/module/appselect.rb +15 -41
  24. data/lib/pindo/module/appstore/itcapp_helper.rb +3 -6
  25. data/lib/pindo/module/build/build_helper.rb +28 -18
  26. data/lib/pindo/module/build/git_repo_helper.rb +284 -405
  27. data/lib/pindo/module/cert/pem_helper.rb +3 -6
  28. data/lib/pindo/module/pgyer/pgyerhelper.rb +193 -25
  29. data/lib/pindo/module/task/model/appstore/appstore_task.rb +5 -0
  30. data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +13 -187
  31. data/lib/pindo/module/task/model/build/android_build_dev_task.rb +36 -34
  32. data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +13 -187
  33. data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +9 -6
  34. data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +9 -6
  35. data/lib/pindo/module/task/model/build/ios_build_dev_task.rb +37 -32
  36. data/lib/pindo/module/task/model/build/web_build_dev_task.rb +7 -5
  37. data/lib/pindo/module/task/model/build_task.rb +8 -11
  38. data/lib/pindo/module/task/model/git/git_commit_task.rb +118 -0
  39. data/lib/pindo/module/task/model/git/git_tag_task.rb +125 -0
  40. data/lib/pindo/module/task/model/git_task.rb +75 -0
  41. data/lib/pindo/module/task/model/jps/jps_message_task.rb +178 -0
  42. data/lib/pindo/module/task/model/{jps_resign_task.rb → jps/jps_resign_task.rb} +14 -23
  43. data/lib/pindo/module/task/model/jps/jps_upload_media_task.rb +248 -0
  44. data/lib/pindo/module/task/model/{jps_upload_task.rb → jps/jps_upload_task.rb} +39 -94
  45. data/lib/pindo/module/task/model/jps_task.rb +43 -0
  46. data/lib/pindo/module/task/model/{ipa_local_resign_task.rb → resign/ipa_local_resign_task.rb} +7 -2
  47. data/lib/pindo/module/task/model/unity/unity_config_task.rb +103 -0
  48. data/lib/pindo/module/task/model/{unity_export_task.rb → unity/unity_export_task.rb} +76 -78
  49. data/lib/pindo/module/task/model/unity/unity_update_task.rb +95 -0
  50. data/lib/pindo/module/task/model/unity/unity_yoo_asset_task.rb +156 -0
  51. data/lib/pindo/module/task/model/unity_task.rb +118 -0
  52. data/lib/pindo/module/task/pindo_task.rb +101 -1
  53. data/lib/pindo/module/task/task_manager.rb +29 -24
  54. data/lib/pindo/module/unity/nuget_helper.rb +7 -7
  55. data/lib/pindo/module/unity/unity_command_helper.rb +188 -0
  56. data/lib/pindo/module/unity/unity_env_helper.rb +208 -0
  57. data/lib/pindo/module/unity/unity_helper.rb +189 -746
  58. data/lib/pindo/module/unity/unity_proc_helper.rb +390 -0
  59. data/lib/pindo/options/core/global_options_state.rb +96 -26
  60. data/lib/pindo/options/core/option_configuration.rb +3 -0
  61. data/lib/pindo/options/core/option_item.rb +36 -0
  62. data/lib/pindo/options/groups/build_options.rb +23 -6
  63. data/lib/pindo/options/groups/git_options.rb +115 -0
  64. data/lib/pindo/options/groups/jps_options.rb +7 -0
  65. data/lib/pindo/options/groups/option_group.rb +15 -0
  66. data/lib/pindo/options/groups/unity_options.rb +49 -0
  67. data/lib/pindo/options/options.rb +2 -0
  68. data/lib/pindo/version.rb +2 -2
  69. metadata +25 -14
  70. data/lib/pindo/base/githelper.rb +0 -686
  71. data/lib/pindo/base/pindocontext.rb +0 -602
  72. data/lib/pindo/command/utils/feishu.rb +0 -134
  73. data/lib/pindo/module/build/version_helper.rb +0 -146
  74. data/lib/pindo/module/task/model/git_tag_task.rb +0 -80
@@ -1,602 +0,0 @@
1
- require 'singleton'
2
- require 'digest'
3
- require 'json'
4
- require 'fileutils'
5
-
6
- module Pindo
7
- class PindoContext
8
- # 选择键定义
9
- module SelectionKey
10
- TAG_DECISION = :tag_decision # 打Tag决定
11
- PROJECT_NAME = :project_name # 项目名称
12
- BUNDLE_ID = :bundle_id # Bundle ID
13
- ANDROID_BUNDLE_NAME = :android_bundle_name # Android Bundle Name
14
- CERT_TYPE = :cert_type # 证书类型
15
- end
16
-
17
- include Singleton
18
-
19
- attr_reader :current_command, :current_directory
20
-
21
- def initialize
22
- @current_command = nil # 根命令(第一个设置的命令)
23
- @current_directory = nil # 项目路径
24
- @memory_selections = {} # 三级结构的内存缓存
25
- @file_cache_loaded = false # 标记文件缓存是否已加载
26
- @cache_enabled = false # 默认禁用缓存
27
- @command_group = nil # 命令组名称
28
- @verbose = false # 是否输出详细日志
29
- @loaded_file_cache = nil # 已加载但未应用的文件缓存数据
30
- @cache_confirmed = false # 标记缓存确认是否已完成
31
- ensure_cache_dir
32
- end
33
-
34
- # 判断是否处于 verbose 模式
35
- def verbose?
36
- @verbose || ENV['PINDO_VERBOSE'] == '1' || ENV['PINDO_DEBUG'] == '1'
37
- end
38
-
39
- # 设置当前上下文
40
- def set_context(command, directory = nil, options = {})
41
- # 如果已有命令在执行,这是嵌套调用,不需要做任何事
42
- unless @current_command.nil?
43
- puts "[PindoContext] 嵌套调用 #{command},使用已有上下文 (根命令: #{@current_command},命令组: #{@command_group})" if verbose?
44
- return
45
- end
46
-
47
- # 第一次设置,是顶层命令
48
- @current_command = command # 保持原始命令名称
49
- @current_directory = directory || Dir.pwd # 固定项目目录
50
-
51
- # 从选项中获取缓存配置
52
- @cache_enabled = options[:cache_enabled] || false
53
- @verbose = options[:verbose] || false
54
- # 使用 get_command_group 来确定缓存组
55
- @command_group = get_command_group(command)
56
-
57
- if verbose?
58
- puts "\n[PindoContext] ========== 设置顶层命令上下文 =========="
59
- puts "[PindoContext] 命令: #{command}"
60
- puts "[PindoContext] 目录: #{@current_directory}"
61
- puts "[PindoContext] 缓存启用: #{@cache_enabled}"
62
- puts "[PindoContext] 命令组: #{@command_group}"
63
- puts "[PindoContext] options: #{options.inspect}"
64
- end
65
-
66
- # 仅在启用缓存时加载文件缓存(不确认,只加载到临时变量)
67
- if @cache_enabled && !@file_cache_loaded
68
- puts "[PindoContext] 准备加载文件缓存..." if verbose?
69
- load_file_cache
70
- @file_cache_loaded = true
71
- else
72
- if verbose?
73
- if !@cache_enabled
74
- puts "[PindoContext] 缓存未启用,跳过文件缓存加载"
75
- elsif @file_cache_loaded
76
- puts "[PindoContext] 文件缓存已加载,跳过重复加载"
77
- end
78
- end
79
- end
80
- puts "[PindoContext] ======================================\n" if verbose?
81
- end
82
-
83
- # 重置上下文(顶层命令结束时调用)
84
- def reset_context
85
- # 仅在启用缓存时保存文件缓存
86
- save_file_cache if @cache_enabled && @current_command
87
-
88
- @current_command = nil
89
- @current_directory = nil
90
- @file_cache_loaded = false
91
- @cache_enabled = false
92
- @command_group = nil
93
- @cache_confirmed = false
94
- # 暂不清理内存缓存,让同一进程内可以复用
95
- end
96
-
97
- # 设置用户选择(三级结构:项目路径 -> 根命令 -> 键值)
98
- def set_selection(key, value)
99
- # 构建三级键 - 使用统一的项目路径获取方法
100
- project_path = get_project_path
101
- root_command = @command_group || @current_command
102
-
103
- # 如果没有有效的项目路径或命令,不保存
104
- unless project_path && root_command
105
- puts "[PindoContext] 警告: 无法保存选择,缺少项目路径或命令上下文"
106
- return
107
- end
108
-
109
- # 初始化三级结构(总是保存到内存,不管是否启用缓存)
110
- @memory_selections[project_path] ||= {}
111
- @memory_selections[project_path][root_command] ||= {}
112
-
113
- # 如果值为 nil,则删除该键而不是保存 nil
114
- if value.nil?
115
- @memory_selections[project_path][root_command].delete(key)
116
- puts "[PindoContext] 从内存删除: [#{project_path}][#{root_command}][#{key}]" if verbose?
117
- else
118
- @memory_selections[project_path][root_command][key] = value
119
- puts "[PindoContext] 保存到内存: [#{project_path}][#{root_command}][#{key}] = #{value.inspect}" if verbose?
120
- end
121
-
122
- # 更新该命令组的最后修改时间
123
- @memory_selections[project_path][root_command]['__last_modified__'] = Time.now.to_i
124
-
125
- # 仅在启用缓存时保存到文件
126
- if @cache_enabled
127
- save_file_cache
128
- puts "[PindoContext] 已保存到文件缓存" if verbose?
129
- else
130
- puts "[PindoContext] 缓存未启用,仅保存到内存" if verbose?
131
- end
132
- end
133
-
134
- # 获取用户选择(三级结构访问)
135
- def get_selection(key)
136
- # 使用统一的项目路径获取方法
137
- project_path = get_project_path
138
- root_command = @command_group || @current_command
139
-
140
- return nil unless project_path && root_command
141
-
142
- # 从三级结构中获取值(总是从内存获取,不管是否启用缓存)
143
- value = @memory_selections.dig(project_path, root_command, key)
144
-
145
- if value
146
- puts "[PindoContext] 从内存获取: [#{project_path}][#{root_command}][#{key}] = #{value.inspect}" if verbose?
147
- else
148
- puts "[PindoContext] 内存中未找到: [#{project_path}][#{root_command}][#{key}]" if verbose?
149
- end
150
-
151
- value
152
- end
153
-
154
- # 检查是否有缓存的选择
155
- def has_selection?(key)
156
- # 总是检查内存中是否有值,不管是否启用缓存
157
- !get_selection(key).nil?
158
- end
159
-
160
- # 启用/禁用缓存
161
- def enable_cache(enabled = true)
162
- @cache_enabled = enabled
163
- if enabled && !@file_cache_loaded && @current_command
164
- load_file_cache
165
- @file_cache_loaded = true
166
- end
167
- end
168
-
169
- # 检查缓存是否启用
170
- def cache_enabled?
171
- @cache_enabled
172
- end
173
-
174
- # 是否是嵌套调用
175
- def nested_call?
176
- !@current_command.nil?
177
- end
178
-
179
- # 是否是顶层命令(非嵌套)
180
- def top_level_command?
181
- @current_command.nil?
182
- end
183
-
184
- # 获取当前根命令
185
- def root_command
186
- @command_group || @current_command
187
- end
188
-
189
- # 获取当前项目路径(统一的获取方法,确保一致性)
190
- def project_path
191
- get_project_path
192
- end
193
-
194
- # 内部使用的项目路径获取方法
195
- # 优先使用已设置的目录,如果没有则尝试获取Git仓库根目录
196
- def get_project_path
197
- # 如果已经设置了目录,直接返回
198
- return @current_directory if @current_directory
199
-
200
- # 尝试获取Git仓库根目录
201
- begin
202
- git_root = `git rev-parse --show-toplevel 2>/dev/null`.strip
203
- return git_root if $?.success? && !git_root.empty?
204
- rescue
205
- # git命令失败
206
- end
207
-
208
- # 最后的后备:使用当前目录
209
- Dir.pwd
210
- end
211
-
212
- # 清除当前上下文的缓存
213
- def clear_current_cache
214
- return unless @cache_enabled
215
-
216
- proj_path = get_project_path
217
- cmd = root_command
218
- return unless proj_path && cmd
219
-
220
- if @memory_selections[proj_path] && @memory_selections[proj_path][cmd]
221
- @memory_selections[proj_path].delete(cmd)
222
- @memory_selections.delete(proj_path) if @memory_selections[proj_path].empty?
223
- save_file_cache
224
- puts "[PindoContext] 清除缓存: [#{proj_path}][#{cmd}]" if verbose?
225
- end
226
- end
227
-
228
- private
229
-
230
- # 递归将Hash的键从字符串转换为符号
231
- def symbolize_keys(obj)
232
- case obj
233
- when Hash
234
- obj.each_with_object({}) do |(key, value), result|
235
- result[key.to_sym] = symbolize_keys(value)
236
- end
237
- when Array
238
- obj.map { |item| symbolize_keys(item) }
239
- else
240
- obj
241
- end
242
- end
243
-
244
- # 确保缓存目录存在
245
- def ensure_cache_dir
246
- cache_dir = File.expand_path('~/.pindo/cache')
247
- FileUtils.mkdir_p(cache_dir) unless File.exist?(cache_dir)
248
- end
249
-
250
- # 获取缓存文件路径
251
- def cache_file_path
252
- cache_dir = File.expand_path('~/.pindo/cache')
253
- File.join(cache_dir, 'context_selections.json')
254
- end
255
-
256
- # 加载文件缓存(仅加载,不确认)
257
- def load_file_cache
258
- file_path = cache_file_path
259
-
260
- puts "[PindoContext] 检查文件缓存: #{file_path}" if verbose?
261
-
262
- unless File.exist?(file_path)
263
- puts "[PindoContext] 文件缓存不存在,跳过加载" if verbose?
264
- @loaded_file_cache = nil
265
- return
266
- end
267
-
268
- begin
269
- file_content = File.read(file_path)
270
- file_cache = JSON.parse(file_content)
271
-
272
- # 清理过期缓存(超过7天)
273
- file_cache = clean_expired_cache(file_cache)
274
-
275
- # 保存加载的缓存数据,但不应用到内存
276
- @loaded_file_cache = file_cache
277
-
278
- # 加载其他项目/命令的缓存到内存(不需要确认的部分)
279
- project_path = get_project_path
280
- root_command = @command_group || @current_command
281
-
282
- file_cache.each do |proj_path, commands|
283
- @memory_selections[proj_path] ||= {}
284
- commands.each do |cmd, selections|
285
- # 跳过当前上下文(需要确认)
286
- next if proj_path == project_path && cmd == root_command
287
-
288
- @memory_selections[proj_path][cmd] ||= {}
289
- selections.each do |key, value|
290
- symbol_key = key.to_sym
291
- @memory_selections[proj_path][cmd][symbol_key] = symbolize_keys(value)
292
- end
293
- end
294
- end
295
-
296
- puts "[PindoContext] 已加载文件缓存到临时存储" if verbose?
297
- rescue => e
298
- puts "[PindoContext] 加载缓存失败: #{e.message}" if verbose?
299
- @loaded_file_cache = nil
300
- end
301
- end
302
-
303
- # 保存文件缓存(三级结构)
304
- def save_file_cache
305
- file_path = cache_file_path
306
-
307
- begin
308
- # 转换内存缓存为可序列化的格式(保持三级结构)
309
- file_cache = {}
310
- @memory_selections.each do |project_path, commands|
311
- file_cache[project_path] ||= {}
312
- commands.each do |command, selections|
313
- file_cache[project_path][command] ||= {}
314
- selections.each do |key, value|
315
- # 跳过 nil 值,不保存到文件
316
- next if value.nil?
317
- # 将符号键转换为字符串
318
- string_key = key.to_s
319
- file_cache[project_path][command][string_key] = value
320
- end
321
- end
322
- end
323
-
324
- # 写入文件
325
- File.write(file_path, JSON.pretty_generate(file_cache))
326
-
327
- puts "[PindoContext] 保存文件缓存: #{file_path}" if verbose?
328
- rescue => e
329
- puts "[PindoContext] 保存缓存失败: #{e.message}" if verbose?
330
- end
331
- end
332
-
333
- # 获取命令组名称(统一管理命令缓存组)
334
- def get_command_group(command)
335
- # 根据需求文档定义命令组,相关命令共享同一缓存
336
- case command
337
- # iOS 构建相关命令组
338
- when 'unity:ipa'
339
- 'ios:autobuild'
340
-
341
- # Android 构建相关命令组
342
- when 'unity:apk'
343
- 'and:autobuild'
344
-
345
- # Web 构建相关命令组
346
- when 'unity:web'
347
- 'web:autobuild'
348
-
349
- else
350
- command # 其他命令使用独立缓存(命令名本身作为组)
351
- end
352
- end
353
-
354
- # 清理过期缓存(超过7天的缓存)
355
- def clean_expired_cache(cache_data)
356
- return {} unless cache_data.is_a?(Hash)
357
-
358
- current_time = Time.now.to_i
359
- seven_days_in_seconds = 7 * 24 * 60 * 60
360
- cleaned_cache = {}
361
- expired_commands = []
362
- expired_projects = []
363
-
364
- cache_data.each do |project_path, commands|
365
- # 初始化项目路径
366
- cleaned_commands = {}
367
-
368
- commands.each do |command, selections|
369
- # 获取最后修改时间
370
- last_modified = selections['__last_modified__']
371
-
372
- # 如果没有时间戳,视为过期
373
- if last_modified.nil?
374
- expired_commands << "[#{project_path}][#{command}] (无时间戳)"
375
- puts "[PindoContext] 清理无时间戳缓存: [#{project_path}][#{command}]" if verbose?
376
- next
377
- end
378
-
379
- # 检查是否过期(超过7天)
380
- if (current_time - last_modified.to_i) > seven_days_in_seconds
381
- days_old = (current_time - last_modified.to_i) / (24 * 60 * 60)
382
- expired_commands << "[#{project_path}][#{command}] (#{days_old}天前)"
383
- puts "[PindoContext] 清理过期缓存 (#{days_old}天前): [#{project_path}][#{command}]" if verbose?
384
- next
385
- end
386
-
387
- # 保留未过期的缓存
388
- cleaned_commands[command] = selections
389
- end
390
-
391
- # 如果该项目路径下还有有效的命令缓存,保留它
392
- if cleaned_commands.any?
393
- cleaned_cache[project_path] = cleaned_commands
394
- else
395
- # 整个项目路径下的所有命令都过期了,删除整个项目路径
396
- expired_projects << project_path
397
- puts "[PindoContext] 删除空项目路径: #{project_path}" if verbose?
398
- end
399
- end
400
-
401
- # 输出清理总结
402
- if expired_commands.any? || expired_projects.any?
403
- puts "[PindoContext] 缓存清理完成:"
404
- if expired_commands.any?
405
- puts " - 清理了 #{expired_commands.size} 个过期命令缓存"
406
- expired_commands.each { |cmd| puts " • #{cmd}" } if verbose?
407
- end
408
- if expired_projects.any?
409
- puts " - 删除了 #{expired_projects.size} 个空项目路径"
410
- expired_projects.each { |proj| puts " • #{proj}" } if verbose?
411
- end
412
-
413
- # 立即保存清理后的缓存到文件
414
- File.write(cache_file_path, JSON.pretty_generate(cleaned_cache))
415
- end
416
-
417
- cleaned_cache
418
- end
419
-
420
-
421
- public
422
-
423
- # 加载 JPSBuildConfig.json 并覆盖项目名称(如果存在)
424
- # 应在 confirm_and_apply_cache 之前调用
425
- def load_and_apply_jps_config(project_dir = nil)
426
- project_dir ||= get_project_path
427
-
428
- # 判断工程类型并确定配置文件路径
429
- # Unity 工程:ProjectSettings/JPSBuildConfig.json
430
- # iOS/Android 工程:JPSBuildConfig.json
431
- config_file = nil
432
- project_type = nil
433
-
434
- # 检查是否是 Unity 工程(存在 ProjectSettings 目录)
435
- if File.directory?(File.join(project_dir, 'ProjectSettings'))
436
- config_file = File.join(project_dir, 'ProjectSettings', 'JPSBuildConfig.json')
437
- project_type = 'Unity'
438
- else
439
- # iOS/Android 工程,直接在根目录
440
- config_file = File.join(project_dir, 'JPSBuildConfig.json')
441
- project_type = 'iOS/Android'
442
- end
443
-
444
- unless File.exist?(config_file)
445
- puts "[PindoContext] JPSBuildConfig.json 不存在 (#{project_type} 工程),跳过" if verbose?
446
- return nil
447
- end
448
-
449
- begin
450
- config_content = File.read(config_file)
451
- jps_config = JSON.parse(config_content)
452
-
453
- if jps_config['project_name'] && !jps_config['project_name'].empty?
454
- project_name = jps_config['project_name']
455
- puts "[PindoContext] 从 JPSBuildConfig.json 加载项目名称 (#{project_type}): #{project_name}" if verbose?
456
-
457
- # 设置到当前上下文的缓存中
458
- set_selection(SelectionKey::PROJECT_NAME, project_name)
459
-
460
- puts "使用 JPS 配置的项目名称: #{project_name}"
461
- return project_name
462
- end
463
- rescue => e
464
- puts "[PindoContext] 加载 JPSBuildConfig.json 失败: #{e.message}" if verbose?
465
- end
466
-
467
- nil
468
- end
469
-
470
- # 确认并应用缓存(供命令在 run 函数中调用)
471
- # 返回值:true 表示使用缓存,false 表示不使用缓存
472
- def confirm_and_apply_cache
473
- return false unless @cache_enabled
474
- return false unless @loaded_file_cache
475
-
476
- # 如果已经确认过缓存,直接返回(避免嵌套调用时重复询问)
477
- if @cache_confirmed
478
- puts "[PindoContext] 缓存已确认,跳过重复询问" if verbose?
479
- # 检查内存中是否已有缓存数据
480
- project_path = get_project_path
481
- root_command = @command_group || @current_command
482
- return @memory_selections.dig(project_path, root_command) != nil
483
- end
484
-
485
- project_path = get_project_path
486
- root_command = @command_group || @current_command
487
-
488
- return false unless project_path && root_command
489
-
490
- # 检查三级结构中是否有当前上下文的缓存
491
- cached_selections = @loaded_file_cache.dig(project_path, root_command)
492
-
493
- unless cached_selections && !cached_selections.empty?
494
- puts "[PindoContext] 当前上下文没有缓存数据" if verbose?
495
- return false
496
- end
497
-
498
- # 根据命令组显示更友好的描述
499
- group_desc = case root_command
500
- when 'ios:autobuild'
501
- 'iOS 构建'
502
- when 'and:autobuild', 'android:autobuild'
503
- 'Android 构建'
504
- when 'web:autobuild'
505
- 'Web 构建'
506
- else
507
- @current_command # 其他命令显示原始命令名
508
- end
509
-
510
- puts "\n检测到之前的选择 (#{group_desc}):"
511
- puts "────────────────────────────────────────"
512
-
513
- cached_selections.each do |key, value|
514
- # 跳过内部字段和 nil 值
515
- next if key.to_s.start_with?('__')
516
- next if value.nil?
517
-
518
- case key.to_s
519
- when 'bundle_id'
520
- puts " Bundle ID: #{value}"
521
- when 'android_bundle_name'
522
- puts " Bundle Name: #{value}"
523
- when 'project_name', 'app_key' # 兼容旧的 app_key
524
- puts " 项目名称: #{value}"
525
- when 'tag_decision'
526
- if value.is_a?(Hash)
527
- action_desc = value['description'] || value['action']
528
- puts " Tag决定: #{action_desc}"
529
- end
530
- when 'cert_type'
531
- puts " 证书类型: #{value}"
532
- end
533
- end
534
- puts "────────────────────────────────────────"
535
-
536
- # 检查是否设置了强制编译环境变量
537
- force_build = ENV['PINDO_FORCE_BUILD']
538
-
539
- confirm = false
540
- if force_build && !force_build.empty?
541
- # 环境变量存在,自动使用缓存
542
- puts "\n检测到 PINDO_FORCE_BUILD 环境变量,自动使用缓存的选择"
543
- confirm = true
544
- else
545
- # 询问用户是否使用缓存
546
- require 'highline/import'
547
- cli = HighLine.new
548
- confirm = cli.agree("\n是否使用以上缓存的选择? (y/n) ")
549
- end
550
-
551
- if confirm
552
- puts "使用缓存的选择\n" unless force_build
553
- # 恢复当前上下文的文件缓存到内存缓存
554
- @memory_selections[project_path] ||= {}
555
- @memory_selections[project_path][root_command] ||= {}
556
- cached_selections.each do |key, value|
557
- symbol_key = key.to_sym
558
- @memory_selections[project_path][root_command][symbol_key] = symbolize_keys(value)
559
- end
560
- # 标记缓存已确认,避免嵌套调用时重复询问
561
- @cache_confirmed = true
562
- return true
563
- else
564
- puts "清除缓存,重新选择\n"
565
- # 清除当前上下文的文件缓存(三级结构)
566
- file_path = cache_file_path
567
- if @loaded_file_cache[project_path] && @loaded_file_cache[project_path][root_command]
568
- @loaded_file_cache[project_path].delete(root_command)
569
- # 如果项目路径下没有任何命令缓存了,删除项目路径键
570
- @loaded_file_cache.delete(project_path) if @loaded_file_cache[project_path].empty?
571
- # 保存清理后的缓存到文件
572
- save_file_cache
573
- end
574
- # 标记缓存已确认(用户选择不使用)
575
- @cache_confirmed = true
576
- return false
577
- end
578
- end
579
-
580
- # 调试信息
581
- def debug_info
582
- puts "\n=== PindoContext Debug Info ==="
583
- puts "当前命令: #{@current_command || '无'}"
584
- puts "命令组: #{@command_group || '无'}"
585
- puts "设置的目录: #{@current_directory || '未设置'}"
586
- puts "实际项目路径: #{get_project_path}"
587
- puts "缓存启用: #{@cache_enabled}"
588
-
589
- proj_path = get_project_path
590
- root_cmd = @command_group || @current_command
591
-
592
- if root_cmd && @memory_selections.dig(proj_path, root_cmd)
593
- puts "当前缓存的选择:"
594
- @memory_selections[proj_path][root_cmd].each do |k, v|
595
- next if k.to_s.start_with?('__') # 跳过内部字段
596
- puts " #{k}: #{v.inspect}"
597
- end
598
- end
599
- puts "================================\n"
600
- end
601
- end
602
- end