shenzhen 0.5.4 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +22 -14
- data/README.md +1 -1
- data/bin/ipa +1 -0
- data/lib/shenzhen/commands.rb +1 -1
- data/lib/shenzhen/commands/info.rb +63 -0
- data/lib/shenzhen/plugins/ftp.rb +34 -13
- data/lib/shenzhen/plugins/hockeyapp.rb +2 -2
- data/lib/shenzhen/plugins/s3.rb +0 -2
- data/lib/shenzhen/plugins/testflight.rb +1 -1
- data/lib/shenzhen/version.rb +1 -1
- data/shenzhen.gemspec +5 -2
- metadata +48 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ebfc5a3bdab8ba1bccc7c1d93ff4c146dc66020
|
4
|
+
data.tar.gz: 8cb8638db47c593660ab11b0f325deed53ea858c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b853584db4fc708b4b2c834c031a50280af62e42370568b1286f1c6a59908e4feeb798bb273f0ff24b414e24c880a958378b6d5525ab9d1235ef4729aa13b354
|
7
|
+
data.tar.gz: 235d5a50b1cdddac4eefa5da37325a3deff3aea99abdfcac3054ae6a8ccc654c9a758ca945c3167ac1d5f5bdb7cd7720e1c94c0d54e0c425362baeb0ead84640
|
data/Gemfile.lock
CHANGED
@@ -1,46 +1,54 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
shenzhen (0.
|
4
|
+
shenzhen (0.6.0)
|
5
5
|
aws-sdk (~> 1.0)
|
6
6
|
commander (~> 4.1)
|
7
7
|
dotenv (~> 0.7)
|
8
|
-
faraday (~> 0.8)
|
8
|
+
faraday (~> 0.8.9)
|
9
9
|
faraday_middleware (~> 0.9)
|
10
10
|
json (~> 1.8)
|
11
11
|
net-sftp (~> 2.1.2)
|
12
|
+
plist (~> 3.1.0)
|
13
|
+
rubyzip (~> 1.1)
|
14
|
+
terminal-table (~> 1.4.5)
|
12
15
|
|
13
16
|
GEM
|
14
17
|
remote: https://rubygems.org/
|
15
18
|
specs:
|
16
|
-
aws-sdk (1.
|
19
|
+
aws-sdk (1.38.0)
|
17
20
|
json (~> 1.4)
|
18
|
-
nokogiri (>= 1.4.4
|
21
|
+
nokogiri (>= 1.4.4)
|
19
22
|
uuidtools (~> 2.1)
|
20
|
-
commander (4.1.
|
23
|
+
commander (4.1.6)
|
21
24
|
highline (~> 1.6.11)
|
22
25
|
diff-lcs (1.2.5)
|
23
|
-
dotenv (0.
|
24
|
-
faraday (0.8.
|
26
|
+
dotenv (0.10.0)
|
27
|
+
faraday (0.8.9)
|
25
28
|
multipart-post (~> 1.2.0)
|
26
29
|
faraday_middleware (0.9.0)
|
27
30
|
faraday (>= 0.7.4, < 0.9)
|
28
|
-
highline (1.6.
|
31
|
+
highline (1.6.21)
|
29
32
|
json (1.8.1)
|
33
|
+
mini_portile (0.5.3)
|
30
34
|
multipart-post (1.2.0)
|
31
35
|
net-sftp (2.1.2)
|
32
36
|
net-ssh (>= 2.6.5)
|
33
|
-
net-ssh (2.
|
34
|
-
nokogiri (1.
|
35
|
-
|
37
|
+
net-ssh (2.8.0)
|
38
|
+
nokogiri (1.6.1)
|
39
|
+
mini_portile (~> 0.5.0)
|
40
|
+
plist (3.1.0)
|
41
|
+
rake (10.2.1)
|
36
42
|
rspec (2.14.1)
|
37
43
|
rspec-core (~> 2.14.0)
|
38
44
|
rspec-expectations (~> 2.14.0)
|
39
45
|
rspec-mocks (~> 2.14.0)
|
40
|
-
rspec-core (2.14.
|
41
|
-
rspec-expectations (2.14.
|
46
|
+
rspec-core (2.14.8)
|
47
|
+
rspec-expectations (2.14.5)
|
42
48
|
diff-lcs (>= 1.1.3, < 2.0)
|
43
|
-
rspec-mocks (2.14.
|
49
|
+
rspec-mocks (2.14.6)
|
50
|
+
rubyzip (1.1.2)
|
51
|
+
terminal-table (1.4.5)
|
44
52
|
uuidtools (2.1.4)
|
45
53
|
|
46
54
|
PLATFORMS
|
data/README.md
CHANGED
@@ -49,7 +49,7 @@ Shenzhen adds the `ipa` command to your PATH:
|
|
49
49
|
|
50
50
|
#### HockeyApp Distribution
|
51
51
|
|
52
|
-
$ ipa distribute:hockeyapp
|
52
|
+
$ ipa distribute:hockeyapp --token API_TOKEN
|
53
53
|
|
54
54
|
> Shenzhen will load credentials from the environment variable `HOCKEYAPP_API_TOKEN` unless otherwise specified.
|
55
55
|
|
data/bin/ipa
CHANGED
data/lib/shenzhen/commands.rb
CHANGED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'plist'
|
2
|
+
require 'tempfile'
|
3
|
+
require 'zip'
|
4
|
+
|
5
|
+
command :info do |c|
|
6
|
+
c.syntax = 'ipa info [options]'
|
7
|
+
c.summary = 'Show mobile provisioning information about an .ipa file'
|
8
|
+
c.description = ''
|
9
|
+
|
10
|
+
c.action do |args, options|
|
11
|
+
say_error "`security` command not found in $PATH" and abort if `which security` == ""
|
12
|
+
|
13
|
+
determine_file! unless @file = args.pop
|
14
|
+
say_error "Missing or unspecified .ipa file" and abort unless @file and ::File.exist?(@file)
|
15
|
+
|
16
|
+
Zip::File.open(@file) do |zipfile|
|
17
|
+
entry = zipfile.find_entry("Payload/#{File.basename(@file)}.app/embedded.mobileprovision")
|
18
|
+
say_error "Embedded mobile provisioning file not found in #{@file}" and abort unless entry
|
19
|
+
|
20
|
+
tempfile = Tempfile.new(::File.basename(entry.name))
|
21
|
+
begin
|
22
|
+
zipfile.extract(entry, tempfile.path)
|
23
|
+
plist = Plist::parse_xml(`security cms -D -i #{tempfile.path}`)
|
24
|
+
|
25
|
+
table = Terminal::Table.new do |t|
|
26
|
+
plist.each do |key, value|
|
27
|
+
next if key == "DeveloperCertificates"
|
28
|
+
|
29
|
+
columns = []
|
30
|
+
columns << key
|
31
|
+
columns << case value
|
32
|
+
when Hash
|
33
|
+
value.collect{|k, v| "#{k}: #{v}"}.join("\n")
|
34
|
+
else
|
35
|
+
value.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
t << columns
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
puts table
|
43
|
+
|
44
|
+
rescue => e
|
45
|
+
say_error e.message
|
46
|
+
ensure
|
47
|
+
tempfile.close and tempfile.unlink
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def determine_file!
|
55
|
+
files = Dir['*.ipa']
|
56
|
+
@file ||= case files.length
|
57
|
+
when 0 then nil
|
58
|
+
when 1 then files.first
|
59
|
+
else
|
60
|
+
@file = choose "Select an .ipa File:", *files
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/shenzhen/plugins/ftp.rb
CHANGED
@@ -5,14 +5,14 @@ module Shenzhen::Plugins
|
|
5
5
|
module FTP
|
6
6
|
class Client
|
7
7
|
|
8
|
-
def initialize(host, user, password)
|
9
|
-
@host, @user, @password = host, user, password
|
8
|
+
def initialize(host, port, user, password)
|
9
|
+
@host, @port, @user, @password = host, port, user, password
|
10
10
|
end
|
11
11
|
|
12
12
|
def upload(ipa, options = {})
|
13
13
|
connection = Net::FTP.new
|
14
14
|
connection.passive = true
|
15
|
-
connection.connect(@host)
|
15
|
+
connection.connect(@host, @port)
|
16
16
|
|
17
17
|
path = expand_path_with_substitutions_from_ipa_plist(ipa, options[:path])
|
18
18
|
|
@@ -43,15 +43,13 @@ module Shenzhen::Plugins
|
|
43
43
|
private
|
44
44
|
|
45
45
|
def expand_path_with_substitutions_from_ipa_plist(ipa, path)
|
46
|
-
components = []
|
47
|
-
|
48
46
|
substitutions = path.scan(/\{CFBundle[^}]+\}/)
|
49
47
|
return path if substitutions.empty?
|
50
48
|
|
51
49
|
Dir.mktmpdir do |dir|
|
52
50
|
system "unzip -q #{ipa} -d #{dir} 2> /dev/null"
|
53
51
|
|
54
|
-
plist = Dir["#{dir}
|
52
|
+
plist = Dir["#{dir}/**/*.app/Info.plist"].last
|
55
53
|
|
56
54
|
substitutions.uniq.each do |substitution|
|
57
55
|
key = substitution[1...-1]
|
@@ -69,20 +67,31 @@ module Shenzhen::Plugins
|
|
69
67
|
module SFTP
|
70
68
|
class Client < Shenzhen::Plugins::FTP::Client
|
71
69
|
def upload(ipa, options = {})
|
72
|
-
session = Net::SSH.start(@host, @user, :password => @password)
|
70
|
+
session = Net::SSH.start(@host, @user, :password => @password, :port => @port)
|
73
71
|
connection = Net::SFTP::Session.new(session).connect!
|
74
72
|
|
75
73
|
path = expand_path_with_substitutions_from_ipa_plist(ipa, options[:path])
|
76
74
|
|
77
75
|
begin
|
78
|
-
connection.
|
79
|
-
|
80
|
-
|
76
|
+
connection.stat!(path) do |response|
|
77
|
+
connection.mkdir! path if options[:mkdir] and not response.ok?
|
78
|
+
|
79
|
+
connection.upload! ipa, determine_file_path(File.basename(ipa), path)
|
80
|
+
connection.upload! options[:dsym], determine_file_path(File.basename(options[:dsym]), path) if options[:dsym]
|
81
|
+
end
|
81
82
|
ensure
|
82
83
|
connection.close_channel
|
83
84
|
session.shutdown!
|
84
85
|
end
|
85
86
|
end
|
87
|
+
|
88
|
+
def determine_file_path(file_name, path)
|
89
|
+
if path.empty?
|
90
|
+
file_name
|
91
|
+
else
|
92
|
+
"#{path}/#{file_name}"
|
93
|
+
end
|
94
|
+
end
|
86
95
|
end
|
87
96
|
end
|
88
97
|
end
|
@@ -99,7 +108,8 @@ command :'distribute:ftp' do |c|
|
|
99
108
|
c.option '-h', '--host HOST', "FTP host"
|
100
109
|
c.option '-u', '--user USER', "FTP user"
|
101
110
|
c.option '-p', '--password PASS', "FTP password"
|
102
|
-
c.option '-P', '--path PATH', "FTP path. Values from Info.plist will be
|
111
|
+
c.option '-P', '--path PATH', "FTP path. Values from Info.plist will be substituted for keys wrapped in {} \n\t\t e.g. \"/path/to/folder/{CFBundleVersion}/\" would be evaluated as \"/path/to/folder/1.0.0/\""
|
112
|
+
c.option '--port PORT', "FTP port"
|
103
113
|
c.option '--protocol [PROTOCOL]', [:ftp, :sftp], "Protocol to use (ftp, sftp)"
|
104
114
|
c.option '--[no-]mkdir', "Create directories on FTP if they don't already exist"
|
105
115
|
|
@@ -115,6 +125,8 @@ command :'distribute:ftp' do |c|
|
|
115
125
|
determine_host! unless @host = options.host
|
116
126
|
say_error "Missing FTP host" and abort unless @host
|
117
127
|
|
128
|
+
determine_port!(options.protocol) unless @port = options.port
|
129
|
+
|
118
130
|
determine_user! unless @user = options.user
|
119
131
|
say_error "Missing FTP user" and abort unless @user
|
120
132
|
|
@@ -125,9 +137,9 @@ command :'distribute:ftp' do |c|
|
|
125
137
|
|
126
138
|
client = case options.protocol
|
127
139
|
when :sftp
|
128
|
-
Shenzhen::Plugins::SFTP::Client.new(@host, @user, @password)
|
140
|
+
Shenzhen::Plugins::SFTP::Client.new(@host, @port, @user, @password)
|
129
141
|
else
|
130
|
-
Shenzhen::Plugins::FTP::Client.new(@host, @user, @password)
|
142
|
+
Shenzhen::Plugins::FTP::Client.new(@host, @port, @user, @password)
|
131
143
|
end
|
132
144
|
|
133
145
|
begin
|
@@ -144,6 +156,15 @@ command :'distribute:ftp' do |c|
|
|
144
156
|
@host ||= ask "FTP Host:"
|
145
157
|
end
|
146
158
|
|
159
|
+
def determine_port!(protocol)
|
160
|
+
@port = case protocol
|
161
|
+
when :sftp
|
162
|
+
Net::SSH::Transport::Session::DEFAULT_PORT
|
163
|
+
else
|
164
|
+
Net::FTP::FTP_PORT
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
147
168
|
def determine_user!
|
148
169
|
@user ||= ask "Username:"
|
149
170
|
end
|
@@ -81,9 +81,9 @@ command :'distribute:hockeyapp' do |c|
|
|
81
81
|
parameters[:dsym_filename] = @dsym if @dsym
|
82
82
|
parameters[:mandatory] = "1" if options.mandatory
|
83
83
|
parameters[:release_type] = case options.release
|
84
|
-
when
|
84
|
+
when :beta
|
85
85
|
"0"
|
86
|
-
when
|
86
|
+
when :live
|
87
87
|
"1"
|
88
88
|
else
|
89
89
|
"2"
|
data/lib/shenzhen/plugins/s3.rb
CHANGED
@@ -83,7 +83,7 @@ command :'distribute:testflight' do |c|
|
|
83
83
|
when 200...300
|
84
84
|
say_ok "Build successfully uploaded to TestFlight"
|
85
85
|
else
|
86
|
-
say_error "Error uploading to TestFlight: #{response.body}"
|
86
|
+
say_error "Error uploading to TestFlight: #{response.body}" and abort
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
data/lib/shenzhen/version.rb
CHANGED
data/shenzhen.gemspec
CHANGED
@@ -7,19 +7,22 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.name = "shenzhen"
|
8
8
|
s.authors = ["Mattt Thompson"]
|
9
9
|
s.email = "m@mattt.me"
|
10
|
-
s.homepage = "http://
|
10
|
+
s.homepage = "http://nomad-cli.com"
|
11
11
|
s.version = Shenzhen::VERSION
|
12
12
|
s.platform = Gem::Platform::RUBY
|
13
13
|
s.summary = "Shenzhen"
|
14
14
|
s.description = "CLI for Building & Distributing iOS Apps (.ipa Files)"
|
15
15
|
|
16
16
|
s.add_dependency "commander", "~> 4.1"
|
17
|
+
s.add_dependency "terminal-table", "~> 1.4.5"
|
17
18
|
s.add_dependency "json", "~> 1.8"
|
18
|
-
s.add_dependency "faraday", "~> 0.8"
|
19
|
+
s.add_dependency "faraday", "~> 0.8.9"
|
19
20
|
s.add_dependency "faraday_middleware", "~> 0.9"
|
20
21
|
s.add_dependency "dotenv", "~> 0.7"
|
21
22
|
s.add_dependency "aws-sdk", "~> 1.0"
|
22
23
|
s.add_dependency "net-sftp", "~> 2.1.2"
|
24
|
+
s.add_dependency "plist", "~> 3.1.0"
|
25
|
+
s.add_dependency "rubyzip", "~> 1.1"
|
23
26
|
|
24
27
|
s.add_development_dependency "rspec"
|
25
28
|
s.add_development_dependency "rake"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shenzhen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mattt Thompson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: commander
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: terminal-table
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.4.5
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.4.5
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: json
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +58,14 @@ dependencies:
|
|
44
58
|
requirements:
|
45
59
|
- - ~>
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
61
|
+
version: 0.8.9
|
48
62
|
type: :runtime
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - ~>
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
68
|
+
version: 0.8.9
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: faraday_middleware
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +122,34 @@ dependencies:
|
|
108
122
|
- - ~>
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: 2.1.2
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: plist
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ~>
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 3.1.0
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ~>
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 3.1.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubyzip
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ~>
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '1.1'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ~>
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '1.1'
|
111
153
|
- !ruby/object:Gem::Dependency
|
112
154
|
name: rspec
|
113
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,6 +190,7 @@ files:
|
|
148
190
|
- ./lib/shenzhen/agvtool.rb
|
149
191
|
- ./lib/shenzhen/commands/build.rb
|
150
192
|
- ./lib/shenzhen/commands/distribute.rb
|
193
|
+
- ./lib/shenzhen/commands/info.rb
|
151
194
|
- ./lib/shenzhen/commands.rb
|
152
195
|
- ./lib/shenzhen/plistbuddy.rb
|
153
196
|
- ./lib/shenzhen/plugins/ftp.rb
|
@@ -162,7 +205,7 @@ files:
|
|
162
205
|
- ./README.md
|
163
206
|
- ./shenzhen.gemspec
|
164
207
|
- bin/ipa
|
165
|
-
homepage: http://
|
208
|
+
homepage: http://nomad-cli.com
|
166
209
|
licenses: []
|
167
210
|
metadata: {}
|
168
211
|
post_install_message:
|