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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd43527c8c17eb024c8a5954a09dcec961cb9888e94311a3e88ede69ac11d1d1
4
- data.tar.gz: 850a430465fb9b7b8c801c30f2f8c2684a738fe63a078adf7f1c067619a7e324
3
+ metadata.gz: 497b5a13a5d90bf725ce1fbdac76ec095a49dcf200783d0ce5d58949255e6a44
4
+ data.tar.gz: 9d0cab4c002042fbac5f6d35d055f326f9c2cfd79713eb9112ac18c92ff5f7dd
5
5
  SHA512:
6
- metadata.gz: 2cc3f43c90b1ecec85020ba6e9d52a0c4b67978c054b5139cb263e4640e4e19ade1e523c9c799d502f52b3f0f9bd9f7cfd7ff20488ef40fb3934af64a0208c29
7
- data.tar.gz: 911a6c7c912e5e077ed00eae5dc9a2f9c0935b080362d2f841d22dfba6b2f8975e75338ec423f0ea05d1965472e5d1866928199b75d8586a4b9507d06741020f
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
- * 自动关联到指定的commit记录
20
+ * 自动关联到当前 HEAD commit 记录
23
21
  * 支持追加模式(保留已有附件)
24
- * 自动模式:从项目 JPSMedia/ 目录查找文件
22
+ * 自动模式:从项目 JPSMedia/ 目录查找 3 小时内的文件
25
23
 
26
24
  使用示例:
27
25
 
28
- $ pindo jps media # 自动模式:使用 HEAD commit,从 JPSMedia/ 查找文件
26
+ $ pindo jps media # 自动模式:从 JPSMedia/ 查找文件
29
27
 
30
- $ pindo jps media path/to/1.png path/to/2.mov # 自动模式:使用 HEAD commit,上传指定文件
28
+ $ pindo jps media path/to/1.png path/to/2.mov # 上传指定文件
31
29
 
32
- $ pindo jps media --commit_id=9e959ffd # 指定 git commit id
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
- @args_commit_id = argv.option('commit_id')
61
- @args_workflow_id = argv.option('workflow_id')
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
- # 转换 workflow_id 为整数
66
- if @args_workflow_id
67
- @args_workflow_id = @args_workflow_id.to_i
68
- end
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
- expanded_files = expand_file_paths(@file_paths)
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
- # 设置 PgyerHelper 登录选项
85
- PgyerHelper.share_instace.setForeLogin(beforeLogin: @args_login_flag)
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
- expanded_files,
94
- git_commit_id: @args_commit_id,
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
- nuget_project = projects.find { |p| p['projectName']&.downcase == 'nuget' || p['projectName']&.downcase == 'nuget 库' }
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 "❌ 未找到名为 'nuget' 的项目"
252
+ puts "❌ 未找到名为 '#{project_name}' 的项目"
229
253
  puts
230
- raise Informative, "JPS 管理员添加Nuget项目权限, 然后登录JPS系统查看是否有Nuget项目的编辑权限"
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. 如果 file_paths 为空,自动查找 JPSMedia 目录
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
@@ -6,7 +6,7 @@ require 'time'
6
6
 
7
7
  module Pindo
8
8
 
9
- VERSION = "5.13.11"
9
+ VERSION = "5.13.12"
10
10
 
11
11
  class VersionCheck
12
12
  RUBYGEMS_API = 'https://rubygems.org/api/v1/gems/pindo.json'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pindo
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.13.11
4
+ version: 5.13.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - wade