cocoapods-submit 0.1.1 → 0.2.0
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/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
|