fir-cli 0.0.4 → 0.0.5
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/fir-cli.rb +27 -29
- data/lib/lagunitas.ext.rb +48 -19
- data/lib/lagunitas.patch.rb +40 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7542e6029327b193019ad292029cda16611bb3df
|
4
|
+
data.tar.gz: a8211154ff64bd79f1111a4530bcf304a8a3516a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 594509c71c4ef5933ceb9e80bbfed36dcb03971ece925301256da6a370e445d10728de088d6a8cc41255a68e5a4265b9b9d978182f0e1c0e84d6e0cb206440f0
|
7
|
+
data.tar.gz: ad35e24c12be9f02ee2335c4639736e85dd09be297192b4d42c0f01c951b4d6d372d44284643e2d1ccbec582b960b0bfde7c8ad0614ab31c82717848016dfb92
|
data/lib/fir-cli.rb
CHANGED
@@ -10,6 +10,7 @@ require 'pngdefry'
|
|
10
10
|
require 'user_config'
|
11
11
|
require 'rest_client'
|
12
12
|
require 'lagunitas'
|
13
|
+
require 'lagunitas.patch'
|
13
14
|
require 'lagunitas.ext'
|
14
15
|
|
15
16
|
# p Lagunitas::App.new('').respond_to? :mobileprovision
|
@@ -34,7 +35,7 @@ class FirCli < Thor
|
|
34
35
|
end
|
35
36
|
|
36
37
|
desc 'config', '配置全局设置'
|
37
|
-
option :resign, :aliases => '-r', :desc => '
|
38
|
+
option :resign, :aliases => '-r', :desc => '是否以企业签名发布', :type => :boolean
|
38
39
|
option :token, :aliases => '-t', :desc => '用户令牌'
|
39
40
|
option :email, :aliases => '-e', :desc => '邮件地址'
|
40
41
|
option :verbose, :aliases => '-v', :desc => '输出配置项', :type => :boolean
|
@@ -54,8 +55,8 @@ class FirCli < Thor
|
|
54
55
|
option :short, :aliases => '-s', :desc => '自定义短地址'
|
55
56
|
option :token, :aliases => '-t', :desc => '用户令牌,不写则使用已经登陆信息'
|
56
57
|
def update(path)
|
57
|
-
app =
|
58
|
-
fir_app =
|
58
|
+
app = _info path, false, true
|
59
|
+
fir_app = _fir_info app[:identifier]
|
59
60
|
opt_short = options[:short]
|
60
61
|
post = {}
|
61
62
|
post[:public] = options[:public] != nil ? options[:public] : @ipa_config['public']
|
@@ -64,9 +65,9 @@ class FirCli < Thor
|
|
64
65
|
post.each { |i| if i[1] == fir_app[i[0]] then post.delete i[0] end }
|
65
66
|
|
66
67
|
if post.length == 0 then puts '> 没有可以更新的项目'; return end
|
67
|
-
|
68
|
+
_fir_put fir_app[:id], post
|
68
69
|
|
69
|
-
fir_app =
|
70
|
+
fir_app = _fir_info app[:identifier]
|
70
71
|
if opt_short && opt_short != fir_app[:short]
|
71
72
|
puts "> 短地址 #{ opt_short } 被占用,FIR.im 自动更新短地址为 #{ fir_app[:short] }"
|
72
73
|
end
|
@@ -79,13 +80,13 @@ class FirCli < Thor
|
|
79
80
|
option :token, :aliases => '-t', :desc => '用户令牌,不写则使用已经登陆信息'
|
80
81
|
option :changelog, :aliases => '-c', :desc => '修改纪录,默认为空字符串', :default => ''
|
81
82
|
def publish(path)
|
82
|
-
if
|
83
|
+
if _opt_resign
|
83
84
|
tfile = Tempfile.new SecureRandom.hex
|
84
85
|
resign path, tfile.path
|
85
86
|
path = tfile.path
|
86
87
|
end
|
87
|
-
app =
|
88
|
-
fir_app =
|
88
|
+
app = _info path
|
89
|
+
fir_app = _fir_info app[:identifier]
|
89
90
|
|
90
91
|
id = fir_app[:id]
|
91
92
|
short = fir_app[:short]
|
@@ -115,13 +116,13 @@ class FirCli < Thor
|
|
115
116
|
puts '上传图标成功'
|
116
117
|
end
|
117
118
|
|
118
|
-
|
119
|
+
_fir_put fir_app[:id],
|
119
120
|
:name => app[:display_name] || app[:name],
|
120
121
|
:short => options[:short] || fir_app[:short],
|
121
122
|
:version => app[:version],
|
122
123
|
:versionShort => app[:short_version]
|
123
124
|
|
124
|
-
|
125
|
+
_fir_vput upload_res[:versionOid],
|
125
126
|
:version => app[:version],
|
126
127
|
:versionShort => app[:short_version],
|
127
128
|
:devices => app[:devices],
|
@@ -132,14 +133,14 @@ class FirCli < Thor
|
|
132
133
|
puts "> http://fir.im/#{short}"
|
133
134
|
end
|
134
135
|
|
135
|
-
desc '
|
136
|
+
desc 'info IPA_FILE_PATH', '获取 .ipa 文件的信息'
|
136
137
|
option 'verbose', :aliases => '-v', :desc => '显示更多信息', :type => :boolean
|
137
138
|
option 'fir', :aliases => '-f', :desc => '显示托管在 fir.im 的信息', :type => :boolean
|
138
|
-
def
|
139
|
-
app =
|
139
|
+
def info(path)
|
140
|
+
app = _info path, false, options['verbose']
|
140
141
|
app.each { |i| puts "#{ Paint[i[0].to_s.rjust(15), :blue] } #{ i[1] }" }
|
141
142
|
if options[:fir]
|
142
|
-
fir_app =
|
143
|
+
fir_app = _fir_info app[:identifier]
|
143
144
|
fir_app.each { |i| puts "#{ Paint[i[0].to_s.rjust(15), :blue] } #{ i[1] }" }
|
144
145
|
end
|
145
146
|
end
|
@@ -154,7 +155,7 @@ class FirCli < Thor
|
|
154
155
|
puts "! 用分发,请注意:#{ Paint['当证书失效后,所有安装以失效证', :red ] }"
|
155
156
|
puts "! #{ Paint['书签名的的用户都会无法正常运行应用;同时托管在', :red ] }"
|
156
157
|
puts "! #{ Paint['fir.im 的应用将无法正常安装。', :red ] }"
|
157
|
-
if
|
158
|
+
if _opt_email == nil
|
158
159
|
puts Paint['! 您需要提供邮件地址才能使用 resign.tapbeta.com 的签名服务', :red]
|
159
160
|
puts Paint['! 使用 fir config --email=EMAIL 进行设置', :green]
|
160
161
|
exit
|
@@ -198,7 +199,7 @@ class FirCli < Thor
|
|
198
199
|
end
|
199
200
|
|
200
201
|
private
|
201
|
-
def
|
202
|
+
def _info(path, quiet = false, more = false)
|
202
203
|
path = Pathname.new(Dir.pwd).join(path).cleanpath
|
203
204
|
ipa = Lagunitas::IPA.new path
|
204
205
|
if !quiet then puts '> 正在解析 ipa 文件...' end
|
@@ -214,17 +215,14 @@ class FirCli < Thor
|
|
214
215
|
# :distribution_name => app.distribution_name
|
215
216
|
}
|
216
217
|
if more
|
217
|
-
|
218
|
-
info[:icons] = app.icons
|
219
|
-
rescue
|
220
|
-
end
|
218
|
+
info[:icons] = app.icons
|
221
219
|
info[:plist] = app.info
|
222
220
|
end
|
223
221
|
ipa.cleanup
|
224
222
|
info
|
225
223
|
end
|
226
|
-
def
|
227
|
-
if !
|
224
|
+
def _fir_info(identifier, quiet = false)
|
225
|
+
if !_opt_token
|
228
226
|
puts Paint['! 您还没有登录', :red]
|
229
227
|
puts Paint['! 请 fir login USER_TOKEN 登录', :green]
|
230
228
|
exit
|
@@ -234,8 +232,8 @@ class FirCli < Thor
|
|
234
232
|
res = RestClient.get "http://fir.im/api/v2/app/info/#{identifier}?#{URI.encode_www_form body}"
|
235
233
|
JSON.parse res.body, :symbolize_names => true
|
236
234
|
end
|
237
|
-
def
|
238
|
-
if !
|
235
|
+
def _fir_put(id, body, quiet = false)
|
236
|
+
if !_opt_token
|
239
237
|
puts Paint['! 您还没有登录', :red]
|
240
238
|
puts Paint['! 请 fir login USER_TOKEN 登录', :green]
|
241
239
|
exit
|
@@ -245,8 +243,8 @@ class FirCli < Thor
|
|
245
243
|
RestClient.put "http://fir.im/api/v2/app/#{id}?#{URI.encode_www_form body}", body
|
246
244
|
puts '> 更新成功'
|
247
245
|
end
|
248
|
-
def
|
249
|
-
if !
|
246
|
+
def _fir_vput(id, body, quiet = false)
|
247
|
+
if !_opt_token
|
250
248
|
puts Paint['! 您还没有登录', :red]
|
251
249
|
puts Paint['! 请 fir login USER_TOKEN 登录', :green]
|
252
250
|
exit
|
@@ -256,13 +254,13 @@ class FirCli < Thor
|
|
256
254
|
RestClient.put "http://fir.im/api/v2/appVersion/#{id}/complete?#{URI.encode_www_form body}", body
|
257
255
|
puts '> 更新成功'
|
258
256
|
end
|
259
|
-
def
|
257
|
+
def _opt_token
|
260
258
|
@token = options[:token] || @ipa_config['token'] || nil
|
261
259
|
end
|
262
|
-
def
|
260
|
+
def _opt_email
|
263
261
|
@email = options[:email] || @ipa_config['email'] || nil
|
264
262
|
end
|
265
|
-
def
|
263
|
+
def _opt_resign
|
266
264
|
@resign = options[:resign] || @ipa_config['resign'] || nil
|
267
265
|
end
|
268
266
|
end
|
data/lib/lagunitas.ext.rb
CHANGED
@@ -2,25 +2,54 @@ require 'cfpropertylist'
|
|
2
2
|
require 'lagunitas'
|
3
3
|
module Lagunitas
|
4
4
|
class App
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
def initialize(path, root)
|
6
|
+
@path = path
|
7
|
+
@root = root
|
8
|
+
end
|
9
|
+
def name
|
10
|
+
@info['CFBundleName']
|
11
|
+
end
|
12
|
+
def mobileprovision
|
13
|
+
return if !mobileprovision?
|
14
|
+
@mobileprovision ||= CFPropertyList.native_types CFPropertyList::List.new(:data => `security cms -D -i #{File.join @path, 'embedded.mobileprovision'}`).value
|
15
|
+
end
|
16
|
+
def mobileprovision?
|
17
|
+
return true if @mobileprovision
|
18
|
+
File.exists? File.join @path, 'embedded.mobileprovision'
|
19
|
+
end
|
20
|
+
def devices
|
21
|
+
mobileprovision['ProvisionedDevices'] if mobileprovision
|
22
|
+
end
|
14
23
|
def distribution_name
|
15
|
-
mobileprovision['DeveloperCertificates']
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
24
|
+
mobileprovision['DeveloperCertificates'] if mobileprovision
|
25
|
+
end
|
26
|
+
def metadata
|
27
|
+
return if !metadata?
|
28
|
+
@metadata ||= CFPropertyList.native_types(CFPropertyList::List.new(file: File.join(@root, 'iTunesMetadata.plist')).value)
|
29
|
+
end
|
30
|
+
def metadata?
|
31
|
+
return true if @metadata
|
32
|
+
File.exists? File.join @root, 'iTunesMetadata.plist'
|
33
|
+
end
|
34
|
+
def release_type
|
35
|
+
@release_type ||= begin
|
36
|
+
if mobileprovision?
|
37
|
+
if devices
|
38
|
+
'adhoc'
|
39
|
+
else
|
40
|
+
'inhouse'
|
41
|
+
end
|
42
|
+
elsif metadata?
|
43
|
+
'store'
|
44
|
+
else
|
45
|
+
'adhoc'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
class IPA
|
51
|
+
def root_path
|
52
|
+
contents
|
53
|
+
end
|
25
54
|
end
|
26
55
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'lagunitas'
|
2
|
+
module Lagunitas
|
3
|
+
class App
|
4
|
+
def initialize(path, root)
|
5
|
+
@path = path
|
6
|
+
@root = root
|
7
|
+
end
|
8
|
+
def icons
|
9
|
+
@icons ||= begin
|
10
|
+
icons = []
|
11
|
+
info['CFBundleIcons']['CFBundlePrimaryIcon']['CFBundleIconFiles'].each do |name|
|
12
|
+
icons << get_image(name)
|
13
|
+
icons << get_image("#{name}@2x")
|
14
|
+
end
|
15
|
+
icons.delete_if { |i| !i }
|
16
|
+
rescue
|
17
|
+
# info['CFBundleIcons'] might be nil
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
class IPA
|
23
|
+
def app
|
24
|
+
@app ||= App.new app_path, root_path
|
25
|
+
end
|
26
|
+
def contents
|
27
|
+
@contents ||= begin
|
28
|
+
tmp_path = "tmp/lagunitas-#{SecureRandom.hex}"
|
29
|
+
Zip::ZipFile.open @path do |zip_file|
|
30
|
+
zip_file.each do |f|
|
31
|
+
f_path = File.join tmp_path, f.name
|
32
|
+
FileUtils.mkdir_p File.dirname f_path
|
33
|
+
zip_file.extract f, f_path unless File.exist? f_path
|
34
|
+
end
|
35
|
+
end
|
36
|
+
tmp_path
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fir-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yan
|
@@ -103,6 +103,7 @@ extra_rdoc_files: []
|
|
103
103
|
files:
|
104
104
|
- lib/fir-cli.rb
|
105
105
|
- lib/lagunitas.ext.rb
|
106
|
+
- lib/lagunitas.patch.rb
|
106
107
|
- bin/fir
|
107
108
|
homepage: https://github.com/idy/fir-cli
|
108
109
|
licenses:
|