pindo 5.17.5 → 5.18.3

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/git_handler.rb +120 -38
  3. data/lib/pindo/command/android/autobuild.rb +62 -25
  4. data/lib/pindo/command/appstore/adhocbuild.rb +1 -1
  5. data/lib/pindo/command/appstore/autobuild.rb +1 -1
  6. data/lib/pindo/command/appstore/autoresign.rb +1 -1
  7. data/lib/pindo/command/appstore/updateid.rb +229 -0
  8. data/lib/pindo/command/appstore.rb +1 -0
  9. data/lib/pindo/command/ios/autobuild.rb +70 -33
  10. data/lib/pindo/command/ios/podpush.rb +1 -1
  11. data/lib/pindo/command/unity/autobuild.rb +38 -18
  12. data/lib/pindo/command/utils/allcopyconfig.rb +144 -0
  13. data/lib/pindo/command/utils/copyconfig.rb +207 -0
  14. data/lib/pindo/command/utils/icon.rb +2 -2
  15. data/lib/pindo/command/utils/renewbundleid.rb +199 -0
  16. data/lib/pindo/command/utils/renewcert.rb +56 -54
  17. data/lib/pindo/command/utils.rb +3 -0
  18. data/lib/pindo/command/web/autobuild.rb +10 -8
  19. data/lib/pindo/config/build_info_manager.rb +1 -3
  20. data/lib/pindo/module/android/android_build_helper.rb +193 -33
  21. data/lib/pindo/module/android/android_config_helper.rb +305 -88
  22. data/lib/pindo/module/android/android_project_helper.rb +69 -14
  23. data/lib/pindo/module/android/android_res_helper.rb +349 -51
  24. data/lib/pindo/module/android/keystore_helper.rb +611 -295
  25. data/lib/pindo/module/android/workflow_gradle_injector.rb +702 -0
  26. data/lib/pindo/module/appselect.rb +4 -4
  27. data/lib/pindo/module/appstore/bundleid_helper.rb +204 -14
  28. data/lib/pindo/module/build/build_helper.rb +76 -10
  29. data/lib/pindo/module/build/git_repo_helper.rb +4 -4
  30. data/lib/pindo/module/cert/mode/base_cert_operator.rb +8 -6
  31. data/lib/pindo/module/pgyer/pgyerhelper.rb +102 -39
  32. data/lib/pindo/module/task/model/build/android_build_dev_task.rb +64 -6
  33. data/lib/pindo/module/task/model/git/git_commit_task.rb +70 -54
  34. data/lib/pindo/module/task/model/git/git_tag_task.rb +13 -9
  35. data/lib/pindo/module/task/model/jps/jps_upload_task.rb +104 -1
  36. data/lib/pindo/module/task/model/unity/unity_export_task.rb +2 -1
  37. data/lib/pindo/module/task/model/unity/unity_update_task.rb +2 -1
  38. data/lib/pindo/module/task/model/unity/unity_yoo_asset_task.rb +2 -1
  39. data/lib/pindo/module/task/model/unity_task.rb +2 -1
  40. data/lib/pindo/module/unity/unity_helper.rb +13 -10
  41. data/lib/pindo/module/unity/unity_proc_helper.rb +27 -2
  42. data/lib/pindo/module/xcode/applovin_xcode_helper.rb +4 -2
  43. data/lib/pindo/module/xcode/res/xcode_res_constant.rb +72 -0
  44. data/lib/pindo/module/xcode/xcode_build_config.rb +36 -17
  45. data/lib/pindo/module/xcode/xcode_build_helper.rb +180 -23
  46. data/lib/pindo/module/xcode/xcode_project_helper.rb +1 -1
  47. data/lib/pindo/module/xcode/xcode_res_helper.rb +32 -16
  48. data/lib/pindo/options/groups/build_options.rb +5 -5
  49. data/lib/pindo/options/groups/git_options.rb +7 -5
  50. data/lib/pindo/options/groups/unity_options.rb +11 -0
  51. data/lib/pindo/options/helpers/bundleid_selector.rb +25 -0
  52. data/lib/pindo/options/helpers/git_constants.rb +7 -6
  53. data/lib/pindo/version.rb +2 -2
  54. metadata +10 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2dc0ea199e9881c190ba29b0da86845f0f628d92e8d44fdc5276a00ab8945a23
4
- data.tar.gz: 5c001a0004db9f0cfe726bbf20bfbd855c8cbdd65e35a63043cf62f059b4d513
3
+ metadata.gz: 6aa6cacda33572effc137d3edb8cc37b1cf395c200da85365b8f1f975dd8b56a
4
+ data.tar.gz: ae49f32ec2d23e85acb5311b9358e8fa2dd0f136c85613401d4053e9538e03a2
5
5
  SHA512:
