sigh 0.10.9 → 1.0.0.beta1
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/README.md +23 -45
- data/bin/sigh +4 -22
- data/lib/assets/resign.sh +2 -7
- data/lib/sigh.rb +0 -2
- data/lib/sigh/dependency_checker.rb +2 -2
- data/lib/sigh/local_manage.rb +9 -11
- data/lib/sigh/manager.rb +21 -15
- data/lib/sigh/options.rb +18 -32
- data/lib/sigh/profile_analyser.rb +15 -0
- data/lib/sigh/resign.rb +3 -14
- data/lib/sigh/{runner.rb → spaceship/runner.rb} +30 -58
- data/lib/sigh/version.rb +1 -1
- metadata +34 -41
- data/lib/sigh/download_all.rb +0 -33
- data/lib/sigh/repair.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bd071805139ebac24b44afa6957387eafdc0801
|
4
|
+
data.tar.gz: bb57df6ea7f50a5fc228ea1b009172eda00bbef5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d179f1f7b811cdbc04a3af74b4f4315ab48da99ee7c0888fc52ffdb20289fbacbfbb59649713f50c2ecb8830447603aeb97fd556e88d8c34a44e22203fc14d70
|
7
|
+
data.tar.gz: cb7894b2121b114200a37b11b1c0b0f7aabfbaa7eed56d87cd54947cfaf6b901514894ecd3942ea81374104bb2b855de46d2580250fe72dd9c19147529ab8550
|
data/README.md
CHANGED
@@ -13,12 +13,7 @@
|
|
13
13
|
<b>sigh</b> •
|
14
14
|
<a href="https://github.com/KrauseFx/produce">produce</a> •
|
15
15
|
<a href="https://github.com/KrauseFx/cert">cert</a> •
|
16
|
-
<a href="https://github.com/KrauseFx/codes">codes</a>
|
17
|
-
<a href="https://github.com/fastlane/spaceship">spaceship</a> •
|
18
|
-
<a href="https://github.com/fastlane/pilot">pilot</a> •
|
19
|
-
<a href="https://github.com/fastlane/boarding">boarding</a> •
|
20
|
-
<a href="https://github.com/fastlane/gym">gym</a>
|
21
|
-
|
16
|
+
<a href="https://github.com/KrauseFx/codes">codes</a>
|
22
17
|
</p>
|
23
18
|
-------
|
24
19
|
|
@@ -56,6 +51,7 @@ Special thanks to [Matthias Tretter](https://twitter.com/myell0w) for coming up
|
|
56
51
|
|
57
52
|
<h5 align="center"><code>sigh</code> is part of <a href="https://fastlane.tools">fastlane</a>: connect all deployment tools into one streamlined workflow.</h5>
|
58
53
|
|
54
|
+
|
59
55
|
# Features
|
60
56
|
|
61
57
|
- **Download** the latest provisioning profile for your app
|
@@ -112,11 +108,7 @@ To generate the profile in a specific directory:
|
|
112
108
|
|
113
109
|
sigh -o "~/Certificates/"
|
114
110
|
|
115
|
-
|
116
|
-
|
117
|
-
sigh download_all
|
118
|
-
|
119
|
-
For a list of available parameters and commands run
|
111
|
+
For a list of available commands run
|
120
112
|
|
121
113
|
sigh --help
|
122
114
|
|
@@ -126,30 +118,21 @@ By default, ```sigh``` will install the downloaded profile on your machine. If y
|
|
126
118
|
|
127
119
|
sigh --skip_install
|
128
120
|
|
129
|
-
To save the provisioning profile under a specific name, use the -
|
121
|
+
To save the provisioning profile under a specific name, use the -f option:
|
130
122
|
|
131
|
-
sigh -a com.krausefx.app -u username -
|
123
|
+
sigh -a com.krausefx.app -u username -f "myProfile.mobileprovision"
|
132
124
|
|
133
125
|
If you need the provisioning profile to be renewed regardless of its state use the `--force` option. This gives you a profile with the maximum lifetime. `--force` will also add all available devices to this profile.
|
134
126
|
|
135
127
|
sigh --force
|
136
128
|
|
137
|
-
By default,
|
129
|
+
By default, ```sigh``` will include all certificates on development profiles, and first certificate on other types. If you need to specify which certificate to use you can either use the environment variable `SIGH_CERTIFICATE`, or pass the name or expiry date of the certificate as argument:
|
138
130
|
|
139
131
|
sigh -c "SunApps GmbH"
|
140
132
|
|
141
|
-
|
142
|
-
|
143
|
-
sigh --help
|
144
|
-
|
145
|
-
# Repair
|
146
|
-
|
147
|
-
`sigh` can automatically repair all your existing provisioning profiles which are expired or just invalid.
|
148
|
-
|
149
|
-
All you have to do is
|
150
|
-
|
151
|
-
sigh repair
|
133
|
+
Or identify be expire date if you're using the same names for multiple certificates
|
152
134
|
|
135
|
+
sigh -d "Nov 11, 2017"
|
153
136
|
|
154
137
|
# Resign
|
155
138
|
|
@@ -190,8 +173,7 @@ Choose signing certificate to use:
|
|
190
173
|
|
191
174
|
- `SIGH_CERTIFICATE` (The name of the certificate to use)
|
192
175
|
- `SIGH_CERTIFICATE_ID` (The ID of the certificate)
|
193
|
-
|
194
|
-
As always, run `sigh --help` to get a list of all variables.
|
176
|
+
- `SIGH_CERTIFICATE_EXPIRE_DATE` (The expire date of the certificate)
|
195
177
|
|
196
178
|
If you're using [cert](https://github.com/KrauseFx/cert) in combination with [fastlane](https://github.com/KrauseFx/fastlane) the signing certificate will automatically be selected for you. (make sure to run `cert` before `sigh`)
|
197
179
|
|
@@ -199,49 +181,45 @@ If you're using [cert](https://github.com/KrauseFx/cert) in combination with [fa
|
|
199
181
|
|
200
182
|
# How does it work?
|
201
183
|
|
202
|
-
|
184
|
+
```sigh``` will access the ```iOS Dev Center``` to download, renew or generate the ```.mobileprovision``` file. Check out the full source code: [developer_center.rb](https://github.com/KrauseFx/sigh/blob/master/lib/sigh/developer_center.rb).
|
203
185
|
|
204
186
|
|
205
187
|
## How is my password stored?
|
206
|
-
|
188
|
+
```sigh``` uses the [password manager](https://github.com/KrauseFx/CredentialsManager) from `fastlane`. Take a look the [CredentialsManager README](https://github.com/KrauseFx/CredentialsManager) for more information.
|
207
189
|
|
208
190
|
# Tips
|
209
191
|
## [`fastlane`](https://fastlane.tools) Toolchain
|
210
192
|
|
211
193
|
- [`fastlane`](https://fastlane.tools): Connect all deployment tools into one streamlined workflow
|
212
|
-
- [`deliver`](https://github.com/KrauseFx/deliver): Upload screenshots, metadata and your app to the App Store
|
194
|
+
- [`deliver`](https://github.com/KrauseFx/deliver): Upload screenshots, metadata and your app to the App Store using a single command
|
213
195
|
- [`snapshot`](https://github.com/KrauseFx/snapshot): Automate taking localized screenshots of your iOS app on every device
|
214
196
|
- [`frameit`](https://github.com/KrauseFx/frameit): Quickly put your screenshots into the right device frames
|
215
197
|
- [`PEM`](https://github.com/KrauseFx/pem): Automatically generate and renew your push notification profiles
|
216
198
|
- [`produce`](https://github.com/KrauseFx/produce): Create new iOS apps on iTunes Connect and Dev Portal using the command line
|
217
199
|
- [`cert`](https://github.com/KrauseFx/cert): Automatically create and maintain iOS code signing certificates
|
218
200
|
- [`codes`](https://github.com/KrauseFx/codes): Create promo codes for iOS Apps using the command line
|
219
|
-
- [`spaceship`](https://github.com/fastlane/spaceship): Ruby library to access the Apple Dev Center and iTunes Connect
|
220
|
-
- [`pilot`](https://github.com/fastlane/pilot): The best way to manage your TestFlight testers and builds from your terminal
|
221
|
-
- [`boarding`](https://github.com/fastlane/boarding): The easiest way to invite your TestFlight beta testers
|
222
|
-
- [`gym`](https://github.com/fastlane/gym): Building your iOS apps has never been easier
|
223
|
-
|
224
201
|
|
225
202
|
##### [Like this tool? Be the first to know about updates and new fastlane tools](https://tinyletter.com/krausefx)
|
226
203
|
|
227
204
|
## Use the 'Provisioning Quicklook plugin'
|
228
205
|
Download and install the [Provisioning Plugin](https://github.com/chockenberry/Provisioning).
|
229
206
|
|
230
|
-
It will show you the
|
207
|
+
It will show you the ```mobileprovision``` files like this:
|
231
208
|

|
232
209
|
|
233
|
-
## App Identifier couldn't be found
|
234
|
-
|
235
|
-
If you also want to create a new App Identifier on the Apple Developer Portal, check out [produce](https://github.com/fastlane/produce), which does exactly that.
|
236
|
-
|
237
|
-
## What happens to my Xcode managed profiles?
|
238
|
-
|
239
|
-
`sigh` will never touch or use the profiles which are created and managed by Xcode. Instead `sigh` will manage its own set of provisioning profiles.
|
240
210
|
|
241
211
|
# Need help?
|
242
|
-
|
212
|
+
- If there is a technical problem with ```sigh```, submit an issue.
|
213
|
+
- I'm available for contract work - drop me an email: sigh@krausefx.com
|
243
214
|
|
244
215
|
# License
|
245
216
|
This project is licensed under the terms of the MIT license. See the LICENSE file.
|
246
217
|
|
247
|
-
|
218
|
+
# Contributing
|
219
|
+
|
220
|
+
1. Create an issue to start a discussion about your idea
|
221
|
+
2. Fork it (https://github.com/KrauseFx/sigh/fork)
|
222
|
+
3. Create your feature branch (`git checkout -b my-new-feature`)
|
223
|
+
4. Commit your changes (`git commit -am 'Add some feature'`)
|
224
|
+
5. Push to the branch (`git push origin my-new-feature`)
|
225
|
+
6. Create a new Pull Request
|
data/bin/sigh
CHANGED
@@ -23,6 +23,8 @@ class SighApplication
|
|
23
23
|
program :help, 'GitHub', 'https://github.com/krausefx/sigh'
|
24
24
|
program :help_formatter, :compact
|
25
25
|
|
26
|
+
always_trace!
|
27
|
+
|
26
28
|
FastlaneCore::CommanderGenerator.new.generate(Sigh::Options.available_options)
|
27
29
|
|
28
30
|
command :renew do |c|
|
@@ -35,27 +37,6 @@ class SighApplication
|
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
38
|
-
command :download_all do |c|
|
39
|
-
c.syntax = 'sigh download_all'
|
40
|
-
c.description = 'Downloads all valid provisioning profiles'
|
41
|
-
|
42
|
-
c.action do |args, options|
|
43
|
-
Sigh.config = FastlaneCore::Configuration.create(Sigh::Options.available_options, options.__hash__)
|
44
|
-
Sigh::Manager.download_all
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
command :repair do |c|
|
49
|
-
c.syntax = 'sigh repair'
|
50
|
-
c.description = 'Repairs all expired or invalid provisioning profiles'
|
51
|
-
|
52
|
-
c.action do |args, options|
|
53
|
-
Sigh.config = FastlaneCore::Configuration.create(Sigh::Options.available_options, options.__hash__)
|
54
|
-
require 'sigh/repair'
|
55
|
-
Sigh::Repair.new.repair_all
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
40
|
command :resign do |c|
|
60
41
|
c.syntax = 'sigh resign'
|
61
42
|
c.description = 'Resigns an existing ipa file with the given provisioning profile'
|
@@ -70,7 +51,7 @@ class SighApplication
|
|
70
51
|
command :manage do |c|
|
71
52
|
c.syntax = 'sigh manage'
|
72
53
|
c.description = 'Manage installed provisioning profiles on your system.'
|
73
|
-
|
54
|
+
|
74
55
|
c.option '-e', '--clean_expired', 'Remove all expired provisioning profiles.'
|
75
56
|
|
76
57
|
c.option '-p', '--clean_pattern STRING', String, 'Remove any provisioning profiles that matches the regular expression.'
|
@@ -85,6 +66,7 @@ class SighApplication
|
|
85
66
|
|
86
67
|
run!
|
87
68
|
end
|
69
|
+
|
88
70
|
end
|
89
71
|
|
90
72
|
begin
|
data/lib/assets/resign.sh
CHANGED
@@ -362,18 +362,13 @@ else
|
|
362
362
|
# checkStatus -- if this fails it's likely because the keychain-access-groups key does not exist, so we have nothing to update
|
363
363
|
if [[ "$CERTIFICATE" == *Distribution* ]]; then
|
364
364
|
IS_ENTERPRISE_PROFILE=`PlistBuddy -c "Print :ProvisionsAllDevices" "$TEMP_DIR/profile.plist" | tr -d '\n'`
|
365
|
-
ADHOC_PROVISIONING_DEVICES=`PlistBuddy -c "Print :ProvisionedDevices" "$TEMP_DIR/profile.plist" | tr -d '\n'`
|
366
365
|
|
367
366
|
echo "Assuming Distribution Identity"
|
368
367
|
if [ "$ADJUST_BETA_REPORTS_ACTIVE_FLAG" == "1" ]; then
|
369
368
|
if [ "$IS_ENTERPRISE_PROFILE" == "true" ]; then
|
370
369
|
echo "Ensuring beta-reports-active is not included for Enterprise environment"
|
371
|
-
PlistBuddy -c "Delete :beta-reports-active" "$TEMP_DIR/newEntitlements"
|
372
|
-
|
373
|
-
elif [ -n "$ADHOC_PROVISIONING_DEVICES" ]; then
|
374
|
-
echo "Ensuring beta-reports-active is not included for Adhoc environment"
|
375
|
-
PlistBuddy -c "Delete :beta-reports-active" "$TEMP_DIR/newEntitlements" || true
|
376
|
-
# checkStatus -- this can fail is beta-reports-active isn't present, which is OK
|
370
|
+
PlistBuddy -c "Delete :beta-reports-active" "$TEMP_DIR/newEntitlements"
|
371
|
+
checkStatus
|
377
372
|
else
|
378
373
|
echo "Ensuring beta-reports-active is present and enabled"
|
379
374
|
# new beta key is only used for Distribution; might not exist yet, if we were building Development
|
data/lib/sigh.rb
CHANGED
@@ -5,7 +5,7 @@ module Sigh
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def self.check_xcode_select
|
8
|
-
unless `xcode-select -v`.include?
|
8
|
+
unless `xcode-select -v`.include?"xcode-select version "
|
9
9
|
Helper.log.fatal '#############################################################'
|
10
10
|
Helper.log.fatal "# You have to install the Xcode commdand line tools to use sigh"
|
11
11
|
Helper.log.fatal "# Install the latest version of Xcode from the AppStore"
|
@@ -15,4 +15,4 @@ module Sigh
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
18
|
-
end
|
18
|
+
end
|
data/lib/sigh/local_manage.rb
CHANGED
@@ -26,21 +26,20 @@ module Sigh
|
|
26
26
|
# copy to Xcode provisioning profile directory
|
27
27
|
FileUtils.copy profile, destination
|
28
28
|
|
29
|
-
if File.
|
29
|
+
if File.exists? destination
|
30
30
|
Helper.log.info "Profile installed at \"#{destination}\""
|
31
31
|
else
|
32
32
|
raise "Failed installation of provisioning profile at location: #{destination}".red
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
def self.get_inputs(options,
|
36
|
+
def self.get_inputs(options, args)
|
37
37
|
clean_expired = options.clean_expired
|
38
38
|
clean_pattern = /#{options.clean_pattern}/ if options.clean_pattern
|
39
|
-
command = (
|
39
|
+
command = (clean_expired != nil || clean_pattern != nil) ? CLEANUP : LIST
|
40
40
|
return command, clean_expired, clean_pattern
|
41
41
|
end
|
42
42
|
|
43
|
-
# rubocop:disable Metrics/AbcSize
|
44
43
|
def self.list_profiles
|
45
44
|
profiles = load_profiles
|
46
45
|
|
@@ -64,7 +63,7 @@ module Sigh
|
|
64
63
|
Helper.log.info profile["Name"].yellow
|
65
64
|
end
|
66
65
|
end
|
67
|
-
|
66
|
+
|
68
67
|
profiles_expired = profiles.select { |profile| profile["ExpirationDate"] < now }
|
69
68
|
if profiles_expired.count > 0
|
70
69
|
Helper.log.info ""
|
@@ -73,7 +72,7 @@ module Sigh
|
|
73
72
|
Helper.log.info profile["Name"].red
|
74
73
|
end
|
75
74
|
end
|
76
|
-
|
75
|
+
|
77
76
|
Helper.log.info ""
|
78
77
|
Helper.log.info "Summary"
|
79
78
|
Helper.log.info "#{profiles.count} installed profiles"
|
@@ -83,12 +82,11 @@ module Sigh
|
|
83
82
|
|
84
83
|
Helper.log.info "You can remove all expired profiles using `sigh manage -e`" if profiles_expired.count > 0
|
85
84
|
end
|
86
|
-
# rubocop:enable Metrics/AbcSize
|
87
85
|
|
88
86
|
def self.cleanup_profiles(expired = false, pattern = nil)
|
89
87
|
now = DateTime.now
|
90
88
|
|
91
|
-
profiles = load_profiles.select { |profile| (expired && profile["ExpirationDate"] < now) || (
|
89
|
+
profiles = load_profiles.select { |profile| (expired && profile["ExpirationDate"] < now) || (pattern != nil && profile["Name"] =~ pattern) }
|
92
90
|
|
93
91
|
Helper.log.info "The following provisioning profiles are either expired or matches your pattern:"
|
94
92
|
profiles.each do |profile|
|
@@ -110,14 +108,14 @@ module Sigh
|
|
110
108
|
|
111
109
|
profiles = []
|
112
110
|
profile_paths.each do |profile_path|
|
113
|
-
profile = Plist
|
111
|
+
profile = Plist::parse_xml(`security cms -D -i '#{profile_path}'`)
|
114
112
|
profile['Path'] = profile_path
|
115
113
|
profiles << profile
|
116
114
|
end
|
117
115
|
|
118
|
-
profiles = profiles.sort_by {
|
116
|
+
profiles = profiles.sort_by {|profile| profile["Name"].downcase}
|
119
117
|
|
120
118
|
return profiles
|
121
119
|
end
|
122
120
|
end
|
123
|
-
end
|
121
|
+
end
|
data/lib/sigh/manager.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'plist'
|
2
|
-
require 'sigh/runner'
|
2
|
+
require 'sigh/spaceship/runner'
|
3
3
|
|
4
4
|
module Sigh
|
5
5
|
class Manager
|
6
6
|
def self.start
|
7
|
+
start = Time.now
|
7
8
|
path = Sigh::Runner.new.run
|
8
9
|
|
9
10
|
return nil unless path
|
@@ -14,12 +15,8 @@ module Sigh
|
|
14
15
|
file_name = File.basename(path)
|
15
16
|
end
|
16
17
|
|
17
|
-
output = File.join(
|
18
|
-
|
19
|
-
FileUtils.mv(path, output)
|
20
|
-
rescue
|
21
|
-
# in case it already exists
|
22
|
-
end
|
18
|
+
output = File.join(Sigh.config[:output_path].gsub("~", ENV["HOME"]), file_name)
|
19
|
+
(FileUtils.mv(path, output) rescue nil) # in case it already exists
|
23
20
|
|
24
21
|
install_profile(output) unless Sigh.config[:skip_install]
|
25
22
|
|
@@ -28,16 +25,25 @@ module Sigh
|
|
28
25
|
return File.expand_path(output)
|
29
26
|
end
|
30
27
|
|
31
|
-
def self.download_all
|
32
|
-
require 'sigh/download_all'
|
33
|
-
DownloadAll.new.download_all
|
34
|
-
end
|
35
|
-
|
36
28
|
def self.install_profile(profile)
|
37
|
-
|
38
|
-
|
29
|
+
Helper.log.info "Installing provisioning profile..."
|
30
|
+
profile_path = File.expand_path("~") + "/Library/MobileDevice/Provisioning Profiles/"
|
31
|
+
profile_filename = ENV["SIGH_UDID"] + ".mobileprovision"
|
32
|
+
destination = profile_path + profile_filename
|
33
|
+
|
34
|
+
# If the directory doesn't exist, make it first
|
35
|
+
unless File.directory?(profile_path)
|
36
|
+
FileUtils.mkdir_p(profile_path)
|
37
|
+
end
|
39
38
|
|
40
|
-
|
39
|
+
# copy to Xcode provisioning profile directory
|
40
|
+
(FileUtils.copy profile, destination rescue nil) # if the directory doesn't exist yet
|
41
|
+
|
42
|
+
if File.exists? destination
|
43
|
+
Helper.log.info "Profile successfully installed".green
|
44
|
+
else
|
45
|
+
raise "Failed installation of provisioning profile at location: #{destination}".red
|
46
|
+
end
|
41
47
|
end
|
42
48
|
end
|
43
49
|
end
|
data/lib/sigh/options.rb
CHANGED
@@ -35,24 +35,17 @@ module Sigh
|
|
35
35
|
short_option: "-u",
|
36
36
|
env_name: "SIGH_USERNAME",
|
37
37
|
description: "Your Apple ID Username",
|
38
|
-
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
|
38
|
+
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:apple_id),
|
39
|
+
verify_block: Proc.new do |value|
|
40
|
+
CredentialsManager::PasswordManager.shared_manager(value)
|
41
|
+
end),
|
39
42
|
FastlaneCore::ConfigItem.new(key: :team_id,
|
40
|
-
short_option: "-
|
43
|
+
short_option: "-t",
|
41
44
|
env_name: "SIGH_TEAM_ID",
|
42
45
|
description: "The ID of your team if you're in multiple teams",
|
43
46
|
optional: true,
|
44
|
-
|
45
|
-
|
46
|
-
ENV["FASTLANE_TEAM_ID"] = value
|
47
|
-
end),
|
48
|
-
FastlaneCore::ConfigItem.new(key: :team_name,
|
49
|
-
short_option: "-l",
|
50
|
-
env_name: "SIGH_TEAM_NAME",
|
51
|
-
description: "The name of your team if you're in multiple teams",
|
52
|
-
optional: true,
|
53
|
-
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:team_name),
|
54
|
-
verify_block: proc do |value|
|
55
|
-
ENV["FASTLANE_TEAM_NAME"] = value
|
47
|
+
verify_block: Proc.new do |value|
|
48
|
+
ENV["FASTLANE_TEAM_ID"] = value
|
56
49
|
end),
|
57
50
|
FastlaneCore::ConfigItem.new(key: :provisioning_name,
|
58
51
|
short_option: "-n",
|
@@ -64,8 +57,8 @@ module Sigh
|
|
64
57
|
env_name: "SIGH_OUTPUT_PATH",
|
65
58
|
description: "Directory in which the profile should be stored",
|
66
59
|
default_value: ".",
|
67
|
-
verify_block:
|
68
|
-
raise "Could not find output directory '#{value}'".red unless File.
|
60
|
+
verify_block: Proc.new do |value|
|
61
|
+
raise "Could not find output directory '#{value}'".red unless File.exists?(value)
|
69
62
|
end),
|
70
63
|
FastlaneCore::ConfigItem.new(key: :cert_id,
|
71
64
|
short_option: "-i",
|
@@ -77,26 +70,19 @@ module Sigh
|
|
77
70
|
env_name: "SIGH_CERTIFICATE",
|
78
71
|
description: "The certificate name to use for new profiles, or to renew with. (e.g. \"Felix Krause\")",
|
79
72
|
optional: true),
|
73
|
+
FastlaneCore::ConfigItem.new(key: :cert_date,
|
74
|
+
short_option: "-d",
|
75
|
+
env_name: "SIGH_CERTIFICATE_EXPIRE_DATE",
|
76
|
+
description: "The certificate with the given expiry date used to renew. (e.g. \"Nov 11, 2017\")",
|
77
|
+
optional: true),
|
80
78
|
FastlaneCore::ConfigItem.new(key: :filename,
|
81
|
-
short_option: "-
|
79
|
+
short_option: "-f",
|
82
80
|
env_name: "SIGH_PROFILE_FILE_NAME",
|
83
81
|
optional: true,
|
84
82
|
description: "Filename to use for the generated provisioning profile (must include .mobileprovision)",
|
85
|
-
verify_block:
|
86
|
-
raise "The output name must end with .mobileprovision".red unless value.end_with?
|
87
|
-
end)
|
88
|
-
FastlaneCore::ConfigItem.new(key: :skip_fetch_profiles,
|
89
|
-
env_name: "SIGH_SKIP_FETCH_PROFILES",
|
90
|
-
description: "Skips the verification of existing profiles which is useful if you have thousands of profiles",
|
91
|
-
is_string: false,
|
92
|
-
default_value: false,
|
93
|
-
short_option: "-w"),
|
94
|
-
FastlaneCore::ConfigItem.new(key: :skip_certificate_verification,
|
95
|
-
short_option: '-z',
|
96
|
-
env_name: "SIGH_SKIP_CERTIFICATE_VERIFICATION",
|
97
|
-
description: "Skips the verification of the certificates for every existing profiles. This will make sure the provisioning profile can be used on the local machine",
|
98
|
-
is_string: false,
|
99
|
-
default_value: false)
|
83
|
+
verify_block: Proc.new do |value|
|
84
|
+
raise "The output name must end with .mobileprovision".red unless value.end_with?".mobileprovision"
|
85
|
+
end)
|
100
86
|
]
|
101
87
|
end
|
102
88
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'plist'
|
2
|
+
|
3
|
+
module Sigh
|
4
|
+
class ProfileAnalyser
|
5
|
+
def self.run(path)
|
6
|
+
plist = Plist::parse_xml(`security cms -D -i '#{path}'`)
|
7
|
+
if plist.count > 10
|
8
|
+
Helper.log.info("Provisioning profile of app '#{plist['AppIDName']}' with the name '#{plist['Name']}' successfully analysed.".green)
|
9
|
+
return plist["UUID"]
|
10
|
+
else
|
11
|
+
Helper.log.error("Error parsing provisioning profile at path '#{path}'".red)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/sigh/resign.rb
CHANGED
@@ -33,14 +33,7 @@ module Sigh
|
|
33
33
|
puts command.magenta
|
34
34
|
output = `#{command}`
|
35
35
|
puts output
|
36
|
-
|
37
|
-
if signing_identity =~ /^iPhone Developer:*/
|
38
|
-
ptn = 'Assuming Development Identity'
|
39
|
-
else
|
40
|
-
ptn = 'Assuming Distribution Identity'
|
41
|
-
end
|
42
|
-
|
43
|
-
if output.include?(ptn)
|
36
|
+
if output.include?('Assuming Distribution Identity')
|
44
37
|
Helper.log.info "Successfully signed #{ipa}!".green
|
45
38
|
true
|
46
39
|
else
|
@@ -93,7 +86,7 @@ module Sigh
|
|
93
86
|
end
|
94
87
|
|
95
88
|
def validate_provisioning_file(provisioning_profile)
|
96
|
-
raise "Provisioning profile file could not be found or is not a .mobileprovision file (#{provisioning_profile})".red unless File.
|
89
|
+
raise "Provisioning profile file could not be found or is not a .mobileprovision file (#{provisioning_profile})".red unless File.exists?(provisioning_profile) && provisioning_profile.end_with?('.mobileprovision')
|
97
90
|
end
|
98
91
|
|
99
92
|
def print_available_identities
|
@@ -110,11 +103,7 @@ module Sigh
|
|
110
103
|
available = `security find-identity -v -p codesigning`
|
111
104
|
ids = []
|
112
105
|
available.split("\n").each do |current|
|
113
|
-
|
114
|
-
(ids << current.match(/.*\"(.*)\"/)[1])
|
115
|
-
rescue
|
116
|
-
nil
|
117
|
-
end # the last line does not match
|
106
|
+
(ids << current.match(/.*\"(.*)\"/)[1]) rescue nil # the last line does not match
|
118
107
|
end
|
119
108
|
|
120
109
|
ids
|
@@ -7,44 +7,38 @@ module Sigh
|
|
7
7
|
# Uses the spaceship to create or download a provisioning profile
|
8
8
|
# returns the path the newly created provisioning profile (in /tmp usually)
|
9
9
|
def run
|
10
|
-
|
11
|
-
|
12
|
-
Helper.log.info "Starting login with user '#{Sigh.config[:username]}'"
|
10
|
+
Helper.log.info "Starting login"
|
13
11
|
Spaceship.login(Sigh.config[:username], nil)
|
14
12
|
Spaceship.select_team
|
15
13
|
Helper.log.info "Successfully logged in"
|
16
|
-
|
17
|
-
profiles =
|
18
|
-
profiles ||= fetch_profiles # download the profile if it's there
|
14
|
+
|
15
|
+
profiles = fetch_profiles # download the profile if it's there
|
19
16
|
|
20
17
|
if profiles.count > 0
|
21
18
|
Helper.log.info "Found #{profiles.count} matching profile(s)".yellow
|
22
19
|
profile = profiles.first
|
23
20
|
|
24
21
|
if Sigh.config[:force]
|
25
|
-
|
26
|
-
Helper.log.info "Updating the provisioning profile".yellow
|
27
|
-
else
|
22
|
+
unless profile_type == Spaceship.provisioning_profile::AppStore
|
28
23
|
Helper.log.info "Updating the profile to include all devices".yellow
|
29
|
-
profile.devices = Spaceship.device.all
|
24
|
+
profile.devices = Spaceship.device.all
|
25
|
+
else
|
26
|
+
Helper.log.info "Updating the provisioning profile".yellow
|
30
27
|
end
|
31
28
|
|
32
29
|
profile = profile.update! # assign it, as it's a new profile
|
33
30
|
end
|
34
31
|
else
|
35
|
-
Helper.log.info "No existing profiles, creating a new one for you".yellow
|
32
|
+
Helper.log.info "No existing profiles found, creating a new one for you".yellow
|
36
33
|
profile = create_profile!
|
37
34
|
end
|
38
35
|
|
39
36
|
raise "Something went wrong fetching the latest profile".red unless profile
|
37
|
+
|
38
|
+
path = download_profile(profile)
|
39
|
+
store_provisioning_id_in_environment(path)
|
40
40
|
|
41
|
-
|
42
|
-
ENV["SIGH_PROFILE_ENTERPRISE"] = "1"
|
43
|
-
else
|
44
|
-
ENV.delete("SIGH_PROFILE_ENTERPRISE")
|
45
|
-
end
|
46
|
-
|
47
|
-
return download_profile(profile)
|
41
|
+
return path
|
48
42
|
end
|
49
43
|
|
50
44
|
# The kind of provisioning profile we're interested in
|
@@ -52,7 +46,6 @@ module Sigh
|
|
52
46
|
return @profile_type if @profile_type
|
53
47
|
|
54
48
|
@profile_type = Spaceship.provisioning_profile.app_store
|
55
|
-
@profile_type = Spaceship.provisioning_profile.in_house if Spaceship.client.in_house?
|
56
49
|
@profile_type = Spaceship.provisioning_profile.ad_hoc if Sigh.config[:adhoc]
|
57
50
|
@profile_type = Spaceship.provisioning_profile.development if Sigh.config[:development]
|
58
51
|
|
@@ -61,28 +54,7 @@ module Sigh
|
|
61
54
|
|
62
55
|
# Fetches a profile matching the user's search requirements
|
63
56
|
def fetch_profiles
|
64
|
-
|
65
|
-
results = profile_type.find_by_bundle_id(Sigh.config[:app_identifier]).find_all(&:valid?)
|
66
|
-
|
67
|
-
# Take the provisioning profile name into account
|
68
|
-
if Sigh.config[:provisioning_name].to_s.length > 0
|
69
|
-
filtered = results.select { |p| p.name.strip == Sigh.config[:provisioning_name].strip }
|
70
|
-
results = filtered if (filtered || []).count > 0
|
71
|
-
end
|
72
|
-
|
73
|
-
return results if Sigh.config[:skip_certificate_verification]
|
74
|
-
|
75
|
-
return results.find_all do |a|
|
76
|
-
# Also make sure we have the certificate installed on the local machine
|
77
|
-
installed = false
|
78
|
-
a.certificates.each do |cert|
|
79
|
-
file = Tempfile.new('cert')
|
80
|
-
file.write(cert.download_raw)
|
81
|
-
file.close
|
82
|
-
installed = true if FastlaneCore::CertChecker.installed?(file.path)
|
83
|
-
end
|
84
|
-
installed
|
85
|
-
end
|
57
|
+
profile_type.find_by_bundle_id(Sigh.config[:app_identifier])
|
86
58
|
end
|
87
59
|
|
88
60
|
# Create a new profile and return it
|
@@ -91,27 +63,23 @@ module Sigh
|
|
91
63
|
bundle_id = Sigh.config[:app_identifier]
|
92
64
|
name = Sigh.config[:provisioning_name] || [bundle_id, profile_type.pretty_type].join(' ')
|
93
65
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
name += " #{Time.now.to_i}"
|
98
|
-
end
|
66
|
+
if Spaceship.provisioning_profile.all.find { |p| p.name == name }
|
67
|
+
Helper.log.error "The name '#{name}' is already taken, using another one."
|
68
|
+
name += " #{Time.now.to_i}"
|
99
69
|
end
|
100
70
|
|
101
71
|
Helper.log.info "Creating new provisioning profile for '#{Sigh.config[:app_identifier]}' with name '#{name}'".yellow
|
102
|
-
profile = profile_type.create!(name: name,
|
72
|
+
profile = profile_type.create!(name: name,
|
103
73
|
bundle_id: bundle_id,
|
104
74
|
certificate: cert)
|
105
75
|
profile
|
106
76
|
end
|
107
77
|
|
78
|
+
|
108
79
|
# Certificate to use based on the current distribution mode
|
109
|
-
# rubocop:disable Metrics/AbcSize
|
110
80
|
def certificate_to_use
|
111
81
|
if profile_type == Spaceship.provisioning_profile.Development
|
112
82
|
certificates = Spaceship.certificate.development.all
|
113
|
-
elsif profile_type == Spaceship.provisioning_profile.InHouse
|
114
|
-
certificates = Spaceship.certificate.in_house.all
|
115
83
|
else
|
116
84
|
certificates = Spaceship.certificate.production.all # Ad hoc or App Store
|
117
85
|
end
|
@@ -129,12 +97,11 @@ module Sigh
|
|
129
97
|
true
|
130
98
|
end
|
131
99
|
|
132
|
-
if certificates.count > 1
|
100
|
+
if certificates.count > 1
|
133
101
|
Helper.log.info "Found more than one code signing identity. Choosing the first one. Check out `sigh --help` to see all available options.".yellow
|
134
102
|
Helper.log.info "Available Code Signing Identities for current filters:".green
|
135
103
|
certificates.each do |c|
|
136
|
-
|
137
|
-
Helper.log.info str.green
|
104
|
+
Helper.log.info ("\t- Name: " + c.owner_name + " - ID: " + c.id + " - Expires: " + c.expires).green
|
138
105
|
end
|
139
106
|
end
|
140
107
|
|
@@ -146,24 +113,29 @@ module Sigh
|
|
146
113
|
raise "Could not find a matching code signing identity for #{profile_type}. You can use cert to generate one (https://github.com/fastlane/cert)".red
|
147
114
|
end
|
148
115
|
|
149
|
-
return certificates if Sigh.config[:development] # development profiles support multiple certificates
|
150
116
|
return certificates.first
|
151
117
|
end
|
152
|
-
# rubocop:enable Metrics/AbcSize
|
153
118
|
|
154
119
|
# Downloads and stores the provisioning profile
|
155
120
|
def download_profile(profile)
|
156
121
|
Helper.log.info "Downloading provisioning profile...".yellow
|
157
122
|
profile_name ||= "#{profile.class.pretty_type}_#{Sigh.config[:app_identifier]}.mobileprovision" # default name
|
158
|
-
profile_name += '.mobileprovision' unless profile_name.include?
|
123
|
+
profile_name += '.mobileprovision' unless profile_name.include?'mobileprovision'
|
159
124
|
|
160
125
|
output_path = File.join('/tmp', profile_name)
|
161
|
-
File.open(output_path, "wb") do |f|
|
126
|
+
dataWritten = File.open(output_path, "wb") do |f|
|
162
127
|
f.write(profile.download)
|
163
128
|
end
|
164
129
|
|
165
130
|
Helper.log.info "Successfully downloaded provisioning profile...".green
|
166
131
|
return output_path
|
167
132
|
end
|
133
|
+
|
134
|
+
# Store the profile ID into the environment
|
135
|
+
def store_provisioning_id_in_environment(path)
|
136
|
+
require 'sigh/profile_analyser'
|
137
|
+
udid = Sigh::ProfileAnalyser.run(path)
|
138
|
+
ENV["SIGH_UDID"] = udid if udid
|
139
|
+
end
|
168
140
|
end
|
169
|
-
end
|
141
|
+
end
|
data/lib/sigh/version.rb
CHANGED
metadata
CHANGED
@@ -1,159 +1,153 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sigh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fastlane_core
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 1.0.0
|
19
|
+
version: 0.7.2
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 0.19.0
|
30
|
-
- - "<"
|
24
|
+
- - '>='
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
26
|
+
version: 0.7.2
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: plist
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
|
-
- -
|
31
|
+
- - ~>
|
38
32
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
33
|
+
version: 3.1.0
|
40
34
|
type: :runtime
|
41
35
|
prerelease: false
|
42
36
|
version_requirements: !ruby/object:Gem::Requirement
|
43
37
|
requirements:
|
44
|
-
- -
|
38
|
+
- - ~>
|
45
39
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
40
|
+
version: 3.1.0
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
42
|
name: spaceship
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ~>
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.
|
47
|
+
version: 0.0.1
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
51
|
requirements:
|
58
|
-
- -
|
52
|
+
- - ~>
|
59
53
|
- !ruby/object:Gem::Version
|
60
|
-
version: 0.
|
54
|
+
version: 0.0.1
|
61
55
|
- !ruby/object:Gem::Dependency
|
62
56
|
name: bundler
|
63
57
|
requirement: !ruby/object:Gem::Requirement
|
64
58
|
requirements:
|
65
|
-
- -
|
59
|
+
- - '>='
|
66
60
|
- !ruby/object:Gem::Version
|
67
61
|
version: '0'
|
68
62
|
type: :development
|
69
63
|
prerelease: false
|
70
64
|
version_requirements: !ruby/object:Gem::Requirement
|
71
65
|
requirements:
|
72
|
-
- -
|
66
|
+
- - '>='
|
73
67
|
- !ruby/object:Gem::Version
|
74
68
|
version: '0'
|
75
69
|
- !ruby/object:Gem::Dependency
|
76
70
|
name: rake
|
77
71
|
requirement: !ruby/object:Gem::Requirement
|
78
72
|
requirements:
|
79
|
-
- -
|
73
|
+
- - '>='
|
80
74
|
- !ruby/object:Gem::Version
|
81
75
|
version: '0'
|
82
76
|
type: :development
|
83
77
|
prerelease: false
|
84
78
|
version_requirements: !ruby/object:Gem::Requirement
|
85
79
|
requirements:
|
86
|
-
- -
|
80
|
+
- - '>='
|
87
81
|
- !ruby/object:Gem::Version
|
88
82
|
version: '0'
|
89
83
|
- !ruby/object:Gem::Dependency
|
90
84
|
name: rspec
|
91
85
|
requirement: !ruby/object:Gem::Requirement
|
92
86
|
requirements:
|
93
|
-
- -
|
87
|
+
- - ~>
|
94
88
|
- !ruby/object:Gem::Version
|
95
89
|
version: 3.1.0
|
96
90
|
type: :development
|
97
91
|
prerelease: false
|
98
92
|
version_requirements: !ruby/object:Gem::Requirement
|
99
93
|
requirements:
|
100
|
-
- -
|
94
|
+
- - ~>
|
101
95
|
- !ruby/object:Gem::Version
|
102
96
|
version: 3.1.0
|
103
97
|
- !ruby/object:Gem::Dependency
|
104
98
|
name: pry
|
105
99
|
requirement: !ruby/object:Gem::Requirement
|
106
100
|
requirements:
|
107
|
-
- -
|
101
|
+
- - '>='
|
108
102
|
- !ruby/object:Gem::Version
|
109
103
|
version: '0'
|
110
104
|
type: :development
|
111
105
|
prerelease: false
|
112
106
|
version_requirements: !ruby/object:Gem::Requirement
|
113
107
|
requirements:
|
114
|
-
- -
|
108
|
+
- - '>='
|
115
109
|
- !ruby/object:Gem::Version
|
116
110
|
version: '0'
|
117
111
|
- !ruby/object:Gem::Dependency
|
118
112
|
name: yard
|
119
113
|
requirement: !ruby/object:Gem::Requirement
|
120
114
|
requirements:
|
121
|
-
- -
|
115
|
+
- - ~>
|
122
116
|
- !ruby/object:Gem::Version
|
123
117
|
version: 0.8.7.4
|
124
118
|
type: :development
|
125
119
|
prerelease: false
|
126
120
|
version_requirements: !ruby/object:Gem::Requirement
|
127
121
|
requirements:
|
128
|
-
- -
|
122
|
+
- - ~>
|
129
123
|
- !ruby/object:Gem::Version
|
130
124
|
version: 0.8.7.4
|
131
125
|
- !ruby/object:Gem::Dependency
|
132
126
|
name: webmock
|
133
127
|
requirement: !ruby/object:Gem::Requirement
|
134
128
|
requirements:
|
135
|
-
- -
|
129
|
+
- - ~>
|
136
130
|
- !ruby/object:Gem::Version
|
137
131
|
version: 1.19.0
|
138
132
|
type: :development
|
139
133
|
prerelease: false
|
140
134
|
version_requirements: !ruby/object:Gem::Requirement
|
141
135
|
requirements:
|
142
|
-
- -
|
136
|
+
- - ~>
|
143
137
|
- !ruby/object:Gem::Version
|
144
138
|
version: 1.19.0
|
145
139
|
- !ruby/object:Gem::Dependency
|
146
140
|
name: codeclimate-test-reporter
|
147
141
|
requirement: !ruby/object:Gem::Requirement
|
148
142
|
requirements:
|
149
|
-
- -
|
143
|
+
- - '>='
|
150
144
|
- !ruby/object:Gem::Version
|
151
145
|
version: '0'
|
152
146
|
type: :development
|
153
147
|
prerelease: false
|
154
148
|
version_requirements: !ruby/object:Gem::Requirement
|
155
149
|
requirements:
|
156
|
-
- -
|
150
|
+
- - '>='
|
157
151
|
- !ruby/object:Gem::Version
|
158
152
|
version: '0'
|
159
153
|
description: Because you would rather spend your time building stuff than fighting
|
@@ -171,13 +165,12 @@ files:
|
|
171
165
|
- lib/assets/resign.sh
|
172
166
|
- lib/sigh.rb
|
173
167
|
- lib/sigh/dependency_checker.rb
|
174
|
-
- lib/sigh/download_all.rb
|
175
168
|
- lib/sigh/local_manage.rb
|
176
169
|
- lib/sigh/manager.rb
|
177
170
|
- lib/sigh/options.rb
|
178
|
-
- lib/sigh/
|
171
|
+
- lib/sigh/profile_analyser.rb
|
179
172
|
- lib/sigh/resign.rb
|
180
|
-
- lib/sigh/runner.rb
|
173
|
+
- lib/sigh/spaceship/runner.rb
|
181
174
|
- lib/sigh/version.rb
|
182
175
|
homepage: https://fastlane.tools
|
183
176
|
licenses:
|
@@ -189,17 +182,17 @@ require_paths:
|
|
189
182
|
- lib
|
190
183
|
required_ruby_version: !ruby/object:Gem::Requirement
|
191
184
|
requirements:
|
192
|
-
- -
|
185
|
+
- - '>='
|
193
186
|
- !ruby/object:Gem::Version
|
194
187
|
version: 2.0.0
|
195
188
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
196
189
|
requirements:
|
197
|
-
- -
|
190
|
+
- - '>'
|
198
191
|
- !ruby/object:Gem::Version
|
199
|
-
version:
|
192
|
+
version: 1.3.1
|
200
193
|
requirements: []
|
201
194
|
rubyforge_project:
|
202
|
-
rubygems_version: 2.4.
|
195
|
+
rubygems_version: 2.4.7
|
203
196
|
signing_key:
|
204
197
|
specification_version: 4
|
205
198
|
summary: Because you would rather spend your time building stuff than fighting provisioning
|
data/lib/sigh/download_all.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
module Sigh
|
2
|
-
class DownloadAll
|
3
|
-
# Download all valid provisioning profiles
|
4
|
-
def download_all
|
5
|
-
Helper.log.info "Starting login with user '#{Sigh.config[:username]}'"
|
6
|
-
Spaceship.login(Sigh.config[:username], nil)
|
7
|
-
Spaceship.select_team
|
8
|
-
Helper.log.info "Successfully logged in"
|
9
|
-
|
10
|
-
Spaceship.provisioning_profile.all.each do |profile|
|
11
|
-
if profile.valid?
|
12
|
-
Helper.log.info "Downloading profile '#{profile.name}'...".green
|
13
|
-
download_profile(profile)
|
14
|
-
else
|
15
|
-
Helper.log.info "Skipping invalid/expired profile '#{profile.name}'".yellow
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def download_profile(profile)
|
21
|
-
output = Sigh.config[:output_path] || "/tmp"
|
22
|
-
|
23
|
-
profile_name = "#{profile.class.pretty_type}_#{profile.app.bundle_id}.mobileprovision" # default name
|
24
|
-
|
25
|
-
output_path = File.join(output, profile_name)
|
26
|
-
File.open(output_path, "wb") do |f|
|
27
|
-
f.write(profile.download)
|
28
|
-
end
|
29
|
-
|
30
|
-
Manager.install_profile(output_path) unless Sigh.config[:skip_install]
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/lib/sigh/repair.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module Sigh
|
2
|
-
class Repair
|
3
|
-
def repair_all
|
4
|
-
Helper.log.info "Starting login with user '#{Sigh.config[:username]}'"
|
5
|
-
Spaceship.login(Sigh.config[:username], nil)
|
6
|
-
Spaceship.select_team
|
7
|
-
Helper.log.info "Successfully logged in"
|
8
|
-
|
9
|
-
# Select all 'Invalid' or 'Expired' provisioning profiles
|
10
|
-
broken_profiles = Spaceship.provisioning_profile.all.find_all do |profile|
|
11
|
-
(profile.status == "Invalid" or profile.status == "Expired")
|
12
|
-
end
|
13
|
-
|
14
|
-
if broken_profiles.count == 0
|
15
|
-
Helper.log.info "All provisioning profiles are valid, nothing to do".green
|
16
|
-
return
|
17
|
-
end
|
18
|
-
|
19
|
-
Helper.log.info "Going to repair #{broken_profiles.count} provisioning profiles".green
|
20
|
-
|
21
|
-
# Iterate over all broken profiles and repair them
|
22
|
-
broken_profiles.each do |profile|
|
23
|
-
Helper.log.info "Repairing profile '#{profile.name}'..."
|
24
|
-
profile.repair! # yes, that's all you need to repair a profile
|
25
|
-
end
|
26
|
-
|
27
|
-
Helper.log.info "Successfully repaired #{broken_profiles.count} provisioning profiles".green
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|