pindo 5.13.9 → 5.13.11

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/funlog.rb +13 -0
  3. data/lib/pindo/base/git_handler.rb +247 -42
  4. data/lib/pindo/command/android/autobuild.rb +72 -30
  5. data/lib/pindo/command/android/autoresign.rb +23 -322
  6. data/lib/pindo/command/android/keystore.rb +7 -130
  7. data/lib/pindo/command/appstore/adhocbuild.rb +5 -14
  8. data/lib/pindo/command/appstore/autobuild.rb +64 -14
  9. data/lib/pindo/command/appstore/autoresign.rb +1 -3
  10. data/lib/pindo/command/ios/autobuild.rb +71 -53
  11. data/lib/pindo/command/ios/build.rb +8 -186
  12. data/lib/pindo/command/jps/media.rb +146 -0
  13. data/lib/pindo/command/jps/upload.rb +48 -20
  14. data/lib/pindo/command/jps.rb +1 -0
  15. data/lib/pindo/command/unity/autobuild.rb +99 -27
  16. data/lib/pindo/command/unity/packpush.rb +5 -8
  17. data/lib/pindo/command/utils/repoinit.rb +0 -2
  18. data/lib/pindo/command/utils/tag.rb +58 -26
  19. data/lib/pindo/command/utils.rb +0 -1
  20. data/lib/pindo/command/web/autobuild.rb +71 -37
  21. data/lib/pindo/command.rb +0 -56
  22. data/lib/pindo/config/build_info_manager.rb +7 -8
  23. data/lib/pindo/module/android/android_config_helper.rb +2 -11
  24. data/lib/pindo/module/appselect.rb +15 -41
  25. data/lib/pindo/module/appstore/itcapp_helper.rb +3 -6
  26. data/lib/pindo/module/build/build_helper.rb +28 -18
  27. data/lib/pindo/module/build/git_repo_helper.rb +284 -405
  28. data/lib/pindo/module/cert/pem_helper.rb +3 -6
  29. data/lib/pindo/module/pgyer/pgyerhelper.rb +193 -25
  30. data/lib/pindo/module/task/model/appstore/appstore_task.rb +5 -0
  31. data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +13 -187
  32. data/lib/pindo/module/task/model/build/android_build_dev_task.rb +36 -34
  33. data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +13 -187
  34. data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +9 -6
  35. data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +9 -6
  36. data/lib/pindo/module/task/model/build/ios_build_dev_task.rb +37 -32
  37. data/lib/pindo/module/task/model/build/web_build_dev_task.rb +7 -5
  38. data/lib/pindo/module/task/model/build_task.rb +8 -11
  39. data/lib/pindo/module/task/model/git/git_commit_task.rb +118 -0
  40. data/lib/pindo/module/task/model/git/git_tag_task.rb +125 -0
  41. data/lib/pindo/module/task/model/git_task.rb +75 -0
  42. data/lib/pindo/module/task/model/jps/jps_message_task.rb +178 -0
  43. data/lib/pindo/module/task/model/{resign → jps}/jps_resign_task.rb +13 -22
  44. data/lib/pindo/module/task/model/jps/jps_upload_media_task.rb +248 -0
  45. data/lib/pindo/module/task/model/jps/jps_upload_task.rb +38 -93
  46. data/lib/pindo/module/task/model/jps_task.rb +43 -0
  47. data/lib/pindo/module/task/model/resign/ipa_local_resign_task.rb +5 -0
  48. data/lib/pindo/module/task/model/unity/unity_config_task.rb +0 -4
  49. data/lib/pindo/module/task/model/unity/unity_export_task.rb +8 -7
  50. data/lib/pindo/module/task/model/unity/unity_update_task.rb +4 -3
  51. data/lib/pindo/module/task/model/unity/unity_yoo_asset_task.rb +8 -7
  52. data/lib/pindo/module/task/model/unity_task.rb +7 -2
  53. data/lib/pindo/module/task/pindo_task.rb +101 -1
  54. data/lib/pindo/module/task/task_manager.rb +29 -32
  55. data/lib/pindo/module/unity/nuget_helper.rb +7 -7
  56. data/lib/pindo/options/core/global_options_state.rb +96 -26
  57. data/lib/pindo/options/core/option_configuration.rb +3 -0
  58. data/lib/pindo/options/core/option_item.rb +36 -0
  59. data/lib/pindo/options/groups/build_options.rb +23 -6
  60. data/lib/pindo/options/groups/git_options.rb +115 -0
  61. data/lib/pindo/options/groups/jps_options.rb +7 -0
  62. data/lib/pindo/options/groups/option_group.rb +15 -0
  63. data/lib/pindo/options/groups/unity_options.rb +49 -0
  64. data/lib/pindo/options/options.rb +2 -0
  65. data/lib/pindo/version.rb +2 -2
  66. metadata +15 -11
  67. data/lib/pindo/base/githelper.rb +0 -686
  68. data/lib/pindo/base/pindocontext.rb +0 -602
  69. data/lib/pindo/command/utils/feishu.rb +0 -134
  70. data/lib/pindo/module/build/version_helper.rb +0 -146
  71. data/lib/pindo/module/task/model/git_tag_task.rb +0 -80
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1f5b841b91a7c9548ae422e6b7c73db4104f9d55c1266937c2ca23e1480c30a
4
- data.tar.gz: 42e0235ff47d8f1a4a6d3d461a47a2ab30a3b6e0666e2d9dac24811b72cc50c9
3
+ metadata.gz: dd43527c8c17eb024c8a5954a09dcec961cb9888e94311a3e88ede69ac11d1d1
4
+ data.tar.gz: 850a430465fb9b7b8c801c30f2f8c2684a738fe63a078adf7f1c067619a7e324
5
5
  SHA512:
