pindo 5.13.9 → 5.13.10

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/git_handler.rb +247 -42
  3. data/lib/pindo/command/android/autobuild.rb +72 -30
  4. data/lib/pindo/command/android/autoresign.rb +23 -322
  5. data/lib/pindo/command/android/keystore.rb +7 -130
  6. data/lib/pindo/command/appstore/adhocbuild.rb +5 -14
  7. data/lib/pindo/command/appstore/autobuild.rb +64 -14
  8. data/lib/pindo/command/appstore/autoresign.rb +1 -3
  9. data/lib/pindo/command/ios/autobuild.rb +71 -53
  10. data/lib/pindo/command/ios/build.rb +8 -186
  11. data/lib/pindo/command/jps/media.rb +146 -0
  12. data/lib/pindo/command/jps/upload.rb +48 -20
  13. data/lib/pindo/command/jps.rb +1 -0
  14. data/lib/pindo/command/unity/autobuild.rb +99 -27
  15. data/lib/pindo/command/unity/packpush.rb +5 -8
  16. data/lib/pindo/command/utils/repoinit.rb +0 -2
  17. data/lib/pindo/command/utils/tag.rb +58 -26
  18. data/lib/pindo/command/utils.rb +0 -1
  19. data/lib/pindo/command/web/autobuild.rb +71 -37
  20. data/lib/pindo/command.rb +0 -56
  21. data/lib/pindo/config/build_info_manager.rb +7 -8
  22. data/lib/pindo/module/android/android_config_helper.rb +2 -11
  23. data/lib/pindo/module/appselect.rb +15 -41
  24. data/lib/pindo/module/appstore/itcapp_helper.rb +3 -6
  25. data/lib/pindo/module/build/build_helper.rb +28 -18
  26. data/lib/pindo/module/build/git_repo_helper.rb +284 -405
  27. data/lib/pindo/module/cert/pem_helper.rb +3 -6
  28. data/lib/pindo/module/pgyer/pgyerhelper.rb +193 -25
  29. data/lib/pindo/module/task/model/appstore/appstore_task.rb +5 -0
  30. data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +13 -187
  31. data/lib/pindo/module/task/model/build/android_build_dev_task.rb +36 -34
  32. data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +13 -187
  33. data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +9 -6
  34. data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +9 -6
  35. data/lib/pindo/module/task/model/build/ios_build_dev_task.rb +37 -32
  36. data/lib/pindo/module/task/model/build/web_build_dev_task.rb +7 -5
  37. data/lib/pindo/module/task/model/build_task.rb +8 -11
  38. data/lib/pindo/module/task/model/git/git_commit_task.rb +118 -0
  39. data/lib/pindo/module/task/model/git/git_tag_task.rb +125 -0
  40. data/lib/pindo/module/task/model/git_task.rb +75 -0
  41. data/lib/pindo/module/task/model/jps/jps_message_task.rb +178 -0
  42. data/lib/pindo/module/task/model/{resign → jps}/jps_resign_task.rb +13 -22
  43. data/lib/pindo/module/task/model/jps/jps_upload_media_task.rb +248 -0
  44. data/lib/pindo/module/task/model/jps/jps_upload_task.rb +38 -93
  45. data/lib/pindo/module/task/model/jps_task.rb +43 -0
  46. data/lib/pindo/module/task/model/resign/ipa_local_resign_task.rb +5 -0
  47. data/lib/pindo/module/task/model/unity/unity_config_task.rb +0 -4
  48. data/lib/pindo/module/task/model/unity/unity_export_task.rb +8 -7
  49. data/lib/pindo/module/task/model/unity/unity_update_task.rb +4 -3
  50. data/lib/pindo/module/task/model/unity/unity_yoo_asset_task.rb +8 -7
  51. data/lib/pindo/module/task/model/unity_task.rb +7 -2
  52. data/lib/pindo/module/task/pindo_task.rb +101 -1
  53. data/lib/pindo/module/task/task_manager.rb +29 -32
  54. data/lib/pindo/module/unity/nuget_helper.rb +7 -7
  55. data/lib/pindo/options/core/global_options_state.rb +96 -26
  56. data/lib/pindo/options/core/option_configuration.rb +3 -0
  57. data/lib/pindo/options/core/option_item.rb +36 -0
  58. data/lib/pindo/options/groups/build_options.rb +23 -6
  59. data/lib/pindo/options/groups/git_options.rb +115 -0
  60. data/lib/pindo/options/groups/jps_options.rb +7 -0
  61. data/lib/pindo/options/groups/option_group.rb +15 -0
  62. data/lib/pindo/options/groups/unity_options.rb +49 -0
  63. data/lib/pindo/options/options.rb +2 -0
  64. data/lib/pindo/version.rb +2 -2
  65. metadata +15 -11
  66. data/lib/pindo/base/githelper.rb +0 -686
  67. data/lib/pindo/base/pindocontext.rb +0 -602
  68. data/lib/pindo/command/utils/feishu.rb +0 -134
  69. data/lib/pindo/module/build/version_helper.rb +0 -146
  70. data/lib/pindo/module/task/model/git_tag_task.rb +0 -80
