pindo 4.6.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/pindo +35 -0
- data/lib/pindo/base/aeshelper.rb +31 -0
- data/lib/pindo/base/deviceinfo.rb +90 -0
- data/lib/pindo/base/executable.rb +224 -0
- data/lib/pindo/base/githelper.rb +489 -0
- data/lib/pindo/base/hashhelper.rb +134 -0
- data/lib/pindo/base/plaininformative.rb +15 -0
- data/lib/pindo/base/plistbuddyexecutable.rb +121 -0
- data/lib/pindo/base/standarderror.rb +14 -0
- data/lib/pindo/client/applovinclient.rb +156 -0
- data/lib/pindo/client/aws3sclient.rb +183 -0
- data/lib/pindo/client/bossclient.rb +229 -0
- data/lib/pindo/client/bossconfigclient.rb +175 -0
- data/lib/pindo/client/giteeclient.rb +65 -0
- data/lib/pindo/client/httpclient.rb +40 -0
- data/lib/pindo/client/pgyerclient.rb +439 -0
- data/lib/pindo/client/tgateclient.rb +103 -0
- data/lib/pindo/command.rb +101 -0
- data/lib/pindo/config/pindoconfig.rb +439 -0
- data/lib/pindo/config/pindouserlocalconfig.rb +81 -0
- data/lib/pindo/deploy/Fastfile +233 -0
- data/lib/pindo/deploy/build.rb +167 -0
- data/lib/pindo/deploy/bundleid.rb +245 -0
- data/lib/pindo/deploy/cert.rb +508 -0
- data/lib/pindo/deploy/check.rb +79 -0
- data/lib/pindo/deploy/configproj.rb +89 -0
- data/lib/pindo/deploy/confusecode.rb +248 -0
- data/lib/pindo/deploy/confuseproj.rb +112 -0
- data/lib/pindo/deploy/fabric.rb +58 -0
- data/lib/pindo/deploy/getitcinfo.rb +248 -0
- data/lib/pindo/deploy/iap.rb +796 -0
- data/lib/pindo/deploy/initconfig.rb +128 -0
- data/lib/pindo/deploy/itcapp.rb +147 -0
- data/lib/pindo/deploy/itcinfo.rb +369 -0
- data/lib/pindo/deploy/pem.rb +55 -0
- data/lib/pindo/deploy/pullconfig.rb +46 -0
- data/lib/pindo/deploy/pushconfig.rb +83 -0
- data/lib/pindo/deploy/quswark.rb +146 -0
- data/lib/pindo/deploy/quswauth.rb +67 -0
- data/lib/pindo/deploy/reportbug.rb +135 -0
- data/lib/pindo/deploy/resign.rb +338 -0
- data/lib/pindo/deploy/tag.rb +108 -0
- data/lib/pindo/deploy/updateconfig.rb +129 -0
- data/lib/pindo/deploy/uploadipa.rb +63 -0
- data/lib/pindo/deploy.rb +44 -0
- data/lib/pindo/dev/autobuild.rb +204 -0
- data/lib/pindo/dev/autoresign.rb +186 -0
- data/lib/pindo/dev/confusecode.rb +127 -0
- data/lib/pindo/dev/confuseproj.rb +111 -0
- data/lib/pindo/dev/createbuild.rb +159 -0
- data/lib/pindo/dev/debug.rb +141 -0
- data/lib/pindo/dev/pub.rb +171 -0
- data/lib/pindo/dev/renewcert.rb +142 -0
- data/lib/pindo/dev.rb +23 -0
- data/lib/pindo/env/dreamstudio.rb +53 -0
- data/lib/pindo/env/flutter.rb +59 -0
- data/lib/pindo/env/flutter.sh +116 -0
- data/lib/pindo/env/quarkenv.rb +58 -0
- data/lib/pindo/env/swarkenv.rb +62 -0
- data/lib/pindo/env/workhard.rb +56 -0
- data/lib/pindo/env.rb +17 -0
- data/lib/pindo/ipa/autoresign.rb +188 -0
- data/lib/pindo/ipa/import.rb +261 -0
- data/lib/pindo/ipa/output.rb +396 -0
- data/lib/pindo/ipa.rb +22 -0
- data/lib/pindo/lib/forcepush.rb +159 -0
- data/lib/pindo/lib/lint.rb +115 -0
- data/lib/pindo/lib/push.rb +143 -0
- data/lib/pindo/lib/update.rb +75 -0
- data/lib/pindo/lib.rb +18 -0
- data/lib/pindo/module/appselect.rb +200 -0
- data/lib/pindo/module/appstore_in_app_purchase.rb +1803 -0
- data/lib/pindo/module/appstore_metadata_connect_api_helper.rb +12 -0
- data/lib/pindo/module/appstore_metadata_fastlane_helper.rb +922 -0
- data/lib/pindo/module/buildconfighelper.rb +13 -0
- data/lib/pindo/module/buildhelper.rb +76 -0
- data/lib/pindo/module/commonconfuseproj.rb +271 -0
- data/lib/pindo/module/config_project.sh +143 -0
- data/lib/pindo/module/configprojhelper.rb +631 -0
- data/lib/pindo/module/iap_tier.json +813 -0
- data/lib/pindo/module/icon_contents.json +116 -0
- data/lib/pindo/module/imessage_icon.json +91 -0
- data/lib/pindo/module/imgset_contents.json +21 -0
- data/lib/pindo/module/launchimg_contents.json +21 -0
- data/lib/pindo/module/pemcreate.rb +63 -0
- data/lib/pindo/module/pgyerhelper.rb +339 -0
- data/lib/pindo/module/xcodebuildpre.rb +258 -0
- data/lib/pindo/module/xcodehelper.rb +521 -0
- data/lib/pindo/options/appconfigoptions.rb +23 -0
- data/lib/pindo/options/deployoptions.rb +363 -0
- data/lib/pindo/pgyer/apptest.rb +104 -0
- data/lib/pindo/pgyer/comment.rb +95 -0
- data/lib/pindo/pgyer/download.rb +105 -0
- data/lib/pindo/pgyer/login.rb +61 -0
- data/lib/pindo/pgyer/upload.rb +234 -0
- data/lib/pindo/pgyer.rb +17 -0
- data/lib/pindo/repo/clone.rb +78 -0
- data/lib/pindo/repo/create.rb +55 -0
- data/lib/pindo/repo/login.rb +64 -0
- data/lib/pindo/repo/search.rb +60 -0
- data/lib/pindo/repo.rb +16 -0
- data/lib/pindo/setup.rb +60 -0
- data/lib/pindo/upgrade.rb +56 -0
- data/lib/pindo/utils/applovin.rb +213 -0
- data/lib/pindo/utils/boss.rb +209 -0
- data/lib/pindo/utils/clearcert.rb +60 -0
- data/lib/pindo/utils/device.rb +279 -0
- data/lib/pindo/utils/icon.rb +91 -0
- data/lib/pindo/utils/icon.sh +133 -0
- data/lib/pindo/utils/podindex.rb +56 -0
- data/lib/pindo/utils/podindex.sh +30 -0
- data/lib/pindo/utils/renewproj.rb +146 -0
- data/lib/pindo/utils/tgate.rb +159 -0
- data/lib/pindo/utils/xcassets.rb +46 -0
- data/lib/pindo/utils/xcassets.sh +88 -0
- data/lib/pindo/utils.rb +29 -0
- data/lib/pindo/version.rb +110 -0
- data/lib/pindo.rb +34 -0
- metadata +364 -0
@@ -0,0 +1,204 @@
|
|
1
|
+
require 'highline/import'
|
2
|
+
require 'xcodeproj'
|
3
|
+
require 'find'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'pindo/base/executable'
|
6
|
+
|
7
|
+
module Pindo
|
8
|
+
class Command
|
9
|
+
class Dev < Command
|
10
|
+
class Autobuild < Dev
|
11
|
+
|
12
|
+
include Appselect
|
13
|
+
|
14
|
+
self.summary = '自动编译工程,并支持上传ipa到测试网站'
|
15
|
+
|
16
|
+
self.description = <<-DESC
|
17
|
+
自动编译工程,并支持上传ipa到测试网站. 在工程目录下运行: pindo dev autobuild
|
18
|
+
DESC
|
19
|
+
|
20
|
+
self.arguments = [
|
21
|
+
|
22
|
+
]
|
23
|
+
|
24
|
+
def self.options
|
25
|
+
[
|
26
|
+
['--deploy', '默认用开发的bundle id,用法:pindo ipa autobuild --deploy'],
|
27
|
+
['--adhoc', '默认用dev证书,使用--adhoc设置使用adhoc证书编译, 用法:pindo ipa autobuild --adhoc'],
|
28
|
+
['--proj', '指定上传到pgyer对应的项目名称(大小写空格忽略),用法:pindo ipa autobuild --proj=aichatv4'],
|
29
|
+
['--upload', '是否上传编译后的ipa, 用法:pindo ipa autobuild --upload'],
|
30
|
+
['--send', '上传到之后是否发送测试信息,用法:pindo ipa autobuild --send'],
|
31
|
+
].concat(super)
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(argv)
|
35
|
+
|
36
|
+
@args_deploy_flag = argv.flag?('deploy', false)
|
37
|
+
@args_adhoc_flag = argv.flag?('adhoc', false)
|
38
|
+
@args_upload_flag = argv.flag?('upload', false)
|
39
|
+
@args_send_flag = argv.flag?('send', false)
|
40
|
+
@args_proj_name = argv.option('proj')
|
41
|
+
|
42
|
+
super
|
43
|
+
@additional_args = argv.remainder!
|
44
|
+
end
|
45
|
+
|
46
|
+
def validate!
|
47
|
+
|
48
|
+
super
|
49
|
+
end
|
50
|
+
|
51
|
+
def run
|
52
|
+
|
53
|
+
mainapp_bundleid= nil
|
54
|
+
if @args_deploy_flag
|
55
|
+
mainapp_bundleid = get_selected_deploy_bundleid()
|
56
|
+
else
|
57
|
+
mainapp_bundleid = get_selected_dev_bundleid()
|
58
|
+
end
|
59
|
+
|
60
|
+
prepare_for_upload()
|
61
|
+
|
62
|
+
args_temp = []
|
63
|
+
args_temp << mainapp_bundleid
|
64
|
+
Pindo::Command::Deploy::Pullconfig::run(args_temp)
|
65
|
+
|
66
|
+
project_dir = Dir.pwd
|
67
|
+
Dir.chdir(project_dir)
|
68
|
+
config_json_file = File.join(project_dir,"config.json")
|
69
|
+
Debug::modify_cert_with_project(project_dir:project_dir, config_file:config_json_file)
|
70
|
+
|
71
|
+
|
72
|
+
if File.exist?(File.join(project_dir, "Podfile"))
|
73
|
+
|
74
|
+
args_temp = []
|
75
|
+
args_temp << config_json_file
|
76
|
+
Pindo::Command::Utils::Podindex::run([])
|
77
|
+
|
78
|
+
begin
|
79
|
+
if File.exist?(File.join(project_dir, "Podfile.lock"))
|
80
|
+
FileUtils.rm_rf(File.join(project_dir, "Podfile.lock"))
|
81
|
+
end
|
82
|
+
if File.exist?(File.join(project_dir,"Pods"))
|
83
|
+
FileUtils.rm_rf(File.join(project_dir, "Pods"))
|
84
|
+
end
|
85
|
+
puts "正在执行pod deintegrate..."
|
86
|
+
system 'pod deintegrate'
|
87
|
+
puts "正在执行pod install..."
|
88
|
+
system 'pod install'
|
89
|
+
rescue => error
|
90
|
+
puts(error.to_s)
|
91
|
+
raise Informative, "pod install失败!!先pod install 完成后成编译 !"
|
92
|
+
end
|
93
|
+
|
94
|
+
Dir.chdir(project_dir)
|
95
|
+
pod_lock_file = File.join(project_dir, "Podfile.lock")
|
96
|
+
if !File.exist?(pod_lock_file)
|
97
|
+
raise Informative, "pod install失败!!先pod install 完成后成编译 !"
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
args_temp = []
|
104
|
+
if @args_adhoc_flag
|
105
|
+
args_temp << "--adhoc"
|
106
|
+
else
|
107
|
+
args_temp << "--dev"
|
108
|
+
end
|
109
|
+
|
110
|
+
Pindo::Command::Deploy::Cert::run(args_temp)
|
111
|
+
|
112
|
+
Dir.chdir(project_dir)
|
113
|
+
Pindo::Command::Deploy::Build::run(args_temp)
|
114
|
+
|
115
|
+
puts "Buiid Done !!!"
|
116
|
+
system "open #{project_dir}"
|
117
|
+
|
118
|
+
|
119
|
+
build_path = File.join(project_dir, "build", "*.ipa")
|
120
|
+
ipa_file_upload = Dir.glob(build_path).max_by {|f| File.mtime(f)}
|
121
|
+
|
122
|
+
|
123
|
+
if !ipa_file_upload.nil? && !@args_proj_name.nil?
|
124
|
+
|
125
|
+
description = nil
|
126
|
+
if File.exist?(File.join(project_dir, ".release_info"))
|
127
|
+
description = File.read(File.join(project_dir, ".release_info"))
|
128
|
+
end
|
129
|
+
if description.nil?
|
130
|
+
commit_id_info = git_latest_commit_id(local_repo_dir:project_dir)
|
131
|
+
description = "commit " + commit_id_info
|
132
|
+
end
|
133
|
+
start_upload(pgyer_proj_name:@args_proj_name, ipa_file_upload:ipa_file_upload, description:description, args_send_flag:@args_send_flag)
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
def prepare_for_upload
|
139
|
+
|
140
|
+
if @args_upload_flag
|
141
|
+
if @args_proj_name.nil?
|
142
|
+
xcodeproj_file_name = Dir.glob(File.join(Dir.pwd, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
|
143
|
+
proj_name = File.basename(xcodeproj_file_name, ".xcodeproj") if xcodeproj_file_name
|
144
|
+
if !proj_name.nil?
|
145
|
+
puts
|
146
|
+
answer = agree("Pgyer的App项目代号是: #{proj_name} ?(Y/n)")
|
147
|
+
if answer
|
148
|
+
@args_proj_name = proj_name
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
@pgyer_client = PgyerClient.new
|
154
|
+
app_info_obj = nil
|
155
|
+
login_success = @pgyer_client.do_login(force_login:@args_login_flag)
|
156
|
+
if login_success
|
157
|
+
PgyerHelper.share_instace.get_app_list_in_pgyer(client:@pgyer_client)
|
158
|
+
if !@args_proj_name.nil?
|
159
|
+
app_info_obj = PgyerHelper.share_instace.find_app_info_with_obj_list(proj_name:@args_proj_name)
|
160
|
+
end
|
161
|
+
|
162
|
+
if app_info_obj.nil?
|
163
|
+
proj_name = ask('请输入Pyger上的App代号(大小写空格忽略):') || nil
|
164
|
+
@args_proj_name = proj_name
|
165
|
+
app_info_obj = PgyerHelper.share_instace.find_app_info_with_obj_list(proj_name:@args_proj_name)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
if app_info_obj.nil?
|
170
|
+
raise Informative, "#{proj_name} 错误, 请输入正确的App代号名称, pgyer网站没有该App"
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
def start_upload(pgyer_proj_name:nil, ipa_file_upload:nil, description:nil, args_send_flag:true)
|
178
|
+
|
179
|
+
if !pgyer_proj_name.nil? && !ipa_file_upload.nil?
|
180
|
+
|
181
|
+
|
182
|
+
args_temp = []
|
183
|
+
pgyer_proj_name = pgyer_proj_name.strip.gsub(/ /, '')
|
184
|
+
args_temp << "--proj=#{pgyer_proj_name}"
|
185
|
+
args_temp << "--ipa=\"#{ipa_file_upload}\""
|
186
|
+
|
187
|
+
if args_send_flag
|
188
|
+
args_temp << "--send"
|
189
|
+
end
|
190
|
+
|
191
|
+
if !description.nil?
|
192
|
+
args_temp << "--desc=\"#{description}\""
|
193
|
+
end
|
194
|
+
|
195
|
+
puts args_temp
|
196
|
+
Pindo::Command::Pgyer::Upload::run(args_temp)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
@@ -0,0 +1,186 @@
|
|
1
|
+
require 'highline/import'
|
2
|
+
require 'xcodeproj'
|
3
|
+
require 'find'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'pindo/base/executable'
|
6
|
+
|
7
|
+
module Pindo
|
8
|
+
class Command
|
9
|
+
class Dev < Command
|
10
|
+
class Autoresign < Dev
|
11
|
+
|
12
|
+
include Appselect
|
13
|
+
|
14
|
+
self.summary = '开发阶段ipa包重签名'
|
15
|
+
|
16
|
+
self.description = <<-DESC
|
17
|
+
用最新的证书重签名ipa. 用法:pindo dev autoresign, 默认使用dev证书给当前目录下面的ipa重签名。
|
18
|
+
也可以加上可选参数,例如:pindo dev autoresign ~/Desktop/mydemo.ipa --adhoc --deploy --upload.
|
19
|
+
DESC
|
20
|
+
|
21
|
+
self.arguments = [
|
22
|
+
CLAide::Argument.new('path/to/demo.ipa', true),
|
23
|
+
]
|
24
|
+
|
25
|
+
def self.options
|
26
|
+
[
|
27
|
+
['--ipa', '指定ipa的路径,用法:pindo ipa autoresign --ipa=path/to/name.ipa'],
|
28
|
+
['--adhoc', '默认用dev证书,使用--adhoc设置使用adhoc证书编译, 用法:pindo ipa autoresign --adhoc'],
|
29
|
+
['--deploy', '默认用开发的bundle id,使用--deploy设置使用发布bundle id来重签名, 用法:pindo ipa autoresign --deploy'],
|
30
|
+
['--proj', '指定上传到pgyer对应的项目名称(大小写空格忽略),用法:pindo ipa autoresign --proj=aichatv4'],
|
31
|
+
['--upload', '是否上传编译后的ipa, 用法:pindo ipa autoresign --upload'],
|
32
|
+
['--send', '上传到之后是否发送测试信息,用法:pindo ipa autobuild --send'],
|
33
|
+
].concat(super)
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def initialize(argv)
|
38
|
+
|
39
|
+
@args_ipa_file = argv.shift_argument
|
40
|
+
@args_set_ipa_name = argv.option('ipa')
|
41
|
+
@args_adhoc_flag = argv.flag?('adhoc', false)
|
42
|
+
@args_deploy_flag = argv.flag?('deploy', false)
|
43
|
+
|
44
|
+
@args_upload_flag = argv.flag?('upload', false)
|
45
|
+
@args_send_flag = argv.flag?('send', false)
|
46
|
+
@args_proj_name = argv.option('proj')
|
47
|
+
|
48
|
+
super
|
49
|
+
@additional_args = argv.remainder!
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def run
|
54
|
+
|
55
|
+
ipa_file_name = @args_ipa_file
|
56
|
+
if !@args_set_ipa_name.nil?
|
57
|
+
ipa_file_name = @args_set_ipa_name
|
58
|
+
end
|
59
|
+
|
60
|
+
if !ipa_file_name.nil? && File.exist?(ipa_file_name)
|
61
|
+
else
|
62
|
+
current_dir = Dir.pwd
|
63
|
+
# File.basename(f).include?("_resigned") ? Time.local(0, 0, 0) : File.mtime(f)
|
64
|
+
ipa_file_name = Dir.glob(File.join(current_dir, "/*.ipa")).max_by {|f| File.basename(f).include?("_resigned") ? Time.local(0, 1, 1) : File.mtime(f)}
|
65
|
+
end
|
66
|
+
|
67
|
+
if !ipa_file_name.nil? && File.exist?(ipa_file_name)
|
68
|
+
puts
|
69
|
+
puts "正在重签名的ipa: #{ipa_file_name}"
|
70
|
+
puts "时间: #{File.mtime(ipa_file_name)}"
|
71
|
+
puts
|
72
|
+
else
|
73
|
+
return
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
mainapp_bundleid = nil
|
78
|
+
|
79
|
+
if @args_deploy_flag
|
80
|
+
mainapp_bundleid = get_selected_deploy_bundleid()
|
81
|
+
else
|
82
|
+
mainapp_bundleid = get_selected_dev_bundleid()
|
83
|
+
end
|
84
|
+
puts "mainapp_bundleid: #{mainapp_bundleid}"
|
85
|
+
|
86
|
+
args_temp = []
|
87
|
+
args_temp << mainapp_bundleid
|
88
|
+
|
89
|
+
Pindo::Command::Deploy::Pullconfig::run(args_temp)
|
90
|
+
|
91
|
+
prepare_for_upload()
|
92
|
+
|
93
|
+
args_temp = []
|
94
|
+
if @args_adhoc_flag
|
95
|
+
args_temp << "--adhoc"
|
96
|
+
else
|
97
|
+
args_temp << "--dev"
|
98
|
+
end
|
99
|
+
|
100
|
+
if !ipa_file_name.nil?
|
101
|
+
|
102
|
+
args_temp << "--ipa=#{ipa_file_name}"
|
103
|
+
Pindo::Command::Deploy::Resign::run(args_temp)
|
104
|
+
|
105
|
+
|
106
|
+
ipa_file_name = File::expand_path(ipa_file_name)
|
107
|
+
ipa_base_name = File.basename(ipa_file_name, ".ipa")
|
108
|
+
ipa_dir = File.dirname(ipa_file_name)
|
109
|
+
resign_ipa_name = File.join(ipa_dir, ipa_base_name + "_resigned.ipa")
|
110
|
+
|
111
|
+
if File.exist?(resign_ipa_name) && (@args_upload_flag || !@args_proj_name.nil?)
|
112
|
+
start_upload(pgyer_proj_name:@args_proj_name, ipa_file_upload:resign_ipa_name, description:nil, args_send_flag:@args_send_flag)
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
#
|
120
|
+
end
|
121
|
+
|
122
|
+
def prepare_for_upload
|
123
|
+
|
124
|
+
if @args_upload_flag
|
125
|
+
if @args_proj_name.nil?
|
126
|
+
xcodeproj_file_name = Dir.glob(File.join(Dir.pwd, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
|
127
|
+
proj_name = File.basename(xcodeproj_file_name, ".xcodeproj") if xcodeproj_file_name
|
128
|
+
if !proj_name.nil?
|
129
|
+
puts
|
130
|
+
answer = agree("Pgyer的App项目代号是: #{proj_name} ?(Y/n)")
|
131
|
+
if answer
|
132
|
+
@args_proj_name = proj_name
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
@pgyer_client = PgyerClient.new
|
138
|
+
app_info_obj = nil
|
139
|
+
login_success = @pgyer_client.do_login(force_login:@args_login_flag)
|
140
|
+
if login_success
|
141
|
+
PgyerHelper.share_instace.get_app_list_in_pgyer(client:@pgyer_client)
|
142
|
+
if !@args_proj_name.nil?
|
143
|
+
app_info_obj = PgyerHelper.share_instace.find_app_info_with_obj_list(proj_name:@args_proj_name)
|
144
|
+
end
|
145
|
+
|
146
|
+
if app_info_obj.nil?
|
147
|
+
proj_name = ask('请输入Pyger上的App代号(大小写空格忽略):') || nil
|
148
|
+
@args_proj_name = proj_name
|
149
|
+
app_info_obj = PgyerHelper.share_instace.find_app_info_with_obj_list(proj_name:@args_proj_name)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
if app_info_obj.nil?
|
154
|
+
raise Informative, "#{proj_name} 错误, 请输入正确的App代号名称, pgyer网站没有该App"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
def start_upload(pgyer_proj_name:nil, ipa_file_upload:nil, description:nil, args_send_flag:true)
|
161
|
+
|
162
|
+
if !pgyer_proj_name.nil? && !ipa_file_upload.nil?
|
163
|
+
|
164
|
+
args_temp = []
|
165
|
+
pgyer_proj_name = pgyer_proj_name.strip.gsub(/ /, '')
|
166
|
+
args_temp << "--proj=#{pgyer_proj_name}"
|
167
|
+
args_temp << "--ipa=\"#{ipa_file_upload}\""
|
168
|
+
|
169
|
+
if args_send_flag
|
170
|
+
args_temp << "--send"
|
171
|
+
end
|
172
|
+
|
173
|
+
if !description.nil?
|
174
|
+
args_temp << "--desc=\"#{description}\""
|
175
|
+
end
|
176
|
+
|
177
|
+
puts args_temp
|
178
|
+
Pindo::Command::Pgyer::Upload::run(args_temp)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'highline/import'
|
2
|
+
require 'xcodeproj'
|
3
|
+
require 'find'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
module Pindo
|
7
|
+
class Command
|
8
|
+
class Dev < Command
|
9
|
+
class Confusecode < Dev
|
10
|
+
|
11
|
+
include Command::DeployOptions
|
12
|
+
|
13
|
+
include CommonConfuseProj
|
14
|
+
|
15
|
+
self.summary = '设置混淆编译第一步'
|
16
|
+
|
17
|
+
self.description = <<-DESC
|
18
|
+
目前该混淆方法已经废弃。设置混淆编译第一步.用法: pindo dev confusecode --type=class_method_variable_protocol_property_category_pods
|
19
|
+
|
20
|
+
DESC
|
21
|
+
|
22
|
+
self.arguments = [
|
23
|
+
CLAide::Argument.new('path/to/config.json', true),
|
24
|
+
]
|
25
|
+
|
26
|
+
def self.options
|
27
|
+
[
|
28
|
+
|
29
|
+
].concat(super)
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize(argv)
|
33
|
+
super
|
34
|
+
end
|
35
|
+
|
36
|
+
def validate!
|
37
|
+
super
|
38
|
+
end
|
39
|
+
|
40
|
+
def run
|
41
|
+
|
42
|
+
current_dir = Dir.pwd
|
43
|
+
current_project_dir = current_dir
|
44
|
+
app_config_dir = clong_buildconfig_repo(repo_name: @deploy_repo_name)
|
45
|
+
|
46
|
+
clang_repo_dir = clone_devclang_repo
|
47
|
+
# if !File.exist?(clang_repo_dir)
|
48
|
+
puts "#{clang_repo_dir}"
|
49
|
+
puts "There is no clang tool !!! dev confusecode"
|
50
|
+
# return
|
51
|
+
# end
|
52
|
+
|
53
|
+
symash_type = confuse_version_type(path:current_project_dir, default_type:"symash2")
|
54
|
+
if @newconfuse_flag
|
55
|
+
symash_type = "symash2"
|
56
|
+
end
|
57
|
+
confuse_tool_path = File.join(clang_repo_dir, symash_type)
|
58
|
+
puts "Confuse Tool Path: #{confuse_tool_path}"
|
59
|
+
|
60
|
+
meaning_tool = File.join(clang_repo_dir, "MeaningfulTools/MeaningfulName")
|
61
|
+
|
62
|
+
if symash_type == "symash1"
|
63
|
+
|
64
|
+
base_db = File.join(clang_repo_dir, "MeaningfulTools/confuse.db")
|
65
|
+
meaning_db = File.join(current_project_dir, "SymashCache/app_confuse.db")
|
66
|
+
origin_json_dir = File.join(current_project_dir, "SymashCache/Original")
|
67
|
+
output_dir = File.join(current_project_dir, "SymashCache")
|
68
|
+
confuse_type= @confuse_type
|
69
|
+
|
70
|
+
if File.exist?(File.join(output_dir, "Replaced.json"))
|
71
|
+
FileUtils.rm_rf(File.join(output_dir, "Replaced.json"))
|
72
|
+
end
|
73
|
+
|
74
|
+
puts "Tool: #{meaning_tool}"
|
75
|
+
puts "Base DB: #{base_db}"
|
76
|
+
puts "DB: #{meaning_db}"
|
77
|
+
puts "Origin Dir: #{origin_json_dir}"
|
78
|
+
puts "Output Dir: #{output_dir}"
|
79
|
+
puts "Project Dir: #{current_project_dir}"
|
80
|
+
puts "Confuse Type: #{confuse_type}"
|
81
|
+
|
82
|
+
if File.exist?(origin_json_dir)
|
83
|
+
command = meaning_tool + " -r -p 100 -i 100 -b " + @bundle_id + " -d " + origin_json_dir + " -o " + base_db + " -m " + meaning_db + " -t " + output_dir + " -f " + current_project_dir + " -z " + confuse_type
|
84
|
+
puts "Command: #{command}"
|
85
|
+
system command
|
86
|
+
end
|
87
|
+
|
88
|
+
text = File.read(File.join(current_project_dir, "Symash.json"))
|
89
|
+
new_contents = text.gsub(/\"IMPORT\".*/, "\"IMPORT\":true,")
|
90
|
+
File.open(File.join(current_project_dir, "Symash.json"), "w") {|file| file.puts new_contents }
|
91
|
+
|
92
|
+
text = File.read(File.join(current_project_dir, "Symash.json"))
|
93
|
+
new_contents = text.gsub(/\"STRICT\".*/, "\"STRICT\":true,")
|
94
|
+
File.open(File.join(current_project_dir, "Symash.json"), "w") {|file| file.puts new_contents }
|
95
|
+
else
|
96
|
+
|
97
|
+
|
98
|
+
puts "Tool: #{meaning_tool}"
|
99
|
+
|
100
|
+
puts "+++++++"
|
101
|
+
puts "+++++++"
|
102
|
+
puts "+++++++"
|
103
|
+
service_path = File.join(confuse_tool_path, "/Applications/SymashX.app/Contents/MacOS/symashctl")
|
104
|
+
command1 = "cd #{current_project_dir} && " + service_path + " stop"
|
105
|
+
puts "Command: #{command1}"
|
106
|
+
system command1
|
107
|
+
puts "+++++++"
|
108
|
+
puts "+++++++"
|
109
|
+
puts "+++++++"
|
110
|
+
|
111
|
+
if File.exist?(File.join(current_project_dir, "SymashData/export-sympkg.plist"))
|
112
|
+
command = meaning_tool + " -q -f " + current_project_dir
|
113
|
+
puts "Command: #{command}"
|
114
|
+
system command
|
115
|
+
end
|
116
|
+
|
117
|
+
command2 = "cd #{current_project_dir} && " + service_path + " start -backend"
|
118
|
+
puts "Command: #{command2}"
|
119
|
+
system command2
|
120
|
+
puts "Done !"
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'highline/import'
|
2
|
+
require 'xcodeproj'
|
3
|
+
require 'find'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
|
7
|
+
module Pindo
|
8
|
+
class Command
|
9
|
+
class Dev < Command
|
10
|
+
class Confuseproj < Dev
|
11
|
+
|
12
|
+
require 'pindo/deploy/confuseproj'
|
13
|
+
|
14
|
+
include Command::DeployOptions
|
15
|
+
|
16
|
+
include CommonConfuseProj
|
17
|
+
|
18
|
+
self.summary = '设置混淆编译第一步'
|
19
|
+
|
20
|
+
self.description = <<-DESC
|
21
|
+
设置混淆编译第一步. 用法:\n
|
22
|
+
pindo dev confuseproj --type=class_method_variable_protocol_property_category
|
23
|
+
|
24
|
+
for example: --type=class_method
|
25
|
+
|
26
|
+
class: confuse class
|
27
|
+
method: confuse method
|
28
|
+
|
29
|
+
...
|
30
|
+
DESC
|
31
|
+
|
32
|
+
self.arguments = [
|
33
|
+
|
34
|
+
]
|
35
|
+
|
36
|
+
def self.options
|
37
|
+
[
|
38
|
+
].concat(super)
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(argv)
|
42
|
+
super
|
43
|
+
end
|
44
|
+
|
45
|
+
def validate!
|
46
|
+
super
|
47
|
+
end
|
48
|
+
|
49
|
+
def run
|
50
|
+
|
51
|
+
current_dir = Dir.pwd
|
52
|
+
current_project_dir = current_dir
|
53
|
+
puts "+++++ #{current_project_dir}"
|
54
|
+
|
55
|
+
app_config_dir = clong_buildconfig_repo(repo_name: @deploy_repo_name)
|
56
|
+
clang_repo_dir = clone_devclang_repo
|
57
|
+
# if !File.exist?(clang_repo_dir)
|
58
|
+
puts "#{clang_repo_dir}"
|
59
|
+
puts "There is no clang tool !!! dev confuseproj"
|
60
|
+
# return
|
61
|
+
# end
|
62
|
+
|
63
|
+
symash_type = confuse_version_type(path:app_config_dir, default_type:"symash2")
|
64
|
+
if @newconfuse_flag
|
65
|
+
symash_type = "symash2"
|
66
|
+
end
|
67
|
+
confuse_tool_path = File.join(clang_repo_dir, symash_type)
|
68
|
+
puts "Confuse Tool Path: #{confuse_tool_path}"
|
69
|
+
|
70
|
+
puts "Clang Path: #{confuse_tool_path}"
|
71
|
+
install_symash(clang_path:confuse_tool_path)
|
72
|
+
|
73
|
+
current_project_fullname = ""
|
74
|
+
Dir.foreach(current_dir) do |file|
|
75
|
+
if file =~ /(.*).xcodeproj/
|
76
|
+
current_project_fullname = file
|
77
|
+
break;
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
old_proj_name = File.basename(current_project_fullname, ".xcodeproj")
|
82
|
+
|
83
|
+
config_confuse_project(clang_path:confuse_tool_path, project_name:old_proj_name, project_path:current_project_dir, default_type:symash_type)
|
84
|
+
config_symash(clang_path:confuse_tool_path, project_path:current_project_dir, confuse_type:@confuse_type, default_type:symash_type)
|
85
|
+
|
86
|
+
force_config = nil
|
87
|
+
force_config = {}
|
88
|
+
# force_config['BACKEND_SYMASH_DISABLE_SPL'] = true
|
89
|
+
force_config['BACKEND_SYMASH_DISABLE_BCF_PROB'] = 50
|
90
|
+
|
91
|
+
update_symash_config(app_config_dir:app_config_dir, project_path:current_project_dir, confuse_type:@confuse_type, force_config: force_config)
|
92
|
+
|
93
|
+
if symash_type == "symash2"
|
94
|
+
Dir.chdir(current_project_dir)
|
95
|
+
puts "+++++ #{current_project_dir}"
|
96
|
+
service_path = File.join(confuse_tool_path, "/Applications/SymashX.app/Contents/MacOS/symashctl")
|
97
|
+
command1 = "cd #{current_project_dir} && " + service_path + " stop"
|
98
|
+
command2 = "cd #{current_project_dir} && " + service_path + " start -export"
|
99
|
+
puts "Command: #{command1}"
|
100
|
+
system command1
|
101
|
+
puts "Command: #{command2}"
|
102
|
+
system command2
|
103
|
+
Dir.chdir(current_project_dir)
|
104
|
+
puts "Done !"
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|