cocoapods-submit 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/cocoapods-submit.gemspec +2 -3
- data/lib/cocoapods_submit.rb +5 -0
- data/lib/cocoapods_submit/build_configuration.rb +23 -0
- data/lib/cocoapods_submit/ipa_builder.rb +129 -0
- data/lib/cocoapods_submit/ipa_uploader.rb +106 -0
- data/lib/cocoapods_submit/provisioning_profile.rb +52 -0
- data/lib/{version.rb → cocoapods_submit/version.rb} +1 -1
- data/lib/pod/command/submit.rb +17 -87
- data/ps.rb +74 -0
- metadata +9 -32
- data/lib/provisioning_profile.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c96979d4855a45ae0032587c5733fa5d3460a48
|
4
|
+
data.tar.gz: a83e7da4d915e1b8a88da2b6720a92c8ec93ec07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a70e9f04478679bbaf950a1dbafd52ba98e2ccaf40a71d52b2716ceacd07d72e7db439adf5ab38df31c041265184e9b127357a243774d493a70328e9bbde5d8
|
7
|
+
data.tar.gz: c5237cc46abfdb92b84770666638c09bf58c0a9bd59796bbcf24a603321ee6bb9f79d1589700381956850937815ce6d62a300fad7d4835c93aeca53a03474a1d
|
data/cocoapods-submit.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'version'
|
4
|
+
require 'cocoapods_submit/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "cocoapods-submit"
|
@@ -18,8 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "
|
22
|
-
spec.add_dependency "xcpretty", "~> 0.1"
|
21
|
+
# spec.add_dependency "xcpretty", "~> 0.1"
|
23
22
|
spec.add_dependency "plist", "~> 3.1"
|
24
23
|
|
25
24
|
spec.add_development_dependency "bundler", "~> 1.7"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'plist'
|
2
|
+
|
3
|
+
module CocoapodsSubmit
|
4
|
+
class BuildConfiguration
|
5
|
+
def initialize(workspace_path, target, configuration)
|
6
|
+
output = `xcodebuild -showBuildSettings -workspace "#{workspace_path}" -scheme "#{target.name}" -configuration "#{configuration.name}"`
|
7
|
+
abort unless $?
|
8
|
+
|
9
|
+
@hash = {}
|
10
|
+
regex = /(\w*) *= *(.*)/
|
11
|
+
lines = output.split("\n").select { |s| s.match(regex) }
|
12
|
+
lines = lines.map { |s| s.match(regex) }.each { |match| @hash[match[1]] = match[2] }
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
super + ": #{@hash.to_s}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def [](settings)
|
20
|
+
@hash[settings]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'plist'
|
2
|
+
require 'securerandom'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module CocoapodsSubmit
|
6
|
+
class IPABuilder
|
7
|
+
attr_reader :workspace_path
|
8
|
+
attr_reader :target
|
9
|
+
attr_reader :configuration
|
10
|
+
attr_reader :build_settings
|
11
|
+
attr_reader :provisioning
|
12
|
+
|
13
|
+
def initialize(workspace_path, target, configuration)
|
14
|
+
@directory = File.join "/tmp", SecureRandom.uuid
|
15
|
+
@workspace_path = workspace_path
|
16
|
+
@target = target
|
17
|
+
@configuration = configuration
|
18
|
+
@build_settings = BuildConfiguration.new workspace_path, @target, configuration
|
19
|
+
end
|
20
|
+
|
21
|
+
def bundle_identifier
|
22
|
+
relative_info_path = configuration.build_settings["INFOPLIST_FILE"]
|
23
|
+
info_path = File.join File.dirname(@target.project.path), relative_info_path
|
24
|
+
Plist::parse_xml(info_path)["CFBundleIdentifier"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def build_ipa
|
28
|
+
FileUtils.mkdir_p @directory
|
29
|
+
|
30
|
+
increment_bundle_version
|
31
|
+
xcodebuild
|
32
|
+
copy_app
|
33
|
+
# codesign
|
34
|
+
ipa_path = package_ipa
|
35
|
+
|
36
|
+
final_ipa_path = File.join ".", File.basename(ipa_path)
|
37
|
+
FileUtils.move ipa_path, final_ipa_path
|
38
|
+
|
39
|
+
FileUtils.rm_rf @directory
|
40
|
+
final_ipa_path
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
def increment_bundle_version
|
45
|
+
relative_info_path = configuration.build_settings["INFOPLIST_FILE"]
|
46
|
+
info_path = File.join File.dirname(@target.project.path), relative_info_path
|
47
|
+
info_plist = Plist::parse_xml(info_path)
|
48
|
+
info_plist["CFBundleVersion"] = (info_plist["CFBundleVersion"].to_i + 1).to_s
|
49
|
+
File.write info_path, info_plist.to_plist
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def xcodebuild
|
54
|
+
flags = []
|
55
|
+
flags << %{-sdk iphoneos}
|
56
|
+
flags << %{-workspace "#{workspace_path}"}
|
57
|
+
flags << %{-scheme "#{target.name}"}
|
58
|
+
flags << %{-configuration "#{configuration.name}"}
|
59
|
+
|
60
|
+
actions = []
|
61
|
+
actions << :clean
|
62
|
+
actions << :build
|
63
|
+
actions << :archive
|
64
|
+
|
65
|
+
execute %{xcodebuild #{flags.join(" ")} #{actions.join(" ")} | xcpretty -c && exit ${PIPESTATUS[0]}}
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
def execute(command)
|
70
|
+
puts "#{"==>".magenta} #{command}"
|
71
|
+
abort unless system(command)
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
def root_directory
|
76
|
+
root_directory = File.join @directory, "root"
|
77
|
+
FileUtils.mkdir_p root_directory
|
78
|
+
root_directory
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
def copy_app
|
83
|
+
app_path = File.join build_settings['BUILT_PRODUCTS_DIR'], build_settings['WRAPPER_NAME']
|
84
|
+
dsym_path = app_path + ".dSYM"
|
85
|
+
|
86
|
+
FileUtils.cp_r app_path, root_directory
|
87
|
+
FileUtils.cp_r dsym_path, root_directory
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
def codesign
|
92
|
+
provisioning = CocoapodsSubmit::ProvisioningProfile.new configuration.build_settings["PROVISIONING_PROFILE"]
|
93
|
+
abort "cocoapods-submit only supports provisionings with a single signer identity" unless provisioning.signer_identities.count == 1
|
94
|
+
signer_identity = provisioning.signer_identities.first
|
95
|
+
|
96
|
+
empty_entitlements = entitlements
|
97
|
+
app_entitlements = entitlements provisioning["Entitlements"]
|
98
|
+
|
99
|
+
app_path = File.join root_directory, build_settings['WRAPPER_NAME']
|
100
|
+
frameworks_path = File.join app_path, "Frameworks"
|
101
|
+
|
102
|
+
execute %{codesign --force --verbose --preserve-metadata=identifier,resource-rules --entitlements "#{empty_entitlements}" --sign "#{signer_identity}" #{frameworks_path}/*} if File.exists? frameworks_path
|
103
|
+
execute %{codesign --force --verbose --preserve-metadata=identifier,resource-rules --entitlements "#{app_entitlements}" --sign "#{signer_identity}" #{app_path}}
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
def entitlements(entitlements = {})
|
108
|
+
entitlements.each do |key, value|
|
109
|
+
next unless value.kind_of? Array
|
110
|
+
value.delete "Development"
|
111
|
+
end
|
112
|
+
|
113
|
+
path = File.join @directory, "#{SecureRandom.uuid}.entitlements"
|
114
|
+
File.write path, entitlements.to_plist
|
115
|
+
path
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
def package_ipa
|
120
|
+
app_path = File.join root_directory, build_settings['WRAPPER_NAME']
|
121
|
+
dsym_path = app_path + ".dSYM"
|
122
|
+
ipa_path = File.join @directory, "#{@target.name}.ipa"
|
123
|
+
|
124
|
+
execute %{xcrun -sdk iphoneos PackageApplication -v "#{app_path}" -o "#{ipa_path}" --embed "#{dsym_path}" > /dev/null}
|
125
|
+
|
126
|
+
ipa_path
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'plist'
|
2
|
+
require 'securerandom'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module CocoapodsSubmit
|
6
|
+
class IPAUploader
|
7
|
+
attr_reader :ipa
|
8
|
+
attr_reader :bundle_identifier
|
9
|
+
|
10
|
+
def initialize(ipa, bundle_identifier)
|
11
|
+
@directory = File.join "/tmp", SecureRandom.uuid
|
12
|
+
@ipa = ipa
|
13
|
+
@bundle_identifier = bundle_identifier
|
14
|
+
end
|
15
|
+
|
16
|
+
def upload
|
17
|
+
FileUtils::mkdir_p @directory
|
18
|
+
|
19
|
+
username, password, apple_id = credentials(bundle_identifier)
|
20
|
+
|
21
|
+
transporter = File.join `xcode-select --print-path`.chomp, "/../Applications/Application\\ Loader.app/Contents/MacOS/itms/bin/iTMSTransporter"
|
22
|
+
|
23
|
+
package = create_package(apple_id)
|
24
|
+
execute %{#{transporter} -m verify -f "#{package}" -u "#{username}" -p "#{password}"}
|
25
|
+
execute %{#{transporter} -m upload -f "#{package}" -u "#{username}" -p "#{password}"}
|
26
|
+
|
27
|
+
`rm -rf "#{@directory}"`
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
def create_package(apple_id)
|
32
|
+
size = File.size(ipa)
|
33
|
+
checksum = Digest::MD5.file(ipa)
|
34
|
+
|
35
|
+
package = File.join @directory, "Package.itmsp"
|
36
|
+
FileUtils.mkdir_p(package)
|
37
|
+
|
38
|
+
ipa_path = File.join(package, File.basename(ipa))
|
39
|
+
metadata_path = File.join(package, "metadata.xml")
|
40
|
+
|
41
|
+
FileUtils.copy_entry(ipa, ipa_path)
|
42
|
+
File.write(metadata_path, metadata(apple_id, checksum, size))
|
43
|
+
|
44
|
+
package
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
def execute(command)
|
49
|
+
puts "#{"==>".magenta} #{command}"
|
50
|
+
abort unless system(command)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
def login(bundle_identifier)
|
55
|
+
puts "You will now have to login to iTunes Connect. Don't worry. Your credentials will be securly stored in your keychain."
|
56
|
+
print "Username: "
|
57
|
+
username = $stdin.gets.chomp
|
58
|
+
abort "Username is required" if username.empty?
|
59
|
+
|
60
|
+
print "Password for #{username}: "
|
61
|
+
password = STDIN.noecho(&:gets).chomp
|
62
|
+
abort "Password is required" if password.empty?
|
63
|
+
puts ""
|
64
|
+
|
65
|
+
print "Apple-ID for #{bundle_identifier} (you can find it in iTunes Connect): "
|
66
|
+
apple_id = $stdin.gets.chomp
|
67
|
+
abort "Apple-ID is required" if apple_id.empty?
|
68
|
+
|
69
|
+
`security add-generic-password -a #{bundle_identifier}.cocoapods-submit.username -s #{bundle_identifier}.cocoapods-submit.username -w #{username}`
|
70
|
+
`security add-generic-password -a #{bundle_identifier}.cocoapods-submit.password -s #{bundle_identifier}.cocoapods-submit.password -w #{password}`
|
71
|
+
`security add-generic-password -a #{bundle_identifier}.cocoapods-submit.apple-id -s #{bundle_identifier}.cocoapods-submit.apple-id -w #{apple_id}`
|
72
|
+
|
73
|
+
return [username, password, apple_id]
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
def credentials(bundle_identifier)
|
78
|
+
username = `security find-generic-password -wl #{bundle_identifier}.cocoapods-submit.username`.chomp
|
79
|
+
return login(bundle_identifier) if $?.to_i > 0
|
80
|
+
|
81
|
+
password = `security find-generic-password -wl #{bundle_identifier}.cocoapods-submit.password`.chomp
|
82
|
+
return login(bundle_identifier) if $?.to_i > 0
|
83
|
+
|
84
|
+
apple_id = `security find-generic-password -wl #{bundle_identifier}.cocoapods-submit.apple-id`.chomp
|
85
|
+
return login(bundle_identifier) if $?.to_i > 0
|
86
|
+
|
87
|
+
return [username, password, apple_id]
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
def metadata(apple_id, checksum, size)
|
92
|
+
%Q(<?xml version="1.0" encoding="UTF-8"?>
|
93
|
+
<package version="software4.7" xmlns="http://apple.com/itunes/importer">
|
94
|
+
<software_assets apple_id="#{apple_id}">
|
95
|
+
<asset type="bundle">
|
96
|
+
<data_file>
|
97
|
+
<file_name>#{File.basename ipa}</file_name>
|
98
|
+
<checksum type="md5">#{checksum}</checksum>
|
99
|
+
<size>#{size}</size>
|
100
|
+
</data_file>
|
101
|
+
</asset>
|
102
|
+
</software_assets>
|
103
|
+
</package>)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'plist'
|
2
|
+
require 'openssl'
|
3
|
+
|
4
|
+
module CocoapodsSubmit
|
5
|
+
class ProvisioningProfile
|
6
|
+
attr_reader :path
|
7
|
+
attr_reader :uuid
|
8
|
+
|
9
|
+
def initialize(uuid)
|
10
|
+
@uuid = uuid
|
11
|
+
@path = File.expand_path File.join "~/Library/MobileDevice/Provisioning Profiles", "#{uuid}.mobileprovision"
|
12
|
+
abort "#{@path} not found" unless File.exists? @path
|
13
|
+
|
14
|
+
start_string = "<?"
|
15
|
+
end_string = "</plist>"
|
16
|
+
|
17
|
+
profile = File.read(@path)
|
18
|
+
profile = profile.slice(profile.index(start_string), profile.length)
|
19
|
+
profile = profile.slice(0, profile.index(end_string) + end_string.length)
|
20
|
+
|
21
|
+
@hash = Plist::parse_xml(profile)
|
22
|
+
@hash["DeveloperCertificates"] = @hash["DeveloperCertificates"].map { |s| OpenSSL::X509::Certificate.new s.string }
|
23
|
+
end
|
24
|
+
|
25
|
+
def signer_identities
|
26
|
+
@hash["DeveloperCertificates"].map do |cert|
|
27
|
+
array = cert.subject.to_a.flatten
|
28
|
+
hash = Hash[array.map.with_index.to_a]
|
29
|
+
|
30
|
+
array[hash["CN"] + 1]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def[](string)
|
35
|
+
@hash[string]
|
36
|
+
end
|
37
|
+
|
38
|
+
def rank
|
39
|
+
return 0.0 unless @hash
|
40
|
+
|
41
|
+
rank = 1.0
|
42
|
+
rank *= 0.0 if @hash["Entitlements"]["get-task-allow"]
|
43
|
+
rank *= 1.0 / @hash["ProvisionedDevices"].count if @hash["ProvisionedDevices"]
|
44
|
+
|
45
|
+
return rank
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_s
|
49
|
+
super + ": #{@hash.to_s}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/pod/command/submit.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'plist'
|
2
2
|
require 'io/console'
|
3
|
-
require 'provisioning_profile'
|
4
3
|
require 'time'
|
4
|
+
require 'cocoapods_submit'
|
5
5
|
|
6
6
|
module Pod
|
7
7
|
class Command
|
@@ -22,60 +22,23 @@ module Pod
|
|
22
22
|
super
|
23
23
|
end
|
24
24
|
|
25
|
-
def login(bundle_identifier)
|
26
|
-
puts "You will now have to login to iTunes Connect. Don't worry. Your credentials will be securly stored in your keychain."
|
27
|
-
print "Username: "
|
28
|
-
username = $stdin.gets.chomp
|
29
|
-
abort "Username is required" if username.empty?
|
30
|
-
|
31
|
-
print "Password for #{username}: "
|
32
|
-
password = STDIN.noecho(&:gets).chomp
|
33
|
-
abort "Password is required" if password.empty?
|
34
|
-
puts ""
|
35
|
-
|
36
|
-
print "Apple-ID for #{bundle_identifier} (you can find it in iTunes Connect): "
|
37
|
-
apple_id = $stdin.gets.chomp
|
38
|
-
abort "Apple-ID is required" if apple_id.empty?
|
39
|
-
|
40
|
-
`security add-generic-password -a #{bundle_identifier}.cocoapods-submit.username -s #{bundle_identifier}.cocoapods-submit.username -w #{username}`
|
41
|
-
`security add-generic-password -a #{bundle_identifier}.cocoapods-submit.password -s #{bundle_identifier}.cocoapods-submit.password -w #{password}`
|
42
|
-
`security add-generic-password -a #{bundle_identifier}.cocoapods-submit.apple-id -s #{bundle_identifier}.cocoapods-submit.apple-id -w #{apple_id}`
|
43
|
-
|
44
|
-
return [username, password, apple_id]
|
45
|
-
end
|
46
|
-
|
47
|
-
def credentials(bundle_identifier)
|
48
|
-
username = `security find-generic-password -wl #{bundle_identifier}.cocoapods-submit.username`.chomp
|
49
|
-
return login(bundle_identifier) if $?.to_i > 0
|
50
|
-
|
51
|
-
password = `security find-generic-password -wl #{bundle_identifier}.cocoapods-submit.password`.chomp
|
52
|
-
return login(bundle_identifier) if $?.to_i > 0
|
53
|
-
|
54
|
-
apple_id = `security find-generic-password -wl #{bundle_identifier}.cocoapods-submit.apple-id`.chomp
|
55
|
-
return login(bundle_identifier) if $?.to_i > 0
|
56
|
-
|
57
|
-
return [username, password, apple_id]
|
58
|
-
end
|
59
|
-
|
60
|
-
def create_package(target, apple_id)
|
61
|
-
ipa = "#{target}.ipa"
|
62
|
-
size = File.size(ipa)
|
63
|
-
checksum = Digest::MD5.file(ipa)
|
64
|
-
|
65
|
-
FileUtils.mkdir_p("Package.itmsp")
|
66
|
-
FileUtils.copy_entry(ipa, "Package.itmsp/#{ipa}")
|
67
|
-
|
68
|
-
File.write("Package.itmsp/metadata.xml", metadata(apple_id, checksum, size))
|
69
|
-
end
|
70
|
-
|
71
25
|
def find_best_configuration(target)
|
72
26
|
identifiers = target.build_configurations.map { |c| c.build_settings["PROVISIONING_PROFILE"] }
|
73
|
-
profiles = identifiers.map { |uuid| CocoapodsSubmit::ProvisioningProfile.
|
74
|
-
|
27
|
+
profiles = identifiers.map { |uuid| CocoapodsSubmit::ProvisioningProfile.new uuid }
|
28
|
+
abort "No build configuration for iTunes Connect releases found." if profiles.count == 0
|
75
29
|
|
30
|
+
ranks = profiles.map &:rank
|
76
31
|
return target.build_configurations[ranks.each_with_index.max[1]]
|
77
32
|
end
|
78
33
|
|
34
|
+
def tag_release
|
35
|
+
time = Time.now.strftime "%Y%m%d%H%m%S"
|
36
|
+
execute "git add ."
|
37
|
+
execute "git commit -am 'Submitted to iTunes Connect submit-#{time}-#{@target.name}-#{info_plist["CFBundleShortVersionString"]}-#{info_plist["CFBundleVersion"]}'"
|
38
|
+
execute "git tag submit-#{time}-#{@target.name}-#{info_plist["CFBundleShortVersionString"]}-#{info_plist["CFBundleVersion"]}"
|
39
|
+
execute "git push && git push --tags"
|
40
|
+
end
|
41
|
+
|
79
42
|
def run
|
80
43
|
workspaces = Dir.entries(".").select { |s| s.end_with? ".xcworkspace" }
|
81
44
|
abort "pod submit only supports one .xcworkspace in the current directory" unless workspaces.count == 1
|
@@ -106,46 +69,13 @@ module Pod
|
|
106
69
|
configuration = find_best_configuration @target
|
107
70
|
abort "No build configuration found for target #{@target}." unless configuration
|
108
71
|
|
109
|
-
|
110
|
-
|
111
|
-
info_path = File.join File.dirname(project.path), relative_info_path
|
112
|
-
info_plist = Plist::parse_xml(info_path)
|
113
|
-
identifier = info_plist["CFBundleIdentifier"]
|
114
|
-
info_plist["CFBundleVersion"] = (info_plist["CFBundleVersion"].to_i + 1).to_s
|
115
|
-
File.write info_path, info_plist.to_plist
|
116
|
-
|
117
|
-
username, password, apple_id = credentials(identifier)
|
118
|
-
|
119
|
-
execute "ipa build --verbose --scheme #{@target_name} --configuration #{configuration.name} | xcpretty -c && exit ${PIPESTATUS[0]}"
|
120
|
-
execute "ipa info #{@target_name}.ipa"
|
72
|
+
ipa_builder = CocoapodsSubmit::IPABuilder.new workspaces[0], targets.first, configuration
|
73
|
+
path = ipa_builder.build_ipa
|
121
74
|
|
122
|
-
|
123
|
-
|
124
|
-
create_package(@target_name, apple_id)
|
125
|
-
execute "#{transporter} -m verify -f Package.itmsp -u #{username} -p #{password}"
|
126
|
-
execute "#{transporter} -m upload -f Package.itmsp -u #{username} -p #{password}"
|
127
|
-
`rm -rf Package.itmsp #{@target_name}.ipa #{@target_name}.app.dSYM.zip`
|
128
|
-
|
129
|
-
time = Time.now.strftime "%Y%m%d%H%m%S"
|
130
|
-
execute "git add ."
|
131
|
-
execute "git commit -am 'Submitted to iTunes Connect submit-#{time}-#{@target.name}-#{info_plist["CFBundleShortVersionString"]}-#{info_plist["CFBundleVersion"]}'"
|
132
|
-
execute "git tag submit-#{time}-#{@target.name}-#{info_plist["CFBundleShortVersionString"]}-#{info_plist["CFBundleVersion"]}"
|
133
|
-
execute "git push && git push --tags"
|
134
|
-
end
|
75
|
+
uploader = CocoapodsSubmit::IPAUploader.new path, ipa_builder.bundle_identifier
|
76
|
+
uploader.upload
|
135
77
|
|
136
|
-
|
137
|
-
%Q(<?xml version="1.0" encoding="UTF-8"?>
|
138
|
-
<package version="software4.7" xmlns="http://apple.com/itunes/importer">
|
139
|
-
<software_assets apple_id="#{apple_id}">
|
140
|
-
<asset type="bundle">
|
141
|
-
<data_file>
|
142
|
-
<file_name>#{@target_name}.ipa</file_name>
|
143
|
-
<checksum type="md5">#{checksum}</checksum>
|
144
|
-
<size>#{size}</size>
|
145
|
-
</data_file>
|
146
|
-
</asset>
|
147
|
-
</software_assets>
|
148
|
-
</package>)
|
78
|
+
tag_release
|
149
79
|
end
|
150
80
|
end
|
151
81
|
end
|
data/ps.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
handled_processes = []
|
2
|
+
|
3
|
+
while true
|
4
|
+
processes = `ps ax`.split "\n"
|
5
|
+
index = processes.shift.index /COMMAND/
|
6
|
+
|
7
|
+
processes.map { |s| s[index..-1] }.each do |command|
|
8
|
+
command = command.strip
|
9
|
+
next if handled_processes.include? command
|
10
|
+
|
11
|
+
handled_processes << command
|
12
|
+
puts command
|
13
|
+
end
|
14
|
+
sleep 0.001
|
15
|
+
end
|
16
|
+
|
17
|
+
=begin
|
18
|
+
/Applications/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --eval require('/Applications/Atom.app/Contents/Resources/app/node_modules/coffee-script/lib/coffee-script/coffee-script.js').register();^Jrequire('/Applications/Atom.app/Contents/Resources/app/src/coffee-cache.js').register();^Jrequire('/Applications/Atom.app/Contents/Resources/app/src/task-bootstrap.js');
|
19
|
+
(Atom Helper)
|
20
|
+
(lssave)
|
21
|
+
/System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker-bundle -c MDSImporterBundleFinder -m com.apple.mdworker.bundles
|
22
|
+
/usr/bin/ditto -V /Users/oliver/Library/Developer/Xcode/Archives/2014-11-10/SellSpotCompanion 10.11.14 10.16.xcarchive/Products/Applications/SellSpotCompanion.app /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app
|
23
|
+
(ditto)
|
24
|
+
/usr/bin/codesign -vvv --force --sign 41796A964CE9D664FB012A8A47ADDA2C22DED204 --preserve-metadata=identifier,resource-rules --entitlements /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/entitlementsYm3 /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/SellSpotSDK.framework
|
25
|
+
codesign_allocate -i /private/var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/SellSpotSDK.framework/SellSpotSDK -o /private/var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/SellSpotSDK.framework/SellSpotSDK.cstemp -a armv7 24848 -a arm64 28448
|
26
|
+
(codesign)
|
27
|
+
/usr/bin/codesign -vvv --force --sign 41796A964CE9D664FB012A8A47ADDA2C22DED204 --preserve-metadata=identifier,resource-rules --entitlements /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/entitlementsD0l /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/libswiftCore.dylib
|
28
|
+
(codesign_allocat)
|
29
|
+
/usr/bin/codesign -vvv --force --sign 41796A964CE9D664FB012A8A47ADDA2C22DED204 --preserve-metadata=identifier,resource-rules --entitlements /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/entitlementscGY /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/libswiftCoreGraphics.dylib
|
30
|
+
/usr/bin/codesign -vvv --force --sign 41796A964CE9D664FB012A8A47ADDA2C22DED204 --preserve-metadata=identifier,resource-rules --entitlements /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/entitlementssEK /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/libswiftCoreImage.dylib
|
31
|
+
/usr/bin/codesign -vvv --force --sign 41796A964CE9D664FB012A8A47ADDA2C22DED204 --preserve-metadata=identifier,resource-rules --entitlements /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/entitlementsrR2 /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/libswiftDarwin.dylib
|
32
|
+
/usr/bin/codesign -vvv --force --sign 41796A964CE9D664FB012A8A47ADDA2C22DED204 --preserve-metadata=identifier,resource-rules --entitlements /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/entitlementsUAE /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/libswiftDispatch.dylib
|
33
|
+
/usr/bin/codesign -vvv --force --sign 41796A964CE9D664FB012A8A47ADDA2C22DED204 --preserve-metadata=identifier,resource-rules --entitlements /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/entitlementscaW /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/libswiftFoundation.dylib
|
34
|
+
/usr/bin/codesign -vvv --force --sign 41796A964CE9D664FB012A8A47ADDA2C22DED204 --preserve-metadata=identifier,resource-rules --entitlements /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/entitlementsBYW /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/libswiftObjectiveC.dylib
|
35
|
+
/usr/bin/codesign -vvv --force --sign 41796A964CE9D664FB012A8A47ADDA2C22DED204 --preserve-metadata=identifier,resource-rules --entitlements /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/entitlementswOn /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/libswiftSecurity.dylib
|
36
|
+
/usr/bin/codesign -vvv --force --sign 41796A964CE9D664FB012A8A47ADDA2C22DED204 --preserve-metadata=identifier,resource-rules --entitlements /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/entitlementsj8N /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app/Frameworks/libswiftUIKit.dylib
|
37
|
+
/usr/bin/codesign -vvv --force --sign 41796A964CE9D664FB012A8A47ADDA2C22DED204 --preserve-metadata=identifier,resource-rules --entitlements /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/entitlementsVRN /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root/Payload/SellSpotCompanion.app
|
38
|
+
(rsync)
|
39
|
+
/Applications/Xcode.app/Contents/Developer/usr/bin/symbols -noTextInSOD -noDaemon -arch all -symbolsPackageDir /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Symbols /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/SellSpotSDK.framework/SellSpotSDK
|
40
|
+
(symbols)
|
41
|
+
/Applications/Xcode.app/Contents/Developer/usr/bin/symbols -noTextInSOD -noDaemon -arch all -symbolsPackageDir /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Symbols /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/SellSpotCompanion.app/SellSpotCompanion
|
42
|
+
/usr/bin/ditto -V -c -k --norsrc /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/Root /var/folders/nr/th1dm1g94d79dn7w2d1r3nxw0000gn/T/XCodeDistPipeline.bUI/SellSpotCompanion.ipa
|
43
|
+
/System/Library/PrivateFrameworks/FamilyControls.framework/Resources/parentalcontrolsd
|
44
|
+
automountd
|
45
|
+
(mdworker)
|
46
|
+
(parentalcontrols)
|
47
|
+
(zsh)
|
48
|
+
(git)
|
49
|
+
(tail)
|
50
|
+
(cat)
|
51
|
+
(mdwrite)
|
52
|
+
(SFLSharedPrefsTo)
|
53
|
+
/System/Library/PrivateFrameworks/SyncedDefaults.framework/Support/syncdefaultsd
|
54
|
+
(garcon)
|
55
|
+
pluginkit -a /Applications/Dropbox.app/Contents/PlugIns/garcon.appex
|
56
|
+
(pluginkit)
|
57
|
+
pluginkit -e use -i com.getdropbox.dropbox.garcon
|
58
|
+
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lssave 0
|
59
|
+
(SFLIconTool)
|
60
|
+
/Applications/Xcode.app/Contents/SharedFrameworks/DVTSourceControl.framework/Versions/A/XPCServices/com.apple.dt.Xcode.sourcecontrol.Git.xpc/Contents/MacOS/com.apple.dt.Xcode.sourcecontrol.Git
|
61
|
+
/Applications/Xcode.app/Contents/SharedFrameworks/DVTSourceControl.framework/Versions/A/XPCServices/com.apple.dt.Xcode.sourcecontrol.Subversion.xpc/Contents/MacOS/com.apple.dt.Xcode.sourcecontrol.Subversion
|
62
|
+
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/sourcekitd.framework/Versions/A/XPCServices/SourceKitService.xpc/Contents/MacOS/SourceKitService
|
63
|
+
/Applications/Xcode.app/Contents/SharedFrameworks/DVTSourceControl.framework/Versions/A/XPCServices/com.apple.dt.Xcode.sourcecontrol.WorkingCopyScanner.xpc/Contents/MacOS/com.apple.dt.Xcode.sourcecontrol.WorkingCopyScanner
|
64
|
+
/Applications/Xcode.app/Contents/Developer/usr/bin/svn info /Users/oliver/Development/SparrowLabs/sellspot --xml --no-auth-cache
|
65
|
+
/Applications/Xcode.app/Contents/Developer/usr/bin/git config --get remote.origin.url
|
66
|
+
/Applications/Xcode.app/Contents/Developer/usr/bin/git status --porcelain
|
67
|
+
(sh)
|
68
|
+
(clang)
|
69
|
+
(svn)
|
70
|
+
(ld)
|
71
|
+
git diff
|
72
|
+
less
|
73
|
+
(com.apple.iCloud)
|
74
|
+
=end
|
metadata
CHANGED
@@ -1,43 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cocoapods-submit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oliver Letterer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: shenzhen
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0.8'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0.8'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: xcpretty
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0.1'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0.1'
|
41
13
|
- !ruby/object:Gem::Dependency
|
42
14
|
name: plist
|
43
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,9 +67,14 @@ files:
|
|
95
67
|
- Rakefile
|
96
68
|
- cocoapods-submit.gemspec
|
97
69
|
- lib/cocoapods_plugin.rb
|
70
|
+
- lib/cocoapods_submit.rb
|
71
|
+
- lib/cocoapods_submit/build_configuration.rb
|
72
|
+
- lib/cocoapods_submit/ipa_builder.rb
|
73
|
+
- lib/cocoapods_submit/ipa_uploader.rb
|
74
|
+
- lib/cocoapods_submit/provisioning_profile.rb
|
75
|
+
- lib/cocoapods_submit/version.rb
|
98
76
|
- lib/pod/command/submit.rb
|
99
|
-
-
|
100
|
-
- lib/version.rb
|
77
|
+
- ps.rb
|
101
78
|
homepage: https://github.com/Sparrow-Labs/cocoapods-submit
|
102
79
|
licenses:
|
103
80
|
- MIT
|
data/lib/provisioning_profile.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'plist'
|
2
|
-
|
3
|
-
module CocoapodsSubmit
|
4
|
-
class ProvisioningProfile
|
5
|
-
def initialize(hash)
|
6
|
-
@hash = hash
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.from_uuid(uuid)
|
10
|
-
from_file File.expand_path File.join "~/Library/MobileDevice/Provisioning Profiles", "#{uuid}.mobileprovision"
|
11
|
-
end
|
12
|
-
|
13
|
-
def rank
|
14
|
-
return 0.0 unless @hash
|
15
|
-
|
16
|
-
rank = 1.0
|
17
|
-
rank *= 0.0 if @hash["Entitlements"]["get-task-allow"]
|
18
|
-
rank *= 1.0 / @hash["ProvisionedDevices"].count if @hash["ProvisionedDevices"]
|
19
|
-
|
20
|
-
return rank
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.from_file(path)
|
24
|
-
return nil unless File.exists? path
|
25
|
-
|
26
|
-
start_string = "<?"
|
27
|
-
end_string = "</plist>"
|
28
|
-
|
29
|
-
profile = File.read(path)
|
30
|
-
profile = profile.slice(profile.index(start_string), profile.length)
|
31
|
-
profile = profile.slice(0, profile.index(end_string) + end_string.length)
|
32
|
-
profile = Plist::parse_xml(profile)
|
33
|
-
|
34
|
-
new(profile)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|