6
- metadata.gz: '085884e89d114f0499c38d1c8b879452330023dac6bed14e89d4d5882c866729ea6efa6bef6318d12fea4d72d7626a5f47b41c6a6f5faa03ca06d8c4daa89426'
7
- data.tar.gz: be7b3c4603946b117d1d6051556b92870a834cb57f71cbf1a3857b37f97791274e75b2a7bb98258a26a44d60d96b88dc44369397130dc8f290b81264708e262b
6
+ metadata.gz: 2cc3f43c90b1ecec85020ba6e9d52a0c4b67978c054b5139cb263e4640e4e19ade1e523c9c799d502f52b3f0f9bd9f7cfd7ff20488ef40fb3934af64a0208c29
7
+ data.tar.gz: 911a6c7c912e5e077ed00eae5dc9a2f9c0935b080362d2f841d22dfba6b2f8975e75338ec423f0ea05d1965472e5d1866928199b75d8586a4b9507d06741020f
@@ -49,6 +49,15 @@ module Pindo
49
49
  @spinner_log =nil
50
50
  end
51
51
 
52
+ # 输出警告信息(使用spinner,黄色警告标记)
53
+ # @param args [Array] 要输出的消息
54
+ def fancyinfo_warning(*args)
55
+ message = args.join(" ")
56
+ spinner_log_handle.update(title:message)
57
+ spinner_log_handle.stop("\e[33m⚠\e[0m")
58
+ @spinner_log = nil
59
+ end
60
+
52
61
  # 输出静态成功信息(不使用spinner,对应 fancyinfo_success)
53
62
  # @param args [Array] 要输出的消息
54
63
  def info(*args)
@@ -113,6 +122,10 @@ module Pindo
113
122
  instance.fancyinfo_error(*args)
114
123
  end
115
124
 
125
+ def fancyinfo_warning(*args)
126
+ instance.fancyinfo_warning(*args)
127
+ end
128
+
116
129
  def info(*args)
117
130
  instance.info(*args)
118
131
  end
@@ -2,6 +2,7 @@ require 'fileutils'
2
2
  require 'pindo/base/executable'
3
3
  require 'etc'
4
4
  require 'claide'
5
+ require 'highline/import'
5
6
 
6
7
  module Pindo
7
8
  # Git 操作处理类
@@ -452,11 +453,40 @@ module Pindo
452
453
 
453
454
 
454
455
 
