fastlane 2.70.0.beta.20171214010003 → 2.70.0.beta.20171215010003

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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/fastlane/lib/fastlane/actions/docs/pilot.md +10 -10
  3. data/fastlane/lib/fastlane/version.rb +1 -1
  4. data/fastlane/swift/Appfile.swift +17 -0
  5. data/fastlane/swift/ArgumentProcessor.swift +72 -0
  6. data/fastlane/swift/Deliverfile.swift +14 -0
  7. data/fastlane/swift/DeliverfileProtocol.swift +118 -0
  8. data/fastlane/swift/Fastfile.swift +12 -0
  9. data/fastlane/swift/Fastlane.swift +3739 -0
  10. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +409 -0
  11. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  12. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme +103 -0
  13. data/fastlane/swift/Gymfile.swift +14 -0
  14. data/fastlane/swift/GymfileProtocol.swift +86 -0
  15. data/fastlane/swift/LaneFileProtocol.swift +103 -0
  16. data/fastlane/swift/Matchfile.swift +14 -0
  17. data/fastlane/swift/MatchfileProtocol.swift +54 -0
  18. data/fastlane/swift/Precheckfile.swift +14 -0
  19. data/fastlane/swift/PrecheckfileProtocol.swift +24 -0
  20. data/fastlane/swift/RubyCommand.swift +138 -0
  21. data/fastlane/swift/Runner.swift +190 -0
  22. data/fastlane/swift/RunnerArgument.swift +18 -0
  23. data/fastlane/swift/Scanfile.swift +14 -0
  24. data/fastlane/swift/ScanfileProtocol.swift +88 -0
  25. data/fastlane/swift/Screengrabfile.swift +14 -0
  26. data/fastlane/swift/ScreengrabfileProtocol.swift +48 -0
  27. data/fastlane/swift/Snapshotfile.swift +14 -0
  28. data/fastlane/swift/SnapshotfileProtocol.swift +70 -0
  29. data/fastlane/swift/SocketClient.swift +283 -0
  30. data/fastlane/swift/SocketClientDelegateProtocol.swift +19 -0
  31. data/fastlane/swift/SocketResponse.swift +74 -0
  32. data/fastlane/swift/main.swift +43 -0
  33. data/match/lib/match/encrypt.rb +12 -0
  34. 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]
@@ -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.20171214010003
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-14 00:00:00.000000000 Z
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