Skip to content

Commit 05e8dd5

Browse files
authored
Merge pull request #10 from hartbit/update
Update
2 parents 693aba4 + 31943da commit 05e8dd5

16 files changed

+95
-82
lines changed

Sources/TSCBasic/DictionaryExtensions.swift

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,6 @@
99
*/
1010

1111
extension Dictionary {
12-
/// Convenience initializer to create dictionary from tuples.
13-
public init<S: Sequence>(items: S) where S.Iterator.Element == (Key, Value) {
14-
self.init(minimumCapacity: items.underestimatedCount)
15-
for (key, value) in items {
16-
self[key] = value
17-
}
18-
}
19-
20-
/// Convenience initializer to create dictionary from tuples.
21-
public init<S: Sequence>(items: S) where S.Iterator.Element == (Key, Optional<Value>) {
22-
self.init(minimumCapacity: items.underestimatedCount)
23-
for (key, value) in items {
24-
self[key] = value
25-
}
26-
}
27-
2812
/// Returns a new dictionary containing the keys of this dictionary with the
2913
/// values transformed by the given closure, if transformed is not nil.
3014
public func spm_flatMapValues<T>(_ transform: (Value) throws -> T?) rethrows -> [Key: T] {

Sources/TSCBasic/JSON.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ extension JSON {
278278

279279
extension JSON {
280280
public init(_ dict: [String: JSONSerializable]) {
281-
self = .dictionary(Dictionary(items: dict.map({ ($0.0, $0.1.toJSON()) })))
281+
self = .dictionary(dict.mapValues({ $0.toJSON() }))
282282
}
283283
}
284284

Sources/TSCBasic/JSONMapper.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ extension JSON {
6565
throw MapError.typeMismatch(
6666
key: key, expected: Dictionary<String, JSON>.self, json: object)
6767
}
68-
return try Dictionary(items: value.map({ ($0.0, try T.init(json: $0.1)) }))
68+
return try value.mapValues({ try T.init(json: $0) })
6969
}
7070

7171
/// Returns a JSON mappable dictionary from a given key.

Sources/TSCBasic/OSLog.swift

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public final class OSLog {
3535
/// Creates a custom log object.
3636
public convenience init(subsystem: String, category: String) {
3737
#if canImport(os)
38-
if #available(macOS 10.12, *) {
38+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
3939
self.init(os.OSLog(subsystem: subsystem, category: category))
4040
} else {
4141
self.init()
@@ -48,7 +48,7 @@ public final class OSLog {
4848
/// The shared default log.
4949
public static let disabled: OSLog = {
5050
#if canImport(os)
51-
if #available(macOS 10.12, *) {
51+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
5252
return OSLog(os.OSLog.disabled)
5353
} else {
5454
return OSLog()
@@ -61,7 +61,7 @@ public final class OSLog {
6161
/// The shared default log.
6262
public static let `default`: OSLog = {
6363
#if canImport(os)
64-
if #available(macOS 10.12, *) {
64+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
6565
return OSLog(os.OSLog.default)
6666
} else {
6767
return OSLog()
@@ -91,7 +91,7 @@ public struct OSLogType {
9191
/// The default log level.
9292
public static var `default`: OSLogType {
9393
#if canImport(os)
94-
if #available(OSX 10.14, *) {
94+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
9595
return self.init(os.OSLogType.default)
9696
} else {
9797
return self.init()
@@ -104,7 +104,7 @@ public struct OSLogType {
104104
/// The info log level.
105105
public static var info: OSLogType {
106106
#if canImport(os)
107-
if #available(OSX 10.14, *) {
107+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
108108
return self.init(os.OSLogType.info)
109109
} else {
110110
return self.init()
@@ -117,7 +117,7 @@ public struct OSLogType {
117117
/// The debug log level.
118118
public static var debug: OSLogType {
119119
#if canImport(os)
120-
if #available(OSX 10.14, *) {
120+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
121121
return self.init(os.OSLogType.info)
122122
} else {
123123
return self.init()
@@ -139,7 +139,7 @@ public struct OSLogType {
139139
_ args: CVarArg...
140140
) {
141141
#if canImport(os)
142-
if #available(OSX 10.14, *) {
142+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
143143
switch args.count {
144144
case 0:
145145
os.os_log(type.type, log: log.log, message)
@@ -181,7 +181,7 @@ public struct OSSignpostType {
181181
/// Begins a signposted interval.
182182
public static let begin: OSSignpostType = {
183183
#if canImport(os)
184-
if #available(macOS 10.14, *) {
184+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
185185
return OSSignpostType(.begin)
186186
} else {
187187
fatalError("unreachable")
@@ -194,7 +194,7 @@ public struct OSSignpostType {
194194
/// Ends a signposted interval.
195195
public static let end: OSSignpostType = {
196196
#if canImport(os)
197-
if #available(macOS 10.14, *) {
197+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
198198
return OSSignpostType(.end)
199199
} else {
200200
fatalError("unreachable")
@@ -207,7 +207,7 @@ public struct OSSignpostType {
207207
/// Marks a point of interest in time with no duration.
208208
public static let event: OSSignpostType = {
209209
#if canImport(os)
210-
if #available(macOS 10.14, *) {
210+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
211211
return OSSignpostType(.event)
212212
} else {
213213
fatalError("unreachable")
@@ -227,7 +227,7 @@ public struct OSSignpostID {
227227
private let storage: Any?
228228

229229
#if canImport(os)
230-
@available(macOS 10.14, *)
230+
@available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *)
231231
@usableFromInline var id: os.OSSignpostID {
232232
return storage as! os.OSSignpostID
233233
}
@@ -241,7 +241,7 @@ public struct OSSignpostID {
241241
// provided log handle.
242242
public init(log: OSLog) {
243243
#if canImport(os)
244-
if #available(macOS 10.14, *) {
244+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
245245
self.init(os.OSSignpostID(log: log.log))
246246
} else {
247247
self.init(nil)
@@ -255,7 +255,7 @@ public struct OSSignpostID {
255255
/// concurrently.
256256
public static let exclusive: OSSignpostID = {
257257
#if canImport(os)
258-
if #available(macOS 10.14, *) {
258+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
259259
return OSSignpostID(os.OSSignpostID.exclusive)
260260
} else {
261261
return OSSignpostID(nil)
@@ -274,7 +274,7 @@ public struct OSSignpostID {
274274
signpostID: OSSignpostID = .exclusive
275275
) {
276276
#if canImport(os)
277-
if #available(macOS 10.14, *) {
277+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
278278
os.os_signpost(type.type, log: log.log, name: name, signpostID: signpostID.id)
279279
}
280280
#endif
@@ -290,7 +290,7 @@ public struct OSSignpostID {
290290
_ args: CVarArg...
291291
) {
292292
#if canImport(os)
293-
if #available(macOS 10.14, *) {
293+
if #available(macOS 10.14, iOS 12, tvOS 12, watchOS 5, *) {
294294
switch args.count {
295295
case 0:
296296
os.os_signpost(type.type, log: log.log, name: name, signpostID: signpostID.id, format)

Sources/TSCBasic/Process.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ public final class Process: ObjectIdentifierProtocol {
312312
try _process?.run()
313313
#else
314314
// Initialize the spawn attributes.
315-
#if canImport(Darwin)
315+
#if canImport(Darwin) || os(Android)
316316
var attributes: posix_spawnattr_t? = nil
317317
#else
318318
var attributes = posix_spawnattr_t()
@@ -357,7 +357,7 @@ public final class Process: ObjectIdentifierProtocol {
357357
posix_spawnattr_setflags(&attributes, Int16(flags))
358358

359359
// Setup the file actions.
360-
#if canImport(Darwin)
360+
#if canImport(Darwin) || os(Android)
361361
var fileActions: posix_spawn_file_actions_t? = nil
362362
#else
363363
var fileActions = posix_spawn_file_actions_t()
@@ -366,7 +366,10 @@ public final class Process: ObjectIdentifierProtocol {
366366
defer { posix_spawn_file_actions_destroy(&fileActions) }
367367

368368
// Workaround for https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=89e435f3559c53084498e9baad22172b64429362
369-
let devNull = strdup("/dev/null")
369+
// Change allowing for newer version of glibc
370+
guard let devNull = strdup("/dev/null") else {
371+
throw SystemError.posix_spawn(0, arguments)
372+
}
370373
defer { free(devNull) }
371374
// Open /dev/null as stdin.
372375
posix_spawn_file_actions_addopen(&fileActions, 0, devNull, O_RDONLY, 0)
@@ -392,7 +395,7 @@ public final class Process: ObjectIdentifierProtocol {
392395

393396
let argv = CStringArray(arguments)
394397
let env = CStringArray(environment.map({ "\($0.0)=\($0.1)" }))
395-
let rv = posix_spawnp(&processID, argv.cArray[0], &fileActions, &attributes, argv.cArray, env.cArray)
398+
let rv = posix_spawnp(&processID, argv.cArray[0]!, &fileActions, &attributes, argv.cArray, env.cArray)
396399

397400
guard rv == 0 else {
398401
throw SystemError.posix_spawn(rv, arguments)

Sources/TSCLibc/libc.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
See http://swift.org/CONTRIBUTORS.txt for Swift project authors
99
*/
1010

11-
#if os(Linux)
11+
#if canImport(Glibc)
1212
@_exported import Glibc
1313
#elseif os(Windows)
1414
@_exported import MSVCRT

Sources/TSCUtility/ArgumentParser.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ public final class ArgumentParser {
815815
}
816816
return result
817817
})
818-
let optionsMap = Dictionary(items: optionsTuple)
818+
let optionsMap = Dictionary(uniqueKeysWithValues: optionsTuple)
819819

820820
// Create iterators.
821821
var positionalArgumentIterator = positionalArguments.makeIterator()

Sources/TSCUtility/ArgumentParserShellCompletion.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ extension ArgumentParser {
1818
/// Generates part of a completion script for the given shell.
1919
///
2020
/// These aren't complete scripts, as some setup code is required. See
21-
/// `Utilities/bash/completions` and `Utilities/zsh/_swift` for example
22-
/// usage.
21+
/// `Sources/Commands/Completions+bash.swift` and
22+
/// `Sources/Commands/Completions+zsh.swift` for example usage.
2323
public func generateCompletionScript(for shell: Shell, on stream: OutputByteStream) {
2424
guard let commandName = commandName else { abort() }
2525
let name = "_\(commandName.replacingOccurrences(of: " ", with: "_"))"

Sources/TSCUtility/FSWatch.swift

Lines changed: 53 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -428,55 +428,76 @@ public final class Inotify {
428428
// FIXME: <rdar://problem/45794219> Swift should provide shims for FD_ macros
429429

430430
private func FD_ZERO(_ set: inout fd_set) {
431+
#if os(Android)
432+
set.fds_bits = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
433+
#else
431434
set.__fds_bits = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
435+
#endif
432436
}
433437

434438
private func FD_SET(_ fd: Int32, _ set: inout fd_set) {
435439
let intOffset = Int(fd / 16)
436440
let bitOffset = Int(fd % 16)
441+
#if os(Android)
442+
var fd_bits = set.fds_bits
443+
let mask: UInt = 1 << bitOffset
444+
#else
445+
var fd_bits = set.__fds_bits
437446
let mask = 1 << bitOffset
447+
#endif
438448
switch intOffset {
439-
case 0: set.__fds_bits.0 = set.__fds_bits.0 | mask
440-
case 1: set.__fds_bits.1 = set.__fds_bits.1 | mask
441-
case 2: set.__fds_bits.2 = set.__fds_bits.2 | mask
442-
case 3: set.__fds_bits.3 = set.__fds_bits.3 | mask
443-
case 4: set.__fds_bits.4 = set.__fds_bits.4 | mask
444-
case 5: set.__fds_bits.5 = set.__fds_bits.5 | mask
445-
case 6: set.__fds_bits.6 = set.__fds_bits.6 | mask
446-
case 7: set.__fds_bits.7 = set.__fds_bits.7 | mask
447-
case 8: set.__fds_bits.8 = set.__fds_bits.8 | mask
448-
case 9: set.__fds_bits.9 = set.__fds_bits.9 | mask
449-
case 10: set.__fds_bits.10 = set.__fds_bits.10 | mask
450-
case 11: set.__fds_bits.11 = set.__fds_bits.11 | mask
451-
case 12: set.__fds_bits.12 = set.__fds_bits.12 | mask
452-
case 13: set.__fds_bits.13 = set.__fds_bits.13 | mask
453-
case 14: set.__fds_bits.14 = set.__fds_bits.14 | mask
454-
case 15: set.__fds_bits.15 = set.__fds_bits.15 | mask
449+
case 0: fd_bits.0 = fd_bits.0 | mask
450+
case 1: fd_bits.1 = fd_bits.1 | mask
451+
case 2: fd_bits.2 = fd_bits.2 | mask
452+
case 3: fd_bits.3 = fd_bits.3 | mask
453+
case 4: fd_bits.4 = fd_bits.4 | mask
454+
case 5: fd_bits.5 = fd_bits.5 | mask
455+
case 6: fd_bits.6 = fd_bits.6 | mask
456+
case 7: fd_bits.7 = fd_bits.7 | mask
457+
case 8: fd_bits.8 = fd_bits.8 | mask
458+
case 9: fd_bits.9 = fd_bits.9 | mask
459+
case 10: fd_bits.10 = fd_bits.10 | mask
460+
case 11: fd_bits.11 = fd_bits.11 | mask
461+
case 12: fd_bits.12 = fd_bits.12 | mask
462+
case 13: fd_bits.13 = fd_bits.13 | mask
463+
case 14: fd_bits.14 = fd_bits.14 | mask
464+
case 15: fd_bits.15 = fd_bits.15 | mask
455465
default: break
456466
}
467+
#if os(Android)
468+
set.fds_bits = fd_bits
469+
#else
470+
set.__fds_bits = fd_bits
471+
#endif
457472
}
458473

459474
private func FD_ISSET(_ fd: Int32, _ set: inout fd_set) -> Bool {
460475
let intOffset = Int(fd / 32)
461476
let bitOffset = Int(fd % 32)
477+
#if os(Android)
478+
let fd_bits = set.fds_bits
479+
let mask: UInt = 1 << bitOffset
480+
#else
481+
let fd_bits = set.__fds_bits
462482
let mask = 1 << bitOffset
483+
#endif
463484
switch intOffset {
464-
case 0: return set.__fds_bits.0 & mask != 0
465-
case 1: return set.__fds_bits.1 & mask != 0
466-
case 2: return set.__fds_bits.2 & mask != 0
467-
case 3: return set.__fds_bits.3 & mask != 0
468-
case 4: return set.__fds_bits.4 & mask != 0
469-
case 5: return set.__fds_bits.5 & mask != 0
470-
case 6: return set.__fds_bits.6 & mask != 0
471-
case 7: return set.__fds_bits.7 & mask != 0
472-
case 8: return set.__fds_bits.8 & mask != 0
473-
case 9: return set.__fds_bits.9 & mask != 0
474-
case 10: return set.__fds_bits.10 & mask != 0
475-
case 11: return set.__fds_bits.11 & mask != 0
476-
case 12: return set.__fds_bits.12 & mask != 0
477-
case 13: return set.__fds_bits.13 & mask != 0
478-
case 14: return set.__fds_bits.14 & mask != 0
479-
case 15: return set.__fds_bits.15 & mask != 0
485+
case 0: return fd_bits.0 & mask != 0
486+
case 1: return fd_bits.1 & mask != 0
487+
case 2: return fd_bits.2 & mask != 0
488+
case 3: return fd_bits.3 & mask != 0
489+
case 4: return fd_bits.4 & mask != 0
490+
case 5: return fd_bits.5 & mask != 0
491+
case 6: return fd_bits.6 & mask != 0
492+
case 7: return fd_bits.7 & mask != 0
493+
case 8: return fd_bits.8 & mask != 0
494+
case 9: return fd_bits.9 & mask != 0
495+
case 10: return fd_bits.10 & mask != 0
496+
case 11: return fd_bits.11 & mask != 0
497+
case 12: return fd_bits.12 & mask != 0
498+
case 13: return fd_bits.13 & mask != 0
499+
case 14: return fd_bits.14 & mask != 0
500+
case 15: return fd_bits.15 & mask != 0
480501
default: return false
481502
}
482503
}

Sources/TSCUtility/IndexStore.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ public final class IndexStoreAPI {
193193
self.path = path
194194
#if os(Windows)
195195
let flags: DLOpenFlags = []
196+
#elseif os(Android)
197+
let flags: DLOpenFlags = [.lazy, .local, .first]
196198
#else
197199
let flags: DLOpenFlags = [.lazy, .local, .first, .deepBind]
198200
#endif

Sources/TSCUtility/InterruptHandler.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ public final class InterruptHandler {
6565
var action = sigaction()
6666
#if canImport(Darwin)
6767
action.__sigaction_u.__sa_handler = signalHandler
68+
#elseif os(Android)
69+
action.sa_handler = signalHandler
6870
#else
6971
action.__sigaction_handler = unsafeBitCast(
7072
signalHandler,

Sources/TSCUtility/Platform.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import Foundation
1313

1414
/// Recognized Platform types.
1515
public enum Platform {
16+
case android
1617
case darwin
1718
case linux(LinuxFlavor)
1819

@@ -33,6 +34,10 @@ public enum Platform {
3334
if localFileSystem.isFile(AbsolutePath("/etc/debian_version")) {
3435
return .linux(.debian)
3536
}
37+
if localFileSystem.isFile(AbsolutePath("/system/bin/toolbox")) ||
38+
localFileSystem.isFile(AbsolutePath("/system/bin/toybox")) {
39+
return .android
40+
}
3641
default:
3742
return nil
3843
}

0 commit comments

Comments
 (0)