6
- metadata.gz: 3cf203666f973af0185f1a7cd0b700e918e6fe4a273ce5af2324cfa7e809c55ea2c6669b1678d54b0d3c851660d0021c3edd60d0a20253ab47f68b5b6df70ad2
7
- data.tar.gz: 1dad5465cd43d8e974ba99c059f0f7a9995144c5af8c890c092c471fd677ca657bd024ffb677d42463b4ad27c6bc91644fba8acb5be86f1c360870de46d7413a
6
+ metadata.gz: 878e76466b93a3f095b024af378a47b6c54e36d5000455eaf29f07c1b5d6ec1d3ace1b7624a2d3826dc595d976cf030c3e241158e675b74ca8affdca696d7c7a
7
+ data.tar.gz: '0769e7e7f5f55836395bedb94f04d5665accb807a88e5c5bbb98f6c0cd92547a62410dfd4ae1a3873e40114d302fcb966f65aaed4d8b8a31e02fa2342b7171c3'
@@ -20,6 +20,50 @@ module Pindo
20
20
  git!(%W(config --global user.name #{usrname}))
21
21
  end
22
22
 
23
+ # 检查指定目录的 Git 仓库是否使用 gitee.com 远程地址
24
+ def is_gitee_repo?(local_repo_dir: nil)
25
+ return false if local_repo_dir.nil? || !File.exist?(local_repo_dir)
26
+ begin
27
+ remote_url = git!(%W(-C #{local_repo_dir} remote get-url origin)).strip rescue ""
28
+ remote_url.include?("gitee.com")
29
+ rescue
30
+ false
31
+ end
32
+ end
33
+
34
+ # 临时去除代理环境变量执行代码块
35
+ # 用于 gitee.com 等不需要代理的仓库操作
36
+ def without_proxy(&block)
37
+ saved_env = {}
38
+ %w[http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY].each do |key|
39
+ saved_env[key] = ENV[key]
40
+ ENV.delete(key)
41
+ end
42
+ begin
43
+ block.call
44
+ ensure
45
+ saved_env.each do |key, value|
46
+ if value.nil?
47
+ ENV.delete(key)
48
+ else
49
+ ENV[key] = value
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ # 执行需要联网的 git 命令(fetch / push / pull)
56
+ # 若仓库地址包含 gitee.com,自动清除代理环境变量再执行
57
+ # @param project_dir [String] 仓库目录(用于判断是否 gitee)
58
+ # @param args [Array] git 命令参数
59
+ def git_remote!(project_dir, args)
60
+ if is_gitee_repo?(local_repo_dir: project_dir)
61
+ without_proxy { git!(args) }
62
+ else
63
+ git!(args)
64
+ end
65
+ end
66
+
23
67
  def is_git_directory?(local_repo_dir: nil)
24
68
  args = local_repo_dir ? %W(-C #{local_repo_dir} rev-parse --is-inside-work-tree) : %w(rev-parse --is-inside-work-tree)
25
69
  begin
@@ -51,7 +95,7 @@ module Pindo
51
95
  result = true
52
96
  end
53
97
 
54
- git!(%W(-C #{local_repo_dir} push origin #{branch}:#{branch}))
98
+ git_remote!(local_repo_dir, %W(-C #{local_repo_dir} push origin #{branch}:#{branch}))
55
99
 
56
100
  Dir.chdir(current)
57
101
  return result
@@ -69,7 +113,7 @@ module Pindo
69
113
  end
70
114
 
71
115
  if remote_branch_exists?(local_repo_dir: local_repo_dir, branch: branch)
72
- git!(%W(-C #{local_repo_dir} push origin :#{branch}))
116
+ git_remote!(local_repo_dir, %W(-C #{local_repo_dir} push origin :#{branch}))
73
117
  result = true
74
118
  end
75
119
 
@@ -105,7 +149,7 @@ module Pindo
105
149
  result = false
106
150
  if File.exist?(local_repo_dir)
107
151
  Dir.chdir(local_repo_dir)
108
- res_data = git!(%W(-C #{local_repo_dir} ls-remote --heads origin refs/heads/#{branch}))
152
+ res_data = git_remote!(local_repo_dir, %W(-C #{local_repo_dir} ls-remote --heads origin refs/heads/#{branch}))
109
153
  result = !res_data.nil? && !res_data.empty?
110
154
  else
111
155
  result = false
@@ -125,7 +169,7 @@ module Pindo
125
169
  git!(%W(-C #{local_repo_dir} tag #{tag_name}))
126
170
  result = true
127
171
  end
128
- git!(%W(-C #{local_repo_dir} push origin #{tag_name}))
172
+ git_remote!(local_repo_dir, %W(-C #{local_repo_dir} push origin #{tag_name}))
129
173
  else
130
174
  result = false
131
175
  end
@@ -152,7 +196,7 @@ module Pindo
152
196
  if local_tag_exists?(local_repo_dir: local_repo_dir, tag_name: tag_name)
153
197
  git!(%W(-C #{local_repo_dir} tag -d #{tag_name}))
154
198
  end
155
- git!(%W(-C #{local_repo_dir} push origin :#{tag_name}))
199
+ git_remote!(local_repo_dir, %W(-C #{local_repo_dir} push origin :#{tag_name}))
156
200
  add_tag(local_repo_dir:local_repo_dir, tag_name:tag_name)
157
201
  else
158
202
  if local_tag_exists?(local_repo_dir: local_repo_dir, tag_name: tag_name)
@@ -173,7 +217,7 @@ module Pindo
173
217
  result = true
174
218
  end
175
219
  if remote_tag_exists?(local_repo_dir: local_repo_dir, tag_name: tag_name)
176
- git!(%W(-C #{local_repo_dir} push origin :#{tag_name}))
220
+ git_remote!(local_repo_dir, %W(-C #{local_repo_dir} push origin :#{tag_name}))
177
221
  result = true
178
222
  end
179
223
  else
@@ -193,7 +237,7 @@ module Pindo
193
237
  if File.exist?(local_repo_dir)
194
238
  Dir.chdir(local_repo_dir)
195
239
  tag_ref = "refs/tags/#{tag_name}"
196
- res_data = git!(%W(-C #{local_repo_dir} ls-remote --tags origin #{tag_ref}))
240
+ res_data = git_remote!(local_repo_dir, %W(-C #{local_repo_dir} ls-remote --tags origin #{tag_ref}))
197
241
  result = !res_data.nil? && !res_data.empty?
198
242
  else
199
243
  result = false
@@ -250,6 +294,19 @@ module Pindo
250
294
  current=Dir.pwd
251
295
  local_repo_dir = File::join(path, reponame)
252
296
 
297
+ # gitee.com 仓库自动去除代理
298
+ if remote_url && remote_url.include?("gitee.com")
299
+ return without_proxy { getcode_to_dir_impl(reponame: reponame, remote_url: remote_url, path: path, new_branch: new_branch, new_tag: new_tag) }
300
+ end
301
+
302
+ getcode_to_dir_impl(reponame: reponame, remote_url: remote_url, path: path, new_branch: new_branch, new_tag: new_tag)
303
+ end
304
+
305
+ def getcode_to_dir_impl(reponame:nil, remote_url:nil, path: nil, new_branch:"master", new_tag: nil)
306
+
307
+ current=Dir.pwd
308
+ local_repo_dir = File::join(path, reponame)
309
+
253
310
  Funlog.instance.fancyinfo_update("开始更新仓库:#{local_repo_dir}...")
254
311
 
255
312
  begin
@@ -267,13 +324,17 @@ module Pindo
267
324
  git!(%W(remote add origin #{remote_url}))
268
325
  args = %W(-C #{local_repo_dir} fetch origin)
269
326
  args.push('--progress')
270
- git!(args)
327
+ git_remote!(local_repo_dir, args)
271
328
  git!(%W(-C #{local_repo_dir} branch --set-upstream-to=origin/#{current_branch} #{current_branch}))
272
329
  end
273
330
 
274
- git!(%W(-C #{local_repo_dir} fetch origin --progress))
331
+ git_remote!(local_repo_dir, %W(-C #{local_repo_dir} fetch origin --progress))
275
332
  else
276
- git! ['clone', remote_url, local_repo_dir]
333
+ if remote_url&.include?("gitee.com")
334
+ without_proxy { git!(['clone', remote_url, local_repo_dir]) }
335
+ else
336
+ git!(['clone', remote_url, local_repo_dir])
337
+ end
277
338
  end
278
339
 
279
340
  Dir.chdir(local_repo_dir)
@@ -281,7 +342,7 @@ module Pindo
281
342
  if current_branch.eql?(new_branch)
282
343
  git!(%W(-C #{local_repo_dir} reset --hard origin/#{new_branch}))
283
344
  git!(%W(-C #{local_repo_dir} branch --set-upstream-to=origin/#{new_branch} #{new_branch}))
284
- git!(%W(-C #{local_repo_dir} pull))
345
+ git_remote!(local_repo_dir, %W(-C #{local_repo_dir} pull))
285
346
 
286
347
  else
287
348
  git!(%W(-C #{local_repo_dir} clean -fd))
@@ -295,7 +356,7 @@ module Pindo
295
356
  end
296
357
  end
297
358
  git!(%W(-C #{local_repo_dir} branch --set-upstream-to=origin/#{new_branch} #{new_branch}))
298
- git!(%W(-C #{local_repo_dir} pull))
359
+ git_remote!(local_repo_dir, %W(-C #{local_repo_dir} pull))
299
360
  end
300
361
 
301
362
  if !new_tag.nil? && new_tag != ""
@@ -335,17 +396,20 @@ module Pindo
335
396
  FileUtils.mkdir(pindo_dir)
336
397
  end
337
398
 
399
+ # 通配符 bundle id (如 com.eyesofstorms.*) 对应的仓库名去掉 .* 后缀
400
+ actual_repo_name = repo_name&.gsub(".*", "") || repo_name
401
+
338
402
  repo_org_name = Pindoconfig.instance.build_deploy_org
339
403
 
340
404
  git_repo_file = File.join(Pindoconfig.instance.pindo_env_configdir, "git_base_url.json")
341
405
  git_repo_json = JSON.parse(File.read(git_repo_file))
342
- if repo_name && git_repo_json && git_repo_json[repo_name]
343
- repo_org_name = git_repo_json[repo_name]
406
+ if actual_repo_name && git_repo_json && git_repo_json[actual_repo_name]
407
+ repo_org_name = git_repo_json[actual_repo_name]
344
408
  end
345
409
 
346
- url = File.join("https://gitee.com", repo_org_name, repo_name + ".git")
347
- getcode_to_dir(reponame:repo_name, remote_url: url, path:pindo_dir)
348
- config_repo_dir = File.join(pindo_dir, repo_name)
410
+ url = File.join("https://gitee.com", repo_org_name, actual_repo_name + ".git")
411
+ getcode_to_dir(reponame:actual_repo_name, remote_url: url, path:pindo_dir)
412
+ config_repo_dir = File.join(pindo_dir, actual_repo_name)
349
413
 
350
414
 
351
415
 
@@ -414,6 +478,19 @@ module Pindo
414
478
  def git_addpush_repo(path:nil, message:"res", commit_file_params:nil)
415
479
  current=Dir.pwd
416
480
  Dir.chdir(path)
481
+
482
+ # gitee.com 仓库自动去除代理
483
+ if is_gitee_repo?(local_repo_dir: path)
484
+ Dir.chdir(current)
485
+ return without_proxy { git_addpush_repo_impl(path: path, message: message, commit_file_params: commit_file_params) }
486
+ end
487
+
488
+ git_addpush_repo_impl(path: path, message: message, commit_file_params: commit_file_params)
489
+ end
490
+
491
+ def git_addpush_repo_impl(path:nil, message:"res", commit_file_params:nil)
492
+ current=Dir.pwd
493
+ Dir.chdir(path)
417
494
  begin
418
495
  if !commit_file_params.nil? && !commit_file_params.empty?
419
496
  files_list = git! ['ls-files', '--other', '--modified', '--exclude-standard'] || []
@@ -527,9 +604,13 @@ module Pindo
527
604
  handle_delete_all(current_project_dir, coding_branch)
528
605
  when Pindo::UncommittedFilesProcessType::STASH
529
606
  handle_stash(current_project_dir, coding_branch)
530
- when Pindo::UncommittedFilesProcessType::SKIP
531
- # 跳过处理,不做任何操作
532
- Funlog.instance.warning("跳过提交,可能导致 build number 与代码仓库不一致")
607
+ when Pindo::UncommittedFilesProcessType::SKIP_WITH_TAG
608
+ # 不提交,但后续会合并分支并打 tag
609
+ Funlog.instance.warning("跳过提交,但会合并分支并打 tag")
610
+ return
611
+ when Pindo::UncommittedFilesProcessType::SKIP_WITHOUT_TAG
612
+ # 不提交,不合并分支,不打 tag
613
+ Funlog.instance.warning("跳过提交,不合并分支,不打 tag")
533
614
  return
534
615
  when Pindo::UncommittedFilesProcessType::EXIT
535
616
  raise Informative, "请手动处理未提交的文件!!!"
@@ -593,14 +674,14 @@ module Pindo
593
674
  end
594
675
  end
595
676
 
596
- git!(%W(-C #{project_dir} fetch origin))
677
+ git_remote!(project_dir, %W(-C #{project_dir} fetch origin))
597
678
  Funlog.instance.fancyinfo_start("正在push...")
598
679
  if remote_branch_exists?(local_repo_dir: project_dir, branch: branch)
599
680
  git!(%W(-C #{project_dir} branch --set-upstream-to=origin/#{branch} #{branch}))
600
- git! ['pull']
601
- git! ['push']
681
+ git_remote!(project_dir, %W(-C #{project_dir} pull))
682
+ git_remote!(project_dir, %W(-C #{project_dir} push))
602
683
  else
603
- git!(%W(-C #{project_dir} push --set-upstream origin #{branch}))
684
+ git_remote!(project_dir, %W(-C #{project_dir} push --set-upstream origin #{branch}))
604
685
  end
605
686
  Funlog.instance.fancyinfo_success("push文件完成!")
606
687
  end
@@ -615,7 +696,7 @@ module Pindo
615
696
  git!(%W(-C #{project_dir} reset --hard))
616
697
  git!(%W(-C #{project_dir} clean -df))
617
698
  git!(%W(-C #{project_dir} branch --set-upstream-to=origin/#{branch} #{branch}))
618
- git!(%W(-C #{project_dir} pull))
699
+ git_remote!(project_dir, %W(-C #{project_dir} pull))
619
700
  Funlog.instance.fancyinfo_success("未提交的文件已删除!")
620
701
  end
621
702
 
@@ -887,7 +968,7 @@ module Pindo
887
968
  git_root = git_root_directory(local_repo_dir: project_dir)
888
969
  unless git_root
889
970
  Funlog.instance.fancyinfo_warning("当前目录不是Git仓库")
890
- return Pindo::UncommittedFilesProcessType::SKIP
971
+ return Pindo::UncommittedFilesProcessType::SKIP_WITH_TAG
891
972
  end
892
973
 
893
974
  current_branch = git!(%W(-C #{git_root} rev-parse --abbrev-ref HEAD)).strip
@@ -897,11 +978,12 @@ module Pindo
897
978
  cli = HighLine.new
898
979
  cli.choose do |menu|
899
980
  menu.header = "仓库有未提交的修改,请选择处理方式"
900
- menu.prompt = "请输入选项(1/2/3/4/5):"
981
+ menu.prompt = "请输入选项(1/2/3/4/5/6):"
901
982
  menu.choice("(commit) 全部提交") { Pindo::UncommittedFilesProcessType::COMMIT }
902
- menu.choice("(skip) 跳过并且不作任何修改,继续执行") { Pindo::UncommittedFilesProcessType::SKIP }
983
+ menu.choice("(skip-with-tag) 不提交,但合并分支并打tag") { Pindo::UncommittedFilesProcessType::SKIP_WITH_TAG }
984
+ menu.choice("(skip-without-tag) 不提交,不合并分支,不打tag") { Pindo::UncommittedFilesProcessType::SKIP_WITHOUT_TAG }
903
985
  menu.choice("(reset) 全部丢弃更改,回滚代码") { Pindo::UncommittedFilesProcessType::RESET }
904
- menu.choice("(stash) 保存到stash区域(该部分代码本次不生效)") { Pindo::UncommittedFilesProcessType::STASH }
986
+ menu.choice("(stash) 保存到stash区域(该部分代码本次编译不生效)") { Pindo::UncommittedFilesProcessType::STASH }
905
987
  menu.choice("(exit) 先退出,手动来处理退出") { Pindo::UncommittedFilesProcessType::EXIT }
906
988
  end
907
989
  end
@@ -936,7 +1018,7 @@ module Pindo
936
1018
  end
937
1019
 
938
1020
  git!(%W(-C #{current_project_dir} branch --set-upstream-to=origin/#{target_branch} #{target_branch}))
939
- git!(%W(-C #{current_project_dir} fetch origin #{target_branch}))
1021
+ git_remote!(current_project_dir, %W(-C #{current_project_dir} fetch origin #{target_branch}))
940
1022
  git!(%W(-C #{current_project_dir} merge origin/#{target_branch}))
941
1023
 
942
1024
  # 执行合并操作
@@ -947,7 +1029,7 @@ module Pindo
947
1029
  if !conflict_filelist.nil? && !conflict_filelist.strip.empty?
948
1030
  raise Informative, "合并#{source_branch}到#{target_branch}时产生冲突,请手动处理!"
949
1031
  else
950
- git!(%W(-C #{current_project_dir} push))
1032
+ git_remote!(current_project_dir, %W(-C #{current_project_dir} push))
951
1033
  Funlog.instance.fancyinfo_success("代码已经合并到#{target_branch}分支")
952
1034
  # 获取 target_branch 的 commit ID(处理空分支情况)
953
1035
  begin
@@ -977,7 +1059,7 @@ module Pindo
977
1059
 
978
1060
  # 基于 source_branch 创建 target_branch(明确指定起点,避免基于错误的分支创建)
979
1061
  git!(%W(-C #{current_project_dir} checkout -b #{target_branch} #{source_branch}))
980
- git!(%W(-C #{current_project_dir} push origin #{target_branch}))
1062
+ git_remote!(current_project_dir, %W(-C #{current_project_dir} push origin #{target_branch}))
981
1063
  git!(%W(-C #{current_project_dir} branch --set-upstream-to=origin/#{target_branch} #{target_branch}))
982
1064
 
983
1065
  Funlog.instance.fancyinfo_success("代码已经合并到#{target_branch}分支")
@@ -1013,14 +1095,14 @@ module Pindo
1013
1095
  Funlog.instance.fancyinfo_success("已将#{source_branch} fast-forward 到#{target_branch},两分支现在在同一节点")
1014
1096
 
1015
1097
  # 推送到远程(普通 push,因为是 fast-forward)
1016
- git!(%W(-C #{current_project_dir} push origin #{source_branch}))
1098
+ git_remote!(current_project_dir, %W(-C #{current_project_dir} push origin #{source_branch}))
1017
1099
  Funlog.instance.fancyinfo_success("已推送#{source_branch}分支到远程")
1018
1100
  rescue => e
1019
1101
  if e.message.include?("Not possible to fast-forward")
1020
1102
  # 理论上不应该到这里,因为前面检查过是祖先
1021
1103
  Funlog.instance.fancyinfo_warning("无法 fast-forward,将产生 merge commit")
1022
1104
  git!(%W(-C #{current_project_dir} merge #{target_branch}))
1023
- git!(%W(-C #{current_project_dir} push origin #{source_branch}))
1105
+ git_remote!(current_project_dir, %W(-C #{current_project_dir} push origin #{source_branch}))
1024
1106
  else
1025
1107
  raise e
1026
1108
  end
@@ -1036,7 +1118,7 @@ module Pindo
1036
1118
  raise Informative, "合并#{target_branch}到#{source_branch}时产生冲突,请手动处理!"
1037
1119
  end
1038
1120
 
1039
- git!(%W(-C #{current_project_dir} push origin #{source_branch}))
1121
+ git_remote!(current_project_dir, %W(-C #{current_project_dir} push origin #{source_branch}))
1040
1122
  Funlog.instance.fancyinfo_success("已将#{target_branch}合并到#{source_branch}(产生了新 merge commit)")
1041
1123
  end
1042
1124
  else
@@ -1071,13 +1153,13 @@ module Pindo
1071
1153
  unless remote_exists
1072
1154
  Funlog.instance.fancyinfo_warning("远程分支 #{remote_branch} 不存在,需要创建")
1073
1155
  Funlog.instance.fancyinfo_start("正在推送并创建远程分支...")
1074
- git!(%W(-C #{project_dir} push -u origin #{branch}))
1156
+ git_remote!(project_dir, %W(-C #{project_dir} push -u origin #{branch}))
1075
1157
  Funlog.instance.fancyinfo_success("远程分支创建成功!")
1076
1158
  return
1077
1159
  end
1078
1160
 
1079
1161
  # 3. 先 fetch 获取最新的远程状态
1080
- git!(%W(-C #{project_dir} fetch origin #{branch}))
1162
+ git_remote!(project_dir, %W(-C #{project_dir} fetch origin #{branch}))
1081
1163
 
1082
1164
  # 4. 检查本地分支是否领先远程分支
1083
1165
  ahead_count = git!(%W(-C #{project_dir} rev-list --count #{remote_branch}..#{branch})).strip.to_i
@@ -1093,7 +1175,7 @@ module Pindo
1093
1175
  # 仅本地领先:直接推送
1094
1176
  Funlog.instance.fancyinfo_warning("检测到 #{ahead_count} 个本地提交尚未推送")
1095
1177
  Funlog.instance.fancyinfo_start("正在推送到远程分支 #{remote_branch}...")
1096
- git!(%W(-C #{project_dir} push origin #{branch}))
1178
+ git_remote!(project_dir, %W(-C #{project_dir} push origin #{branch}))
1097
1179
  Funlog.instance.fancyinfo_success("推送成功!")
1098
1180
  elsif ahead_count == 0 && behind_count > 0
1099
1181
  # 仅远程领先:重置本地到远程位置
@@ -66,7 +66,7 @@ module Pindo
66
66
 
67
67
  使用示例:
68
68
 
69
- $ pindo and autobuild --bundle_name=com.example.app # 指定 Bundle Name
69
+ $ pindo and autobuild --bundle_name=com.example.* # 指定 Bundle Name(支持通配符)
70
70
 
71
71
  $ pindo and autobuild --proj="My App" # 指定项目名称
72
72
 
@@ -151,8 +151,11 @@ module Pindo
151
151
  def run
152
152
  pindo_project_dir = Dir.pwd
153
153
 
154
- # 加载 JPS 配置(如果存在)
155
- Pindo::BuildHelper.share_instance.load_jps_build_config(pindo_project_dir)
154
+ # 加载 JPS 配置(缓存 project_name,并通过映射表解析 bundle_id)
155
+ Pindo::BuildHelper.share_instance.load_jps_build_config(pindo_project_dir, conf: @args_conf)
156
+
157
+ # 解析 bundle_name(优先级:命令行参数 > JPSBuildConfig映射 > 交互选择)
158
+ resolve_bundle_name!
156
159
 
157
160
  # 准备配置
158
161
  config = prepare_android_config(pindo_project_dir)
@@ -177,27 +180,56 @@ module Pindo
177
180
 
178
181
  private
179
182
 
180
- # 准备 Android 配置
181
- def prepare_android_config(pindo_project_dir)
182
- # 获取 Bundle Name
183
- bundle_name = @args_bundle_name || get_selected_dev_bundle_name()
183
+ # 解析 bundle_name(优先级:命令行参数 > JPSBuildConfig映射 > prepare_upload交互选择)
184
+ def resolve_bundle_name!
185
+ # 优先级 1:命令行 --bundle_name 参数
186
+ return if @args_bundle_name && !@args_bundle_name.empty?
184
187
 
185
- # 重要:如果 bundle_name 是通过交互式选择获取的,同步回 @options
186
- if bundle_name && (@args_bundle_name.nil? || @args_bundle_name.empty?)
187
- @args_bundle_name = bundle_name
188
- @options[:bundle_name] = bundle_name # 确保能被缓存系统保存
188
+ # 优先级 2:JPSBuildConfig.json 通过映射表解析的 bundle_name
189
+ resolved = Pindo::Options::GlobalOptionsState.instance[:bundle_name]
190
+ if resolved && !resolved.empty?
191
+ @args_bundle_name = resolved
192
+ return
189
193
  end
190
194
 
191
- # 获取 JPS 配置
192
- app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
195
+ # 优先级 3:走 prepare_upload 交互选择 JPS 项目,创建/更新 JPSBuildConfig.json
196
+ pindo_project_dir = Dir.pwd
197
+ @cached_app_info_obj, @cached_workflow_info = PgyerHelper.share_instace.prepare_upload(
193
198
  working_directory: pindo_project_dir,
194
199
  conf: @args_conf,
195
200
  package_type: 'apk'
196
201
  )
197
202
 
203
+ # prepare_upload 已创建 JPSBuildConfig.json,重新加载获取 bundle_name
204
+ Pindo::BuildHelper.share_instance.load_jps_build_config(pindo_project_dir, conf: @args_conf)
205
+ resolved = Pindo::Options::GlobalOptionsState.instance[:bundle_name]
206
+ if resolved && !resolved.empty?
207
+ @args_bundle_name = resolved
208
+ return
209
+ end
210
+
211
+ # 最终降级:交互选择 bundle_name
212
+ @args_bundle_name = get_selected_dev_bundle_name()
213
+ end
214
+
215
+ # 准备 Android 配置
216
+ def prepare_android_config(pindo_project_dir)
217
+ # 获取 JPS 配置(复用 resolve_bundle_name! 中已缓存的结果)
218
+ if @cached_app_info_obj && @cached_workflow_info
219
+ app_info_obj = @cached_app_info_obj
220
+ workflow_info = @cached_workflow_info
221
+ else
222
+ app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
223
+ working_directory: pindo_project_dir,
224
+ conf: @args_conf,
225
+ package_type: 'apk',
226
+ bundle_name: @args_bundle_name
227
+ )
228
+ end
229
+
198
230
  {
199
231
  project_path: pindo_project_dir,
200
- bundle_name: bundle_name,
232
+ bundle_name: @args_bundle_name,
201
233
  app_info_obj: app_info_obj,
202
234
  workflow_info: workflow_info
203
235
  }
@@ -223,13 +255,15 @@ module Pindo
223
255
  # 如果用户指定了 --git-commit 参数,直接使用该参数;否则交互式询问
224
256
  user_specified_git_commit = @options[:git_commit] != nil
225
257
 
226
- Funlog.instance.info("DEBUG: @options[:git_commit] = #{@options[:git_commit].inspect}")
227
- Funlog.instance.info("DEBUG: @args_git_commit = #{@args_git_commit.inspect}")
228
- Funlog.instance.info("DEBUG: user_specified_git_commit = #{user_specified_git_commit}")
258
+ if ENV['PINDO_DEBUG']
259
+ puts "[PINDO_DEBUG] @options[:git_commit] = #{@options[:git_commit].inspect}"
260
+ puts "[PINDO_DEBUG] @args_git_commit = #{@args_git_commit.inspect}"
261
+ puts "[PINDO_DEBUG] user_specified_git_commit = #{user_specified_git_commit}"
262
+ end
229
263
 
230
264
  if user_specified_git_commit
231
265
  # 用户指定了 --git-commit 参数,直接使用
232
- process_type = @args_git_commit || Pindo::UncommittedFilesProcessType::SKIP
266
+ process_type = @args_git_commit || Pindo::UncommittedFilesProcessType::SKIP_WITH_TAG
233
267
  Funlog.instance.info("使用用户指定的 Git 提交处理方式:#{process_type}")
234
268
  else
235
269
  # 未指定参数,交互式询问
@@ -327,12 +361,15 @@ module Pindo
327
361
  build_task.dependencies << tasks.last.id if tasks.any?
328
362
  tasks << build_task
329
363
 
330
- # 4. Git 标签任务(依赖第一个编译任务)
331
- # 所有参数都从 GitCommitTask 获取
332
- git_tag_task = Pindo::TaskSystem::GitTagTask.new(config[:project_path])
333
- git_tag_task.dependencies << build_task.id
334
- git_tag_task.dependencies << git_commit_task.id
335
- tasks << git_tag_task
364
+ # 4. Git 标签任务(skip_without_tag 模式下不创建)
365
+ git_tag_task = nil
366
+ unless process_type == Pindo::UncommittedFilesProcessType::SKIP_WITHOUT_TAG
367
+ # 所有参数都从 GitCommitTask 获取
368
+ git_tag_task = Pindo::TaskSystem::GitTagTask.new(config[:project_path])
369
+ git_tag_task.dependencies << build_task.id
370
+ git_tag_task.dependencies << git_commit_task.id
371
+ tasks << git_tag_task
372
+ end
336
373
 
337
374
  # 5. 上传和消息发送任务(如果需要)
338
375
  upload_task = nil # 声明变量以便后续绑定任务使用
@@ -419,7 +456,7 @@ module Pindo
419
456
  )
420
457
  # 依赖 Git Commit、Git Tag 和 Bind Package 任务
421
458
  workflow_message_task.dependencies << git_commit_task.id
422
- workflow_message_task.dependencies << git_tag_task.id
459
+ workflow_message_task.dependencies << git_tag_task.id if git_tag_task
423
460
  workflow_message_task.dependencies << bind_package_task.id
424
461
  tasks << workflow_message_task
425
462
  end
@@ -133,7 +133,7 @@ module Pindo
133
133
 
134
134
  begin
135
135
  # 加载 JPS 配置(如果存在)
136
- Pindo::BuildHelper.share_instance.load_jps_build_config(pindo_project_dir)
136
+ Pindo::BuildHelper.share_instance.load_jps_build_config(pindo_project_dir, conf: @args_conf)
137
137
 
138
138
  # 处理配置文件
139
139
  prepare_config(pindo_project_dir)
@@ -97,7 +97,7 @@ module Pindo
97
97
  @args_release_branch = @options[:release_branch] || 'master'
98
98
  @args_tag_type = Pindo::Options::GitOptions.parse_create_tag_type(@options[:tag_type])
99
99
  @args_tag_pre = @options[:tag_pre] || 'ios_release_'
100
- @args_git_commit = Pindo::Options::GitOptions.parse_git_commit_type(@options[:git_commit]) || Pindo::UncommittedFilesProcessType::SKIP
100
+ @args_git_commit = Pindo::Options::GitOptions.parse_git_commit_type(@options[:git_commit]) || Pindo::UncommittedFilesProcessType::SKIP_WITH_TAG
101
101
 
102
102
  super(argv)
103
103
  end
@@ -165,7 +165,7 @@ module Pindo
165
165
  def run
166
166
  begin
167
167
  # 加载 JPS 配置(如果存在)
168
- Pindo::BuildHelper.share_instance.load_jps_build_config(Dir.pwd)
168
+ Pindo::BuildHelper.share_instance.load_jps_build_config(Dir.pwd, conf: @args_conf)
169
169
 
170
170
  # 1. 查找或指定 IPA 文件
171
171
  ipa_file_path = find_ipa_file()