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.
- checksums.yaml +4 -4
- data/lib/pindo/base/funlog.rb +13 -0
- 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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: dd43527c8c17eb024c8a5954a09dcec961cb9888e94311a3e88ede69ac11d1d1
|
|
4
|
+
data.tar.gz: 850a430465fb9b7b8c801c30f2f8c2684a738fe63a078adf7f1c067619a7e324
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2cc3f43c90b1ecec85020ba6e9d52a0c4b67978c054b5139cb263e4640e4e19ade1e523c9c799d502f52b3f0f9bd9f7cfd7ff20488ef40fb3934af64a0208c29
|
|
7
|
+
data.tar.gz: 911a6c7c912e5e077ed00eae5dc9a2f9c0935b080362d2f841d22dfba6b2f8975e75338ec423f0ea05d1965472e5d1866928199b75d8586a4b9507d06741020f
|
data/lib/pindo/base/funlog.rb
CHANGED
|
@@ -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
|
-
|
|
476
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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/
|
|
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/
|
|
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
|
-
['--
|
|
64
|
-
|
|
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 =
|
|
75
|
-
@args_send_flag =
|
|
76
|
-
@args_proj_name =
|
|
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 =
|
|
79
|
-
@args_skip_yoo =
|
|
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
|
-
|
|
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
|
|
152
|
-
|
|
153
|
-
|
|
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 =
|
|
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
|