fastlane 2.70.0.beta.20171214010003 → 2.70.0.beta.20171215010003
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/fastlane/lib/fastlane/actions/docs/pilot.md +10 -10
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Appfile.swift +17 -0
- data/fastlane/swift/ArgumentProcessor.swift +72 -0
- data/fastlane/swift/Deliverfile.swift +14 -0
- data/fastlane/swift/DeliverfileProtocol.swift +118 -0
- data/fastlane/swift/Fastfile.swift +12 -0
- data/fastlane/swift/Fastlane.swift +3739 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +409 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme +103 -0
- data/fastlane/swift/Gymfile.swift +14 -0
- data/fastlane/swift/GymfileProtocol.swift +86 -0
- data/fastlane/swift/LaneFileProtocol.swift +103 -0
- data/fastlane/swift/Matchfile.swift +14 -0
- data/fastlane/swift/MatchfileProtocol.swift +54 -0
- data/fastlane/swift/Precheckfile.swift +14 -0
- data/fastlane/swift/PrecheckfileProtocol.swift +24 -0
- data/fastlane/swift/RubyCommand.swift +138 -0
- data/fastlane/swift/Runner.swift +190 -0
- data/fastlane/swift/RunnerArgument.swift +18 -0
- data/fastlane/swift/Scanfile.swift +14 -0
- data/fastlane/swift/ScanfileProtocol.swift +88 -0
- data/fastlane/swift/Screengrabfile.swift +14 -0
- data/fastlane/swift/ScreengrabfileProtocol.swift +48 -0
- data/fastlane/swift/Snapshotfile.swift +14 -0
- data/fastlane/swift/SnapshotfileProtocol.swift +70 -0
- data/fastlane/swift/SocketClient.swift +283 -0
- data/fastlane/swift/SocketClientDelegateProtocol.swift +19 -0
- data/fastlane/swift/SocketResponse.swift +74 -0
- data/fastlane/swift/main.swift +43 -0
- data/match/lib/match/encrypt.rb +12 -0
- metadata +31 -2
@@ -0,0 +1,48 @@
|
|
1
|
+
protocol ScreengrabfileProtocol: class {
|
2
|
+
var androidHome: String? { get }
|
3
|
+
var buildToolsVersion: String? { get }
|
4
|
+
var locales: [String] { get }
|
5
|
+
var clearPreviousScreenshots: Bool { get }
|
6
|
+
var outputDirectory: String { get }
|
7
|
+
var skipOpenSummary: Bool { get }
|
8
|
+
var appPackageName: String { get }
|
9
|
+
var testsPackageName: String? { get }
|
10
|
+
var useTestsInPackages: [String]? { get }
|
11
|
+
var useTestsInClasses: [String]? { get }
|
12
|
+
var launchArguments: [String]? { get }
|
13
|
+
var testInstrumentationRunner: String { get }
|
14
|
+
var endingLocale: String { get }
|
15
|
+
var appApkPath: String? { get }
|
16
|
+
var testsApkPath: String? { get }
|
17
|
+
var specificDevice: String? { get }
|
18
|
+
var deviceType: String { get }
|
19
|
+
var exitOnTestFailure: Bool { get }
|
20
|
+
var reinstallApp: Bool { get }
|
21
|
+
}
|
22
|
+
|
23
|
+
extension ScreengrabfileProtocol {
|
24
|
+
var androidHome: String? { return nil }
|
25
|
+
var buildToolsVersion: String? { return nil }
|
26
|
+
var locales: [String] { return ["en-US"] }
|
27
|
+
var clearPreviousScreenshots: Bool { return false }
|
28
|
+
var outputDirectory: String { return "fastlane/metadata/android" }
|
29
|
+
var skipOpenSummary: Bool { return false }
|
30
|
+
var appPackageName: String { return "" }
|
31
|
+
var testsPackageName: String? { return nil }
|
32
|
+
var useTestsInPackages: [String]? { return nil }
|
33
|
+
var useTestsInClasses: [String]? { return nil }
|
34
|
+
var launchArguments: [String]? { return nil }
|
35
|
+
var testInstrumentationRunner: String { return "android.support.test.runner.AndroidJUnitRunner" }
|
36
|
+
var endingLocale: String { return "en-US" }
|
37
|
+
var appApkPath: String? { return nil }
|
38
|
+
var testsApkPath: String? { return nil }
|
39
|
+
var specificDevice: String? { return nil }
|
40
|
+
var deviceType: String { return "phone" }
|
41
|
+
var exitOnTestFailure: Bool { return true }
|
42
|
+
var reinstallApp: Bool { return false }
|
43
|
+
}
|
44
|
+
|
45
|
+
|
46
|
+
// Please don't remove the lines below
|
47
|
+
// They are used to detect outdated files
|
48
|
+
// FastlaneRunnerAPIVersion [0.9.1]
|
@@ -0,0 +1,14 @@
|
|
1
|
+
// This class is automatically included in FastlaneRunner during build
|
2
|
+
|
3
|
+
// This autogenerated file will be overwritten or replaced during build time, or when you initialize `snapshot`
|
4
|
+
class Snapshotfile: SnapshotfileProtocol {
|
5
|
+
// If you want to enable `snapshot`, run `fastlane snapshot init`
|
6
|
+
// After, this file will be replaced with a custom implementation that contains values you supplied
|
7
|
+
// during the `init` process, and you won't see this message
|
8
|
+
}
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
// Generated with fastlane 2.69.2
|
@@ -0,0 +1,70 @@
|
|
1
|
+
protocol SnapshotfileProtocol: class {
|
2
|
+
var workspace: String? { get }
|
3
|
+
var project: String? { get }
|
4
|
+
var xcargs: String? { get }
|
5
|
+
var devices: [String]? { get }
|
6
|
+
var languages: [String] { get }
|
7
|
+
var launchArguments: [String] { get }
|
8
|
+
var outputDirectory: String { get }
|
9
|
+
var outputSimulatorLogs: Bool { get }
|
10
|
+
var iosVersion: String? { get }
|
11
|
+
var skipOpenSummary: Bool { get }
|
12
|
+
var skipHelperVersionCheck: Bool { get }
|
13
|
+
var clearPreviousScreenshots: Bool { get }
|
14
|
+
var reinstallApp: Bool { get }
|
15
|
+
var eraseSimulator: Bool { get }
|
16
|
+
var localizeSimulator: Bool { get }
|
17
|
+
var appIdentifier: String? { get }
|
18
|
+
var addPhotos: [String]? { get }
|
19
|
+
var addVideos: [String]? { get }
|
20
|
+
var buildlogPath: String { get }
|
21
|
+
var clean: Bool { get }
|
22
|
+
var configuration: String? { get }
|
23
|
+
var xcprettyArgs: String? { get }
|
24
|
+
var sdk: String? { get }
|
25
|
+
var scheme: String? { get }
|
26
|
+
var numberOfRetries: Int { get }
|
27
|
+
var stopAfterFirstError: Bool { get }
|
28
|
+
var derivedDataPath: String? { get }
|
29
|
+
var testTargetName: String? { get }
|
30
|
+
var namespaceLogFiles: String? { get }
|
31
|
+
var concurrentSimulators: Bool { get }
|
32
|
+
}
|
33
|
+
|
34
|
+
extension SnapshotfileProtocol {
|
35
|
+
var workspace: String? { return nil }
|
36
|
+
var project: String? { return nil }
|
37
|
+
var xcargs: String? { return nil }
|
38
|
+
var devices: [String]? { return nil }
|
39
|
+
var languages: [String] { return ["en-US"] }
|
40
|
+
var launchArguments: [String] { return [""] }
|
41
|
+
var outputDirectory: String { return "screenshots" }
|
42
|
+
var outputSimulatorLogs: Bool { return false }
|
43
|
+
var iosVersion: String? { return nil }
|
44
|
+
var skipOpenSummary: Bool { return false }
|
45
|
+
var skipHelperVersionCheck: Bool { return false }
|
46
|
+
var clearPreviousScreenshots: Bool { return false }
|
47
|
+
var reinstallApp: Bool { return false }
|
48
|
+
var eraseSimulator: Bool { return false }
|
49
|
+
var localizeSimulator: Bool { return false }
|
50
|
+
var appIdentifier: String? { return nil }
|
51
|
+
var addPhotos: [String]? { return nil }
|
52
|
+
var addVideos: [String]? { return nil }
|
53
|
+
var buildlogPath: String { return "~/Library/Logs/snapshot" }
|
54
|
+
var clean: Bool { return false }
|
55
|
+
var configuration: String? { return nil }
|
56
|
+
var xcprettyArgs: String? { return nil }
|
57
|
+
var sdk: String? { return nil }
|
58
|
+
var scheme: String? { return nil }
|
59
|
+
var numberOfRetries: Int { return 1 }
|
60
|
+
var stopAfterFirstError: Bool { return false }
|
61
|
+
var derivedDataPath: String? { return nil }
|
62
|
+
var testTargetName: String? { return nil }
|
63
|
+
var namespaceLogFiles: String? { return nil }
|
64
|
+
var concurrentSimulators: Bool { return true }
|
65
|
+
}
|
66
|
+
|
67
|
+
|
68
|
+
// Please don't remove the lines below
|
69
|
+
// They are used to detect outdated files
|
70
|
+
// FastlaneRunnerAPIVersion [0.9.1]
|
@@ -0,0 +1,283 @@
|
|
1
|
+
//
|
2
|
+
// SocketClient.swift
|
3
|
+
// FastlaneSwiftRunner
|
4
|
+
//
|
5
|
+
// Created by Joshua Liebowitz on 7/30/17.
|
6
|
+
// Copyright © 2017 Joshua Liebowitz. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import Foundation
|
10
|
+
|
11
|
+
public enum SocketClientResponse: Error {
|
12
|
+
case alreadyClosedSockets
|
13
|
+
case malformedRequest
|
14
|
+
case malformedResponse
|
15
|
+
case serverError
|
16
|
+
case commandTimeout(seconds: Int)
|
17
|
+
case connectionFailure
|
18
|
+
case success(returnedObject: String?, closureArgumentValue: String?)
|
19
|
+
}
|
20
|
+
|
21
|
+
class SocketClient: NSObject {
|
22
|
+
|
23
|
+
enum SocketStatus {
|
24
|
+
case ready
|
25
|
+
case closed
|
26
|
+
}
|
27
|
+
|
28
|
+
static let connectTimeoutSeconds = 2
|
29
|
+
static let defaultCommandTimeoutSeconds = 3_600 // Hopefully 1 hr is enough ¯\_(ツ)_/¯
|
30
|
+
static let doneToken = "done"
|
31
|
+
|
32
|
+
fileprivate var inputStream: InputStream!
|
33
|
+
fileprivate var outputStream: OutputStream!
|
34
|
+
fileprivate var cleaningUpAfterDone = false
|
35
|
+
fileprivate let dispatchGroup: DispatchGroup = DispatchGroup()
|
36
|
+
fileprivate let commandTimeoutSeconds: Int
|
37
|
+
|
38
|
+
private let streamQueue: DispatchQueue
|
39
|
+
private let host: String
|
40
|
+
private let port: UInt32
|
41
|
+
|
42
|
+
let maxReadLength = 65_536 // max for ipc on 10.12 is kern.ipc.maxsockbuf: 8388608 ($sysctl kern.ipc.maxsockbuf)
|
43
|
+
|
44
|
+
weak private(set) var socketDelegate: SocketClientDelegateProtocol?
|
45
|
+
|
46
|
+
public private(set) var socketStatus: SocketStatus
|
47
|
+
|
48
|
+
// localhost only, this prevents other computers from connecting
|
49
|
+
init(host: String = "localhost", port: UInt32 = 2000, commandTimeoutSeconds: Int = defaultCommandTimeoutSeconds, socketDelegate: SocketClientDelegateProtocol) {
|
50
|
+
self.host = host
|
51
|
+
self.port = port
|
52
|
+
self.commandTimeoutSeconds = commandTimeoutSeconds
|
53
|
+
self.streamQueue = DispatchQueue(label: "streamQueue")
|
54
|
+
self.socketStatus = .closed
|
55
|
+
self.socketDelegate = socketDelegate
|
56
|
+
super.init()
|
57
|
+
}
|
58
|
+
|
59
|
+
func connectAndOpenStreams() {
|
60
|
+
var readStream: Unmanaged<CFReadStream>?
|
61
|
+
var writeStream: Unmanaged<CFWriteStream>?
|
62
|
+
|
63
|
+
self.streamQueue.async {
|
64
|
+
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, self.host as CFString, self.port, &readStream, &writeStream)
|
65
|
+
|
66
|
+
self.inputStream = readStream!.takeRetainedValue()
|
67
|
+
self.outputStream = writeStream!.takeRetainedValue()
|
68
|
+
|
69
|
+
self.inputStream.delegate = self
|
70
|
+
self.outputStream.delegate = self
|
71
|
+
|
72
|
+
self.inputStream.schedule(in: .main, forMode: .defaultRunLoopMode)
|
73
|
+
self.outputStream.schedule(in: .main, forMode: .defaultRunLoopMode)
|
74
|
+
}
|
75
|
+
|
76
|
+
self.dispatchGroup.enter()
|
77
|
+
self.streamQueue.async {
|
78
|
+
self.inputStream.open()
|
79
|
+
}
|
80
|
+
|
81
|
+
self.dispatchGroup.enter()
|
82
|
+
self.streamQueue.async {
|
83
|
+
self.outputStream.open()
|
84
|
+
}
|
85
|
+
|
86
|
+
let secondsToWait = DispatchTimeInterval.seconds(SocketClient.connectTimeoutSeconds)
|
87
|
+
let connectTimeout = DispatchTime.now() + secondsToWait
|
88
|
+
|
89
|
+
let timeoutResult = self.dispatchGroup.wait(timeout: connectTimeout)
|
90
|
+
let failureMessage = "Couldn't connect to ruby process within: \(SocketClient.connectTimeoutSeconds) seconds"
|
91
|
+
|
92
|
+
let success = testDispatchTimeoutResult(timeoutResult, failureMessage: failureMessage, timeToWait: secondsToWait)
|
93
|
+
|
94
|
+
guard success else {
|
95
|
+
self.socketDelegate?.commandExecuted(serverResponse: .connectionFailure)
|
96
|
+
return
|
97
|
+
}
|
98
|
+
|
99
|
+
self.socketStatus = .ready
|
100
|
+
self.socketDelegate?.connectionsOpened()
|
101
|
+
}
|
102
|
+
|
103
|
+
public func send(rubyCommand: RubyCommandable) {
|
104
|
+
verbose(message: "sending: \(rubyCommand.json)")
|
105
|
+
send(string: rubyCommand.json)
|
106
|
+
}
|
107
|
+
|
108
|
+
public func sendComplete() {
|
109
|
+
sendAbort()
|
110
|
+
}
|
111
|
+
|
112
|
+
private func testDispatchTimeoutResult(_ timeoutResult: DispatchTimeoutResult, failureMessage: String, timeToWait: DispatchTimeInterval) -> Bool {
|
113
|
+
switch timeoutResult {
|
114
|
+
case .success:
|
115
|
+
return true
|
116
|
+
case .timedOut:
|
117
|
+
log(message: "Timeout: \(failureMessage)")
|
118
|
+
|
119
|
+
if case .seconds(let seconds) = timeToWait {
|
120
|
+
socketDelegate?.commandExecuted(serverResponse: .commandTimeout(seconds: seconds))
|
121
|
+
}
|
122
|
+
return false
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
private func stopInputSession() {
|
127
|
+
inputStream.close()
|
128
|
+
}
|
129
|
+
|
130
|
+
private func stopOutputSession() {
|
131
|
+
outputStream.close()
|
132
|
+
}
|
133
|
+
|
134
|
+
private func send(string: String) {
|
135
|
+
guard !self.cleaningUpAfterDone else {
|
136
|
+
// This will happen after we abort if there are commands waiting to be executed
|
137
|
+
// Need to check state of SocketClient in command runner to make sure we can accept `send`
|
138
|
+
socketDelegate?.commandExecuted(serverResponse: .alreadyClosedSockets)
|
139
|
+
return
|
140
|
+
}
|
141
|
+
|
142
|
+
if string == SocketClient.doneToken {
|
143
|
+
self.cleaningUpAfterDone = true
|
144
|
+
}
|
145
|
+
|
146
|
+
self.dispatchGroup.enter()
|
147
|
+
streamQueue.async {
|
148
|
+
let data = string.data(using: .utf8)!
|
149
|
+
_ = data.withUnsafeBytes { self.outputStream.write($0, maxLength: data.count) }
|
150
|
+
}
|
151
|
+
|
152
|
+
let timeoutSeconds = self.cleaningUpAfterDone ? 1 : self.commandTimeoutSeconds
|
153
|
+
|
154
|
+
let timeToWait = DispatchTimeInterval.seconds(timeoutSeconds)
|
155
|
+
let commandTimeout = DispatchTime.now() + timeToWait
|
156
|
+
let timeoutResult = self.dispatchGroup.wait(timeout: commandTimeout)
|
157
|
+
|
158
|
+
_ = testDispatchTimeoutResult(timeoutResult, failureMessage: "Ruby process didn't return after: \(SocketClient.connectTimeoutSeconds) seconds", timeToWait: timeToWait)
|
159
|
+
}
|
160
|
+
|
161
|
+
func sendAbort() {
|
162
|
+
self.socketStatus = .closed
|
163
|
+
|
164
|
+
stopInputSession()
|
165
|
+
|
166
|
+
// and error occured, let's try to send the "done" message
|
167
|
+
send(string: SocketClient.doneToken)
|
168
|
+
|
169
|
+
stopOutputSession()
|
170
|
+
self.socketDelegate?.connectionsClosed()
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
174
|
+
extension SocketClient: StreamDelegate {
|
175
|
+
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
|
176
|
+
guard !self.cleaningUpAfterDone else {
|
177
|
+
// Still getting response from server eventhough we are done.
|
178
|
+
// No big deal, we're closing the streams anyway.
|
179
|
+
// That being said, we need to balance out the dispatchGroups
|
180
|
+
self.dispatchGroup.leave()
|
181
|
+
return
|
182
|
+
}
|
183
|
+
|
184
|
+
if aStream === self.inputStream {
|
185
|
+
switch eventCode {
|
186
|
+
case Stream.Event.openCompleted:
|
187
|
+
self.dispatchGroup.leave()
|
188
|
+
|
189
|
+
case Stream.Event.errorOccurred:
|
190
|
+
verbose(message: "input stream error occurred")
|
191
|
+
sendAbort()
|
192
|
+
|
193
|
+
case Stream.Event.hasBytesAvailable:
|
194
|
+
read()
|
195
|
+
|
196
|
+
case Stream.Event.endEncountered:
|
197
|
+
// nothing special here
|
198
|
+
break
|
199
|
+
|
200
|
+
case Stream.Event.hasSpaceAvailable:
|
201
|
+
// we don't care about this
|
202
|
+
break
|
203
|
+
|
204
|
+
default:
|
205
|
+
verbose(message: "input stream caused unrecognized event: \(eventCode)")
|
206
|
+
}
|
207
|
+
|
208
|
+
} else if aStream === self.outputStream {
|
209
|
+
switch eventCode {
|
210
|
+
case Stream.Event.openCompleted:
|
211
|
+
self.dispatchGroup.leave()
|
212
|
+
|
213
|
+
case Stream.Event.errorOccurred:
|
214
|
+
// probably safe to close all the things because Ruby already disconnected
|
215
|
+
verbose(message: "output stream recevied error")
|
216
|
+
break
|
217
|
+
|
218
|
+
case Stream.Event.endEncountered:
|
219
|
+
// nothing special here
|
220
|
+
break
|
221
|
+
|
222
|
+
case Stream.Event.hasSpaceAvailable:
|
223
|
+
// we don't care about this
|
224
|
+
break
|
225
|
+
|
226
|
+
default:
|
227
|
+
verbose(message: "output stream caused unrecognized event: \(eventCode)")
|
228
|
+
}
|
229
|
+
}
|
230
|
+
}
|
231
|
+
|
232
|
+
func read() {
|
233
|
+
var buffer = [UInt8](repeating: 0, count: maxReadLength)
|
234
|
+
var output = ""
|
235
|
+
while self.inputStream!.hasBytesAvailable {
|
236
|
+
let bytesRead: Int = inputStream!.read(&buffer, maxLength: buffer.count)
|
237
|
+
if bytesRead >= 0 {
|
238
|
+
output += NSString(bytes: UnsafePointer(buffer), length: bytesRead, encoding: String.Encoding.utf8.rawValue)! as String
|
239
|
+
} else {
|
240
|
+
verbose(message: "Stream read() error")
|
241
|
+
}
|
242
|
+
}
|
243
|
+
|
244
|
+
processResponse(string: output)
|
245
|
+
}
|
246
|
+
|
247
|
+
func handleFailure(message: [String]) {
|
248
|
+
log(message: "Encountered a problem: \(message.joined(separator:"\n"))")
|
249
|
+
sendAbort()
|
250
|
+
}
|
251
|
+
|
252
|
+
func processResponse(string: String) {
|
253
|
+
guard string.count > 0 else {
|
254
|
+
self.socketDelegate?.commandExecuted(serverResponse: .malformedResponse)
|
255
|
+
self.handleFailure(message: ["empty response from ruby process"])
|
256
|
+
|
257
|
+
return
|
258
|
+
}
|
259
|
+
|
260
|
+
let responseString = string.trimmingCharacters(in: .whitespacesAndNewlines)
|
261
|
+
let socketResponse = SocketResponse(payload: responseString)
|
262
|
+
verbose(message: "response is: \(responseString)")
|
263
|
+
switch socketResponse.responseType {
|
264
|
+
case .failure(let failureInformation):
|
265
|
+
self.socketDelegate?.commandExecuted(serverResponse: .serverError)
|
266
|
+
self.handleFailure(message: failureInformation)
|
267
|
+
|
268
|
+
case .parseFailure(let failureInformation):
|
269
|
+
self.socketDelegate?.commandExecuted(serverResponse: .malformedResponse)
|
270
|
+
self.handleFailure(message: failureInformation)
|
271
|
+
|
272
|
+
case .readyForNext(let returnedObject, let closureArgumentValue):
|
273
|
+
self.socketDelegate?.commandExecuted(serverResponse: .success(returnedObject: returnedObject, closureArgumentValue: closureArgumentValue))
|
274
|
+
// cool, ready for next command
|
275
|
+
break
|
276
|
+
}
|
277
|
+
self.dispatchGroup.leave() // should now pull the next piece of work
|
278
|
+
}
|
279
|
+
}
|
280
|
+
|
281
|
+
// Please don't remove the lines below
|
282
|
+
// They are used to detect outdated files
|
283
|
+
// FastlaneRunnerAPIVersion [0.9.1]
|
@@ -0,0 +1,19 @@
|
|
1
|
+
//
|
2
|
+
// SocketClientDelegateProtocol.swift
|
3
|
+
// FastlaneSwiftRunner
|
4
|
+
//
|
5
|
+
// Created by Joshua Liebowitz on 8/12/17.
|
6
|
+
// Copyright © 2017 Joshua Liebowitz. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import Foundation
|
10
|
+
|
11
|
+
protocol SocketClientDelegateProtocol: class {
|
12
|
+
func connectionsOpened()
|
13
|
+
func connectionsClosed()
|
14
|
+
func commandExecuted(serverResponse: SocketClientResponse)
|
15
|
+
}
|
16
|
+
|
17
|
+
// Please don't remove the lines below
|
18
|
+
// They are used to detect outdated files
|
19
|
+
// FastlaneRunnerAPIVersion [0.9.1]
|
@@ -0,0 +1,74 @@
|
|
1
|
+
//
|
2
|
+
// SocketResponse.swift
|
3
|
+
// FastlaneSwiftRunner
|
4
|
+
//
|
5
|
+
// Created by Joshua Liebowitz on 7/30/17.
|
6
|
+
// Copyright © 2017 Joshua Liebowitz. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import Foundation
|
10
|
+
|
11
|
+
struct SocketResponse {
|
12
|
+
enum ResponseType {
|
13
|
+
case parseFailure(failureInformation: [String])
|
14
|
+
case failure(failureInformation: [String])
|
15
|
+
case readyForNext(returnedObject: String?, closureArgumentValue: String?)
|
16
|
+
|
17
|
+
init(statusDictionary: [String : Any]) {
|
18
|
+
guard let status = statusDictionary["status"] as? String else {
|
19
|
+
self = .parseFailure(failureInformation: ["Message failed to parse from Ruby server"])
|
20
|
+
return
|
21
|
+
}
|
22
|
+
|
23
|
+
if status == "ready_for_next" {
|
24
|
+
let returnedObject = statusDictionary["return_object"] as? String
|
25
|
+
let closureArgumentValue = statusDictionary["closure_argument_value"] as? String
|
26
|
+
self = .readyForNext(returnedObject: returnedObject, closureArgumentValue: closureArgumentValue)
|
27
|
+
return
|
28
|
+
|
29
|
+
} else if status == "failure" {
|
30
|
+
guard let failureInformation = statusDictionary["failure_information"] as? [String] else {
|
31
|
+
self = .parseFailure(failureInformation: ["Ruby server indicated failure but Swift couldn't receive it"])
|
32
|
+
return
|
33
|
+
}
|
34
|
+
|
35
|
+
self = .failure(failureInformation: failureInformation)
|
36
|
+
return
|
37
|
+
}
|
38
|
+
self = .parseFailure(failureInformation: ["Message status: \(status) not a supported status"])
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
let responseType: ResponseType
|
43
|
+
|
44
|
+
init(payload: String) {
|
45
|
+
guard let data = SocketResponse.convertToDictionary(text: payload) else {
|
46
|
+
self.responseType = .parseFailure(failureInformation: ["Unable to parse message from Ruby server"])
|
47
|
+
return
|
48
|
+
}
|
49
|
+
|
50
|
+
guard case let statusDictionary? = data["payload"] as? [String : Any] else {
|
51
|
+
self.responseType = .parseFailure(failureInformation: ["Payload missing from Ruby server response"])
|
52
|
+
return
|
53
|
+
}
|
54
|
+
|
55
|
+
self.responseType = ResponseType(statusDictionary: statusDictionary)
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
extension SocketResponse {
|
60
|
+
static func convertToDictionary(text: String) -> [String : Any]? {
|
61
|
+
if let data = text.data(using: .utf8) {
|
62
|
+
do {
|
63
|
+
return try JSONSerialization.jsonObject(with: data, options: []) as? [String : Any]
|
64
|
+
} catch {
|
65
|
+
log(message: error.localizedDescription)
|
66
|
+
}
|
67
|
+
}
|
68
|
+
return nil
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
// Please don't remove the lines below
|
73
|
+
// They are used to detect outdated files
|
74
|
+
// FastlaneRunnerAPIVersion [0.9.1]
|
@@ -0,0 +1,43 @@
|
|
1
|
+
//
|
2
|
+
// main.swift
|
3
|
+
// FastlaneSwiftRunner
|
4
|
+
//
|
5
|
+
// Created by Joshua Liebowitz on 8/26/17.
|
6
|
+
// Copyright © 2017 Joshua Liebowitz. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import Foundation
|
10
|
+
|
11
|
+
let argumentProcessor = ArgumentProcessor(args: CommandLine.arguments)
|
12
|
+
let timeout = argumentProcessor.commandTimeout
|
13
|
+
|
14
|
+
class MainProcess {
|
15
|
+
var doneRunningLane = false
|
16
|
+
var thread: Thread!
|
17
|
+
|
18
|
+
@objc func connectToFastlaneAndRunLane() {
|
19
|
+
runner.startSocketThread()
|
20
|
+
|
21
|
+
Fastfile.runLane(named: argumentProcessor.currentLane)
|
22
|
+
runner.disconnectFromFastlaneProcess()
|
23
|
+
|
24
|
+
doneRunningLane = true
|
25
|
+
}
|
26
|
+
|
27
|
+
func startFastlaneThread() {
|
28
|
+
thread = Thread(target: self, selector: #selector(connectToFastlaneAndRunLane), object: nil)
|
29
|
+
thread.name = "worker thread"
|
30
|
+
thread.start()
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
let process: MainProcess = MainProcess()
|
35
|
+
process.startFastlaneThread()
|
36
|
+
|
37
|
+
while (!process.doneRunningLane && (RunLoop.current.run(mode: RunLoopMode.defaultRunLoopMode, before: Date(timeIntervalSinceNow: 2)))) {
|
38
|
+
// no op
|
39
|
+
}
|
40
|
+
|
41
|
+
// Please don't remove the lines below
|
42
|
+
// They are used to detect outdated files
|
43
|
+
// FastlaneRunnerAPIVersion [0.9.1]
|
data/match/lib/match/encrypt.rb
CHANGED
@@ -93,6 +93,18 @@ module Match
|
|
93
93
|
success = system(command.join(' '))
|
94
94
|
|
95
95
|
UI.crash!("Error decrypting '#{path}'") unless success
|
96
|
+
|
97
|
+
# On non-Mac systems (more specific Ubuntu Linux) it might take some time for the file to actually be there (see #11182).
|
98
|
+
# To try to circumvent this flakyness (in tests), we wait a bit until the file appears (max 2s) (usually only 0.1 is actually waited)
|
99
|
+
unless FastlaneCore::Helper.is_mac?
|
100
|
+
count = 0
|
101
|
+
# sleep until file exists or 20*0.1s (=2s) passed
|
102
|
+
until File.exist?(tmpfile) || count == 20
|
103
|
+
sleep(0.1)
|
104
|
+
count += 1
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
96
108
|
FileUtils.mv(tmpfile, path)
|
97
109
|
end
|
98
110
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.70.0.beta.
|
4
|
+
version: 2.70.0.beta.20171215010003
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date: 2017-12-
|
18
|
+
date: 2017-12-15 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: slack-notifier
|
@@ -1199,6 +1199,35 @@ files:
|
|
1199
1199
|
- fastlane/lib/fastlane/swift_lane_manager.rb
|
1200
1200
|
- fastlane/lib/fastlane/tools.rb
|
1201
1201
|
- fastlane/lib/fastlane/version.rb
|
1202
|
+
- fastlane/swift/Appfile.swift
|
1203
|
+
- fastlane/swift/ArgumentProcessor.swift
|
1204
|
+
- fastlane/swift/Deliverfile.swift
|
1205
|
+
- fastlane/swift/DeliverfileProtocol.swift
|
1206
|
+
- fastlane/swift/Fastfile.swift
|
1207
|
+
- fastlane/swift/Fastlane.swift
|
1208
|
+
- fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj
|
1209
|
+
- fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
|
1210
|
+
- fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme
|
1211
|
+
- fastlane/swift/Gymfile.swift
|
1212
|
+
- fastlane/swift/GymfileProtocol.swift
|
1213
|
+
- fastlane/swift/LaneFileProtocol.swift
|
1214
|
+
- fastlane/swift/Matchfile.swift
|
1215
|
+
- fastlane/swift/MatchfileProtocol.swift
|
1216
|
+
- fastlane/swift/Precheckfile.swift
|
1217
|
+
- fastlane/swift/PrecheckfileProtocol.swift
|
1218
|
+
- fastlane/swift/RubyCommand.swift
|
1219
|
+
- fastlane/swift/Runner.swift
|
1220
|
+
- fastlane/swift/RunnerArgument.swift
|
1221
|
+
- fastlane/swift/Scanfile.swift
|
1222
|
+
- fastlane/swift/ScanfileProtocol.swift
|
1223
|
+
- fastlane/swift/Screengrabfile.swift
|
1224
|
+
- fastlane/swift/ScreengrabfileProtocol.swift
|
1225
|
+
- fastlane/swift/Snapshotfile.swift
|
1226
|
+
- fastlane/swift/SnapshotfileProtocol.swift
|
1227
|
+
- fastlane/swift/SocketClient.swift
|
1228
|
+
- fastlane/swift/SocketClientDelegateProtocol.swift
|
1229
|
+
- fastlane/swift/SocketResponse.swift
|
1230
|
+
- fastlane/swift/main.swift
|
1202
1231
|
- fastlane_core/README.md
|
1203
1232
|
- fastlane_core/lib/assets/XMLTemplate.xml.erb
|
1204
1233
|
- fastlane_core/lib/fastlane_core.rb
|