pindo 5.13.1 → 5.13.2
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/git_handler.rb +692 -0
- data/lib/pindo/command/android/autobuild.rb +2 -2
- data/lib/pindo/command/appstore/adhocbuild.rb +258 -311
- data/lib/pindo/command/appstore/autobuild.rb +203 -0
- data/lib/pindo/command/appstore/autoresign.rb +35 -17
- data/lib/pindo/command/appstore/bundleid.rb +120 -0
- data/lib/pindo/command/appstore/cert.rb +212 -0
- data/lib/pindo/command/appstore/configproj.rb +81 -0
- data/lib/pindo/command/{deploy → appstore}/getitcinfo.rb +76 -91
- data/lib/pindo/command/appstore/iap.rb +788 -24
- data/lib/pindo/command/appstore/initconfig.rb +105 -0
- data/lib/pindo/command/appstore/itcapp.rb +95 -13
- data/lib/pindo/command/{deploy → appstore}/itcinfo.rb +90 -118
- data/lib/pindo/command/appstore/pem.rb +136 -0
- data/lib/pindo/command/appstore/pullconfig.rb +99 -0
- data/lib/pindo/command/appstore/quswark.rb +87 -0
- data/lib/pindo/command/appstore/quswauth.rb +67 -0
- data/lib/pindo/command/appstore/tag.rb +77 -0
- data/lib/pindo/command/appstore.rb +13 -1
- data/lib/pindo/command/env/quarkenv.rb +11 -13
- data/lib/pindo/command/env/swarkenv.rb +11 -16
- data/lib/pindo/command/ios/autobuild.rb +64 -43
- data/lib/pindo/command/ios/autoresign.rb +34 -19
- data/lib/pindo/command/ios/build.rb +9 -6
- data/lib/pindo/command/ios/cert.rb +27 -20
- data/lib/pindo/command/jps/upload.rb +3 -3
- data/lib/pindo/command/unity/autobuild.rb +2 -2
- data/lib/pindo/command/utils/clearcert.rb +2 -17
- data/lib/pindo/command/{deploy → utils}/fabric.rb +13 -13
- data/lib/pindo/command/utils/renewcert.rb +62 -38
- data/lib/pindo/command/utils/renewproj.rb +0 -3
- data/lib/pindo/command/{deploy → utils}/updateconfig.rb +6 -7
- data/lib/pindo/command/utils.rb +2 -0
- data/lib/pindo/command/web/autobuild.rb +2 -2
- data/lib/pindo/command.rb +30 -3
- data/lib/pindo/config/build_info_manager.rb +176 -0
- data/lib/pindo/config/ios_config_parser.rb +404 -0
- data/lib/pindo/module/android/android_config_helper.rb +9 -5
- data/lib/pindo/module/appstore/bundleid_helper.rb +349 -0
- data/lib/pindo/module/appstore/itcapp_helper.rb +228 -0
- data/lib/pindo/module/build/build_helper.rb +12 -0
- data/lib/pindo/module/build/swark_helper.rb +116 -77
- data/lib/pindo/module/cert/cert_helper.rb +74 -0
- data/lib/pindo/module/cert/pem_helper.rb +72 -0
- data/lib/pindo/module/cert/{xcodecerthelper.rb → xcode_cert_helper.rb} +208 -6
- data/lib/pindo/module/task/model/appstore/appstore_task.rb +18 -0
- data/lib/pindo/module/task/model/appstore/appstore_upload_ipa_task.rb +151 -0
- data/lib/pindo/module/task/model/appstore/appstore_upload_metadata_task.rb +250 -0
- data/lib/pindo/module/task/model/appstore/appstore_upload_screenshot_task.rb +276 -0
- data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +210 -0
- data/lib/pindo/module/task/model/build/{android_dev_build_task.rb → android_build_dev_task.rb} +2 -2
- data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +210 -0
- data/lib/pindo/module/task/model/build/android_build_task.rb +13 -0
- data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +197 -0
- data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +367 -0
- data/lib/pindo/module/task/model/build/{ios_dev_build_task.rb → ios_build_dev_task.rb} +37 -27
- data/lib/pindo/module/task/model/build/ios_build_task.rb +13 -0
- data/lib/pindo/module/task/model/build/{web_dev_build_task.rb → web_build_dev_task.rb} +1 -1
- data/lib/pindo/module/task/model/build_task.rb +15 -12
- data/lib/pindo/module/task/model/jps_resign_task.rb +185 -0
- data/lib/pindo/module/task/model/{upload_task.rb → jps_upload_task.rb} +3 -3
- data/lib/pindo/module/task/model/unity_export_task.rb +3 -1
- data/lib/pindo/module/unity/unity_helper.rb +2 -1
- data/lib/pindo/module/xcode/ipa_resign_helper.rb +210 -0
- data/lib/pindo/module/xcode/{xcodeappconfig.rb → xcode_app_config.rb} +79 -0
- data/lib/pindo/module/xcode/xcode_build_config.rb +152 -17
- data/lib/pindo/module/xcode/xcode_build_helper.rb +151 -1
- data/lib/pindo/module/xcode/xcode_swark_helper.rb +341 -0
- data/lib/pindo/options/core/global_options_state.rb +268 -0
- data/lib/pindo/options/core/option_configuration.rb +206 -0
- data/lib/pindo/options/core/option_initializer.rb +51 -0
- data/lib/pindo/options/core/option_item.rb +144 -0
- data/lib/pindo/options/core/option_value_parser.rb +54 -0
- data/lib/pindo/options/groups/build_options.rb +60 -0
- data/lib/pindo/options/groups/jps_options.rb +70 -0
- data/lib/pindo/options/groups/option_group.rb +73 -0
- data/lib/pindo/options/helpers/bundleid_selector.rb +103 -0
- data/lib/pindo/options/options.rb +14 -0
- data/lib/pindo/version.rb +1 -1
- metadata +49 -40
- data/lib/pindo/command/appstore/import.rb +0 -259
- data/lib/pindo/command/deploy/build.rb +0 -250
- data/lib/pindo/command/deploy/bundleid.rb +0 -259
- data/lib/pindo/command/deploy/cert.rb +0 -202
- data/lib/pindo/command/deploy/check.rb +0 -93
- data/lib/pindo/command/deploy/configproj.rb +0 -120
- data/lib/pindo/command/deploy/confusecode.rb +0 -262
- data/lib/pindo/command/deploy/confuseproj.rb +0 -122
- data/lib/pindo/command/deploy/iap.rb +0 -826
- data/lib/pindo/command/deploy/initconfig.rb +0 -138
- data/lib/pindo/command/deploy/itcapp.rb +0 -146
- data/lib/pindo/command/deploy/pem.rb +0 -55
- data/lib/pindo/command/deploy/pullconfig.rb +0 -56
- data/lib/pindo/command/deploy/pushconfig.rb +0 -93
- data/lib/pindo/command/deploy/quswark.rb +0 -156
- data/lib/pindo/command/deploy/quswauth.rb +0 -76
- data/lib/pindo/command/deploy/reportbug.rb +0 -145
- data/lib/pindo/command/deploy/resign.rb +0 -300
- data/lib/pindo/command/deploy/tag.rb +0 -108
- data/lib/pindo/command/deploy/uploadipa.rb +0 -73
- data/lib/pindo/command/deploy.rb +0 -42
- data/lib/pindo/command/dev/autobuild.rb +0 -117
- data/lib/pindo/command/dev/build.rb +0 -94
- data/lib/pindo/command/dev/debug.rb +0 -112
- data/lib/pindo/module/task/model/build/android_release_build_task.rb +0 -29
- data/lib/pindo/module/task/model/build/ios_adhoc_build_task.rb +0 -53
- data/lib/pindo/module/task/model/build/ios_release_build_task.rb +0 -53
- data/lib/pindo/options/appconfigoptions.rb +0 -24
- data/lib/pindo/options/deployoptions.rb +0 -372
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: efb0e602f3e0c11eca368669749cfc80c51854a3d7563dfe7d2a66e639507c12
|
|
4
|
+
data.tar.gz: 77df00465e5213f16b11241564184a969a43d49385476930a395524a5cf55764
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c3c3826097cdf84681875828afe7c41af58c5422b9371ea7b23ebb994de3131b04d851099abcd91b548356f227422b67800a5fdb599ba9d863a733d5a3662618
|
|
7
|
+
data.tar.gz: 4b9275fe85f02ea8438367de51f950dbef8c9ab794d9a541844e4ec7875093e7c89ff0e173fe01dbc087a28ac416c5a1795941dacc22044ef4308544e9587268
|
|
@@ -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
|