pindo 4.7.4 → 4.7.6
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/aeshelper.rb +11 -29
- data/lib/pindo/client/aws3sclient.rb +0 -1
- data/lib/pindo/client/httpclient.rb +13 -2
- data/lib/pindo/client/pgyeruploadclient.rb +291 -0
- data/lib/pindo/command/deploy/bundleid.rb +1 -1
- data/lib/pindo/command/deploy/cert.rb +0 -1
- data/lib/pindo/command/deploy/quswark.rb +0 -1
- data/lib/pindo/command/dev/createbuild.rb +0 -1
- data/lib/pindo/command/utils/device.rb +65 -61
- data/lib/pindo/module/cert/certhelper.rb +1 -1
- data/lib/pindo/module/pgyer/pgyerhelper.rb +6 -2
- data/lib/pindo/version.rb +3 -3
- metadata +36 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d67d718e2507fa330a19b44df9b7abefb0ae417dac58a4c5d431cf3c9f63dc13
|
4
|
+
data.tar.gz: 3377d33ac73c5c5024beb48de2fa30d0b1813f0637eae2d990a30eb0ae37f9f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '01038d7dfe0a9b0705056798db4cdbd6897baadb944c9d9808910526a7dead73d5f5573efa73bd0ef9d7dad5dd0e14c28628046b5dbb658571f5865afff2cf86'
|
7
|
+
data.tar.gz: c23e4788703dc11aa106d94c12c8c28ade2d5e0c72241b77bd75263b1e36115abb0a4ff1b633d37ccd9a784f51252f45e1ea8899ce676a91e832b775d386b760
|
data/lib/pindo/base/aeshelper.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
|
1
2
|
require 'openssl'
|
3
|
+
require 'match'
|
2
4
|
|
3
5
|
module Pindo
|
4
|
-
|
6
|
+
|
5
7
|
|
6
8
|
module AESHelper
|
7
9
|
|
@@ -17,7 +19,7 @@ module Pindo
|
|
17
19
|
|
18
20
|
unless password
|
19
21
|
password = FastlaneCore::Helper.ask_password(message: "请输入证书仓库的加密密码: ", confirm: true)
|
20
|
-
Security::InternetPassword.add(server_name, "", password)
|
22
|
+
Security::InternetPassword.add(server_name, "", password)
|
21
23
|
end
|
22
24
|
return password
|
23
25
|
end
|
@@ -54,17 +56,9 @@ module Pindo
|
|
54
56
|
def self.encrypt_specific_file(src_file: nil, password: nil, output_dir: nil)
|
55
57
|
UI.user_error!("No password supplied") if password.to_s.strip.length == 0
|
56
58
|
|
57
|
-
data_to_encrypt = File.binread(path)
|
58
|
-
salt = SecureRandom.random_bytes(8)
|
59
|
-
|
60
|
-
# The :: is important, as there is a name clash
|
61
|
-
cipher = ::OpenSSL::Cipher.new('AES-256-CBC')
|
62
|
-
cipher.encrypt
|
63
|
-
cipher.pkcs5_keyivgen(password, salt, 1, "MD5")
|
64
|
-
encrypted_data = "Salted__" + salt + cipher.update(data_to_encrypt) + cipher.final
|
65
|
-
|
66
59
|
destfile = File.join(output_dir, File.basename(src_file))
|
67
|
-
|
60
|
+
e = Match::Encryption::MatchFileEncryption.new
|
61
|
+
e.encrypt(file_path: src_file, password: password, output_path:destfile)
|
68
62
|
return destfile
|
69
63
|
rescue error
|
70
64
|
puts path
|
@@ -74,32 +68,20 @@ module Pindo
|
|
74
68
|
# The encryption parameters in this implementations reflect the old behavior which depended on the users' local OpenSSL version
|
75
69
|
# 1.0.x OpenSSL and earlier versions use MD5, 1.1.0c and newer uses SHA256, we try both before giving an error
|
76
70
|
def self.decrypt_specific_file(src_file: nil, password: nil, output_dir: nil, hash_algorithm: "MD5")
|
77
|
-
|
78
|
-
begin
|
79
|
-
stored_data = Base64.decode64(File.read(src_file))
|
80
|
-
salt = stored_data[8..15]
|
81
|
-
data_to_decrypt = stored_data[16..-1]
|
82
|
-
|
83
|
-
decipher = ::OpenSSL::Cipher.new('AES-256-CBC')
|
84
|
-
decipher.decrypt
|
85
|
-
decipher.pkcs5_keyivgen(password, salt, 1, hash_algorithm)
|
86
71
|
|
87
|
-
|
72
|
+
begin
|
88
73
|
destfile = File.join(output_dir, File.basename(src_file))
|
89
|
-
|
74
|
+
e = Match::Encryption::MatchFileEncryption.new
|
75
|
+
e.decrypt(file_path: src_file, password: password, output_path:destfile)
|
90
76
|
return destfile
|
91
77
|
rescue => error
|
92
|
-
fallback_hash_algorithm = "SHA256"
|
93
|
-
if hash_algorithm != fallback_hash_algorithm
|
94
|
-
decrypt_specific_file(src_file: src_file, password: password, hash_algorithm: fallback_hash_algorithm)
|
95
|
-
else
|
96
78
|
Funlog.instance.fancyinfo_error("解析文件失败: #{src_file}")
|
79
|
+
raise Informative, error
|
97
80
|
return nil
|
98
|
-
end
|
99
81
|
end
|
100
82
|
end
|
101
83
|
|
102
|
-
end
|
103
84
|
|
104
85
|
|
86
|
+
end
|
105
87
|
end
|
@@ -3,6 +3,7 @@ require 'uri'
|
|
3
3
|
require 'json'
|
4
4
|
require 'faraday'
|
5
5
|
require 'pindo/base/aeshelper'
|
6
|
+
require 'faraday/retry'
|
6
7
|
|
7
8
|
module Pindo
|
8
9
|
|
@@ -24,8 +25,18 @@ module Pindo
|
|
24
25
|
password: ENV['HTTP_PROXY_PASSWORD']
|
25
26
|
}
|
26
27
|
|
27
|
-
|
28
|
-
|
28
|
+
retry_options = {
|
29
|
+
max: 3, # Retry a failed request up to 5 times
|
30
|
+
interval: 0.5, # First retry after 0.5s
|
31
|
+
backoff_factor: 2, # Double the delay for each subsequent retry
|
32
|
+
interval_randomness: 0.5, # Specify "jitter" of up to 50% of interval
|
33
|
+
}
|
34
|
+
|
35
|
+
con = Faraday.new do |config|
|
36
|
+
config.request :retry, retry_options
|
37
|
+
config.proxy = proxy_options.compact if proxy_options[:uri]
|
38
|
+
end
|
39
|
+
|
29
40
|
con
|
30
41
|
end
|
31
42
|
|
@@ -0,0 +1,291 @@
|
|
1
|
+
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
require 'faraday'
|
5
|
+
require 'securerandom'
|
6
|
+
require 'pindo/base/aeshelper'
|
7
|
+
require 'typhoeus'
|
8
|
+
|
9
|
+
module Pindo
|
10
|
+
|
11
|
+
|
12
|
+
class PgyerUploadClient
|
13
|
+
|
14
|
+
|
15
|
+
attr_accessor :token
|
16
|
+
|
17
|
+
attr_accessor :region
|
18
|
+
attr_accessor :bucket_name
|
19
|
+
|
20
|
+
attr_accessor :default_url
|
21
|
+
attr_accessor :attach_url
|
22
|
+
|
23
|
+
|
24
|
+
def initialize()
|
25
|
+
|
26
|
+
begin
|
27
|
+
|
28
|
+
@pgyer_token_file = File.join(File::expand_path(Pindoconfig.instance.pindo_dir), ".pgyer_token")
|
29
|
+
config_file = File.join(File::expand_path(Pindoconfig.instance.pindo_common_configdir), "pgyer_client_config.json")
|
30
|
+
config_json = JSON.parse(File.read(config_file))
|
31
|
+
|
32
|
+
@region = config_json["region"]
|
33
|
+
@bucket_name = config_json["bucket_name"]
|
34
|
+
@default_url = config_json["default_url"]
|
35
|
+
@attach_url = config_json["attach_url"]
|
36
|
+
|
37
|
+
@use_local_wechat_url = config_json["use_local_wechat_url"]
|
38
|
+
@baseurl = config_json["pgyerapps_base_url"]
|
39
|
+
@request_config = config_json["pgyerapps_req_config"]
|
40
|
+
@pgyer_aes_key = config_json["pgyerapps_aes_key"]
|
41
|
+
|
42
|
+
@token = load_token
|
43
|
+
|
44
|
+
rescue => error
|
45
|
+
raise Informative, "PgyerUploadClient 初始化失败!"
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
def load_token()
|
51
|
+
token = nil
|
52
|
+
if File.exist?(@pgyer_token_file)
|
53
|
+
begin
|
54
|
+
data = File.read(@pgyer_token_file)
|
55
|
+
|
56
|
+
data_string = AESHelper::aes_128_ecb_decrypt(@pgyer_aes_key, data)
|
57
|
+
temp_token = data_string
|
58
|
+
temp_token = JSON.parse(data_string)
|
59
|
+
if !temp_token.nil? && !temp_token["token"].nil? && !temp_token["username"].nil?
|
60
|
+
token = temp_token
|
61
|
+
end
|
62
|
+
rescue => error
|
63
|
+
raise Informative, "PgyerUploadClient 加载pgyer token 失败!!!"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
return token
|
67
|
+
end
|
68
|
+
|
69
|
+
def upload_file(binary_file:nil, isAttach:false)
|
70
|
+
|
71
|
+
extension = File.extname(binary_file)
|
72
|
+
filename = File.basename(binary_file)
|
73
|
+
filesize = File.size(binary_file)
|
74
|
+
size_level = 1024 * 1024
|
75
|
+
file_bytes = File.binread(binary_file)
|
76
|
+
checksum = Digest::MD5.hexdigest(file_bytes)
|
77
|
+
file_uuid = SecureRandom.uuid
|
78
|
+
total_m = sprintf("%.2f", 1.00 * filesize / 1024 /1024 )
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
upload_path = @default_url
|
83
|
+
content_disposition = nil
|
84
|
+
if isAttach
|
85
|
+
upload_path = @default_url + @attach_url
|
86
|
+
content_disposition = "attachment; filename=#{filename}"
|
87
|
+
end
|
88
|
+
|
89
|
+
object_key = upload_path + file_uuid + extension
|
90
|
+
|
91
|
+
puts "文件路径: #{binary_file}"
|
92
|
+
puts "文件大小: #{total_m}M"
|
93
|
+
puts "上传路径: #{object_key}"
|
94
|
+
puts
|
95
|
+
|
96
|
+
|
97
|
+
@upload_total_size = filesize
|
98
|
+
|
99
|
+
|
100
|
+
upload_result = nil
|
101
|
+
|
102
|
+
file_size_param = 1.00 * filesize / 1024 /1024
|
103
|
+
result_data = post_upload_url_req(upload_key:object_key, file_size:file_size_param.ceil)
|
104
|
+
|
105
|
+
upload_id= result_data["data"]["uploadId"]
|
106
|
+
upload_params_list = result_data["data"]["uploadParamsList"]
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
Funlog.instance.fancyinfo_start("开始上传...")
|
111
|
+
|
112
|
+
eTags = []
|
113
|
+
eTags = single_task_upload_data_req(binary_file:binary_file, upload_params_list:upload_params_list)
|
114
|
+
|
115
|
+
result_data = post_upload_finish_req(upload_key:object_key, upload_id:upload_id, eTags:eTags)
|
116
|
+
|
117
|
+
if result_data["code"] == 200
|
118
|
+
upload_result = object_key
|
119
|
+
# set_progress(filesize, filesize)
|
120
|
+
Funlog.instance.fancyinfo_success("文件#{binary_file} 上传成功! 😎😎😎")
|
121
|
+
else
|
122
|
+
upload_result = nil
|
123
|
+
Funlog.instance.fancyinfo_error("文件#{binary_file} 上传失败! 😭😭😭")
|
124
|
+
end
|
125
|
+
|
126
|
+
return upload_result
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
def single_task_upload_data_req(binary_file:nil, upload_params_list:nil)
|
131
|
+
filesize = File.size(binary_file)
|
132
|
+
eTags = []
|
133
|
+
if !upload_params_list.nil? && upload_params_list.length > 0
|
134
|
+
for i in 0..upload_params_list.length-1 do
|
135
|
+
part_result = single_task_upload_part_data_req(filesize:filesize, binary_file:binary_file, upload_url:upload_params_list[i]["signedUrl"], part_no:upload_params_list[i]["partNo"])
|
136
|
+
eTag_item = { partNumber: upload_params_list[i]["partNo"], tag: part_result}
|
137
|
+
eTags << eTag_item
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
return eTags
|
142
|
+
end
|
143
|
+
|
144
|
+
def single_task_upload_part_data_req(filesize:nil, binary_file:nil, upload_url:nil, part_no:nil)
|
145
|
+
|
146
|
+
# puts "start upload part #{part_no} -----"
|
147
|
+
|
148
|
+
file_size_ele = 1024 * 1024 * 5 #5M
|
149
|
+
start_position = file_size_ele * (part_no -1)
|
150
|
+
if part_no * file_size_ele > filesize
|
151
|
+
read_length = filesize - start_position
|
152
|
+
else
|
153
|
+
read_length = file_size_ele
|
154
|
+
end
|
155
|
+
|
156
|
+
file = File.open(binary_file, "rb")
|
157
|
+
file.seek(start_position)
|
158
|
+
put_data = file.read(read_length)
|
159
|
+
|
160
|
+
|
161
|
+
request = nil
|
162
|
+
|
163
|
+
proxy_options = {
|
164
|
+
proxy: ENV['http_proxy'] || ENV['https_proxy'],
|
165
|
+
proxyuserpwd: "#{ENV['HTTP_PROXY_USER']}:#{ENV['HTTP_PROXY_PASSWORD']}"
|
166
|
+
}
|
167
|
+
|
168
|
+
if proxy_options[:proxy]
|
169
|
+
request = Typhoeus::Request.new(
|
170
|
+
upload_url,
|
171
|
+
method: :put,
|
172
|
+
proxy: proxy_options[:proxy],
|
173
|
+
proxyuserpwd: proxy_options[:proxyuserpwd],
|
174
|
+
:body => put_data,
|
175
|
+
:headers => {
|
176
|
+
'Content-Type' => 'application/octet-stream',
|
177
|
+
'token' => @token['token'],
|
178
|
+
'Content-Length' => read_length.to_s
|
179
|
+
}
|
180
|
+
)
|
181
|
+
else
|
182
|
+
request = Typhoeus::Request.new(
|
183
|
+
upload_url,
|
184
|
+
method: :put,
|
185
|
+
:body => put_data,
|
186
|
+
:headers => {
|
187
|
+
'Content-Type' => 'application/octet-stream',
|
188
|
+
'token' => @token['token'],
|
189
|
+
'Content-Length' => read_length.to_s
|
190
|
+
}
|
191
|
+
)
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
@upload_num = start_position
|
196
|
+
request.on_progress do |dltotal, dlnow, ultotal, ulnow|
|
197
|
+
# puts "dltotal (#{dltotal}), dlnow (#{dlnow}), ultotal (#{ultotal}), ulnow (#{ulnow})"
|
198
|
+
if ulnow
|
199
|
+
@upload_num = start_position + ulnow
|
200
|
+
set_progress(@upload_num, filesize)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
return_data = nil
|
205
|
+
request.on_complete do |response|
|
206
|
+
if response.success?
|
207
|
+
# puts "on_complete success"
|
208
|
+
return_data = response.headers["ETag"]
|
209
|
+
else
|
210
|
+
# puts "on_complete fail"
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
request.run
|
215
|
+
|
216
|
+
return return_data
|
217
|
+
|
218
|
+
end
|
219
|
+
|
220
|
+
def post_upload_finish_req(upload_key:nil, upload_id:nil, eTags:nil)
|
221
|
+
|
222
|
+
boss_url = @baseurl + @request_config["multi_signed_url_upload"]
|
223
|
+
|
224
|
+
body_params = {
|
225
|
+
functionName:"finish",
|
226
|
+
fileKey:upload_key,
|
227
|
+
uploadId:upload_id,
|
228
|
+
tags:eTags
|
229
|
+
}
|
230
|
+
|
231
|
+
con = HttpClient.create_instance_with_proxy
|
232
|
+
res = con.post do |req|
|
233
|
+
req.url boss_url
|
234
|
+
req.headers['Content-Type'] = 'application/json'
|
235
|
+
req.headers['token'] = @token["token"]
|
236
|
+
req.body = body_params.to_json
|
237
|
+
end
|
238
|
+
|
239
|
+
|
240
|
+
result_data = nil
|
241
|
+
if !res.body.nil?
|
242
|
+
result_data = JSON.parse(res.body)
|
243
|
+
end
|
244
|
+
|
245
|
+
return result_data
|
246
|
+
|
247
|
+
end
|
248
|
+
|
249
|
+
|
250
|
+
def post_upload_url_req(upload_key:nil, file_size:nil)
|
251
|
+
|
252
|
+
# puts "post_upload_url_req start ..."
|
253
|
+
# puts "file_size: #{file_size} MB"
|
254
|
+
boss_url = @baseurl + @request_config["multi_signed_url_upload"]
|
255
|
+
|
256
|
+
body_params = {
|
257
|
+
functionName:"start",
|
258
|
+
fileKey:upload_key,
|
259
|
+
fileSize:file_size
|
260
|
+
}
|
261
|
+
|
262
|
+
con = HttpClient.create_instance_with_proxy
|
263
|
+
res = con.post do |req|
|
264
|
+
req.url boss_url
|
265
|
+
req.headers['Content-Type'] = 'application/json'
|
266
|
+
req.headers['token'] = @token["token"]
|
267
|
+
req.body = body_params.to_json
|
268
|
+
end
|
269
|
+
|
270
|
+
|
271
|
+
result_data = nil
|
272
|
+
if !res.body.nil?
|
273
|
+
result_data = JSON.parse(res.body)
|
274
|
+
end
|
275
|
+
|
276
|
+
# puts JSON.pretty_generate(result_data)
|
277
|
+
|
278
|
+
return result_data
|
279
|
+
|
280
|
+
end
|
281
|
+
|
282
|
+
def set_progress(index_num, total_num, char ='>' )
|
283
|
+
progress_str = sprintf("%.2f", 100.0 * index_num / total_num )
|
284
|
+
total_size = sprintf("%.2f", 1.00 * total_num / 1024 /1024 )
|
285
|
+
index = 40.0 * index_num / total_num
|
286
|
+
upload_message = "已上传:#{progress_str}\%【" + (char * (index/1).floor).ljust(40.0, '_') + "】Total: #{total_size} M"
|
287
|
+
Funlog.instance.fancyinfo_update(upload_message)
|
288
|
+
end
|
289
|
+
|
290
|
+
end
|
291
|
+
end
|
@@ -58,91 +58,93 @@ module Pindo
|
|
58
58
|
|
59
59
|
|
60
60
|
def login
|
61
|
-
Spaceship::Portal.login(pindo_single_config.demo_apple_id)
|
62
|
-
Spaceship::Portal.select_team
|
61
|
+
# Spaceship::Portal.login(pindo_single_config.demo_apple_id)
|
62
|
+
# Spaceship::Portal.select_team
|
63
63
|
end
|
64
64
|
|
65
65
|
def fetch_device
|
66
66
|
|
67
67
|
|
68
|
-
devices = Spaceship::Portal.device.all(include_disabled: true).select do |device|
|
69
|
-
|
70
|
-
end
|
71
|
-
mac_disabled_devices = Spaceship::Portal.device.all(mac: true, include_disabled: true).select do |device|
|
72
|
-
|
73
|
-
end
|
68
|
+
# devices = Spaceship::Portal.device.all(include_disabled: true).select do |device|
|
69
|
+
# device.enabled?
|
70
|
+
# end
|
71
|
+
# mac_disabled_devices = Spaceship::Portal.device.all(mac: true, include_disabled: true).select do |device|
|
72
|
+
# device.enabled?
|
73
|
+
# end
|
74
74
|
|
75
|
-
my_total_devices = {}
|
75
|
+
# my_total_devices = {}
|
76
76
|
|
77
|
-
devices.each do |item|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
77
|
+
# devices.each do |item|
|
78
|
+
# device_item = DeviceItem.new
|
79
|
+
# device_item.name = item.name
|
80
|
+
# device_item.name = device_item.name.downcase
|
81
|
+
# device_item.udid = item.udid
|
82
|
+
# device_item.platform = item.platform
|
83
|
+
# device_item.device_model = item.model
|
84
|
+
# device_item.device_type = item.device_type
|
85
85
|
|
86
|
-
|
87
|
-
|
88
|
-
end
|
86
|
+
# device_item.device_description = ""
|
87
|
+
# my_total_devices[item.udid] = device_item
|
88
|
+
# end
|
89
89
|
|
90
|
-
mac_disabled_devices.each do |item|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
end
|
90
|
+
# mac_disabled_devices.each do |item|
|
91
|
+
# # puts item
|
92
|
+
# device_item = DeviceItem.new
|
93
|
+
# device_item.name = item.name
|
94
|
+
# device_item.name = device_item.name.downcase
|
95
|
+
# device_item.udid = item.udid
|
96
|
+
# device_item.platform = item.platform
|
97
|
+
# device_item.device_model = item.model
|
98
|
+
# device_item.device_type = item.device_type
|
99
|
+
# device_item.device_description = ""
|
100
|
+
# my_total_devices[item.udid] = device_item
|
101
|
+
# end
|
102
102
|
|
103
103
|
|
104
104
|
|
105
|
-
use_devices = read_user_csv()
|
105
|
+
# use_devices = read_user_csv()
|
106
106
|
|
107
|
-
use_devices.each do |key, item|
|
108
|
-
|
107
|
+
# use_devices.each do |key, item|
|
108
|
+
# if !my_total_devices[key].nil?
|
109
109
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
110
|
+
# if !item.device_description.nil?
|
111
|
+
# my_total_devices[key].device_description = item.device_description
|
112
|
+
# end
|
113
|
+
# if my_total_devices[key].device_description.nil? || my_total_devices[key].device_description.eql?("")
|
114
|
+
# my_total_devices[key].device_description = item.name.to_s.downcase
|
115
|
+
# end
|
116
116
|
|
117
|
-
|
118
|
-
|
117
|
+
# if my_total_devices[key].device_model.nil? || my_total_devices[key].device_model.eql?("")
|
118
|
+
# my_total_devices[key].device_model = item.device_model
|
119
119
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
end
|
120
|
+
# end
|
121
|
+
# if my_total_devices[key].device_model.nil? || my_total_devices[key].device_model.eql?("")
|
122
|
+
# my_total_devices[key].device_model = item.name.to_s.downcase
|
123
|
+
# end
|
124
|
+
# end
|
125
|
+
# end
|
126
126
|
|
127
127
|
|
128
128
|
|
129
129
|
|
130
|
-
pgyer_devices = read_apppgyer_csv()
|
131
|
-
pgyer_devices.each do |key, item|
|
132
|
-
|
130
|
+
# pgyer_devices = read_apppgyer_csv()
|
131
|
+
# pgyer_devices.each do |key, item|
|
132
|
+
# if !my_total_devices[key].nil?
|
133
|
+
|
134
|
+
# if !item.device_description.nil?
|
135
|
+
# my_total_devices[key].device_description = item.device_description
|
136
|
+
# end
|
137
|
+
# end
|
138
|
+
# end
|
133
139
|
|
134
|
-
if !item.device_description.nil?
|
135
|
-
my_total_devices[key].device_description = item.device_description
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
140
|
|
141
|
+
my_total_devices = read_user_csv()
|
140
142
|
|
141
|
-
|
143
|
+
JSON.pretty_generate(my_total_devices)
|
142
144
|
|
143
145
|
|
144
146
|
write_appstore_text(devices:my_total_devices)
|
145
|
-
|
147
|
+
write_user_csv(devices:my_total_devices)
|
146
148
|
write_apppgyer_csv(devices:my_total_devices)
|
147
149
|
|
148
150
|
end
|
@@ -155,11 +157,13 @@ module Pindo
|
|
155
157
|
str_text = "DEVICE ID\tDEVICE NAME\tDEVICE PLATFORM\n"
|
156
158
|
devices.each do |key, device|
|
157
159
|
if device.platform.nil? || !(device.platform.to_s.eql?("ios") || device.platform.to_s.eql?("mac"))
|
158
|
-
|
160
|
+
|
161
|
+
if device.device_type.to_s.strip.downcase.eql?("mac")
|
159
162
|
device.platform = "mac"
|
160
163
|
else
|
161
164
|
device.platform = "ios"
|
162
165
|
end
|
166
|
+
|
163
167
|
end
|
164
168
|
str = String.new
|
165
169
|
str = str + device.udid
|
@@ -268,7 +272,7 @@ module Pindo
|
|
268
272
|
line_num += 1
|
269
273
|
end
|
270
274
|
end
|
271
|
-
|
275
|
+
puts devices
|
272
276
|
return devices
|
273
277
|
|
274
278
|
end
|
@@ -5,7 +5,8 @@ require 'json'
|
|
5
5
|
require 'faraday'
|
6
6
|
require "rqrcode"
|
7
7
|
require 'pindo/client/pgyerclient'
|
8
|
-
require 'pindo/client/aws3sclient'
|
8
|
+
# require 'pindo/client/aws3sclient'
|
9
|
+
require 'pindo/client/pgyeruploadclient'
|
9
10
|
|
10
11
|
|
11
12
|
module Pindo
|
@@ -171,7 +172,8 @@ module Pindo
|
|
171
172
|
puts description
|
172
173
|
|
173
174
|
|
174
|
-
aws_client = AWSS3Client.new
|
175
|
+
# aws_client = AWSS3Client.new
|
176
|
+
aws_client = PgyerUploadClient.new
|
175
177
|
upload_res = aws_client.upload_file(binary_file:ipa_file_upload)
|
176
178
|
|
177
179
|
attach_key_url = nil
|
@@ -202,6 +204,8 @@ module Pindo
|
|
202
204
|
})
|
203
205
|
|
204
206
|
return result_data
|
207
|
+
else
|
208
|
+
raise Informative, "上传失败!"
|
205
209
|
end
|
206
210
|
|
207
211
|
|
data/lib/pindo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pindo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.7.
|
4
|
+
version: 4.7.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- wade
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: claide
|
@@ -36,60 +36,40 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '1.
|
39
|
+
version: '1.15'
|
40
40
|
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: 1.
|
42
|
+
version: 1.15.2
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: '1.
|
49
|
+
version: '1.15'
|
50
50
|
- - ">="
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: 1.
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: xcodeproj
|
55
|
-
requirement: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
57
|
-
- - ">="
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version: 1.14.0
|
60
|
-
- - "<"
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '2.0'
|
63
|
-
type: :runtime
|
64
|
-
prerelease: false
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
66
|
-
requirements:
|
67
|
-
- - ">="
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: 1.14.0
|
70
|
-
- - "<"
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: '2.0'
|
52
|
+
version: 1.15.2
|
73
53
|
- !ruby/object:Gem::Dependency
|
74
54
|
name: fastlane
|
75
55
|
requirement: !ruby/object:Gem::Requirement
|
76
56
|
requirements:
|
77
57
|
- - "~>"
|
78
58
|
- !ruby/object:Gem::Version
|
79
|
-
version: '2.
|
59
|
+
version: '2.220'
|
80
60
|
- - ">="
|
81
61
|
- !ruby/object:Gem::Version
|
82
|
-
version: 2.
|
62
|
+
version: 2.220.0
|
83
63
|
type: :runtime
|
84
64
|
prerelease: false
|
85
65
|
version_requirements: !ruby/object:Gem::Requirement
|
86
66
|
requirements:
|
87
67
|
- - "~>"
|
88
68
|
- !ruby/object:Gem::Version
|
89
|
-
version: '2.
|
69
|
+
version: '2.220'
|
90
70
|
- - ">="
|
91
71
|
- !ruby/object:Gem::Version
|
92
|
-
version: 2.
|
72
|
+
version: 2.220.0
|
93
73
|
- !ruby/object:Gem::Dependency
|
94
74
|
name: fastimage
|
95
75
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,25 +131,45 @@ dependencies:
|
|
151
131
|
- !ruby/object:Gem::Version
|
152
132
|
version: 2.2.0
|
153
133
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
134
|
+
name: faraday-retry
|
135
|
+
requirement: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 2.2.0
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: 2.2.0
|
143
|
+
type: :runtime
|
144
|
+
prerelease: false
|
145
|
+
version_requirements: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - "~>"
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 2.2.0
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 2.2.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: typhoeus
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
157
|
- - "~>"
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version: 1.
|
159
|
+
version: 1.4.0
|
160
160
|
- - ">="
|
161
161
|
- !ruby/object:Gem::Version
|
162
|
-
version: 1.
|
162
|
+
version: 1.4.1
|
163
163
|
type: :runtime
|
164
164
|
prerelease: false
|
165
165
|
version_requirements: !ruby/object:Gem::Requirement
|
166
166
|
requirements:
|
167
167
|
- - "~>"
|
168
168
|
- !ruby/object:Gem::Version
|
169
|
-
version: 1.
|
169
|
+
version: 1.4.0
|
170
170
|
- - ">="
|
171
171
|
- !ruby/object:Gem::Version
|
172
|
-
version: 1.
|
172
|
+
version: 1.4.1
|
173
173
|
- !ruby/object:Gem::Dependency
|
174
174
|
name: bundler
|
175
175
|
requirement: !ruby/object:Gem::Requirement
|
@@ -245,6 +245,7 @@ files:
|
|
245
245
|
- lib/pindo/client/giteeclient.rb
|
246
246
|
- lib/pindo/client/httpclient.rb
|
247
247
|
- lib/pindo/client/pgyerclient.rb
|
248
|
+
- lib/pindo/client/pgyeruploadclient.rb
|
248
249
|
- lib/pindo/client/tgateclient.rb
|
249
250
|
- lib/pindo/command.rb
|
250
251
|
- lib/pindo/command/appstore.rb
|