pindo 5.14.8 → 5.15.1

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/aeshelper.rb +53 -22
  3. data/lib/pindo/base/git_handler.rb +243 -22
  4. data/lib/pindo/client/giteeclient.rb +15 -6
  5. data/lib/pindo/command/android/autobuild.rb +7 -5
  6. data/lib/pindo/command/appstore/autobuild.rb +5 -2
  7. data/lib/pindo/command/appstore/cert.rb +6 -0
  8. data/lib/pindo/command/ios/autobuild.rb +31 -21
  9. data/lib/pindo/command/ios/cert.rb +1 -1
  10. data/lib/pindo/command/jps/apptest.rb +1 -1
  11. data/lib/pindo/command/jps/bind.rb +6 -2
  12. data/lib/pindo/command/jps/media.rb +6 -2
  13. data/lib/pindo/command/jps/upload.rb +6 -4
  14. data/lib/pindo/command/repo/clone.rb +110 -32
  15. data/lib/pindo/command/repo/subgit.rb +91 -0
  16. data/lib/pindo/command/repo.rb +1 -0
  17. data/lib/pindo/command/unity/autobuild.rb +6 -4
  18. data/lib/pindo/command/unity/packbuild.rb +14 -7
  19. data/lib/pindo/command/utils/tag.rb +5 -3
  20. data/lib/pindo/command/web/autobuild.rb +7 -5
  21. data/lib/pindo/command.rb +1 -1
  22. data/lib/pindo/config/build_info_manager.rb +37 -14
  23. data/lib/pindo/module/appstore/bundleid_helper.rb +7 -3
  24. data/lib/pindo/module/build/git_repo_helper.rb +1 -14
  25. data/lib/pindo/module/cert/cert_helper.rb +33 -9
  26. data/lib/pindo/module/cert/xcode_cert_helper.rb +17 -7
  27. data/lib/pindo/module/pgyer/pgyerhelper.rb +110 -22
  28. data/lib/pindo/module/task/model/git/git_commit_task.rb +106 -6
  29. data/lib/pindo/module/task/model/git/git_tag_task.rb +17 -7
  30. data/lib/pindo/module/task/model/jps/jps_upload_media_task.rb +13 -8
  31. data/lib/pindo/module/task/model/resign/ipa_local_resign_task.rb +5 -0
  32. data/lib/pindo/options/core/option_item.rb +4 -5
  33. data/lib/pindo/options/groups/git_options.rb +40 -0
  34. data/lib/pindo/options/helpers/git_constants.rb +28 -0
  35. data/lib/pindo/version.rb +1 -1
  36. metadata +7 -5
@@ -52,14 +52,15 @@ module Pindo
52
52
  root_dir = @git_root_path
53
53
  git_repo_helper = Pindo::GitRepoHelper.share_instance
54
54
  stash_saved = false
