sigh 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +48 -48
- data/bin/sigh +1 -0
- data/lib/assets/resign.sh +81 -76
- data/lib/sigh/local_manage.rb +27 -9
- data/lib/sigh/runner.rb +1 -1
- data/lib/sigh/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63a5bb24c8badd1785e7c1c9ad7a7b1ec75b8afb
|
4
|
+
data.tar.gz: 5483452777078315cf20bca6204bf82f65db39a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a73a95c3a208e70bd5df6bc032a650a79b9587b6287dc9de07ee896be51a35bf7da301fa8f5e69fdae516e932e2b27e7aba69a1a9772b0703584082f0b6c43f
|
7
|
+
data.tar.gz: 32e970b5abb7eeaf379d2e3b67d8ada1e4985613f3845c34b4e4d66e0f497745824758edbc685b081b19c327ac7960b9025076d452d2822cb3467c0468b9c1c9
|
data/README.md
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
<h3 align="center">
|
2
|
-
<a href="https://github.com/fastlane/fastlane">
|
3
|
-
<img src="assets/fastlane.png" width="150" />
|
2
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/fastlane">
|
3
|
+
<img src="../fastlane/assets/fastlane.png" width="150" />
|
4
4
|
<br />
|
5
5
|
fastlane
|
6
6
|
</a>
|
7
7
|
</h3>
|
8
8
|
<p align="center">
|
9
|
-
<a href="https://github.com/fastlane/deliver">deliver</a> •
|
10
|
-
<a href="https://github.com/fastlane/snapshot">snapshot</a> •
|
11
|
-
<a href="https://github.com/fastlane/frameit">frameit</a> •
|
12
|
-
<a href="https://github.com/fastlane/pem">pem</a> •
|
13
|
-
<b>sigh</b> •
|
14
|
-
<a href="https://github.com/fastlane/produce">produce</a> •
|
15
|
-
<a href="https://github.com/fastlane/cert">cert</a> •
|
16
|
-
<a href="https://github.com/fastlane/spaceship">spaceship</a> •
|
17
|
-
<a href="https://github.com/fastlane/pilot">pilot</a> •
|
9
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/deliver">deliver</a> •
|
10
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/snapshot">snapshot</a> •
|
11
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/frameit">frameit</a> •
|
12
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/pem">pem</a> •
|
13
|
+
<b>sigh</b> •
|
14
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/produce">produce</a> •
|
15
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/cert">cert</a> •
|
16
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/spaceship">spaceship</a> •
|
17
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/pilot">pilot</a> •
|
18
18
|
<a href="https://github.com/fastlane/boarding">boarding</a> •
|
19
|
-
<a href="https://github.com/fastlane/gym">gym</a> •
|
20
|
-
<a href="https://github.com/fastlane/scan">scan</a> •
|
21
|
-
<a href="https://github.com/fastlane/match">match</a>
|
19
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/gym">gym</a> •
|
20
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/scan">scan</a> •
|
21
|
+
<a href="https://github.com/fastlane/fastlane/tree/master/match">match</a>
|
22
22
|
</p>
|
23
23
|
-------
|
24
24
|
|
@@ -30,9 +30,9 @@ sigh
|
|
30
30
|
============
|
31
31
|
|
32
32
|
[![Twitter: @FastlaneTools](https://img.shields.io/badge/contact-@FastlaneTools-blue.svg?style=flat)](https://twitter.com/FastlaneTools)
|
33
|
-
[![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/fastlane/
|
33
|
+
[![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/fastlane/fastlane/blob/master/sigh/LICENSE)
|
34
34
|
[![Gem](https://img.shields.io/gem/v/sigh.svg?style=flat)](http://rubygems.org/gems/sigh)
|
35
|
-
[![Build Status](https://img.shields.io/
|
35
|
+
[![Build Status](https://img.shields.io/circleci/project/fastlane/fastlane/master.svg?style=flat)](https://circleci.com/gh/fastlane/fastlane)
|
36
36
|
|
37
37
|
###### Because you would rather spend your time building stuff than fighting provisioning
|
38
38
|
|
@@ -42,12 +42,12 @@ Get in contact with the developer on Twitter: [@FastlaneTools](https://twitter.c
|
|
42
42
|
|
43
43
|
-------
|
44
44
|
<p align="center">
|
45
|
-
<a href="#features">Features</a> •
|
46
|
-
<a href="#installation">Installation</a> •
|
47
|
-
<a href="#usage">Usage</a> •
|
48
|
-
<a href="#resign">Resign</a> •
|
49
|
-
<a href="#how-does-it-work">How does it work?</a> •
|
50
|
-
<a href="#tips">Tips</a> •
|
45
|
+
<a href="#features">Features</a> •
|
46
|
+
<a href="#installation">Installation</a> •
|
47
|
+
<a href="#usage">Usage</a> •
|
48
|
+
<a href="#resign">Resign</a> •
|
49
|
+
<a href="#how-does-it-work">How does it work?</a> •
|
50
|
+
<a href="#tips">Tips</a> •
|
51
51
|
<a href="#need-help">Need help?</a>
|
52
52
|
</p>
|
53
53
|
|
@@ -66,7 +66,7 @@ Get in contact with the developer on Twitter: [@FastlaneTools](https://twitter.c
|
|
66
66
|
- Support for **multiple Teams**
|
67
67
|
- Support for **Enterprise Profiles**
|
68
68
|
|
69
|
-
To automate iOS Push profiles you can use [
|
69
|
+
To automate iOS Push profiles you can use [pem](https://github.com/fastlane/fastlane/tree/master/pem).
|
70
70
|
|
71
71
|
##### [Like this tool? Be the first to know about updates and new fastlane tools](https://tinyletter.com/krausefx)
|
72
72
|
|
@@ -83,7 +83,7 @@ See ```sigh``` in action:
|
|
83
83
|
|
84
84
|
# Installation
|
85
85
|
|
86
|
-
**Note**: It is recommended to use [match](https://github.com/fastlane/match) according to the [codesigning.guide](https://codesigning.guide) for generating and maintaining your provisioning profiles. Use `sigh` directly only if you want full control over what's going on and know more about codesigning.
|
86
|
+
**Note**: It is recommended to use [match](https://github.com/fastlane/fastlane/tree/master/match) according to the [codesigning.guide](https://codesigning.guide) for generating and maintaining your provisioning profiles. Use `sigh` directly only if you want full control over what's going on and know more about codesigning.
|
87
87
|
|
88
88
|
sudo gem install sigh
|
89
89
|
|
@@ -96,7 +96,7 @@ Make sure, you have the latest version of the Xcode command line tools installed
|
|
96
96
|
sigh
|
97
97
|
Yes, that's the whole command!
|
98
98
|
|
99
|
-
```sigh``` will create, repair and download profiles for the App Store by default.
|
99
|
+
```sigh``` will create, repair and download profiles for the App Store by default.
|
100
100
|
|
101
101
|
You can pass your bundle identifier and username like this:
|
102
102
|
|
@@ -105,12 +105,12 @@ You can pass your bundle identifier and username like this:
|
|
105
105
|
If you want to generate an **Ad Hoc** profile instead of an App Store profile:
|
106
106
|
|
107
107
|
sigh --adhoc
|
108
|
-
|
108
|
+
|
109
109
|
If you want to generate a **Development** profile:
|
110
110
|
|
111
111
|
sigh --development
|
112
112
|
|
113
|
-
To generate the profile in a specific directory:
|
113
|
+
To generate the profile in a specific directory:
|
114
114
|
|
115
115
|
sigh -o "~/Certificates/"
|
116
116
|
|
@@ -121,13 +121,13 @@ To download all your provisioning profiles use
|
|
121
121
|
For a list of available parameters and commands run
|
122
122
|
|
123
123
|
sigh --help
|
124
|
-
|
124
|
+
|
125
125
|
### Advanced
|
126
126
|
|
127
127
|
By default, ```sigh``` will install the downloaded profile on your machine. If you just want to generate the profile and skip the installation, use the following flag:
|
128
128
|
|
129
129
|
sigh --skip_install
|
130
|
-
|
130
|
+
|
131
131
|
To save the provisioning profile under a specific name, use the -q option:
|
132
132
|
|
133
133
|
sigh -a com.krausefx.app -u username -q "myProfile.mobileprovision"
|
@@ -149,9 +149,9 @@ For a list of available parameters and commands run
|
|
149
149
|
sigh --help
|
150
150
|
|
151
151
|
|
152
|
-
### Use with [`fastlane`](https://github.com/fastlane/fastlane)
|
152
|
+
### Use with [`fastlane`](https://github.com/fastlane/fastlane/tree/master/fastlane)
|
153
153
|
|
154
|
-
`sigh` becomes really interesting when used in [`fastlane`](https://github.com/fastlane/fastlane) in combination with [`cert`](https://github.com/fastlane/cert).
|
154
|
+
`sigh` becomes really interesting when used in [`fastlane`](https://github.com/fastlane/fastlane/tree/master/fastlane) in combination with [`cert`](https://github.com/fastlane/fastlane/tree/master/cert).
|
155
155
|
|
156
156
|
Update your `Fastfile` to contain the following code:
|
157
157
|
|
@@ -204,7 +204,7 @@ Or delete all `iOS Team Provisioning Profile` by using a regular expression
|
|
204
204
|
|
205
205
|
Run `sigh --help` to get a list of all available environment variables.
|
206
206
|
|
207
|
-
If you're using [cert](https://github.com/fastlane/cert) in combination with [fastlane](https://github.com/fastlane/fastlane) the signing certificate will automatically be selected for you. (make sure to run `cert` before `sigh`)
|
207
|
+
If you're using [cert](https://github.com/fastlane/fastlane/tree/master/cert) in combination with [fastlane](https://github.com/fastlane/fastlane/tree/master/fastlane) the signing certificate will automatically be selected for you. (make sure to run `cert` before `sigh`)
|
208
208
|
|
209
209
|
# How does it work?
|
210
210
|
|
@@ -212,36 +212,36 @@ If you're using [cert](https://github.com/fastlane/cert) in combination with [fa
|
|
212
212
|
|
213
213
|
|
214
214
|
## How is my password stored?
|
215
|
-
`sigh` uses the [CredentialsManager](https://github.com/fastlane/credentials_manager) from `fastlane`.
|
215
|
+
`sigh` uses the [CredentialsManager](https://github.com/fastlane/fastlane/tree/master/credentials_manager) from `fastlane`.
|
216
216
|
|
217
217
|
# Tips
|
218
218
|
## [`fastlane`](https://fastlane.tools) Toolchain
|
219
219
|
|
220
220
|
- [`fastlane`](https://fastlane.tools): Connect all deployment tools into one streamlined workflow
|
221
|
-
- [`deliver`](https://github.com/fastlane/deliver): Upload screenshots, metadata and your app to the App Store
|
222
|
-
- [`snapshot`](https://github.com/fastlane/snapshot): Automate taking localized screenshots of your iOS app on every device
|
223
|
-
- [`frameit`](https://github.com/fastlane/frameit): Quickly put your screenshots into the right device frames
|
224
|
-
- [`pem`](https://github.com/fastlane/pem): Automatically generate and renew your push notification profiles
|
225
|
-
- [`produce`](https://github.com/fastlane/produce): Create new iOS apps on iTunes Connect and Dev Portal using the command line
|
226
|
-
- [`cert`](https://github.com/fastlane/cert): Automatically create and maintain iOS code signing certificates
|
227
|
-
- [`spaceship`](https://github.com/fastlane/spaceship): Ruby library to access the Apple Dev Center and iTunes Connect
|
228
|
-
- [`pilot`](https://github.com/fastlane/pilot): The best way to manage your TestFlight testers and builds from your terminal
|
229
|
-
- [`boarding`](https://github.com/fastlane/boarding): The easiest way to invite your TestFlight beta testers
|
230
|
-
- [`gym`](https://github.com/fastlane/gym): Building your iOS apps has never been easier
|
231
|
-
- [`scan`](https://github.com/fastlane/scan): The easiest way to run tests of your iOS and Mac app
|
232
|
-
- [`match`](https://github.com/fastlane/match): Easily sync your certificates and profiles across your team using git
|
221
|
+
- [`deliver`](https://github.com/fastlane/fastlane/tree/master/deliver): Upload screenshots, metadata and your app to the App Store
|
222
|
+
- [`snapshot`](https://github.com/fastlane/fastlane/tree/master/snapshot): Automate taking localized screenshots of your iOS app on every device
|
223
|
+
- [`frameit`](https://github.com/fastlane/fastlane/tree/master/frameit): Quickly put your screenshots into the right device frames
|
224
|
+
- [`pem`](https://github.com/fastlane/fastlane/tree/master/pem): Automatically generate and renew your push notification profiles
|
225
|
+
- [`produce`](https://github.com/fastlane/fastlane/tree/master/produce): Create new iOS apps on iTunes Connect and Dev Portal using the command line
|
226
|
+
- [`cert`](https://github.com/fastlane/fastlane/tree/master/cert): Automatically create and maintain iOS code signing certificates
|
227
|
+
- [`spaceship`](https://github.com/fastlane/fastlane/tree/master/spaceship): Ruby library to access the Apple Dev Center and iTunes Connect
|
228
|
+
- [`pilot`](https://github.com/fastlane/fastlane/tree/master/pilot): The best way to manage your TestFlight testers and builds from your terminal
|
229
|
+
- [`boarding`](https://github.com/fastlane/boarding): The easiest way to invite your TestFlight beta testers
|
230
|
+
- [`gym`](https://github.com/fastlane/fastlane/tree/master/gym): Building your iOS apps has never been easier
|
231
|
+
- [`scan`](https://github.com/fastlane/fastlane/tree/master/scan): The easiest way to run tests of your iOS and Mac app
|
232
|
+
- [`match`](https://github.com/fastlane/fastlane/tree/master/match): Easily sync your certificates and profiles across your team using git
|
233
233
|
|
234
234
|
##### [Like this tool? Be the first to know about updates and new fastlane tools](https://tinyletter.com/krausefx)
|
235
235
|
|
236
236
|
## Use the 'Provisioning Quicklook plugin'
|
237
237
|
Download and install the [Provisioning Plugin](https://github.com/chockenberry/Provisioning).
|
238
238
|
|
239
|
-
It will show you the `mobileprovision` files like this:
|
239
|
+
It will show you the `mobileprovision` files like this:
|
240
240
|
![assets/QuickLookScreenshot.png](assets/QuickLookScreenshot.png)
|
241
241
|
|
242
242
|
## App Identifier couldn't be found
|
243
243
|
|
244
|
-
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.
|
244
|
+
If you also want to create a new App Identifier on the Apple Developer Portal, check out [produce](https://github.com/fastlane/fastlane/tree/master/produce), which does exactly that.
|
245
245
|
|
246
246
|
## What happens to my Xcode managed profiles?
|
247
247
|
|
@@ -251,7 +251,7 @@ If you also want to create a new App Identifier on the Apple Developer Portal, c
|
|
251
251
|
Please submit an issue on GitHub and provide information about your setup
|
252
252
|
|
253
253
|
# Code of Conduct
|
254
|
-
Help us keep `sigh` open and inclusive. Please read and follow our [Code of Conduct](https://github.com/fastlane/
|
254
|
+
Help us keep `sigh` open and inclusive. Please read and follow our [Code of Conduct](https://github.com/fastlane/fastlane/blob/master/CODE_OF_CONDUCT.md).
|
255
255
|
|
256
256
|
# License
|
257
257
|
This project is licensed under the terms of the MIT license. See the LICENSE file.
|
data/bin/sigh
CHANGED
@@ -76,6 +76,7 @@ class SighApplication
|
|
76
76
|
c.syntax = 'sigh manage'
|
77
77
|
c.description = 'Manage installed provisioning profiles on your system.'
|
78
78
|
|
79
|
+
c.option '-f', '--force', 'Force remove all expired provisioning profiles. Required on CI.'
|
79
80
|
c.option '-e', '--clean_expired', 'Remove all expired provisioning profiles.'
|
80
81
|
|
81
82
|
c.option '-p', '--clean_pattern STRING', String, 'Remove any provisioning profiles that matches the regular expression.'
|
data/lib/assets/resign.sh
CHANGED
@@ -60,13 +60,28 @@
|
|
60
60
|
# 5. copy the entitlements as archived-expanded-entitlements.xcent inside the app bundle (because Xcode does too)
|
61
61
|
#
|
62
62
|
|
63
|
+
# Logging functions
|
64
|
+
|
65
|
+
log() {
|
66
|
+
# Make sure it returns 0 code even when verose mode is off (test 1)
|
67
|
+
# To use like [[ condition ]] && log "x" && something
|
68
|
+
[[ -n "$VERBOSE" ]] && echo -e "$@" || test 1
|
69
|
+
}
|
70
|
+
|
71
|
+
error() {
|
72
|
+
echo "$@" >&2
|
73
|
+
exit 1
|
74
|
+
}
|
75
|
+
|
76
|
+
warning() {
|
77
|
+
echo "$@" >&2
|
78
|
+
}
|
63
79
|
|
64
80
|
function checkStatus {
|
65
81
|
|
66
82
|
if [ $? -ne 0 ];
|
67
83
|
then
|
68
|
-
|
69
|
-
exit 1
|
84
|
+
error "Encountered an error, aborting!"
|
70
85
|
fi
|
71
86
|
}
|
72
87
|
|
@@ -92,65 +107,68 @@ NESTED_APP_REFERENCE_KEYS=(":WKCompanionAppBundleIdentifier" ":NSExtension:NSExt
|
|
92
107
|
|
93
108
|
# options start index
|
94
109
|
OPTIND=3
|
95
|
-
while getopts p:d:e:k:b:n: opt; do
|
110
|
+
while getopts p:d:e:k:b:n:v opt; do
|
96
111
|
case $opt in
|
97
112
|
p)
|
98
113
|
RAW_PROVISIONS+=("$OPTARG")
|
99
|
-
if [[ "$OPTARG" =~ .+=.+ ]]; then
|
100
|
-
echo "Specified provisioning profile: '${OPTARG#*=}' for bundle identifier: '${OPTARG%%=*}'" >&2
|
101
|
-
else
|
102
|
-
echo "Specified provisioning profile: '$OPTARG'" >&2
|
103
|
-
fi
|
104
114
|
;;
|
105
115
|
d)
|
106
116
|
DISPLAY_NAME="$OPTARG"
|
107
|
-
echo "Specified display name: '$DISPLAY_NAME'" >&2
|
108
117
|
;;
|
109
118
|
e)
|
110
119
|
ENTITLEMENTS="$OPTARG"
|
111
|
-
echo "Specified signing entitlements: '$ENTITLEMENTS'" >&2
|
112
120
|
;;
|
113
121
|
b)
|
114
122
|
BUNDLE_IDENTIFIER="$OPTARG"
|
115
|
-
echo "Specified bundle identifier: '$BUNDLE_IDENTIFIER'" >&2
|
116
123
|
;;
|
117
124
|
k)
|
118
125
|
KEYCHAIN="$OPTARG"
|
119
|
-
echo "Specified Keychain to use: '$KEYCHAIN'" >&2
|
120
126
|
;;
|
121
127
|
n)
|
122
128
|
VERSION_NUMBER="$OPTARG"
|
123
|
-
|
129
|
+
;;
|
130
|
+
v)
|
131
|
+
VERBOSE="--verbose"
|
124
132
|
;;
|
125
133
|
\?)
|
126
|
-
|
127
|
-
exit 1
|
134
|
+
error "Invalid option: -$OPTARG"
|
128
135
|
;;
|
129
136
|
:)
|
130
|
-
|
131
|
-
exit 1
|
137
|
+
error "Option -$OPTARG requires an argument."
|
132
138
|
;;
|
133
139
|
esac
|
134
140
|
done
|
135
141
|
|
142
|
+
# Log the options
|
143
|
+
for provision in ${RAW_PROVISIONS[@]}; do
|
144
|
+
if [[ "$provision" =~ .+=.+ ]]; then
|
145
|
+
log "Specified provisioning profile: '${provision#*=}' for bundle identifier: '${provision%%=*}'"
|
146
|
+
else
|
147
|
+
log "Specified provisioning profile: '$provision'"
|
148
|
+
fi
|
149
|
+
done
|
150
|
+
[[ -n "${DISPLAY_NAME}" ]] && log "Specified display name: '$DISPLAY_NAME'"
|
151
|
+
[[ -n "${ENTITLEMENTS}" ]] && log "Specified signing entitlements: '$ENTITLEMENTS'"
|
152
|
+
[[ -n "${BUNDLE_IDENTIFIER}" ]] && log "Specified bundle identifier: '$BUNDLE_IDENTIFIER'"
|
153
|
+
[[ -n "${KEYCHAIN}" ]] && log "Specified Keychain to use: '$KEYCHAIN'"
|
154
|
+
[[ -n "${VERSION_NUMBER}" ]] && log "Specified version to use: '$VERSION_NUMBER'"
|
155
|
+
|
136
156
|
shift $((OPTIND-1))
|
137
157
|
|
138
158
|
NEW_FILE="$1"
|
139
159
|
if [ -z "$NEW_FILE" ];
|
140
160
|
then
|
141
|
-
|
142
|
-
exit 1
|
161
|
+
error "Output file name required"
|
143
162
|
fi
|
144
163
|
|
145
164
|
if [[ "${#RAW_PROVISIONS[*]}" == "0" ]]; then
|
146
|
-
|
147
|
-
exit 1;
|
165
|
+
error "-p 'xxxx.mobileprovision' argument is required"
|
148
166
|
fi
|
149
167
|
|
150
168
|
# Check for and remove the temporary directory if it already exists
|
151
169
|
if [ -d "$TEMP_DIR" ];
|
152
170
|
then
|
153
|
-
|
171
|
+
log "Removing previous temporary directory: '$TEMP_DIR'"
|
154
172
|
rm -Rf "$TEMP_DIR"
|
155
173
|
fi
|
156
174
|
|
@@ -171,8 +189,7 @@ then
|
|
171
189
|
cp -Rf "${ORIGINAL_FILE}" "$TEMP_DIR/Payload/${filename}.app"
|
172
190
|
checkStatus
|
173
191
|
else
|
174
|
-
|
175
|
-
exit
|
192
|
+
error "Error: Only can resign .app files and .ipa files."
|
176
193
|
fi
|
177
194
|
|
178
195
|
# check the keychain
|
@@ -235,8 +252,7 @@ function add_provision_for_bundle_id {
|
|
235
252
|
local CURRENT_PROVISION=`provision_for_bundle_id "$BUNDLE_ID" STRICT`
|
236
253
|
|
237
254
|
if [[ "$CURRENT_PROVISION" != "" && "$CURRENT_PROVISION" != "$PROVISION" ]]; then
|
238
|
-
|
239
|
-
exit 1
|
255
|
+
error "Conflicting provisioning profiles '$PROVISION' and '$CURRENT_PROVISION' for bundle identifier '$BUNDLE_ID'."
|
240
256
|
fi
|
241
257
|
|
242
258
|
PROVISIONS_BY_ID+=("$BUNDLE_ID=$PROVISION")
|
@@ -255,8 +271,7 @@ function add_provision {
|
|
255
271
|
fi
|
256
272
|
|
257
273
|
if [[ ! -e "$PROVISION" ]]; then
|
258
|
-
|
259
|
-
exit 1;
|
274
|
+
error "Provisioning profile '$PROVISION' file does not exist"
|
260
275
|
fi
|
261
276
|
|
262
277
|
local BUNDLE_ID=`bundle_id_for_provison "$PROVISION"`
|
@@ -286,8 +301,7 @@ function resign {
|
|
286
301
|
# Make sure that the Info.plist file is where we expect it
|
287
302
|
if [ ! -e "$APP_PATH/Info.plist" ];
|
288
303
|
then
|
289
|
-
|
290
|
-
exit 1;
|
304
|
+
error "Expected file does not exist: '$APP_PATH/Info.plist'"
|
291
305
|
fi
|
292
306
|
|
293
307
|
# Read in current values from the app
|
@@ -301,12 +315,11 @@ function resign {
|
|
301
315
|
|
302
316
|
if [[ "$NEW_PROVISION" == "" ]]; then
|
303
317
|
if [[ "$NESTED" == NESTED ]]; then
|
304
|
-
|
318
|
+
warning "No provisioning profile for nested application: '$APP_PATH' with bundle identifier '${BUNDLE_IDENTIFIER:-$CURRENT_BUNDLE_IDENTIFIER}'"
|
305
319
|
else
|
306
|
-
|
320
|
+
warning "No provisioning profile for application: '$APP_PATH' with bundle identifier '${BUNDLE_IDENTIFIER:-$CURRENT_BUNDLE_IDENTIFIER}'"
|
307
321
|
fi
|
308
|
-
|
309
|
-
exit 1;
|
322
|
+
error "Use the -p option (example: -p com.example.app=xxxx.mobileprovision)"
|
310
323
|
fi
|
311
324
|
|
312
325
|
local PROVISION_BUNDLE_IDENTIFIER=`bundle_id_for_provison "$NEW_PROVISION"`
|
@@ -314,7 +327,7 @@ function resign {
|
|
314
327
|
# Use provisioning profile's bundle identifier
|
315
328
|
if [ "$BUNDLE_IDENTIFIER" == "" ]; then
|
316
329
|
if [[ "$PROVISION_BUNDLE_IDENTIFIER" =~ \* ]]; then
|
317
|
-
|
330
|
+
log "Bundle Identifier contains a *, using the current bundle identifier"
|
318
331
|
BUNDLE_IDENTIFIER="$CURRENT_BUNDLE_IDENTIFIER"
|
319
332
|
else
|
320
333
|
BUNDLE_IDENTIFIER="$PROVISION_BUNDLE_IDENTIFIER"
|
@@ -322,25 +335,24 @@ function resign {
|
|
322
335
|
fi
|
323
336
|
|
324
337
|
if ! does_bundle_id_match "$PROVISION_BUNDLE_IDENTIFIER" "$BUNDLE_IDENTIFIER"; then
|
325
|
-
|
326
|
-
exit 1
|
338
|
+
error "Bundle Identifier '$PROVISION_BUNDLE_IDENTIFIER' in provisioning profile '$NEW_PROVISION' does not match the Bundle Identifier '$BUNDLE_IDENTIFIER' for application '$APP_PATH'."
|
327
339
|
fi
|
328
340
|
|
329
|
-
|
330
|
-
|
341
|
+
log "Current bundle identifier is: '$CURRENT_BUNDLE_IDENTIFIER'"
|
342
|
+
log "New bundle identifier will be: '$BUNDLE_IDENTIFIER'"
|
331
343
|
|
332
344
|
# Update the CFBundleDisplayName property in the Info.plist if a new name has been provided
|
333
345
|
if [ "${DISPLAY_NAME}" != "" ];
|
334
346
|
then
|
335
347
|
if [ "${DISPLAY_NAME}" != "${CURRENT_NAME}" ];
|
336
348
|
then
|
337
|
-
|
349
|
+
log "Changing display name from '$CURRENT_NAME' to '$DISPLAY_NAME'"
|
338
350
|
`PlistBuddy -c "Set :CFBundleDisplayName $DISPLAY_NAME" "$APP_PATH/Info.plist"`
|
339
351
|
fi
|
340
352
|
fi
|
341
353
|
|
342
354
|
# Replace the embedded mobile provisioning profile
|
343
|
-
|
355
|
+
log "Validating the new provisioning profile: $NEW_PROVISION"
|
344
356
|
security cms -D -i "$NEW_PROVISION" > "$TEMP_DIR/profile.plist"
|
345
357
|
checkStatus
|
346
358
|
|
@@ -350,13 +362,12 @@ function resign {
|
|
350
362
|
APP_IDENTIFER_PREFIX=`PlistBuddy -c "Print :ApplicationIdentifierPrefix:0" "$TEMP_DIR/profile.plist"`
|
351
363
|
if [ "$APP_IDENTIFER_PREFIX" == "" ];
|
352
364
|
then
|
353
|
-
|
354
|
-
exit 1;
|
365
|
+
error "Failed to extract any app identifier prefix from '$NEW_PROVISION'"
|
355
366
|
else
|
356
|
-
|
367
|
+
warning "WARNING: extracted an app identifier prefix '$APP_IDENTIFER_PREFIX' from '$NEW_PROVISION', but it was not found in the profile's entitlements"
|
357
368
|
fi
|
358
369
|
else
|
359
|
-
|
370
|
+
log "Profile app identifier prefix is '$APP_IDENTIFER_PREFIX'"
|
360
371
|
fi
|
361
372
|
|
362
373
|
TEAM_IDENTIFIER=`PlistBuddy -c "Print :Entitlements:com.apple.developer.team-identifier" "$TEMP_DIR/profile.plist" | tr -d '\n'`
|
@@ -365,12 +376,12 @@ function resign {
|
|
365
376
|
TEAM_IDENTIFIER=`PlistBuddy -c "Print :TeamIdentifier:0" "$TEMP_DIR/profile.plist"`
|
366
377
|
if [ "$TEAM_IDENTIFIER" == "" ];
|
367
378
|
then
|
368
|
-
|
379
|
+
warning "Failed to extract team identifier from '$NEW_PROVISION', resigned ipa may fail on iOS 8 and higher"
|
369
380
|
else
|
370
|
-
|
381
|
+
warning "WARNING: extracted a team identifier '$TEAM_IDENTIFIER' from '$NEW_PROVISION', but it was not found in the profile's entitlements, resigned ipa may fail on iOS 8 and higher"
|
371
382
|
fi
|
372
383
|
else
|
373
|
-
|
384
|
+
log "Profile team identifier is '$TEAM_IDENTIFIER'"
|
374
385
|
fi
|
375
386
|
|
376
387
|
cp "$NEW_PROVISION" "$APP_PATH/embedded.mobileprovision"
|
@@ -379,7 +390,7 @@ function resign {
|
|
379
390
|
#if the current bundle identifier is different from the new one in the provisioning profile, then change it.
|
380
391
|
if [ "$CURRENT_BUNDLE_IDENTIFIER" != "$BUNDLE_IDENTIFIER" ];
|
381
392
|
then
|
382
|
-
|
393
|
+
log "Updating the bundle identifier from '$CURRENT_BUNDLE_IDENTIFIER' to '$BUNDLE_IDENTIFIER'"
|
383
394
|
`PlistBuddy -c "Set :CFBundleIdentifier $BUNDLE_IDENTIFIER" "$APP_PATH/Info.plist"`
|
384
395
|
checkStatus
|
385
396
|
fi
|
@@ -390,7 +401,7 @@ function resign {
|
|
390
401
|
CURRENT_VERSION_NUMBER=`PlistBuddy -c "Print :CFBundleVersion" "$APP_PATH/Info.plist"`
|
391
402
|
if [ "$VERSION_NUMBER" != "$CURRENT_VERSION_NUMBER" ];
|
392
403
|
then
|
393
|
-
|
404
|
+
log "Updating the version from '$CURRENT_VERSION_NUMBER' to '$VERSION_NUMBER'"
|
394
405
|
`PlistBuddy -c "Set :CFBundleVersion $VERSION_NUMBER" "$APP_PATH/Info.plist"`
|
395
406
|
`PlistBuddy -c "Set :CFBundleShortVersionString $VERSION_NUMBER" "$APP_PATH/Info.plist"`
|
396
407
|
fi
|
@@ -402,25 +413,24 @@ function resign {
|
|
402
413
|
then
|
403
414
|
if [ "$TEAM_IDENTIFIER" == "" ];
|
404
415
|
then
|
405
|
-
|
406
|
-
exit 1;
|
416
|
+
error "ERROR: embedded frameworks detected, re-signing iOS 8 (or higher) applications wihout a team identifier in the certificate/profile does not work"
|
407
417
|
fi
|
408
418
|
|
409
|
-
|
419
|
+
log "Resigning embedded frameworks using certificate: '$CERTIFICATE'"
|
410
420
|
for framework in "$FRAMEWORKS_DIR"/*
|
411
421
|
do
|
412
422
|
if [[ "$framework" == *.framework || "$framework" == *.dylib ]]
|
413
423
|
then
|
414
|
-
/usr/bin/codesign -f -s "$CERTIFICATE" "$framework"
|
424
|
+
/usr/bin/codesign ${VERBOSE} -f -s "$CERTIFICATE" "$framework"
|
415
425
|
checkStatus
|
416
426
|
else
|
417
|
-
|
427
|
+
log "Ignoring non-framework: $framework"
|
418
428
|
fi
|
419
429
|
done
|
420
430
|
fi
|
421
431
|
|
422
432
|
# Check for and update bundle identifiers for extensions and associated nested apps
|
423
|
-
|
433
|
+
log "Fixing nested app and extension references"
|
424
434
|
for key in ${NESTED_APP_REFERENCE_KEYS[@]}; do
|
425
435
|
# Check if Info.plist has a reference to another app or extension
|
426
436
|
REF_BUNDLE_ID=`PlistBuddy -c "Print ${key}" "$APP_PATH/Info.plist" 2>/dev/null`
|
@@ -433,7 +443,7 @@ function resign {
|
|
433
443
|
# Change if not the same
|
434
444
|
if [ "$REF_BUNDLE_ID" != "$NEW_REF_BUNDLE_ID" ];
|
435
445
|
then
|
436
|
-
|
446
|
+
log "Updating nested app or extension reference for ${key} key from ${REF_BUNDLE_ID} to ${NEW_REF_BUNDLE_ID}"
|
437
447
|
`PlistBuddy -c "Set ${key} $NEW_REF_BUNDLE_ID" "$APP_PATH/Info.plist"`
|
438
448
|
fi
|
439
449
|
fi
|
@@ -447,12 +457,10 @@ function resign {
|
|
447
457
|
ENTITLEMENTS_APP_ID_PREFIX=`PlistBuddy -c "Print :application-identifier" "$ENTITLEMENTS" | grep -E '^[A-Z0-9]*' -o | tr -d '\n'`
|
448
458
|
if [ "$ENTITLEMENTS_APP_ID_PREFIX" == "" ];
|
449
459
|
then
|
450
|
-
|
451
|
-
exit 1;
|
460
|
+
error "Provided entitlements file is missing a value for the required 'application-identifier' key"
|
452
461
|
elif [ "$ENTITLEMENTS_APP_ID_PREFIX" != "$APP_IDENTIFER_PREFIX" ];
|
453
462
|
then
|
454
|
-
|
455
|
-
exit 1;
|
463
|
+
error "Provided entitlements file's app identifier prefix value '$ENTITLEMENTS_APP_ID_PREFIX' does not match the provided provisioning profile's value '$APP_IDENTIFER_PREFIX'"
|
456
464
|
fi
|
457
465
|
fi
|
458
466
|
|
@@ -462,41 +470,38 @@ function resign {
|
|
462
470
|
ENTITLEMENTS_TEAM_IDENTIFIER=`PlistBuddy -c "Print :com.apple.developer.team-identifier" "$ENTITLEMENTS" | tr -d '\n'`
|
463
471
|
if [ "$ENTITLEMENTS_TEAM_IDENTIFIER" == "" ];
|
464
472
|
then
|
465
|
-
|
466
|
-
exit 1;
|
473
|
+
error "Provided entitlements file is missing a value for the required 'com.apple.developer.team-identifier' key"
|
467
474
|
elif [ "$ENTITLEMENTS_TEAM_IDENTIFIER" != "$TEAM_IDENTIFIER" ];
|
468
475
|
then
|
469
|
-
|
470
|
-
exit 1;
|
476
|
+
error "Provided entitlements file's 'com.apple.developer.team-identifier' '$ENTITLEMENTS_TEAM_IDENTIFIER' does not match the provided provisioning profile's value '$TEAM_IDENTIFIER'"
|
471
477
|
fi
|
472
478
|
fi
|
473
479
|
|
474
|
-
|
475
|
-
|
480
|
+
log "Resigning application using certificate: '$CERTIFICATE'"
|
481
|
+
log "and entitlements: $ENTITLEMENTS"
|
476
482
|
cp -- "$ENTITLEMENTS" "$APP_PATH/archived-expanded-entitlements.xcent"
|
477
|
-
/usr/bin/codesign -f -s "$CERTIFICATE" --entitlements="$ENTITLEMENTS" "$APP_PATH"
|
483
|
+
/usr/bin/codesign ${VERBOSE} -f -s "$CERTIFICATE" --entitlements="$ENTITLEMENTS" "$APP_PATH"
|
478
484
|
checkStatus
|
479
485
|
else
|
480
|
-
|
486
|
+
log "Extracting entitlements from provisioning profile"
|
481
487
|
PlistBuddy -x -c "Print Entitlements" "$TEMP_DIR/profile.plist" > "$TEMP_DIR/newEntitlements"
|
482
488
|
checkStatus
|
483
|
-
|
484
|
-
|
489
|
+
log "Resigning application using certificate: '$CERTIFICATE'"
|
490
|
+
log "and entitlements from provisioning profile: $NEW_PROVISION"
|
485
491
|
cp -- "$TEMP_DIR/newEntitlements" "$APP_PATH/archived-expanded-entitlements.xcent"
|
486
|
-
/usr/bin/codesign -f -s "$CERTIFICATE" --entitlements="$TEMP_DIR/newEntitlements" "$APP_PATH"
|
492
|
+
/usr/bin/codesign ${VERBOSE} -f -s "$CERTIFICATE" --entitlements="$TEMP_DIR/newEntitlements" "$APP_PATH"
|
487
493
|
checkStatus
|
488
494
|
fi
|
489
495
|
|
490
496
|
# Remove the temporary files if they were created before generating ipa
|
491
497
|
rm -f "$TEMP_DIR/newEntitlements"
|
492
498
|
rm -f "$TEMP_DIR/profile.plist"
|
493
|
-
|
494
499
|
}
|
495
500
|
|
496
501
|
# Sign nested applications and app extensions
|
497
502
|
while IFS= read -d '' -r app;
|
498
503
|
do
|
499
|
-
|
504
|
+
log "Resigning nested application: '$app'"
|
500
505
|
resign "$app" NESTED
|
501
506
|
done < <(find "$TEMP_DIR/Payload/$APP_NAME" -d -mindepth 1 \( -name "*.app" -or -name "*.appex" \) -print0)
|
502
507
|
|
@@ -504,7 +509,7 @@ done < <(find "$TEMP_DIR/Payload/$APP_NAME" -d -mindepth 1 \( -name "*.app" -or
|
|
504
509
|
resign "$TEMP_DIR/Payload/$APP_NAME"
|
505
510
|
|
506
511
|
# Repackage quietly
|
507
|
-
|
512
|
+
log "Repackaging as $NEW_FILE"
|
508
513
|
|
509
514
|
# Zip up the contents of the "$TEMP_DIR" folder
|
510
515
|
# Navigate to the temporary directory (sending the output to null)
|
@@ -520,4 +525,4 @@ mv "$TEMP_DIR.ipa" "$NEW_FILE"
|
|
520
525
|
# Remove the temp directory
|
521
526
|
rm -rf "$TEMP_DIR"
|
522
527
|
|
523
|
-
|
528
|
+
log "Process complete"
|
data/lib/sigh/local_manage.rb
CHANGED
@@ -4,11 +4,11 @@ module Sigh
|
|
4
4
|
CLEANUP = "cleanup"
|
5
5
|
|
6
6
|
def self.start(options, args)
|
7
|
-
command, clean_expired, clean_pattern = get_inputs(options, args)
|
7
|
+
command, clean_expired, clean_pattern, force = get_inputs(options, args)
|
8
8
|
if command == LIST
|
9
9
|
list_profiles
|
10
10
|
elsif command == CLEANUP
|
11
|
-
cleanup_profiles(clean_expired, clean_pattern)
|
11
|
+
cleanup_profiles(clean_expired, clean_pattern, force)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -36,8 +36,9 @@ module Sigh
|
|
36
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
|
+
force = options.force
|
39
40
|
command = (!clean_expired.nil? || !clean_pattern.nil?) ? CLEANUP : LIST
|
40
|
-
return command, clean_expired, clean_pattern
|
41
|
+
return command, clean_expired, clean_pattern, force
|
41
42
|
end
|
42
43
|
|
43
44
|
def self.list_profiles
|
@@ -51,16 +52,16 @@ module Sigh
|
|
51
52
|
UI.message "Provisioning profiles installed"
|
52
53
|
UI.message "Valid:"
|
53
54
|
profiles_valid.each do |profile|
|
54
|
-
UI.message profile
|
55
|
+
UI.message profile_info(profile).green
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
58
59
|
profiles_soon = profiles.select { |profile| profile["ExpirationDate"] > now && profile["ExpirationDate"] < soon }
|
59
60
|
if profiles_soon.count > 0
|
60
61
|
UI.message ""
|
61
|
-
UI.message "Expiring within 30
|
62
|
+
UI.message "Expiring within 30 days:"
|
62
63
|
profiles_soon.each do |profile|
|
63
|
-
UI.message profile
|
64
|
+
UI.message profile_info(profile).yellow
|
64
65
|
end
|
65
66
|
end
|
66
67
|
|
@@ -69,7 +70,7 @@ module Sigh
|
|
69
70
|
UI.message ""
|
70
71
|
UI.message "Expired:"
|
71
72
|
profiles_expired.each do |profile|
|
72
|
-
UI.message profile
|
73
|
+
UI.message profile_info(profile).red
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
@@ -83,7 +84,15 @@ module Sigh
|
|
83
84
|
UI.message "You can remove all expired profiles using `sigh manage -e`" if profiles_expired.count > 0
|
84
85
|
end
|
85
86
|
|
86
|
-
def self.
|
87
|
+
def self.profile_info(profile)
|
88
|
+
if $verbose
|
89
|
+
"#{profile['Name']} - #{File.basename profile['Path']}"
|
90
|
+
else
|
91
|
+
profile['Name']
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.cleanup_profiles(expired = false, pattern = nil, force = nil)
|
87
96
|
now = DateTime.now
|
88
97
|
|
89
98
|
profiles = load_profiles.select { |profile| (expired && profile["ExpirationDate"] < now) || (!pattern.nil? && profile["Name"] =~ pattern) }
|
@@ -93,7 +102,16 @@ module Sigh
|
|
93
102
|
UI.message profile["Name"].red
|
94
103
|
end
|
95
104
|
|
96
|
-
|
105
|
+
delete = force
|
106
|
+
unless delete
|
107
|
+
if Helper.ci?
|
108
|
+
UI.user_error! "On a CI server, cleanup cannot be used without the --force option"
|
109
|
+
else
|
110
|
+
delete = agree("Delete these provisioning profiles #{profiles.length}? (y/n) ", true)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
if delete
|
97
115
|
profiles.each do |profile|
|
98
116
|
File.delete profile["Path"]
|
99
117
|
end
|
data/lib/sigh/runner.rb
CHANGED
@@ -150,7 +150,7 @@ module Sigh
|
|
150
150
|
filters << "Owner Name: '#{Sigh.config[:cert_owner_name]}' " if Sigh.config[:cert_owner_name]
|
151
151
|
filters << "Certificate ID: '#{Sigh.config[:cert_id]}' " if Sigh.config[:cert_id]
|
152
152
|
UI.important "No certificates for filter: #{filters}" if filters.length > 0
|
153
|
-
UI.user_error!("Could not find a matching code signing identity for #{profile_type}. You can use cert to generate one (https://github.com/fastlane/cert)")
|
153
|
+
UI.user_error!("Could not find a matching code signing identity for #{profile_type}. You can use cert to generate one (https://github.com/fastlane/fastlane/tree/master/cert)")
|
154
154
|
end
|
155
155
|
|
156
156
|
return certificates if Sigh.config[:development] # development profiles support multiple certificates
|
data/lib/sigh/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sigh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fastlane_core
|
@@ -232,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
232
232
|
version: '0'
|
233
233
|
requirements: []
|
234
234
|
rubyforge_project:
|
235
|
-
rubygems_version: 2.
|
235
|
+
rubygems_version: 2.2.2
|
236
236
|
signing_key:
|
237
237
|
specification_version: 4
|
238
238
|
summary: Because you would rather spend your time building stuff than fighting provisioning
|