Skip to content

Commit d8bb450

Browse files
committed
build and test on linux using docker
1 parent a312bdc commit d8bb450

File tree

15 files changed

+126
-120
lines changed

15 files changed

+126
-120
lines changed

Dockerfile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
FROM swift:4.2.1
2+
COPY XcodeProject.xcodeproj ./XcodeProject.xcodeproj
3+
COPY Package.swift ./Package.swift
4+
COPY Sources ./Sources
5+
COPY Tests ./Tests
6+
RUN swift test --configuration debug

Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ test:
88

99
xcode:
1010
swift package generate-xcodeproj --xcconfig-overrides=overrides.xcconfig
11+
12+
linux:
13+
swift test --generate-linuxmain $(SWIFTC_FLAGS)
1114

1215
clean:
13-
swift build --clean
16+
swift build --clean

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version:4.0
1+
// swift-tools-version:4.2
22
// The swift-tools-version declares the minimum version of Swift required to build this package.
33

44
import PackageDescription

Sources/XcodeProject/Objects/PBXFileType.swift

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
//
88

99
import Foundation
10+
#if canImport(CoreServices)
1011
import CoreServices
12+
#endif
1113

1214
public struct PBXFileType {
1315
static var fileTypes: [PBXFileType] = [
@@ -39,25 +41,43 @@ public struct PBXFileType {
3941
var isSource: Bool {
4042
return UTTypeConformsTo(uniformType as CFString, kUTTypeSourceCode)
4143
}
44+
45+
static func fileType(filePath: String) -> PBXFileType? {
46+
let fileExtension = (filePath as NSString).pathExtension
47+
return fileType(fileExtension: fileExtension)
48+
}
49+
50+
static func fileType(reference: PBXFileReference) -> PBXFileType? {
51+
return fileType(filePath: reference.fileType.type)
52+
}
53+
}
54+
55+
#if !canImport(CoreServices)
56+
typealias CFString = String
57+
let kUTTypeCHeader: CFString = "public.c-header"
58+
let kUTTypeCPlusPlusHeader: CFString = "public.c-plus-plus-header"
59+
let kUTTypeSourceCode: CFString = "public.source-code"
60+
func UTTypeConformsTo(_ inUTI: CFString, _ inConformsToUTI: CFString) -> Bool {
61+
return true
4262
}
63+
#endif
4364

65+
#if canImport(CoreServices)
4466
public extension PBXFileType {
4567
static func fileType(fileExtension: String) -> PBXFileType? {
4668
guard let uniformType = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension as CFString, nil)?.takeUnretainedValue() as String? else { return nil }
4769
return fileTypes.first {
4870
$0.uniformType == uniformType
4971
}
5072
}
51-
52-
static func fileType(filePath: String) -> PBXFileType? {
53-
let fileExtension = (filePath as NSString).pathExtension
54-
return fileType(fileExtension: fileExtension)
55-
}
56-
57-
static func fileType(reference: PBXFileReference) -> PBXFileType? {
58-
return fileType(filePath: reference.fileType.type)
73+
}
74+
#else
75+
public extension PBXFileType {
76+
static func fileType(fileExtension: String) -> PBXFileType? {
77+
return nil
5978
}
6079
}
80+
#endif
6181

6282
extension PBXFileType {
6383
var buildPhaseType: PBXBuildPhase.Type? {

Sources/XcodeProject/Objects/PBXGlobalID+Generator.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,13 @@ extension PBXGlobalID {
4242
private var lastTime: UInt32 = 0
4343
private var firstSequence: UInt16 = 0
4444

45-
init(userName: String = NSUserName(), processId: pid_t = getpid(), random: inout RandomNumberGenerator, referenceDateGenerator: @escaping () -> Date = Generator.referenceDate) {
45+
init(userName: String = NSUserName(), processId: pid_t = getpid(), hostId: UInt32, random: UInt16, referenceDateGenerator: @escaping () -> Date = Generator.referenceDate) {
4646
self.referenceDateGenerator = referenceDateGenerator
4747

48-
var hostId: UInt32 = UInt32(gethostid())
49-
if hostId == 0 {
50-
hostId = random.next()
51-
}
5248
self.gid = GlobalIdentifier(
5349
userHash: Generator.userHash(userName: userName),
5450
pidByte: UInt8(truncatingIfNeeded: processId),
55-
random: random.next(),
51+
random: random,
5652
time: 0,
5753
hostShift: UInt8(truncatingIfNeeded: (hostId >> 0x10) & 0xff),
5854
hostHigh: UInt8(truncatingIfNeeded: (hostId & 0xff00) >> 0x8),

Sources/XcodeProject/Objects/PBXGlobalID.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,19 @@ public struct PBXGlobalID: RawRepresentable {
2727
return strings?.compactMap { return PBXGlobalID(rawValue: $0) }
2828
}
2929

30-
private static var randomNumberGenerator: RandomNumberGenerator = SystemRandomNumberGenerator()
31-
private static var generator: PBXGlobalID.Generator = PBXGlobalID.Generator(random: &randomNumberGenerator)
30+
private static var generator: PBXGlobalID.Generator = {
31+
var randomNumberGenerator: RandomNumberGenerator = SystemRandomNumberGenerator()
32+
var hostId: UInt32 = UInt32(gethostid())
33+
if hostId == 0 {
34+
hostId = randomNumberGenerator.next()
35+
}
36+
return PBXGlobalID.Generator(hostId: hostId, random: randomNumberGenerator.next())
37+
}()
3238
}
3339

3440
extension PBXGlobalID: Hashable {
35-
public var hashValue: Int {
36-
return rawValue.hashValue
41+
public func hash(into hasher: inout Hasher) {
42+
hasher.combine(rawValue)
3743
}
3844

3945
public static func ==(lhs: PBXGlobalID, rhs: PBXGlobalID) -> Bool {

Sources/XcodeProject/Objects/PBXObject.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ public class PBXObject {
6767
}
6868

6969
extension PBXObject: Hashable {
70-
public var hashValue: Int {
71-
return globalID.hashValue
70+
public func hash(into hasher: inout Hasher) {
71+
hasher.combine(globalID)
7272
}
7373

7474
public static func ==(lhs: PBXObject, rhs: PBXObject) -> Bool {

Sources/XcodeProject/Objects/References/PBXReference.swift

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,30 @@ public class PBXReference: PBXObject {
3333
var indentWidth: Int?
3434

3535
var buildFiles: [PBXBuildFile] {
36-
return _buildFiles.allObjects
36+
return _buildFiles.compactMap { $0.item }
3737
}
38-
private var _buildFiles = NSHashTable<PBXBuildFile>.weakObjects()
38+
39+
private struct WeakBuildFile: Hashable {
40+
weak var item: PBXBuildFile?
41+
42+
static func ==(lhs: WeakBuildFile, rhs: WeakBuildFile) -> Bool {
43+
return lhs.item == rhs.item
44+
}
45+
46+
func hash(into hasher: inout Hasher) {
47+
hasher.combine(item)
48+
}
49+
}
50+
51+
private var _buildFiles: Array<WeakBuildFile> = []
52+
3953
func register(buildFile: PBXBuildFile) {
40-
_buildFiles.add(buildFile)
54+
_buildFiles.removeAll { $0.item == nil }
55+
_buildFiles.append(WeakBuildFile(item: buildFile))
4156
}
57+
4258
func unregister(buildFile: PBXBuildFile) {
43-
_buildFiles.remove(buildFile)
59+
_buildFiles.removeAll { $0.item == nil || $0.item == buildFile }
4460
}
4561

4662
public var displayName: String {

Sources/XcodeProject/ProjectFile.swift

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,15 @@ public final class ProjectFile {
3939
public private(set) var project: PBXProject
4040

4141
let url: URL
42-
let fileWrapper: FileWrapper
4342

4443
/// Initializes a new project file from the given URL
4544
///
4645
/// - Parameter url: Path to an xcodeproj file to be opened
4746
/// - Returns: A fully parsed project from the provided source or `nil` if an error happened
4847
public init(url: URL) throws {
4948
self.url = url
50-
self.fileWrapper = try FileWrapper(url: url, options: [])
51-
guard fileWrapper.isDirectory else {
52-
throw CocoaError.error(.fileReadUnknown)
53-
}
54-
55-
guard let pbxproj = fileWrapper.fileWrappers?["project.pbxproj"], pbxproj.isRegularFile else {
56-
throw CocoaError.error(.fileReadUnknown)
57-
}
58-
59-
guard let data = pbxproj.regularFileContents else {
60-
throw Error.invalid
61-
}
49+
let pbxproj = URL(fileURLWithPath: "project.pbxproj", relativeTo: url)
50+
let data = try Data(contentsOf: pbxproj)
6251

6352
guard let plist = try PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String: Any] else {
6453
throw Error.invalidPlist
@@ -85,23 +74,6 @@ public final class ProjectFile {
8574
project.path = url.path
8675
self.project = project
8776
}
88-
89-
public func currentFileWrapper() throws -> FileWrapper {
90-
let currentFileWrapper = fileWrapper
91-
92-
let oldPbxproj = currentFileWrapper.fileWrappers!["project.pbxproj"]!
93-
94-
let dataStream = DataStreamWriter()
95-
let archiver = PBXPListArchiver(projectFile: self)
96-
try archiver.write(stream: dataStream)
97-
let newPbxproj = FileWrapper(regularFileWithContents: dataStream.data)
98-
newPbxproj.preferredFilename = "project.pbxproj"
99-
100-
currentFileWrapper.removeFileWrapper(oldPbxproj)
101-
currentFileWrapper.addFileWrapper(newPbxproj)
102-
103-
return currentFileWrapper
104-
}
10577
}
10678

10779
extension ProjectFile {
@@ -112,19 +84,10 @@ extension ProjectFile {
11284
public func save(to destination: URL? = nil) throws {
11385
let destination = destination ?? url
11486

115-
guard let oldPbxproj = fileWrapper.fileWrappers?["project.pbxproj"], oldPbxproj.isRegularFile else {
116-
throw CocoaError.error(.fileReadUnknown)
117-
}
118-
11987
let dataStream = DataStreamWriter()
12088
let archiver = PBXPListArchiver(projectFile: self)
12189
try archiver.write(stream: dataStream)
122-
let newPbxproj = FileWrapper(regularFileWithContents: dataStream.data)
123-
newPbxproj.preferredFilename = "project.pbxproj"
124-
125-
fileWrapper.removeFileWrapper(oldPbxproj)
126-
fileWrapper.addFileWrapper(newPbxproj)
127-
128-
try fileWrapper.write(to: destination, options: [.atomic], originalContentsURL: nil)
90+
let pbxprojURL = URL(fileURLWithPath: "project.pbxproj", relativeTo: destination)
91+
try dataStream.data.write(to: pbxprojURL, options: [.atomic])
12992
}
13093
}

Sources/XcodeProject/Workspace.swift

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ public final class Workspace: WorkspaceReference {
6161
}
6262
let url: URL
6363
public var referenceURL: URL? { return url.deletingLastPathComponent() }
64-
public let fileWrapper: FileWrapper
6564
public var references: [WorkspaceItem] = []
6665

6766
public class FileReference: WorkspaceItem {
@@ -88,15 +87,8 @@ public final class Workspace: WorkspaceReference {
8887

8988
public init(url: URL) throws {
9089
self.url = url
91-
self.fileWrapper = try FileWrapper(url: url, options: [])
92-
if fileWrapper.isDirectory == false {
93-
//throw
94-
}
95-
96-
guard let workspaceData = fileWrapper.fileWrappers?["contents.xcworkspacedata"], workspaceData.isRegularFile,
97-
let data = workspaceData.regularFileContents else {
98-
throw Error.invalid
99-
}
90+
let workspaceFileURL = URL(fileURLWithPath: "contents.xcworkspacedata", relativeTo: url)
91+
let data = try Data(contentsOf: workspaceFileURL)
10092

10193
let document = try XMLDocument(data: data, options: [])
10294
guard let children = document.rootElement()?.children as? [XMLElement] else { throw Error.invalid }

0 commit comments

Comments
 (0)