@@ -1,686 +0,0 @@
1
- require 'fileutils'
2
- require 'pindo/base/executable'
3
- require 'etc'
4
- require 'claide'
5
-
6
- module Pindo
7
- module Githelper
8
-
9
- extend Executable
10
- executable :git
11
-
12
- def prepare_gitenv()
13
- usrname = Etc.getlogin
14
- git!(%W(config --global user.email #{usrname}@example.com))
15
- git!(%W(config --global user.name #{usrname}))
16
- end
17
-
18
- def is_git_directory?(local_repo_dir: nil)
19
- args = local_repo_dir ? %W(-C #{local_repo_dir} rev-parse --is-inside-work-tree) : %w(rev-parse --is-inside-work-tree)
20
- begin
21
- git!(args)
22
- true
23
- rescue StandardError => e
24
- false
25
- end
26
- end
27
-
28
- def git_root_directory(local_repo_dir: nil)
29
- return nil unless is_git_directory?(local_repo_dir: local_repo_dir)
30
-
31
- args = local_repo_dir ? %W(-C #{local_repo_dir} rev-parse --show-toplevel) : %w(rev-parse --show-toplevel)
32
- begin
33
- git!(args).strip
34
- rescue StandardError => e
35
- nil
36
- end
37
- end
38
-
39
- def add_branch(local_repo_dir: nil, branch: nil)
40
-
41
- current=Dir.pwd
42
- result = false
43
-
44
- if !local_branch_exists?(local_repo_dir: local_repo_dir, branch: branch)
45
- git!(%W(-C #{local_repo_dir} checkout -b #{branch}))
46
- result = true
47
- end
48
-
49
- git!(%W(-C #{local_repo_dir} push origin #{branch}:#{branch}))
50
-
51
- Dir.chdir(current)
52
- return result
53
- end
54
-
55
- def remove_branch(local_repo_dir: nil, branch: nil)
56
- current=Dir.pwd
57
-
58
- result = false
59
- if File.exist?(local_repo_dir)
60
- current_branch = git!(%W(-C #{local_repo_dir} rev-parse --abbrev-ref HEAD)).strip
61
- if local_branch_exists?(local_repo_dir: local_repo_dir, branch: branch)
62
- git!(%W(-C #{local_repo_dir} branch -D #{branch}))
63
- result = true
64
- end
65
-
66
- if remote_branch_exists?(local_repo_dir: local_repo_dir, branch: branch)
67
- git!(%W(-C #{local_repo_dir} push origin :#{branch}))
68
- result = true
69
- end
70
-
71
- else
72
- result = false
73
- end
74
- Dir.chdir(current)
75
- return result
76
- end
77
-
78
-
79
- def local_branch_exists?(local_repo_dir: nil, branch: nil)
80
- current=Dir.pwd
81
- result = false
82
-
83
- if File.exist?(local_repo_dir)
84
- Dir.chdir(local_repo_dir)
85
-
86
- res_data = Executable.capture_command('git', %W(rev-parse --verify #{branch}), :capture => :out)
87
- # puts "=====1"
88
- # puts res_data
89
- # res_data = git!(%W(-C #{local_repo_dir} --no-pager branch --list origin/#{branch} --no-color -r))
90
- result = !res_data.nil? && !res_data.empty?
91
- else
92
- result = false
93
- end
94
- Dir.chdir(current)
95
- return result
96
- end
97
-
98
- def remote_branch_exists?(local_repo_dir: nil, branch: nil)
99
- current=Dir.pwd
100
- result = false
101
- if File.exist?(local_repo_dir)
102
- Dir.chdir(local_repo_dir)
103
- res_data = git!(%W(-C #{local_repo_dir} ls-remote --heads origin refs/heads/#{branch}))
104
- result = !res_data.nil? && !res_data.empty?
105
- else
106
- result = false
107
- end
108
- Dir.chdir(current)
109
- return result
110
- end
111
-
112
-
113
- def add_tag(local_repo_dir: nil, tag_name: nil)
114
-
115
- current=Dir.pwd
116
- result = false
117
- if File.exist?(local_repo_dir)
118
- Dir.chdir(local_repo_dir)
119
- if !local_tag_exists?(local_repo_dir: local_repo_dir, tag_name: tag_name)
120
- git!(%W(-C #{local_repo_dir} tag #{tag_name}))
121
- result = true
122
- end
123
- git!(%W(-C #{local_repo_dir} push origin #{tag_name}))
124
- else
125
- result = false
126
- end
127
- Dir.chdir(current)
128
- return result
129
- end
130
-
131
- def add_tag_with_check(local_repo_dir:nil, tag_name:nil, check: true)
132
-
133
- if remote_tag_exists?(local_repo_dir: local_repo_dir, tag_name: tag_name)
134
- puts
135
- puts "路径: #{local_repo_dir}"
136
- puts "Tag: #{tag_name}"
137
- puts
138
- puts "仓库已经存在同样tag:#{tag_name} !!!"
139
-
140
- if check
141
- answer = agree("确定删除远程仓库的tag, 重新添加tag:#{tag_name}吗(Y/n)?:")
142
- unless answer
143
- raise Informative, "添加tag异常!!!"
144
- end
145
- end
146
-
147
- if local_tag_exists?(local_repo_dir: local_repo_dir, tag_name: tag_name)
148
- git!(%W(-C #{local_repo_dir} tag -d #{tag_name}))
149
- end
150
- git!(%W(-C #{local_repo_dir} push origin :#{tag_name}))
151
- add_tag(local_repo_dir:local_repo_dir, tag_name:tag_name)
152
- else
153
- if local_tag_exists?(local_repo_dir: local_repo_dir, tag_name: tag_name)
154
- git!(%W(-C #{local_repo_dir} tag -d #{tag_name}))
155
- end
156
- add_tag(local_repo_dir:local_repo_dir, tag_name:tag_name)
157
- end
158
- end
159
-
160
- def remove_tag(local_repo_dir: nil, tag_name: nil)
161
-
162
- result = false
163
- current=Dir.pwd
164
- if File.exist?(local_repo_dir)
165
- Dir.chdir(local_repo_dir)
166
- if local_tag_exists?(local_repo_dir: local_repo_dir, tag_name: tag_name)
167
- git!(%W(-C #{local_repo_dir} tag -d #{tag_name}))
168
- result = true
169
- end
170
- if remote_tag_exists?(local_repo_dir: local_repo_dir, tag_name: tag_name)
171
- git!(%W(-C #{local_repo_dir} push origin :#{tag_name}))
172
- result = true
173
- end
174
- else
175
- result = false
176
- end
177
- Dir.chdir(current)
178
- return result
179
-
180
- end
181
-
182
-
183
- def remote_tag_exists?(local_repo_dir: nil, tag_name: nil)
184
-
185
- result = false
186
- current=Dir.pwd
187
-
188
- if File.exist?(local_repo_dir)
189
- Dir.chdir(local_repo_dir)
190
- tag_ref = "refs/tags/#{tag_name}"
191
- res_data = git!(%W(-C #{local_repo_dir} ls-remote --tags origin #{tag_ref}))
192
- result = !res_data.nil? && !res_data.empty?
193
- else
194
- result = false
195
- end
196
- Dir.chdir(current)
197
- return result
198
-
199
-
200
- end
201
-
202
- def local_tag_exists?(local_repo_dir: nil, tag_name: nil)
203
- # tag_ref = "refs/tags/#{tag_name}"
204
- result = false
205
- current=Dir.pwd
206
-
207
- if File.exist? (local_repo_dir)
208
- Dir.chdir(local_repo_dir)
209
- res_data = git!(%W(-C #{local_repo_dir} tag --list #{tag_name}))
210
- result = !res_data.nil? && !res_data.empty?
211
- else
212
- result = false
213
- end
214
- Dir.chdir(current)
215
- return result
216
- end
217
-
218
- def git_latest_commit_id(local_repo_dir:nil)
219
-
220
- current=Dir.pwd
221
-
222
- unless File.exist?(File::join(local_repo_dir, ".git"))
223
- return nil
224
- end
225
-
226
- commit_id = nil
227
-
228
- if File.exist?(local_repo_dir)
229
- Dir.chdir(local_repo_dir)
230
- current_branch = git!(%W(-C #{local_repo_dir} rev-parse --abbrev-ref HEAD)).strip
231
- # puts "current_branch: #{current_branch}"
232
-
233
- # git log -n 1 --pretty=format:"commit %H"
234
- # format_str = "commit %H"
235
- # latest_log_info = git!(%W(-C #{current} log -n 1 --pretty=#{format_str} #{current_branch})).strip
236
- commit_id = git!(%W(-C #{local_repo_dir} rev-parse #{current_branch})).strip
237
- end
238
- Dir.chdir(current)
239
-
240
- return commit_id
241
- end
242
-
243
- def getcode_to_dir(reponame:nil, remote_url:nil, path: nil, new_branch:"master", new_tag: nil)
244
-
245
- current=Dir.pwd
246
- local_repo_dir = File::join(path, reponame)
247
-
248
- Funlog.instance.fancyinfo_update("开始更新仓库:#{local_repo_dir}...")
249
-
250
- begin
251
-
252
-
253
- if !reponame.empty? && !remote_url.empty? && !path.empty?
254
-
255
- if File.exist?(local_repo_dir)
256
- Dir.chdir(local_repo_dir)
257
-
258
- remote_info = git!(%W(remote -v))
259
- if remote_info.include?("git.coding.net")
260
- current_branch = git!(%W(-C #{local_repo_dir} rev-parse --abbrev-ref HEAD)).strip
261
- git!(%W(remote remove origin))
262
- git!(%W(remote add origin #{remote_url}))
263
- args = %W(-C #{local_repo_dir} fetch origin)
264
- args.push('--progress')
265
- git!(args)
266
- git!(%W(-C #{local_repo_dir} branch --set-upstream-to=origin/#{current_branch} #{current_branch}))
267
- end
268
-
269
- git!(%W(-C #{local_repo_dir} fetch origin --progress))
270
- else
271
- git! ['clone', remote_url, local_repo_dir]
272
- end
273
-
274
- Dir.chdir(local_repo_dir)
275
- current_branch = git!(%W(-C #{local_repo_dir} rev-parse --abbrev-ref HEAD)).strip
276
- if current_branch.eql?(new_branch)
277
- git!(%W(-C #{local_repo_dir} reset --hard origin/#{new_branch}))
278
- git!(%W(-C #{local_repo_dir} branch --set-upstream-to=origin/#{new_branch} #{new_branch}))
279
- git!(%W(-C #{local_repo_dir} pull))
280
-
281
- else
282
- git!(%W(-C #{local_repo_dir} clean -fd))
283
- if local_branch_exists?(local_repo_dir:local_repo_dir, branch:new_branch)
284
- git!(%W(-C #{local_repo_dir} checkout #{new_branch}))
285
- else
286
- if !remote_branch_exists?(local_repo_dir:local_repo_dir, branch:new_branch)
287
- git!(%W(-C #{local_repo_dir} checkout -b #{new_branch}))
288
- else
289
- raise Informative, "仓库中的#{new_branch}分支不存在 !!!"
290
- end
291
- end
292
- git!(%W(-C #{local_repo_dir} branch --set-upstream-to=origin/#{new_branch} #{new_branch}))
293
- git!(%W(-C #{local_repo_dir} pull))
294
- end
295
-
296
- if !new_tag.nil? && new_tag != ""
297
- if !new_tag.nil? && new_tag != "" && local_tag_exists?(local_repo_dir:local_repo_dir, tag_name:new_tag)
298
- puts "tag : #{new_tag} is exist !!!"
299
- git!(%W(-C #{local_repo_dir} checkout #{new_tag}))
300
- else
301
- raise Informative, "tag #{new_tag} is not exist !!!"
302
- end
303
- end
304
-
305
- end
306
- $stdin.flush
307
- Funlog.instance.fancyinfo_success("仓库#{local_repo_dir}更新完成!")
308
- rescue StandardError => e
309
- Funlog.instance.fancyinfo_error("仓库#{local_repo_dir}更新失败!")
310
- raise Informative, e.to_s
311
- end
312
-
313
- Dir.chdir(current)
314
- return local_repo_dir
315
- end
316
-
317
- def get_repo_base_name(repo_url:nil)
318
- temp_url = String.new(repo_url)
319
- index = temp_url.rindex('/')
320
- temp_url = temp_url.slice(index + 1, temp_url.length)
321
- base_name = temp_url.gsub!(/\.git/, "")
322
- return base_name
323
- end
324
-
325
- def clong_buildconfig_repo(repo_name:nil)
326
-
327
-
328
- pindo_dir = File::expand_path(Pindoconfig.instance.pindo_dir)
329
- if !File.exist?(pindo_dir)
330
- FileUtils.mkdir(pindo_dir)
331
- end
332
-
333
- repo_org_name = Pindoconfig.instance.build_deploy_org
334
-
335
- git_repo_file = File.join(Pindoconfig.instance.pindo_env_configdir, "git_base_url.json")
336
- git_repo_json = JSON.parse(File.read(git_repo_file))
337
- if repo_name && git_repo_json && git_repo_json[repo_name]
338
- repo_org_name = git_repo_json[repo_name]
339
- end
340
-
341
- url = File.join("https://gitee.com", repo_org_name, repo_name + ".git")
342
- getcode_to_dir(reponame:repo_name, remote_url: url, path:pindo_dir)
343
- config_repo_dir = File.join(pindo_dir, repo_name)
344
-
345
-
346
-
347
- return config_repo_dir
348
- end
349
-
350
- def clone_pindo_common_config_repo(force_delete:false)
351
- pindo_dir = File::expand_path(Pindoconfig.instance.pindo_dir)
352
- if !File.exist?(pindo_dir)
353
- FileUtils.mkdir(pindo_dir)
354
- end
355
-
356
- common_config_dir_basename = get_repo_base_name(repo_url:Pindoconfig.instance.pindo_common_config_giturl)
357
- config_repo_dir = File.join(pindo_dir, common_config_dir_basename)
358
- if force_delete
359
- if File.exist?(config_repo_dir)
360
- FileUtils.rm_rf(config_repo_dir)
361
- end
362
- end
363
- getcode_to_dir(reponame:common_config_dir_basename, remote_url:Pindoconfig.instance.pindo_common_config_giturl, path:pindo_dir)
364
-
365
- return config_repo_dir
366
- end
367
-
368
- def clone_pindo_env_config_repo(force_delete:false)
369
- pindo_dir = File::expand_path(Pindoconfig.instance.pindo_dir)
370
- if !File.exist?(pindo_dir)
371
- FileUtils.mkdir(pindo_dir)
372
- end
373
-
374
- env_config_dir_basename = get_repo_base_name(repo_url:Pindoconfig.instance.pindo_env_config_giturl)
375
- config_repo_dir = File.join(pindo_dir, env_config_dir_basename)
376
- if force_delete
377
- if File.exist?(config_repo_dir)
378
- FileUtils.rm_rf(config_repo_dir)
379
- end
380
- end
381
- getcode_to_dir(reponame:env_config_dir_basename, remote_url:Pindoconfig.instance.pindo_env_config_giturl, path:pindo_dir)
382
- return config_repo_dir
383
- end
384
-
385
- def clone_devclang_repo
386
- pindo_dir = File::expand_path(Pindoconfig.instance.pindo_dir)
387
- if !File.exist?(pindo_dir)
388
- FileUtils.mkdir(pindo_dir)
389
- end
390
-
391
- getcode_to_dir(reponame:"confuseclang", remote_url:Pindoconfig.instance.dev_clang_giturl, path:pindo_dir)
392
-
393
- config_repo_dir = File.join(pindo_dir, "confuseclang")
394
- return config_repo_dir
395
- end
396
-
397
- def clone_clang_repo
398
- pindo_dir = File::expand_path(Pindoconfig.instance.pindo_dir)
399
- if !File.exist?(pindo_dir)
400
- FileUtils.mkdir(pindo_dir)
401
- end
402
-
403
- getcode_to_dir(reponame:"deployclang", remote_url:Pindoconfig.instance.deploy_clang_giturl, path:pindo_dir)
404
-
405
- config_repo_dir = File.join(pindo_dir, "deployclang")
406
- return config_repo_dir
407
- end
408
-
409
- def git_addpush_repo(path:nil, message:"res", commit_file_params:nil)
410
- current=Dir.pwd
411
- Dir.chdir(path)
412
- begin
413
- if !commit_file_params.nil? && !commit_file_params.empty?
414
- files_list = git! ['ls-files', '--other', '--modified', '--exclude-standard'] || []
415
-
416
- need_commit = false
417
- commit_file_params.each do |file_name|
418
- if !files_list.nil? && files_list.size > 0 && files_list.include?(file_name)
419
- need_commit = true
420
- git! ['add', file_name]
421
- end
422
- end
423
- if need_commit
424
- git! ['commit', '-m ' + "#{message}"]
425
- git! ['push']
426
- else
427
- # puts "\n#{path}\n!!!仓库中文件未发生变化,无需提交!!!\n"
428
- end
429
- else
430
- files_list = git! ['ls-files', '--other', '--modified', '--exclude-standard'] || []
431
- # puts "提交如下内容:"
432
- # puts files_list
433
- if !files_list.nil? && files_list.size > 0
434
- git! ['add', '-A']
435
- git! ['commit', '-m ' + "#{message}"]
436
- git! ['push']
437
- else
438
- puts "\n#{path}\n!!!仓库中文件未发生变化,无需提交!!!\n"
439
- end
440
- end
441
-
442
- rescue => error
443
- # puts(error.to_s)
444
- raise Informative, "\n#{path}\n 仓库失败 !!!"
445
- end
446
-
447
-
448
- Dir.chdir(current)
449
- end
450
-
451
-
452
-
453
- # 处理未提交的文件
454
- # @param project_dir [String] 项目目录路径
455
- # @raise [Informative] 当用户选择退出或需要手动处理文件时抛出
456
- def process_need_add_files(project_dir:nil)
457
- raise ArgumentError, "项目目录不能为空" if project_dir.nil?
458
-
459
- current_project_dir = project_dir
460
- origin_path = Dir.pwd
461
-
462
- begin
463
- Dir.chdir(current_project_dir)
464
-
465
- # 获取当前分支信息
466
- coding_branch = git!(%W(-C #{current_project_dir} rev-parse --abbrev-ref HEAD)).strip
467
- # 重置暂存区
468
- git!(%W(-C #{current_project_dir} restore --staged #{current_project_dir}))
469
-
470
- # 获取未跟踪和已修改的文件
471
- files_list = git!(%W(-C #{current_project_dir} ls-files --other --modified --exclude-standard)) || []
472
-
473
- if files_list.nil? || files_list.empty?
474
- return
475
- end
476
-
477
- # 显示文件状态
478
- display_file_status(coding_branch, files_list)
479
-
480
- # 处理用户选择
481
- process_user_choice(current_project_dir, coding_branch)
482
-
483
- ensure
484
- Dir.chdir(origin_path)
485
- end
486
- end
487
-
488
- private
489
-
490
- def display_file_status(branch, files)
491
- puts "═" * 60
492
- puts "⚠️ 警告:检测到未提交的文件".red
493
- puts "═" * 60
494
- puts
495
- puts "当前所在分支: #{branch}".red
496
- puts "以下文件尚未提交到 Git:".red
497
- puts
498
-
499
- # 将文件列表分行并用红色显示
500
- if files.is_a?(String)
501
- files.split("\n").each do |file|
502
- puts " • #{file}".red unless file.empty?
503
- end
504
- else
505
- files.each do |file|
506
- puts " • #{file}".red unless file.empty?
507
- end
508
- end
509
-
510
- puts
511
- puts "═" * 60
512
- end
513
-
514
- def process_user_choice(project_dir, branch)
515
- process_types = ["全部提交", "全部删除", "先退出,手动来处理退出"]
516
- cli = HighLine.new
517
- menu_choice = "None"
518
-
519
- cli.choose do |menu|
520
- menu.header = "对以上未提交的文件, 有下列处理方式".red
521
- menu.prompt = "请选择如何处理(1/2/3...):".yellow
522
- process_types.each do |item|
523
- menu.choice(item) { |choice| menu_choice = choice }
524
- end
525
- end
526
-
527
- puts "选择的处理方式为: #{menu_choice}"
528
-
529
- case menu_choice
530
- when "全部提交"
531
- handle_commit_all(project_dir, branch)
532
- when "全部删除"
533
- handle_delete_all(project_dir, branch)
534
- else
535
- raise Informative, "请手动处理未提交的文件!!!"
536
- end
537
- end
538
-
539
- def handle_commit_all(project_dir, branch)
540
- message = ask('请输入提交的备注信息: ') || "release code"
541
-
542
- Funlog.instance.fancyinfo_start("开始提交文件...")
543
- git! ['add', '-A']
544
- git! ['commit', '-m', message]
545
- git!(%W(-C #{project_dir} fetch origin))
546
- Funlog.instance.fancyinfo_success("commit文件完成!")
547
- Funlog.instance.fancyinfo_start("正在push...")
548
- if remote_branch_exists?(local_repo_dir: project_dir, branch: branch)
549
- git!(%W(-C #{project_dir} branch --set-upstream-to=origin/#{branch} #{branch}))
550
- git! ['pull']
551
- git! ['push']
552
- else
553
- git!(%W(-C #{project_dir} push --set-upstream origin #{branch}))
554
- end
555
- Funlog.instance.fancyinfo_success("push文件完成!")
556
- end
557
- def handle_delete_all(project_dir, branch)
558
- answer = agree("有未提交的文件,确认删除?(Y/n):")
559
- unless answer
560
- raise Informative, "请手动处理未提交的文件!!!"
561
- end
562
-
563
- git!(%W(-C #{project_dir} reset --hard))
564
- git!(%W(-C #{project_dir} clean -df))
565
- git!(%W(-C #{project_dir} branch --set-upstream-to=origin/#{branch} #{branch}))
566
- git!(%W(-C #{project_dir} pull))
567
- end
568
-
569
- # 获取最新的版本标签
570
- # @param project_dir [String] 项目目录路径
571
- # @return [String, nil] 返回最新的版本标签,如果没有则返回nil
572
- def get_latest_version_tag(project_dir:nil, tag_prefix:"v")
573
- return nil unless project_dir && File.exist?(project_dir)
574
-
575
- begin
576
- # 获取所有以v开头的标签并按版本号排序
577
- tags = git!(%W(-C #{project_dir} tag -l #{tag_prefix}*)).split("\n")
578
- return nil if tags.empty?
579
-
580
- # 按版本号排序(假设格式为 v1.2.3)
581
- sorted_tags = tags.sort_by do |tag|
582
- tag.gsub(tag_prefix, '').split('.').map(&:to_i)
583
- end
584
-
585
- sorted_tags.last
586
- rescue StandardError => e
587
- nil
588
- end
589
- end
590
-
591
- # 创建新的版本标签
592
- # @param project_dir [String] 项目目录路径
593
- # @param tag_prefix [String] 标签前缀
594
- # @param increment_mode [String] 版本号增加模式 ("major", "minor", "patch")
595
- # @param force_retag [Boolean] 是否强制重新打最新的tag
596
- # @return [String] 返回新创建的版本标签或已存在的标签
597
- # @raise [ArgumentError] 当项目目录不存在时抛出
598
- def create_next_version_tag(project_dir:nil, tag_prefix:"v", increment_mode:"minor", force_retag:false)
599
- raise ArgumentError, "项目目录不能为空" if project_dir.nil?
600
-
601
- latest_tag = get_latest_version_tag(project_dir: project_dir, tag_prefix: tag_prefix)
602
- if latest_tag.nil?
603
- latest_tag = get_latest_version_tag(project_dir: project_dir, tag_prefix: "")
604
- end
605
- # 如果没有任何tag,创建初始版本
606
- if latest_tag.nil?
607
- new_tag = tag_prefix + "1.0.0"
608
- add_tag_with_check(local_repo_dir: project_dir, tag_name: new_tag, check: false)
609
- Funlog.instance.fancyinfo_success("创建新tag完成!")
610
- return new_tag
611
- end
612
-
613
- if is_tag_at_head?(git_root_dir: project_dir, tag_name: latest_tag)
614
- return latest_tag
615
- end
616
-
617
- if force_retag && latest_tag
618
- # 删除并重新打tag
619
- Funlog.instance.fancyinfo_update("正在重新打tag: #{latest_tag}")
620
- remove_tag(local_repo_dir: project_dir, tag_name: latest_tag)
621
- add_tag_with_check(local_repo_dir: project_dir, tag_name: latest_tag)
622
- Funlog.instance.fancyinfo_success("重新打tag完成!")
623
- return latest_tag
624
- end
625
-
626
- # 解析当前版本号
627
- version_numbers = latest_tag.gsub(tag_prefix, '').split('.').map(&:to_i)
628
- major, minor, patch = version_numbers
629
-
630
- # 根据increment_mode增加版本号
631
- case increment_mode
632
- when "major"
633
- major += 1
634
- minor = 0
635
- patch = 0
636
- when "minor"
637
- minor += 1
638
- patch = 0
639
- when "patch"
640
- patch += 1
641
- end
642
-
643
- new_tag = tag_prefix + "#{major}.#{minor}.#{patch}"
644
- add_tag_with_check(local_repo_dir: project_dir, tag_name: new_tag, check: false)
645
- Funlog.instance.fancyinfo_success("创建新tag完成!")
646
- new_tag
647
- end
648
-
649
- # 检查仓库是否有未提交的更改(包括未暂存和已暂存的更改)
650
- # @param git_root_dir [String] 项目目录路径
651
- # @return [Boolean] 如果有未提交的更改返回true,否则返回false
652
- def has_uncommitted_changes?(git_root_dir:nil)
653
- return false if git_root_dir.nil?
654
-
655
- begin
656
- # 使用 git status --porcelain 检查是否有更改
657
- # 如果输出不为空,说明有未提交的更改
658
- status_output = git!(%W(-C #{git_root_dir} status --porcelain)).strip
659
- !status_output.empty?
660
- rescue StandardError => e
661
- false
662
- end
663
- end
664
-
665
- # 检查tag是否在指定的commit上
666
- # @param git_root_dir [String] 项目目录路径
667
- # @param tag_name [String] 标签名称
668
- # @return [Boolean] 如果tag在当前HEAD上返回true,否则返回false
669
- def is_tag_at_head?(git_root_dir:nil, tag_name:nil)
670
- return false if git_root_dir.nil? || tag_name.nil?
671
-
672
- begin
673
- # 获取tag的commit hash
674
- tag_commit = git!(%W(-C #{git_root_dir} rev-parse #{tag_name})).strip
675
- # 获取HEAD的commit hash
676
- head_commit = git!(%W(-C #{git_root_dir} rev-parse HEAD)).strip
677
-
678
- # 比较两个commit hash是否相同
679
- tag_commit == head_commit
680
- rescue StandardError => e
681
- false
682
- end
683
- end
684
-
685
- end
686
- end