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