pindo 5.13.9 → 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.
- checksums.yaml +4 -4
- data/lib/pindo/base/git_handler.rb +247 -42
- data/lib/pindo/command/android/autobuild.rb +72 -30
- data/lib/pindo/command/android/autoresign.rb +23 -322
- data/lib/pindo/command/android/keystore.rb +7 -130
- data/lib/pindo/command/appstore/adhocbuild.rb +5 -14
- data/lib/pindo/command/appstore/autobuild.rb +64 -14
- data/lib/pindo/command/appstore/autoresign.rb +1 -3
- data/lib/pindo/command/ios/autobuild.rb +71 -53
- data/lib/pindo/command/ios/build.rb +8 -186
- data/lib/pindo/command/jps/media.rb +146 -0
- data/lib/pindo/command/jps/upload.rb +48 -20
- data/lib/pindo/command/jps.rb +1 -0
- data/lib/pindo/command/unity/autobuild.rb +99 -27
- data/lib/pindo/command/unity/packpush.rb +5 -8
- data/lib/pindo/command/utils/repoinit.rb +0 -2
- data/lib/pindo/command/utils/tag.rb +58 -26
- data/lib/pindo/command/utils.rb +0 -1
- data/lib/pindo/command/web/autobuild.rb +71 -37
- data/lib/pindo/command.rb +0 -56
- data/lib/pindo/config/build_info_manager.rb +7 -8
- data/lib/pindo/module/android/android_config_helper.rb +2 -11
- data/lib/pindo/module/appselect.rb +15 -41
- data/lib/pindo/module/appstore/itcapp_helper.rb +3 -6
- data/lib/pindo/module/build/build_helper.rb +28 -18
- data/lib/pindo/module/build/git_repo_helper.rb +284 -405
- data/lib/pindo/module/cert/pem_helper.rb +3 -6
- data/lib/pindo/module/pgyer/pgyerhelper.rb +193 -25
- data/lib/pindo/module/task/model/appstore/appstore_task.rb +5 -0
- data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +13 -187
- data/lib/pindo/module/task/model/build/android_build_dev_task.rb +36 -34
- data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +13 -187
- data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +9 -6
- data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +9 -6
- data/lib/pindo/module/task/model/build/ios_build_dev_task.rb +37 -32
- data/lib/pindo/module/task/model/build/web_build_dev_task.rb +7 -5
- data/lib/pindo/module/task/model/build_task.rb +8 -11
- data/lib/pindo/module/task/model/git/git_commit_task.rb +118 -0
- data/lib/pindo/module/task/model/git/git_tag_task.rb +125 -0
- data/lib/pindo/module/task/model/git_task.rb +75 -0
- data/lib/pindo/module/task/model/jps/jps_message_task.rb +178 -0
- data/lib/pindo/module/task/model/{resign → jps}/jps_resign_task.rb +13 -22
- data/lib/pindo/module/task/model/jps/jps_upload_media_task.rb +248 -0
- data/lib/pindo/module/task/model/jps/jps_upload_task.rb +38 -93
- data/lib/pindo/module/task/model/jps_task.rb +43 -0
- data/lib/pindo/module/task/model/resign/ipa_local_resign_task.rb +5 -0
- data/lib/pindo/module/task/model/unity/unity_config_task.rb +0 -4
- data/lib/pindo/module/task/model/unity/unity_export_task.rb +8 -7
- data/lib/pindo/module/task/model/unity/unity_update_task.rb +4 -3
- data/lib/pindo/module/task/model/unity/unity_yoo_asset_task.rb +8 -7
- data/lib/pindo/module/task/model/unity_task.rb +7 -2
- data/lib/pindo/module/task/pindo_task.rb +101 -1
- data/lib/pindo/module/task/task_manager.rb +29 -32
- data/lib/pindo/module/unity/nuget_helper.rb +7 -7
- data/lib/pindo/options/core/global_options_state.rb +96 -26
- data/lib/pindo/options/core/option_configuration.rb +3 -0
- data/lib/pindo/options/core/option_item.rb +36 -0
- data/lib/pindo/options/groups/build_options.rb +23 -6
- data/lib/pindo/options/groups/git_options.rb +115 -0
- data/lib/pindo/options/groups/jps_options.rb +7 -0
- data/lib/pindo/options/groups/option_group.rb +15 -0
- data/lib/pindo/options/groups/unity_options.rb +49 -0
- data/lib/pindo/options/options.rb +2 -0
- data/lib/pindo/version.rb +2 -2
- metadata +15 -11
- data/lib/pindo/base/githelper.rb +0 -686
- data/lib/pindo/base/pindocontext.rb +0 -602
- data/lib/pindo/command/utils/feishu.rb +0 -134
- data/lib/pindo/module/build/version_helper.rb +0 -146
- 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
|