55
+ stash_name = "pindo_stash_#{Time.now.strftime('%Y%m%d%H%M%S')}_#{rand(1000)}"
55
56
  coding_branch = Pindo::GitHandler.git!(%W(-C #{root_dir} rev-parse --abbrev-ref HEAD)).strip
56
57
 
57
58
  begin
58
59
  # 1. 检查工作目录,不干净则 stash
59
60
  status = Pindo::GitHandler.git!(%W(-C #{root_dir} status --porcelain)).strip
60
61
  unless status.empty?
61
- Funlog.instance.fancyinfo_update("工作目录有未提交更改,暂存到 stash")
62
- Pindo::GitHandler.git!(%W(-C #{root_dir} stash -u))
62
+ Funlog.instance.fancyinfo_update("工作目录有未提交更改,暂存到 stash: #{stash_name}")
63
+ Pindo::GitHandler.git!(%W(-C #{root_dir} stash push -u -m #{stash_name}))
63
64
  stash_saved = true
64
65
  end
65
66
 
@@ -109,13 +110,22 @@ module Pindo
109
110
 
110
111
  ensure
111
112
  # 5. 还原 stash
113
+
112
114
  if stash_saved
113
115
  begin
114
- # 先应用 stash(不删除)
115
- Pindo::GitHandler.git!(%W(-C #{root_dir} stash apply))
116
- # 应用成功后再删除 stash
117
- Pindo::GitHandler.git!(%W(-C #{root_dir} stash drop))
118
- Funlog.instance.fancyinfo_success("已还原 stash")
116
+ # 查找指定名字的 stash
117
+ stash_list = Pindo::GitHandler.git!(%W(-C #{root_dir} stash list)).strip
118
+ matched_line = stash_list.lines.find { |l| l.include?(stash_name) }
119
+
120
+ if matched_line && (stash_id = matched_line.match(/(stash@\{\d+\})/)&.[](1))
121
+ # 先应用 stash(不删除)
122
+ Pindo::GitHandler.git!(%W(-C #{root_dir} stash apply #{stash_id}))
123
+ # 应用成功后再删除 stash
124
+ Pindo::GitHandler.git!(%W(-C #{root_dir} stash drop #{stash_id}))
125
+ Funlog.instance.fancyinfo_success("已还原 stash: #{stash_name} (#{stash_id})")
126
+ else
127
+ Funlog.instance.fancyinfo_warning("未找到名为 #{stash_name} 的 stash,请手动检查")
128
+ end
119
129
  rescue => e
120
130
  # 如果应用失败(通常是有冲突),stash 仍然保留,用户可以手动处理
121
131
  Funlog.instance.fancyinfo_warning("stash 还原时发生冲突: #{e.message}")
@@ -294,7 +294,7 @@ module Pindo
294
294
  FileUtils.mkdir_p(backup_dir) unless Dir.exist?(backup_dir)
295
295
 
296
296
  # 移动文件
297
- file_name = File.basename(file_path)
297
+ file_name = File.basename(file_path).force_encoding('UTF-8').scrub('')
298
298
  dest_path = File.join(backup_dir, file_name)
299
299
 
300
300
  # 如果目标文件已存在,添加序号避免覆盖
@@ -391,11 +391,12 @@ module Pindo
391
391
  puts ""
392
392
  files.each_with_index do |file, index|
393
393
  size_str = format_file_size(File.size(file))
394
- file_name = File.basename(file)
394
+ file_name = File.basename(file).force_encoding('UTF-8').scrub('')
395
395
  # 对齐:序号(3位) + 文件名(左对齐) + 大小(右对齐)
396
396
  puts " \e[90m#{(index + 1).to_s.rjust(2)}.\e[0m %-40s \e[33m%8s\e[0m" % [file_name, size_str]
397
397
  if debug_mode
398
- puts " \e[90m路径: #{file}\e[0m"
398
+ safe_path = file.force_encoding('UTF-8').scrub('')
399
+ puts " \e[90m路径: #{safe_path}\e[0m"
399
400
  end
400
401
  end
401
402
  puts ""
@@ -422,7 +423,7 @@ module Pindo
422
423
  failed_files = []
423
424
 
424
425
  files.each_with_index do |file, index|
425
- file_name = File.basename(file)
426
+ file_name = File.basename(file).force_encoding('UTF-8').scrub('')
426
427
 
427
428
  # 显示进度(简洁模式)
428
429
  progress = "#{index + 1}/#{files.size}"
@@ -433,7 +434,10 @@ module Pindo
433
434
  # MacCompressCliTool 的 -f 参数需要一个包含文件路径列表的文本文件
434
435
  file_list_path = File.join(compress_dir, "file_list_#{index}.txt")
435
436
  File.open(file_list_path, 'w:UTF-8') do |f|
436
- f.puts(file)
437
+ # 强制将文件路径转换为 UTF-8 编码,处理无效字符
438
+ # 避免 "incompatible character encodings: UTF-8 and BINARY" 错误
439
+ safe_path = file.force_encoding('UTF-8').scrub('')
440
+ f.puts(safe_path)
437
441
  end
438
442
 
439
443
  # 调用压缩工具: compress-cli -s -f file_list.txt -o output_dir/
@@ -444,7 +448,8 @@ module Pindo
444
448
 
445
449
  if debug_mode
446
450
  puts ""
447
- puts " \e[90m完整路径: #{file}\e[0m"
451
+ safe_file = file.force_encoding('UTF-8').scrub('')
452
+ puts " \e[90m完整路径: #{safe_file}\e[0m"
448
453
  puts " \e[90m文件列表: #{file_list_path}\e[0m"
449
454
  puts " \e[90m执行命令: #{cmd}\e[0m"
450
455
  print " "
@@ -497,7 +502,7 @@ module Pindo
497
502
  if all_files.empty?
498
503
  puts " \e[90m(目录为空)\e[0m"
499
504
  else
500
- all_files.each { |f| puts " \e[90m- #{File.basename(f)}\e[0m" }
505
+ all_files.each { |f| puts " \e[90m- #{File.basename(f).force_encoding('UTF-8').scrub('')}\e[0m" }
501
506
  end
502
507
  else
503
508
  puts " \e[90m(目录不存在)\e[0m"
@@ -532,7 +537,7 @@ module Pindo
532
537
  puts ""
533
538
  puts " \e[31m失败文件 (#{failed_files.size}):\e[0m"
534
539
  failed_files.each do |f|
535
- puts " \e[31m✗\e[0m #{File.basename(f)}"
540
+ puts " \e[31m✗\e[0m #{File.basename(f).force_encoding('UTF-8').scrub('')}"
536
541
  end
537
542
  end
538
543
 
@@ -13,6 +13,11 @@ module Pindo
13
13
  :resign
14
14
  end
15
15
 
16
+ # 任务键
17
+ def self.task_key
18
+ :ipa_local_resign
19
+ end
20
+
16
21
  # 任务类型显示名称
17
22
  def self.task_type_name
18
23
  "重签名"
@@ -154,11 +154,10 @@ module Pindo
154
154
 
155
155
  # 构建描述文本(描述 + 环境变量)
156
156
  def build_description_text
157
- if @env_name
158
- "#{@description} (环境变量: #{@env_name})"
159
- else
160
- @description
161
- end
157
+ desc = @description.dup
158
+ desc += " (环境变量: #{@env_name})" if @env_name
159
+ desc += " 示例: #{@example}" if @example && !@example.to_s.strip.empty?
160
+ desc
162
161
  end
163
162
 
164
163
  # 类型转换为提示字符串
@@ -1,5 +1,6 @@
1
1
  require 'pindo/options/core/option_item'
2
2
  require 'pindo/options/groups/option_group'
3
+ require 'pindo/options/helpers/git_constants'
3
4
 
4
5
  module Pindo
5
6
  module Options
@@ -75,6 +76,24 @@ module Pindo
75
76
  optional: true,
76
77
  cacheable: true, # 存入文件缓存
77
78
  example: 'pindo ios autobuild --release_branch=main'
79
+ ),
80
+
81
+ git_commit: OptionItem.new(
82
+ key: :git_commit,
83
+ name: 'Git 未提交处理方式',
84
+ description: '处理未提交文件的方式: commit/skip/reset/stash/exit',
85
+ type: String,
86
+ env_name: 'PINDO_GIT_COMMIT',
87
+ default_value: nil,
88
+ optional: true,
89
+ cacheable: false,
90
+ verify_block: proc do |value|
91
+ allowed = %w[commit skip reset delete stash exit resetde discard]
92
+ unless allowed.include?(value.to_s.downcase)
93
+ raise "git_commit 值错误: #{value}, 必须是 #{allowed.join(', ')} 之一"
94
+ end
95
+ end,
96
+ example: 'pindo unity autobuild --git-commit=skip'
78
97
  )
79
98
  }
80
99
  end
@@ -95,6 +114,27 @@ module Pindo
95
114
  end
96
115
  end
97
116
 
117
+ # 解析 --git-commit 参数并转换为枚举常量
118
+ # @param value [String] 命令行参数值
119
+ # @return [Symbol, nil] UncommittedFilesProcessType 常量或 nil
120
+ def self.parse_git_commit_type(value)
121
+ return nil if value.nil?
122
+ case value.to_s.downcase
123
+ when 'commit', 'comm'
124
+ Pindo::UncommittedFilesProcessType::COMMIT
125
+ when 'skip', 'none', 'dont'
126
+ Pindo::UncommittedFilesProcessType::SKIP
127
+ when 'reset', 'delete', 'resetde', 'discard'
128
+ Pindo::UncommittedFilesProcessType::RESET
129
+ when 'stash'
130
+ Pindo::UncommittedFilesProcessType::STASH
131
+ when 'exit'
132
+ Pindo::UncommittedFilesProcessType::EXIT
133
+ else
134
+ nil
135
+ end
136
+ end
137
+
98
138
  # 将命令行参数值转换为 CreateTagType 常量
99
139
  # @param value [String] 命令行参数值 (new/recreate/none)
100
140
  # @return [Symbol] CreateTagType 常量值
@@ -0,0 +1,28 @@
1
+ module Pindo
2
+ # Git 版本号增加类型枚举
3
+ # 用于控制版本号自动增长规则
4
+ module VersionIncreaseType
5
+ MAIN = :main # 大版本号增加1 (x.0.0)
6
+ MINI = :mini # 小版本号增加1 (0.x.0)
7
+ PATCH = :patch # 补丁版本号增加1 (0.0.x)
8
+ end
9
+
10
+ # Git Tag 创建类型枚举
11
+ # 用于控制标签创建行为
12
+ module CreateTagType
13
+ NEW = :new # 创建新的 tag,生成新版本号
14
+ RECREATE = :recreate # 重新创建当前版本号的 tag
15
+ NONE = :none # 不创建 tag
16
+ end
17
+
18
+ # Git 未提交文件处理类型枚举
19
+ # 用于控制构建前未提交文件的处理方式
20
+ module UncommittedFilesProcessType
21
+ COMMIT = :commit # 自动提交所有更改
22
+ SKIP = :skip # 跳过处理,继续执行
23
+ RESET = :reset # 丢弃所有更改,重置到远程
24
+ STASH = :stash # 保存到 stash 区域
25
+ EXIT = :exit # 退出程序,要求手动处理
26
+ NONE = :none # 没有需要提交的内容
27
+ end
28
+ end
data/lib/pindo/version.rb CHANGED
@@ -6,7 +6,7 @@ require 'time'
6
6
 
7
7
  module Pindo
8
8
 
9
- VERSION = "5.14.8"
9
+ VERSION = "5.15.1"
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.14.8
4
+ version: 5.15.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - wade
@@ -55,20 +55,20 @@ dependencies:
55
55
  requirements:
56
56
  - - "~>"
57
57
  - !ruby/object:Gem::Version
58
- version: '2.220'
58
+ version: '2.230'
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 2.220.0
61
+ version: 2.230.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '2.220'
68
+ version: '2.230'
69
69
  - - ">="
70
70
  - !ruby/object:Gem::Version
71
- version: 2.220.0
71
+ version: 2.230.0
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: fastimage
74
74
  requirement: !ruby/object:Gem::Requirement
@@ -340,6 +340,7 @@ files:
340
340
  - lib/pindo/command/repo/create.rb
341
341
  - lib/pindo/command/repo/login.rb
342
342
  - lib/pindo/command/repo/search.rb
343
+ - lib/pindo/command/repo/subgit.rb
343
344
  - lib/pindo/command/setup.rb
344
345
  - lib/pindo/command/unity.rb
345
346
  - lib/pindo/command/unity/autobuild.rb
@@ -481,6 +482,7 @@ files:
481
482
  - lib/pindo/options/groups/task_options.rb
482
483
  - lib/pindo/options/groups/unity_options.rb
483
484
  - lib/pindo/options/helpers/bundleid_selector.rb
485
+ - lib/pindo/options/helpers/git_constants.rb
484
486
  - lib/pindo/options/options.rb
485
487
  - lib/pindo/version.rb
486
488
  homepage: https://gitee.com/test/pindo.git