pindo 5.13.11 → 5.13.12
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/command/jps/media.rb +40 -64
- data/lib/pindo/command/unity/packpush.rb +27 -3
- data/lib/pindo/module/task/model/jps/jps_upload_media_task.rb +100 -1
- data/lib/pindo/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 497b5a13a5d90bf725ce1fbdac76ec095a49dcf200783d0ce5d58949255e6a44
|
|
4
|
+
data.tar.gz: 9d0cab4c002042fbac5f6d35d055f326f9c2cfd79713eb9112ac18c92ff5f7dd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a21ddb1cacb9302d007ee9fd68325e3c5cf5210fc39bb182d8d807b2929a7eb0ba659c7d850a59879b523116ada91da9c640c2837eac73203f9808873f57fd53
|
|
7
|
+
data.tar.gz: 944d1f52b0366dcb6c0b333ed0d7c08db1ad2bf4203aaf449492fa911f7a65be9b2c467f37472684049b645fd215da4b2f788c70e4cbfb7b9ed2790df7101e86
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
require 'highline/import'
|
|
2
|
-
require 'fileutils'
|
|
3
|
-
require 'json'
|
|
4
1
|
require 'pindo/module/pgyer/pgyerhelper'
|
|
5
2
|
require 'pindo/module/task/task_manager'
|
|
6
3
|
require 'pindo/module/task/model/jps/jps_upload_media_task'
|
|
4
|
+
require 'pindo/options/options'
|
|
7
5
|
|
|
8
6
|
module Pindo
|
|
9
7
|
class Command
|
|
@@ -19,21 +17,17 @@ module Pindo
|
|
|
19
17
|
|
|
20
18
|
* 上传多个media文件(图片、视频等)
|
|
21
19
|
* 并发上传,支持重试
|
|
22
|
-
*
|
|
20
|
+
* 自动关联到当前 HEAD commit 记录
|
|
23
21
|
* 支持追加模式(保留已有附件)
|
|
24
|
-
* 自动模式:从项目 JPSMedia/
|
|
22
|
+
* 自动模式:从项目 JPSMedia/ 目录查找 3 小时内的文件
|
|
25
23
|
|
|
26
24
|
使用示例:
|
|
27
25
|
|
|
28
|
-
$ pindo jps media #
|
|
26
|
+
$ pindo jps media # 自动模式:从 JPSMedia/ 查找文件
|
|
29
27
|
|
|
30
|
-
$ pindo jps media path/to/1.png path/to/2.mov #
|
|
28
|
+
$ pindo jps media path/to/1.png path/to/2.mov # 上传指定文件
|
|
31
29
|
|
|
32
|
-
$ pindo jps media --
|
|
33
|
-
|
|
34
|
-
$ pindo jps media --workflow_id=2720 # 指定工作流ID
|
|
35
|
-
|
|
36
|
-
$ pindo jps media --proj=demo *.png # 指定项目
|
|
30
|
+
$ pindo jps media --proj=demo # 指定项目
|
|
37
31
|
|
|
38
32
|
DESC
|
|
39
33
|
|
|
@@ -41,13 +35,16 @@ module Pindo
|
|
|
41
35
|
CLAide::Argument.new('files...', false),
|
|
42
36
|
]
|
|
43
37
|
|
|
38
|
+
# 定义此命令使用的参数项
|
|
39
|
+
def self.option_items
|
|
40
|
+
@option_items ||= Pindo::Options::OptionGroup.merge(
|
|
41
|
+
Pindo::Options::JPSOptions.only(:proj),
|
|
42
|
+
Pindo::Options::GitOptions.all
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
|
|
44
46
|
def self.options
|
|
45
|
-
|
|
46
|
-
['--commit_id', '指定 git commit id(默认使用 HEAD)'],
|
|
47
|
-
['--workflow_id', '指定工作流ID(用于查找 commit_log)'],
|
|
48
|
-
['--proj', '指定项目代号名称'],
|
|
49
|
-
['--login', '强制再次登录jps网站'],
|
|
50
|
-
].concat(super)
|
|
47
|
+
option_items.map(&:to_claide_option).concat(super)
|
|
51
48
|
end
|
|
52
49
|
|
|
53
50
|
def initialize(argv)
|
|
@@ -57,43 +54,51 @@ module Pindo
|
|
|
57
54
|
@file_paths << arg.strip.gsub(/\"/, '')
|
|
58
55
|
end
|
|
59
56
|
|
|
60
|
-
|
|
61
|
-
@
|
|
62
|
-
@args_proj_name = argv.option('proj')
|
|
63
|
-
@args_login_flag = argv.flag?('login', false)
|
|
57
|
+
# 使用 Options 系统解析参数
|
|
58
|
+
@options = initialize_options(argv)
|
|
64
59
|
|
|
65
|
-
#
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
60
|
+
# JPS 参数
|
|
61
|
+
@args_proj_name = @options[:proj]
|
|
62
|
+
|
|
63
|
+
# Git 参数
|
|
64
|
+
@args_release_branch = @options[:release_branch] || 'master'
|
|
65
|
+
@args_ver_inc = Pindo::Options::GitOptions.parse_version_increase_type(@options[:ver_inc] || 'mini')
|
|
66
|
+
@args_tag_type = Pindo::Options::GitOptions.parse_create_tag_type(@options[:tag_type] || 'new')
|
|
67
|
+
@args_tag_pre = @options[:tag_pre] || 'v'
|
|
69
68
|
|
|
70
69
|
super(argv)
|
|
71
70
|
end
|
|
72
71
|
|
|
73
72
|
def validate!
|
|
74
73
|
super
|
|
75
|
-
# 不再强制要求参数,Task 会自动从 git 获取
|
|
76
74
|
end
|
|
77
75
|
|
|
78
76
|
def run
|
|
79
77
|
project_path = Dir.pwd
|
|
80
78
|
|
|
81
|
-
#
|
|
82
|
-
|
|
79
|
+
# 获取 JPS 配置(app_info_obj 和 workflow_info)
|
|
80
|
+
app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
|
|
81
|
+
working_directory: project_path,
|
|
82
|
+
proj_name: @args_proj_name,
|
|
83
|
+
package_type: 'ipa' # 任意类型,只是为了获取 workflow_id
|
|
84
|
+
)
|
|
83
85
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
+
if app_info_obj.nil?
|
|
87
|
+
raise Informative, "#{@args_proj_name} 错误,请输入正确的App代号名称"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# 获取 workflow_id
|
|
91
|
+
workflow_id = workflow_info&.dig('id')
|
|
86
92
|
|
|
87
93
|
# 创建并执行任务
|
|
88
94
|
# 所有逻辑都在 Task 中处理:
|
|
89
95
|
# - 自动查找 git 仓库和 HEAD 信息
|
|
96
|
+
# - 展开文件路径(通配符、目录)
|
|
90
97
|
# - 自动查找 JPSMedia/ 目录
|
|
91
98
|
# - 匹配 git_commit_id 到 JPS commit_log
|
|
92
99
|
task = Pindo::TaskSystem::JPSUploadMediaTask.new(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
workflow_id: @args_workflow_id,
|
|
96
|
-
project_name: @args_proj_name,
|
|
100
|
+
@file_paths,
|
|
101
|
+
workflow_id: workflow_id,
|
|
97
102
|
project_path: project_path
|
|
98
103
|
)
|
|
99
104
|
|
|
@@ -111,35 +116,6 @@ module Pindo
|
|
|
111
116
|
end
|
|
112
117
|
end
|
|
113
118
|
|
|
114
|
-
private
|
|
115
|
-
|
|
116
|
-
# 展开文件路径(支持通配符和目录)
|
|
117
|
-
def expand_file_paths(paths)
|
|
118
|
-
return [] if paths.nil? || paths.empty?
|
|
119
|
-
|
|
120
|
-
expanded = []
|
|
121
|
-
media_extensions = %w[png jpg jpeg gif bmp webp mp4 mov avi mkv webm]
|
|
122
|
-
|
|
123
|
-
paths.each do |path|
|
|
124
|
-
if path.include?('*')
|
|
125
|
-
# 通配符展开
|
|
126
|
-
expanded.concat(Dir.glob(path))
|
|
127
|
-
elsif File.directory?(path)
|
|
128
|
-
# 目录:查找所有图片和视频文件
|
|
129
|
-
pattern = File.join(path, "**", "*.{#{media_extensions.join(',')}}")
|
|
130
|
-
expanded.concat(Dir.glob(pattern))
|
|
131
|
-
elsif File.exist?(path)
|
|
132
|
-
# 单个文件
|
|
133
|
-
expanded << path
|
|
134
|
-
else
|
|
135
|
-
Funlog.instance.warning("文件不存在: #{path}")
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
# 去重并过滤有效文件
|
|
140
|
-
expanded.uniq.select { |f| File.file?(f) }
|
|
141
|
-
end
|
|
142
|
-
|
|
143
119
|
end
|
|
144
120
|
end
|
|
145
121
|
end
|
|
@@ -221,13 +221,37 @@ module Pindo
|
|
|
221
221
|
raise Informative, "JPS 中没有任何项目,请联系管理员创建"
|
|
222
222
|
end
|
|
223
223
|
|
|
224
|
-
|
|
224
|
+
# 优先通过固定 ID 查找 Nuget 组件库项目
|
|
225
|
+
target_project_id = '5e6b36f61b614ed88086373ef874616c'
|
|
226
|
+
nuget_project = projects.find { |p| p['id'] == target_project_id }
|
|
227
|
+
|
|
228
|
+
if nuget_project
|
|
229
|
+
puts "✅ 找到 Nuget 组件库项目: #{nuget_project['projectName']} (ID: #{nuget_project['id']})"
|
|
230
|
+
return nuget_project
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# 如果没找到固定 ID,让用户输入项目名称
|
|
234
|
+
puts
|
|
235
|
+
puts "⚠️ 未找到默认 Nuget 组件库项目 (ID: #{target_project_id})"
|
|
236
|
+
puts
|
|
237
|
+
|
|
238
|
+
project_name = ask('请输入 Nuget组件的项目名称:') || ''
|
|
239
|
+
project_name = project_name.strip
|
|
240
|
+
|
|
241
|
+
if project_name.empty?
|
|
242
|
+
raise Informative, "项目名称不能为空"
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
# 根据用户输入的名称匹配项目(去掉空格后比较)
|
|
246
|
+
nuget_project = projects.find do |p|
|
|
247
|
+
p['projectName']&.gsub(/\s+/, '')&.downcase == project_name.gsub(/\s+/, '').downcase
|
|
248
|
+
end
|
|
225
249
|
|
|
226
250
|
if nuget_project.nil?
|
|
227
251
|
puts
|
|
228
|
-
puts "❌ 未找到名为 '
|
|
252
|
+
puts "❌ 未找到名为 '#{project_name}' 的项目"
|
|
229
253
|
puts
|
|
230
|
-
raise Informative, "
|
|
254
|
+
raise Informative, "请确认项目名称是否正确,或联系 JPS 管理员添加项目权限"
|
|
231
255
|
end
|
|
232
256
|
|
|
233
257
|
puts "✅ 找到项目: #{nuget_project['projectName']} (ID: #{nuget_project['id']})"
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
require 'fileutils'
|
|
1
2
|
require 'pindo/module/task/model/jps_task'
|
|
2
3
|
require 'pindo/module/task/task_config'
|
|
3
4
|
require 'pindo/module/pgyer/pgyerhelper'
|
|
@@ -114,9 +115,13 @@ module Pindo
|
|
|
114
115
|
puts " " + "=" * 28
|
|
115
116
|
puts
|
|
116
117
|
|
|
117
|
-
# 4.
|
|
118
|
+
# 4. 处理文件路径
|
|
118
119
|
if @file_paths.nil? || @file_paths.empty?
|
|
120
|
+
# 自动模式:从 JPSMedia 目录查找
|
|
119
121
|
@file_paths = find_media_files(git_root)
|
|
122
|
+
else
|
|
123
|
+
# 指定模式:展开文件路径(通配符、目录)
|
|
124
|
+
@file_paths = expand_file_paths(@file_paths)
|
|
120
125
|
end
|
|
121
126
|
|
|
122
127
|
# 过滤存在的文件
|
|
@@ -222,6 +227,100 @@ module Pindo
|
|
|
222
227
|
result
|
|
223
228
|
end
|
|
224
229
|
|
|
230
|
+
# 展开文件路径(支持通配符和目录)
|
|
231
|
+
# 只查找创建时间或更新时间在 3 小时以内的文件
|
|
232
|
+
# 超过时间的文件自动移动到 Backup_日期 子目录
|
|
233
|
+
# @param paths [Array<String>] 原始路径列表
|
|
234
|
+
# @return [Array<String>] 展开后的文件路径列表
|
|
235
|
+
def expand_file_paths(paths)
|
|
236
|
+
return [] if paths.nil? || paths.empty?
|
|
237
|
+
|
|
238
|
+
expanded = []
|
|
239
|
+
time_threshold = Time.now - (3 * 60 * 60) # 3 小时前
|
|
240
|
+
|
|
241
|
+
paths.each do |path|
|
|
242
|
+
if path.include?('*')
|
|
243
|
+
# 通配符展开
|
|
244
|
+
expanded.concat(Dir.glob(path))
|
|
245
|
+
elsif File.directory?(path)
|
|
246
|
+
# 目录:查找所有媒体文件
|
|
247
|
+
pattern = File.join(path, "**", "*.{#{MEDIA_EXTENSIONS.join(',')}}")
|
|
248
|
+
expanded.concat(Dir.glob(pattern, File::FNM_CASEFOLD))
|
|
249
|
+
elsif File.exist?(path)
|
|
250
|
+
# 单个文件
|
|
251
|
+
expanded << path
|
|
252
|
+
else
|
|
253
|
+
Funlog.instance.warning("文件不存在: #{path}")
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
# 去重并过滤有效文件
|
|
258
|
+
valid_files = expanded.uniq.select { |f| File.file?(f) }
|
|
259
|
+
|
|
260
|
+
# 分离:3 小时以内的文件 和 超时的文件
|
|
261
|
+
recent_files = []
|
|
262
|
+
expired_files = []
|
|
263
|
+
|
|
264
|
+
valid_files.each do |f|
|
|
265
|
+
mtime = File.mtime(f)
|
|
266
|
+
ctime = File.ctime(f)
|
|
267
|
+
# 取创建时间和更新时间中较新的一个
|
|
268
|
+
latest_time = [mtime, ctime].max
|
|
269
|
+
|
|
270
|
+
if latest_time >= time_threshold
|
|
271
|
+
recent_files << f
|
|
272
|
+
else
|
|
273
|
+
expired_files << f
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# 移动超时文件到备份目录
|
|
278
|
+
if expired_files.any?
|
|
279
|
+
move_expired_files_to_backup(expired_files)
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
recent_files
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
# 将超时文件移动到备份目录
|
|
286
|
+
# @param files [Array<String>] 要移动的文件列表
|
|
287
|
+
def move_expired_files_to_backup(files)
|
|
288
|
+
return if files.empty?
|
|
289
|
+
|
|
290
|
+
# 备份目录名:Backup_YYYY-MM-DD
|
|
291
|
+
backup_dir_name = "Backup_#{Time.now.strftime('%Y-%m-%d')}"
|
|
292
|
+
|
|
293
|
+
puts " 移动 #{files.size} 个超过 3 小时的文件到备份目录..."
|
|
294
|
+
|
|
295
|
+
files.each do |file_path|
|
|
296
|
+
begin
|
|
297
|
+
# 在文件所在目录下创建备份子目录
|
|
298
|
+
parent_dir = File.dirname(file_path)
|
|
299
|
+
backup_dir = File.join(parent_dir, backup_dir_name)
|
|
300
|
+
|
|
301
|
+
# 创建备份目录
|
|
302
|
+
FileUtils.mkdir_p(backup_dir) unless Dir.exist?(backup_dir)
|
|
303
|
+
|
|
304
|
+
# 移动文件
|
|
305
|
+
file_name = File.basename(file_path)
|
|
306
|
+
dest_path = File.join(backup_dir, file_name)
|
|
307
|
+
|
|
308
|
+
# 如果目标文件已存在,添加时间戳避免覆盖
|
|
309
|
+
if File.exist?(dest_path)
|
|
310
|
+
ext = File.extname(file_name)
|
|
311
|
+
base = File.basename(file_name, ext)
|
|
312
|
+
timestamp = Time.now.strftime('%H%M%S')
|
|
313
|
+
dest_path = File.join(backup_dir, "#{base}_#{timestamp}#{ext}")
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
FileUtils.mv(file_path, dest_path)
|
|
317
|
+
puts " 已移动: #{file_name}"
|
|
318
|
+
rescue => e
|
|
319
|
+
Funlog.instance.warning("移动文件失败: #{file_path} - #{e.message}")
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
|
|
225
324
|
# 在 JPSMedia 目录下查找 media 文件
|
|
226
325
|
# @param git_root [String] git 仓库根目录
|
|
227
326
|
# @return [Array<String>] 找到的文件路径列表
|
data/lib/pindo/version.rb
CHANGED