456
+ # 获取未提交的文件列表
457
+ # @param project_dir [String] 项目目录路径
458
+ # @return [Array<String>, nil] 返回未提交的文件列表,如果没有则返回 nil
459
+ def get_uncommitted_files(project_dir:)
460
+ raise ArgumentError, "项目目录不能为空" if project_dir.nil?
461
+
462
+ begin
463
+ # 重置暂存区
464
+ git!(%W(-C #{project_dir} restore --staged #{project_dir}))
465
+
466
+ # 获取未跟踪和已修改的文件
467
+ files_list = git!(%W(-C #{project_dir} ls-files --other --modified --exclude-standard)) || []
468
+
469
+ # 返回文件列表(如果为空则返回 nil)
470
+ if files_list.nil? || files_list.empty?
471
+ return nil
472
+ end
473
+
474
+ # 将字符串转换为数组
475
+ files_list.is_a?(String) ? files_list.split("\n").reject(&:empty?) : files_list
476
+ rescue => e
477
+ Funlog.instance.fancyinfo_error("获取未提交文件列表失败: #{e.message}")
478
+ nil
479
+ end
480
+ end
481
+
455
482
  # 处理未提交的文件
456
483
  # @param project_dir [String] 项目目录路径
484
+ # @param process_type [String] 处理方式: 'commit'(全部提交), 'delete'(全部删除), 'stash'(保存到stash), 'exit'(退出)
485
+ # @param commit_message [String] 提交信息(仅在 process_type 为 'commit' 时使用)
457
486
  # @raise [Informative] 当用户选择退出或需要手动处理文件时抛出
458
- def process_need_add_files(project_dir:nil)
487
+ def process_need_add_files(project_dir:, process_type:, commit_message: nil)
459
488
  raise ArgumentError, "项目目录不能为空" if project_dir.nil?
489
+ raise ArgumentError, "处理方式不能为空" if process_type.nil?
460
490
 
461
491
  current_project_dir = project_dir
462
492
  origin_path = Dir.pwd
@@ -466,29 +496,29 @@ module Pindo
466
496
 
467
497
  # 获取当前分支信息
468
498
  coding_branch = git!(%W(-C #{current_project_dir} rev-parse --abbrev-ref HEAD)).strip
469
- # 重置暂存区
470
- git!(%W(-C #{current_project_dir} restore --staged #{current_project_dir}))
471
-
472
- # 获取未跟踪和已修改的文件
473
- files_list = git!(%W(-C #{current_project_dir} ls-files --other --modified --exclude-standard)) || []
474
499
 
475
- if files_list.nil? || files_list.empty?
476
- return
500
+ # 根据 process_type 执行对应操作
501
+ case process_type
502
+ when 'commit', '全部提交'
503
+ handle_commit_all(current_project_dir, coding_branch, commit_message)
504
+ when 'reset', '全部丢弃更改,回滚代码', 'delete', '全部删除'
505
+ handle_delete_all(current_project_dir, coding_branch)
506
+ when 'stash', '保存到stash区域', '保存到stash区域(改代码本次不生效)'
507
+ handle_stash(current_project_dir, coding_branch)
508
+ when 'exit', '先退出,手动来处理退出'
509
+ raise Informative, "请手动处理未提交的文件!!!"
510
+ else
511
+ raise ArgumentError, "不支持的处理方式: #{process_type}"
477
512
  end
478
513
 
479
- # 显示文件状态
480
- display_file_status(coding_branch, files_list)
481
-
482
- # 处理用户选择
483
- process_user_choice(current_project_dir, coding_branch)
484
-
485
514
  ensure
486
515
  Dir.chdir(origin_path)
487
516
  end
488
517
  end
489
518
 
490
- private
491
-
519
+ # 显示未提交的文件状态
520
+ # @param branch [String] 当前分支名
521
+ # @param files [Array<String>, String] 文件列表
492
522
  def display_file_status(branch, files)
493
523
  puts "═" * 60
494
524
  puts "⚠️ 警告:检测到未提交的文件".red
@@ -513,33 +543,11 @@ module Pindo
513
543
  puts "═" * 60
514
544
  end
515
545
 
516
- def process_user_choice(project_dir, branch)
517
- process_types = ["全部提交", "全部删除", "先退出,手动来处理退出"]
518
- cli = HighLine.new
519
- menu_choice = "None"
520
-
521
- cli.choose do |menu|
522
- menu.header = "对以上未提交的文件, 有下列处理方式".red
523
- menu.prompt = "请选择如何处理(1/2/3...):".yellow
524
- process_types.each do |item|
525
- menu.choice(item) { |choice| menu_choice = choice }
526
- end
527
- end
528
-
529
- puts "选择的处理方式为: #{menu_choice}"
530
-
531
- case menu_choice
532
- when "全部提交"
533
- handle_commit_all(project_dir, branch)
534
- when "全部删除"
535
- handle_delete_all(project_dir, branch)
536
- else
537
- raise Informative, "请手动处理未提交的文件!!!"
538
- end
539
- end
546
+ private
540
547
 
541
- def handle_commit_all(project_dir, branch)
542
- message = ask('请输入提交的备注信息: ') || "release code"
548
+ def handle_commit_all(project_dir, branch, commit_message = nil)
549
+ # 使用传入的 commit_message,如果没有则使用默认值
550
+ message = commit_message || "release code"
543
551
 
544
552
  Funlog.instance.fancyinfo_start("开始提交文件...")
545
553
  git! ['add', '-A']
@@ -563,10 +571,33 @@ module Pindo
563
571
  raise Informative, "请手动处理未提交的文件!!!"
564
572
  end
565
573
 
574
+ Funlog.instance.fancyinfo_start("开始删除未提交的文件...")
566
575
  git!(%W(-C #{project_dir} reset --hard))
567
576
  git!(%W(-C #{project_dir} clean -df))
568
577
  git!(%W(-C #{project_dir} branch --set-upstream-to=origin/#{branch} #{branch}))
569
578
  git!(%W(-C #{project_dir} pull))
579
+ Funlog.instance.fancyinfo_success("未提交的文件已删除!")
580
+ end
581
+
582
+ def handle_stash(project_dir, branch)
583
+ Funlog.instance.fancyinfo_start("开始保存文件到 stash 区域...")
584
+
585
+ # 生成 stash 信息,包含分支名和时间戳
586
+ timestamp = Time.now.strftime("%Y-%m-%d %H:%M:%S")
587
+ stash_message = "pindo on #{branch} - #{timestamp}"
588
+
589
+ # 保存到 stash(包含未追踪的文件)
590
+ git!(%W(-C #{project_dir} stash push -u -m #{stash_message}))
591
+
592
+ Funlog.instance.fancyinfo_success("文件已保存到 stash 区域!")
593
+ Funlog.instance.fancyinfo_success("stash 信息: #{stash_message}")
594
+
595
+ # 显示当前 stash 列表
596
+ stash_list = git!(%W(-C #{project_dir} stash list))
597
+ unless stash_list.nil? || stash_list.empty?
598
+ puts "\n当前 stash 列表:"
599
+ puts stash_list
600
+ end
570
601
  end
571
602
 
572
603
  public
@@ -687,6 +718,180 @@ module Pindo
687
718
  end
688
719
  end
689
720
 
721
+ # 检查并处理未提交的文件(交互式)
722
+ # @param project_dir [String] 项目目录路径
723
+ # @return [void]
724
+ def check_uncommitted_files(project_dir:)
725
+ # 1. 检查是否有未提交的文件
726
+ uncommitted_files = get_uncommitted_files(project_dir: project_dir)
727
+
728
+ # 2. 如果没有未提交的文件,直接返回
729
+ return if uncommitted_files.nil? || uncommitted_files.empty?
730
+
731
+ # 3. 获取当前分支名
732
+ current_branch = git!(%W(-C #{project_dir} rev-parse --abbrev-ref HEAD)).strip
733
+
734
+ # 4. 显示文件状态
735
+ display_file_status(current_branch, uncommitted_files)
736
+
737
+ # 5. 让用户选择处理方式
738
+ cli = HighLine.new
739
+ process_type = cli.choose do |menu|
740
+ menu.header = "仓库有未提交的修改,请选择处理方式"
741
+ menu.prompt = "请输入选项(1/2/3/4/5):"
742
+ menu.choice("(commit) 全部提交") { 'commit' }
743
+ menu.choice("(skip) 跳过并且不作任何修改,继续执行") { 'skip' }
744
+ menu.choice("(reset) 全部丢弃更改,回滚代码") { 'reset' }
745
+ menu.choice("(stash) 保存到stash区域(该部分代码本次不生效)") { 'stash' }
746
+ menu.choice("(exit) 先退出,手动来处理退出") { 'exit' }
747
+ end
748
+
749
+ # 6. 如果用户选择跳过,输出警告信息并返回
750
+ if process_type == 'skip'
751
+ Funlog.instance.warning("跳过提交,可能导致 build number 与代码仓库不一致")
752
+ return
753
+ end
754
+
755
+ # 7. 处理未提交的文件
756
+ process_need_add_files(
757
+ project_dir: project_dir,
758
+ process_type: process_type
759
+ )
760
+ end
761
+
762
+ # 合并到发布分支
763
+ # @param project_dir [String] 项目目录
764
+ # @param release_branch [String] 发布分支名称
765
+ # @param coding_branch [String] 当前开发分支名称
766
+ def merge_to_release_branch(project_dir:, release_branch:, coding_branch:)
767
+ current_project_dir = project_dir
768
+ Funlog.instance.fancyinfo_start("开始合并到#{release_branch}分支")
769
+ if !coding_branch.eql?(release_branch)
770
+ coding_branch_commit_id = git!(%W(-C #{current_project_dir} rev-parse #{coding_branch})).strip
771
+ release_branch_commit_id = nil
772
+
773
+ if remote_branch_exists?(local_repo_dir: current_project_dir, branch: release_branch)
774
+ Funlog.instance.fancyinfo_update("存在#{release_branch}远程分支")
775
+ if local_branch_exists?(local_repo_dir: current_project_dir, branch: release_branch)
776
+ Funlog.instance.fancyinfo_update("存在#{release_branch}本地分支")
777
+ git!(%W(-C #{current_project_dir} checkout #{release_branch}))
778
+ else
779
+ Funlog.instance.fancyinfo_update("不存在#{release_branch}本地分支")
780
+ git!(%W(-C #{current_project_dir} checkout -b #{release_branch} origin/#{release_branch}))
781
+ end
782
+
783
+ git!(%W(-C #{current_project_dir} branch --set-upstream-to=origin/#{release_branch} #{release_branch}))
784
+ git!(%W(-C #{current_project_dir} fetch origin #{release_branch}))
785
+ git!(%W(-C #{current_project_dir} merge origin/#{release_branch}))
786
+
787
+ # 执行合并操作
788
+ Executable.capture_command('git', %W(-C #{current_project_dir} merge #{coding_branch}), :capture => :out)
789
+
790
+ # 检查是否有冲突
791
+ conflict_filelist = git!(%W(-C #{current_project_dir} diff --name-only --diff-filter=U --relative))
792
+ if !conflict_filelist.nil? && !conflict_filelist.strip.empty?
793
+ raise Informative, "合并#{coding_branch}到#{release_branch}时产生冲突,请手动处理!"
794
+ else
795
+ git!(%W(-C #{current_project_dir} push))
796
+ Funlog.instance.fancyinfo_success("代码已经合并到#{release_branch}分支")
797
+ # 获取 release_branch 的 commit ID(处理空分支情况)
798
+ begin
799
+ release_branch_commit_id = git!(%W(-C #{current_project_dir} rev-parse #{release_branch})).strip
800
+ rescue => e
801
+ # 分支可能存在但没有提交(空分支),此时使用 coding_branch 的 commit
802
+ Funlog.instance.fancyinfo_update("#{release_branch}分支为空或获取commit失败,将使用当前分支commit")
803
+ release_branch_commit_id = coding_branch_commit_id
804
+ end
805
+ end
806
+
807
+ else
808
+ if local_branch_exists?(local_repo_dir: current_project_dir, branch: release_branch)
809
+ Funlog.instance.fancyinfo_update("不存在#{release_branch}远程分支")
810
+ Funlog.instance.fancyinfo_update("存在#{release_branch}本地分支")
811
+ git!(%W(-C #{current_project_dir} checkout #{release_branch}))
812
+ # 使用带时间戳的备份分支名,避免重复操作时冲突
813
+ backup_branch = "#{release_branch}_backup_#{Time.now.strftime('%Y%m%d%H%M%S')}"
814
+ Funlog.instance.fancyinfo_update("备份本地分支到: #{backup_branch}")
815
+ git!(%W(-C #{current_project_dir} checkout -b #{backup_branch}))
816
+ git!(%W(-C #{current_project_dir} checkout #{coding_branch}))
817
+ git!(%W(-C #{current_project_dir} branch -D #{release_branch}))
818
+ else
819
+ Funlog.instance.fancyinfo_update("不存在#{release_branch}远程分支")
820
+ Funlog.instance.fancyinfo_update("不存在#{release_branch}本地分支")
821
+ end
822
+
823
+ git!(%W(-C #{current_project_dir} checkout -b #{release_branch}))
824
+ git!(%W(-C #{current_project_dir} push origin #{release_branch}))
825
+ git!(%W(-C #{current_project_dir} branch --set-upstream-to=origin/#{release_branch} #{release_branch}))
826
+
827
+ Funlog.instance.fancyinfo_success("代码已经合并到#{release_branch}分支")
828
+ # 获取 release_branch 的 commit ID(处理空分支情况)
829
+ begin
830
+ release_branch_commit_id = git!(%W(-C #{current_project_dir} rev-parse #{release_branch})).strip
831
+ rescue => e
832
+ # 新创建的分支,commit ID 应该与 coding_branch 相同
833
+ release_branch_commit_id = coding_branch_commit_id
834
+ end
835
+ end
836
+
837
+ git!(%W(-C #{current_project_dir} checkout #{coding_branch}))
838
+ if release_branch_commit_id && !release_branch_commit_id.eql?(coding_branch_commit_id)
839
+ Executable.capture_command('git', %W(-C #{current_project_dir} merge #{release_branch}), :capture => :out)
840
+ conflict_filelist = git!(%W(-C #{current_project_dir} diff --name-only --diff-filter=U --relative))
841
+ if !conflict_filelist.nil? && !conflict_filelist.strip.empty?
842
+ raise Informative, "合并#{release_branch}到#{coding_branch}时产生冲突,请手动处理!"
843
+ end
844
+ Funlog.instance.fancyinfo_success("已将#{release_branch}合并到#{coding_branch}")
845
+ end
846
+ git!(%W(-C #{current_project_dir} push origin #{coding_branch}))
847
+ Funlog.instance.fancyinfo_success("已推送#{coding_branch}分支到远程")
848
+ else
849
+ Funlog.instance.fancyinfo_success("代码处于#{coding_branch}分支,无需合并")
850
+ end
851
+ end
852
+
853
+ # 检查并推送未推送的本地提交
854
+ # @param project_dir [String] 项目目录路径
855
+ # @param branch [String] 分支名称
856
+ # @return [void]
857
+ def check_unpushed_commits(project_dir:, branch:)
858
+ remote_branch = "origin/#{branch}"
859
+
860
+ # 1. 检查远程分支是否存在
861
+ remote_exists = false
862
+ begin
863
+ git!(%W(-C #{project_dir} rev-parse --verify #{remote_branch}))
864
+ remote_exists = true
865
+ rescue => e
866
+ # 远程分支不存在
867
+ remote_exists = false
868
+ end
869
+
870
+ # 2. 如果远程分支不存在,直接推送创建远程分支
871
+ unless remote_exists
872
+ Funlog.instance.fancyinfo_warning("远程分支 #{remote_branch} 不存在,需要创建")
873
+ Funlog.instance.fancyinfo_start("正在推送并创建远程分支...")
874
+ git!(%W(-C #{project_dir} push -u origin #{branch}))
875
+ Funlog.instance.fancyinfo_success("远程分支创建成功!")
876
+ return
877
+ end
878
+
879
+ # 3. 检查本地分支是否领先远程分支
880
+ ahead_count = git!(%W(-C #{project_dir} rev-list --count #{remote_branch}..#{branch})).strip.to_i
881
+
882
+ # 4. 如果没有未推送的提交,直接返回
883
+ if ahead_count == 0
884
+ Funlog.instance.fancyinfo_success("本地分支 #{branch} 与远程分支同步,无需推送")
885
+ return
886
+ end
887
+
888
+ # 5. 有未推送的提交,直接推送(不显示内容,不询问用户)
889
+ Funlog.instance.fancyinfo_warning("检测到 #{ahead_count} 个本地提交尚未推送")
890
+ Funlog.instance.fancyinfo_start("正在推送到远程分支 #{remote_branch}...")
891
+ git!(%W(-C #{project_dir} push origin #{branch}))
892
+ Funlog.instance.fancyinfo_success("推送成功!")
893
+ end
894
+
690
895
  end
691
896
  end
692
897
  end
@@ -2,23 +2,25 @@ require 'highline/import'
2
2
  require 'fileutils'
3
3
  require 'pindo/base/executable'
4
4
  require 'pindo/module/build/build_helper'
5
- require 'pindo/module/build/version_helper'
5
+ require 'pindo/module/build/git_repo_helper'
6
6
  require 'pindo/module/android/android_build_helper'
7
7
  require 'pindo/module/android/android_config_helper'
8
8
  require 'pindo/module/task/task_manager'
9
- require 'pindo/module/task/model/git_tag_task'
9
+ require 'pindo/module/task/model/git/git_commit_task'
10
+ require 'pindo/module/task/model/git/git_tag_task'
10
11
  require 'pindo/module/task/model/unity/unity_update_task'
11
12
  require 'pindo/module/task/model/unity/unity_yoo_asset_task'
12
13
  require 'pindo/module/task/model/unity/unity_export_task'
13
14
  require 'pindo/module/task/model/build_task'
14
15
  require 'pindo/module/task/model/jps/jps_upload_task'
16
+ require 'pindo/module/task/model/jps/jps_message_task'
17
+ require 'pindo/options/options'
15
18
 
16
19
  module Pindo
17
20
  class Command
18
21
  class Android < Command
19
22
  class Autobuild < Android
20
23
  include Appselect
21
- include Pindo::Githelper
22
24
 
23
25
  self.summary = '编译APK,自动修改工程配置,支持上传到JPS测试平台'
24
26
 
@@ -57,27 +59,39 @@ module Pindo
57
59
  $ pindo android autobuild --proj="My App" # 指定项目名称
58
60
  DESC
59
61
 
62
+ # 定义此命令使用的参数项
63
+ def self.option_items
64
+ @option_items ||= Pindo::Options::OptionGroup.merge(
65
+ Pindo::Options::JPSOptions.select(:proj, :upload, :send),
66
+ Pindo::Options::UnityOptions.select(:skiplib, :skipyoo),
67
+ Pindo::Options::UnityOptions.select_with_defaults(skipconfig: true),
68
+ Pindo::Options::GitOptions.all
69
+ )
70
+ end
71
+
60
72
  def self.options
61
73
  [
62
74
  ['--release', '使用Release模式构建'],
63
- ['--proj=NAME', '指定上传到测试平台的项目名称'],
64
- ['--bundle_name=NAME', '指定Android Package Name(如com.example.app,会拉取对应配置)'],
65
- ['--upload', '编译后上传到测试平台(自动发送给自己)'],
66
- ['--send', '发送通知到测试群组(同时发送给自己)'],
67
- ['--skiplib', '跳过Unity必备库更新(加快构建速度)'],
68
- ['--skipyoo', '跳过YooAsset资源打包(加快构建速度)']
69
- ].concat(super)
75
+ ['--bundle_name=NAME', '指定Android Package Name(如com.example.app,会拉取对应配置)']
76
+ ].concat(option_items.map(&:to_claide_option)).concat(super)
70
77
  end
71
78
 
72
79
  def initialize(argv)
80
+ @options = initialize_options(argv)
81
+
73
82
  @args_release_flag = argv.flag?('release', false)
74
- @args_upload_flag = argv.flag?('upload', false)
75
- @args_send_flag = argv.flag?('send', false)
76
- @args_proj_name = argv.option('proj')
83
+ @args_upload_flag = @options[:upload] || false
84
+ @args_send_flag = @options[:send] || false
85
+ @args_proj_name = @options[:proj]
77
86
  @args_bundle_name = argv.option('bundle_name')
78
- @args_skip_lib = argv.flag?('skiplib', false)
79
- @args_skip_yoo = argv.flag?('skipyoo', false)
87
+ @args_skip_lib = @options[:skiplib] || false
88
+ @args_skip_yoo = @options[:skipyoo] || false
80
89
 
90
+ # Git 参数
91
+ @args_release_branch = @options[:release_branch] || 'master'
92
+ @args_ver_inc = Pindo::Options::GitOptions.parse_version_increase_type(@options[:ver_inc] || 'mini')
93
+ @args_tag_type = Pindo::Options::GitOptions.parse_create_tag_type(@options[:tag_type] || 'new')
94
+ @args_tag_pre = @options[:tag_pre] || 'v'
81
95
 
82
96
  if @args_send_flag
83
97
  @args_upload_flag = true
@@ -91,10 +105,7 @@ module Pindo
91
105
  pindo_project_dir = Dir.pwd
92
106
 
93
107
  # 加载 JPS 配置(如果存在)
94
- context = Pindo::PindoContext.instance
95
- context.load_and_apply_jps_config(pindo_project_dir)
96
- # 确认并应用缓存(如果有)
97
- context.confirm_and_apply_cache
108
+ Pindo::BuildHelper.share_instance.load_jps_build_config(pindo_project_dir)
98
109
 
99
110
  # 准备配置
100
111
  config = prepare_android_config(pindo_project_dir)
@@ -148,9 +159,15 @@ module Pindo
148
159
 
149
160
  tasks = []
150
161
 
151
- # 1. Git 标签任务(所有编译场景都需要打 Tag)
152
- git_tag_task = Pindo::TaskSystem::GitTagTask.new(config[:project_path])
153
- tasks << git_tag_task
162
+ # 1. Git 提交任务
163
+ git_commit_task = Pindo::TaskSystem::GitCommitTask.new(
164
+ config[:project_path],
165
+ release_branch: @args_release_branch,
166
+ ver_inc: @args_ver_inc,
167
+ tag_type: @args_tag_type,
168
+ tag_pre: @args_tag_pre
169
+ )
170
+ tasks << git_commit_task
154
171
 
155
172
  # 2. Unity 任务链(仅 Unity 工程)
156
173
  if is_unity
@@ -160,7 +177,7 @@ module Pindo
160
177
  android_export_path = File.exist?(base_android_path) ? base_android_path : android_path
161
178
 
162
179
  # 记录上一个任务,用于依赖链
163
- last_task = git_tag_task
180
+ last_task = git_commit_task
164
181
 
165
182
  # 2.1 Unity 更新必备库任务(可选)
166
183
  unless @args_skip_lib
@@ -214,7 +231,11 @@ module Pindo
214
231
  upload: @args_upload_flag,
215
232
  send: @args_send_flag,
216
233
  app_info_obj: config[:app_info_obj],
217
- workflow_info: config[:workflow_info]
234
+ workflow_info: config[:workflow_info],
235
+ # Git 版本参数
236
+ ver_inc: @args_ver_inc,
237
+ tag_type: @args_tag_type,
238
+ tag_pre: @args_tag_pre
218
239
  }
219
240
  build_options[:unity_root_path] = config[:project_path] if is_unity
220
241
 
@@ -226,21 +247,42 @@ module Pindo
226
247
  build_task.dependencies << tasks.last.id if tasks.any?
227
248
  tasks << build_task
228
249
 
229
- # 4. 上传任务(如果需要)
250
+ # 4. Git 标签任务(依赖第一个编译任务)
251
+ git_tag_task = Pindo::TaskSystem::GitTagTask.new(
252
+ config[:project_path],
253
+ release_branch: @args_release_branch,
254
+ ver_inc: @args_ver_inc,
255
+ tag_type: @args_tag_type,
256
+ tag_pre: @args_tag_pre
257
+ )
258
+ git_tag_task.dependencies << build_task.id
259
+ tasks << git_tag_task
260
+
261
+ # 5. 上传和消息发送任务(如果需要)
230
262
  if @args_upload_flag
263
+ # 4.1 创建上传任务
231
264
  upload_task = Pindo::TaskSystem::JPSUploadTask.new(
232
265
  'apk',
233
266
  File.join(android_project_path, 'build'),
234
267
  nil,
235
268
  app_info_obj: config[:app_info_obj],
236
269
  workflow_info: config[:workflow_info],
237
- project_name: @args_proj_name,
238
- context: {
239
- send_to_chat: @args_send_flag
240
- },
241
- dependencies: [build_task.id]
270
+ project_name: @args_proj_name
242
271
  )
272
+ upload_task.dependencies << build_task.id
243
273
  tasks << upload_task
274
+
275
+ # 4.2 创建消息发送任务(依赖上传任务)
276
+ # app_version_info 将从 upload_task 的数据参数中获取
277
+ message_task = Pindo::TaskSystem::JPSMessageTask.new(
278
+ nil, # app_version_info 为 nil,从依赖任务获取
279
+ app_info_obj: config[:app_info_obj],
280
+ project_name: @args_proj_name,
281
+ send_message_type: @args_send_flag ? 'group' : 'self',
282
+ data_dependencies: [upload_task.id] # 从 upload_task 获取数据
283
+ )
284
+ message_task.dependencies << upload_task.id # 执行顺序依赖
285
+ tasks << message_task
244
286
  end
245
287
 
246
288
  tasks