@@ -73,7 +73,7 @@ public final class RegistryClient: Cancellable {
73
73
}
74
74
75
75
public var configured : Bool {
76
- return !self . configuration. isEmpty
76
+ !self . configuration. isEmpty
77
77
}
78
78
79
79
/// Cancel any outstanding requests
@@ -118,7 +118,11 @@ public final class RegistryClient: Cancellable {
118
118
self . httpClient. execute ( request, observabilityScope: observabilityScope, progress: nil ) { result in
119
119
completion (
120
120
result. tryMap { response in
121
- try self . checkResponseStatusAndHeaders ( response, expectedStatusCode: 200 , expectedContentType: . json)
121
+ try self . checkResponseStatusAndHeaders (
122
+ response,
123
+ expectedStatusCode: 200 ,
124
+ expectedContentType: . json
125
+ )
122
126
123
127
guard let data = response. body else {
124
128
throw RegistryError . invalidResponse
@@ -134,7 +138,7 @@ public final class RegistryClient: Cancellable {
134
138
return PackageMetadata (
135
139
registry: registry,
136
140
versions: versions,
137
- alternateLocations: alternateLocations? . map { $0 . url }
141
+ alternateLocations: alternateLocations? . map ( \ . url)
138
142
)
139
143
} . mapError {
140
144
RegistryError . failedRetrievingReleases ( $0)
@@ -182,7 +186,11 @@ public final class RegistryClient: Cancellable {
182
186
self . httpClient. execute ( request, observabilityScope: observabilityScope, progress: nil ) { result in
183
187
completion (
184
188
result. tryMap { response in
185
- try self . checkResponseStatusAndHeaders ( response, expectedStatusCode: 200 , expectedContentType: . swift)
189
+ try self . checkResponseStatusAndHeaders (
190
+ response,
191
+ expectedStatusCode: 200 ,
192
+ expectedContentType: . swift
193
+ )
186
194
187
195
guard let data = response. body else {
188
196
throw RegistryError . invalidResponse
@@ -197,7 +205,8 @@ public final class RegistryClient: Cancellable {
197
205
198
206
let alternativeManifests = try response. headers. parseManifestLinks ( )
199
207
for alternativeManifest in alternativeManifests {
200
- result [ alternativeManifest. filename] = ( toolsVersion: alternativeManifest. toolsVersion, content: . none)
208
+ result [ alternativeManifest. filename] = ( toolsVersion: alternativeManifest. toolsVersion,
209
+ content: . none)
201
210
}
202
211
return result
203
212
} . mapError {
@@ -253,7 +262,11 @@ public final class RegistryClient: Cancellable {
253
262
self . httpClient. execute ( request, observabilityScope: observabilityScope, progress: nil ) { result in
254
263
completion (
255
264
result. tryMap { response -> String in
256
- try self . checkResponseStatusAndHeaders ( response, expectedStatusCode: 200 , expectedContentType: . swift)
265
+ try self . checkResponseStatusAndHeaders (
266
+ response,
267
+ expectedStatusCode: 200 ,
268
+ expectedContentType: . swift
269
+ )
257
270
258
271
guard let data = response. body else {
259
272
throw RegistryError . invalidResponse
@@ -310,14 +323,19 @@ public final class RegistryClient: Cancellable {
310
323
switch result {
311
324
case . success( let response) :
312
325
do {
313
- try self . checkResponseStatusAndHeaders ( response, expectedStatusCode: 200 , expectedContentType: . json)
326
+ try self . checkResponseStatusAndHeaders (
327
+ response,
328
+ expectedStatusCode: 200 ,
329
+ expectedContentType: . json
330
+ )
314
331
315
332
guard let data = response. body else {
316
333
throw RegistryError . invalidResponse
317
334
}
318
335
319
336
let versionMetadata = try self . jsonDecoder. decode ( Serialization . VersionMetadata. self, from: data)
320
- guard let sourceArchive = versionMetadata. resources. first ( where: { $0. name == " source-archive " } ) else {
337
+ guard let sourceArchive = versionMetadata. resources. first ( where: { $0. name == " source-archive " } )
338
+ else {
321
339
throw RegistryError . missingSourceArchive
322
340
}
323
341
@@ -330,16 +348,21 @@ public final class RegistryClient: Cancellable {
330
348
version: version,
331
349
fingerprint: . init( origin: . registry( registry. url) , value: checksum) ,
332
350
observabilityScope: observabilityScope,
333
- callbackQueue: callbackQueue) { storageResult in
351
+ callbackQueue: callbackQueue)
352
+ { storageResult in
334
353
switch storageResult {
335
354
case . success:
336
355
completion ( . success( checksum) )
337
356
case . failure( PackageFingerprintStorageError . conflict( _, let existing) ) :
338
357
switch self . fingerprintCheckingMode {
339
358
case . strict:
340
- completion ( . failure( RegistryError . checksumChanged ( latest: checksum, previous: existing. value) ) )
359
+ completion ( . failure( RegistryError
360
+ . checksumChanged ( latest: checksum, previous: existing. value) ) )
341
361
case . warn:
342
- observabilityScope. emit ( warning: " The checksum \( checksum) from \( registry. url. absoluteString) does not match previously recorded value \( existing. value) from \( String ( describing: existing. origin. url? . absoluteString) ) " )
362
+ observabilityScope
363
+ . emit (
364
+ warning: " The checksum \( checksum) from \( registry. url. absoluteString) does not match previously recorded value \( existing. value) from \( String ( describing: existing. origin. url? . absoluteString) ) "
365
+ )
343
366
completion ( . success( checksum) )
344
367
}
345
368
case . failure( let error) :
@@ -435,9 +458,13 @@ public final class RegistryClient: Cancellable {
435
458
if expectedChecksum != actualChecksum {
436
459
switch self . fingerprintCheckingMode {
437
460
case . strict:
438
- return completion ( . failure( RegistryError . invalidChecksum ( expected: expectedChecksum, actual: actualChecksum) ) )
461
+ return completion ( . failure( RegistryError
462
+ . invalidChecksum ( expected: expectedChecksum, actual: actualChecksum) ) )
439
463
case . warn:
440
- observabilityScope. emit ( warning: " The checksum \( actualChecksum) does not match previously recorded value \( expectedChecksum) " )
464
+ observabilityScope
465
+ . emit (
466
+ warning: " The checksum \( actualChecksum) does not match previously recorded value \( expectedChecksum) "
467
+ )
441
468
}
442
469
}
443
470
// validate that the destination does not already exist (again, as this is async)
@@ -478,13 +505,17 @@ public final class RegistryClient: Cancellable {
478
505
version: version,
479
506
kind: . registry,
480
507
observabilityScope: observabilityScope,
481
- callbackQueue: callbackQueue) { result in
508
+ callbackQueue: callbackQueue)
509
+ { result in
482
510
switch result {
483
511
case . success( let fingerprint) :
484
512
body ( . success( fingerprint. value) )
485
513
case . failure( let error) :
486
514
if error as? PackageFingerprintStorageError != . notFound {
487
- observabilityScope. emit ( error: " Failed to get registry fingerprint for \( package ) \( version) from storage: \( error) " )
515
+ observabilityScope
516
+ . emit (
517
+ error: " Failed to get registry fingerprint for \( package ) \( version) from storage: \( error) "
518
+ )
488
519
}
489
520
// Try fetching checksum from registry again no matter which kind of error it is
490
521
self . fetchSourceArchiveChecksum ( package : package ,
@@ -541,6 +572,11 @@ public final class RegistryClient: Cancellable {
541
572
542
573
self . httpClient. execute ( request, observabilityScope: observabilityScope, progress: nil ) { result in
543
574
completion ( result. tryMap { response in
575
+ // 404 is valid, no identities mapped
576
+ if response. statusCode == 404 {
577
+ return [ ]
578
+ }
579
+
544
580
try self . checkResponseStatusAndHeaders ( response, expectedStatusCode: 200 , expectedContentType: . json)
545
581
546
582
guard let data = response. body else {
@@ -588,7 +624,9 @@ public final class RegistryClient: Cancellable {
588
624
}
589
625
}
590
626
591
- private func makeAsync< T> ( _ closure: @escaping ( Result < T , Error > ) -> Void , on queue: DispatchQueue ) -> ( Result < T , Error > ) -> Void {
627
+ private func makeAsync< T> ( _ closure: @escaping ( Result < T , Error > ) -> Void ,
628
+ on queue: DispatchQueue ) -> ( Result < T , Error > ) -> Void
629
+ {
592
630
{ result in queue. async { closure ( result) } }
593
631
}
594
632
@@ -679,30 +717,34 @@ public enum RegistryError: Error, CustomStringConvertible {
679
717
}
680
718
}
681
719
682
- private extension RegistryClient {
683
- enum APIVersion : String {
720
+ extension RegistryClient {
721
+ fileprivate enum APIVersion : String {
684
722
case v1 = " 1 "
685
723
}
686
724
}
687
725
688
- private extension RegistryClient {
689
- enum MediaType : String {
726
+ extension RegistryClient {
727
+ fileprivate enum MediaType : String {
690
728
case json
691
729
case swift
692
730
case zip
693
731
}
694
732
695
- enum ContentType : String {
733
+ fileprivate enum ContentType : String {
696
734
case json = " application/json "
697
735
case swift = " text/x-swift "
698
736
case zip = " application/zip "
699
737
}
700
738
701
- func acceptHeader( mediaType: MediaType ) -> String {
739
+ private func acceptHeader( mediaType: MediaType ) -> String {
702
740
" application/vnd.swift.registry.v \( self . apiVersion. rawValue) + \( mediaType) "
703
741
}
704
742
705
- func checkResponseStatusAndHeaders( _ response: HTTPClient . Response , expectedStatusCode: Int , expectedContentType: ContentType ) throws {
743
+ private func checkResponseStatusAndHeaders(
744
+ _ response: HTTPClient . Response ,
745
+ expectedStatusCode: Int ,
746
+ expectedContentType: ContentType
747
+ ) throws {
706
748
guard response. statusCode == expectedStatusCode else {
707
749
throw RegistryError . invalidResponseStatus ( expected: expectedStatusCode, actual: response. statusCode)
708
750
}
@@ -727,8 +769,8 @@ extension RegistryClient {
727
769
}
728
770
}
729
771
730
- private extension RegistryClient {
731
- struct AlternativeLocationLink {
772
+ extension RegistryClient {
773
+ fileprivate struct AlternativeLocationLink {
732
774
let url : URL
733
775
let kind : Kind
734
776
@@ -739,21 +781,21 @@ private extension RegistryClient {
739
781
}
740
782
}
741
783
742
- private extension RegistryClient {
743
- struct ManifestLink {
784
+ extension RegistryClient {
785
+ fileprivate struct ManifestLink {
744
786
let url : URL
745
787
let filename : String
746
788
let toolsVersion : ToolsVersion
747
789
}
748
790
}
749
791
750
- private extension HTTPClientHeaders {
792
+ extension HTTPClientHeaders {
751
793
/*
752
794
<https://github.com/mona/LinkedList>; rel="canonical",
753
795
<ssh://
[email protected] :mona/LinkedList.git>; rel="alternate",
754
796
*/
755
- func parseAlternativeLocationLinks( ) throws -> [ RegistryClient . AlternativeLocationLink ] ? {
756
- return try self . get ( " Link " ) . map { header -> [ RegistryClient . AlternativeLocationLink ] in
797
+ fileprivate func parseAlternativeLocationLinks( ) throws -> [ RegistryClient . AlternativeLocationLink ] ? {
798
+ try self . get ( " Link " ) . map { header -> [ RegistryClient . AlternativeLocationLink ] in
757
799
let linkLines = header. split ( separator: " , " ) . map ( String . init) . map { $0. spm_chuzzle ( ) ?? $0 }
758
800
return try linkLines. compactMap { linkLine in
759
801
try parseAlternativeLocationLine ( linkLine)
@@ -770,11 +812,15 @@ private extension HTTPClientHeaders {
770
812
return nil
771
813
}
772
814
773
- guard let link = fields. first ( where: { $0. hasPrefix ( " < " ) } ) . map ( { String ( $0. dropFirst ( ) . dropLast ( ) ) } ) , let url = URL ( string: link) else {
815
+ guard let link = fields. first ( where: { $0. hasPrefix ( " < " ) } ) . map ( { String ( $0. dropFirst ( ) . dropLast ( ) ) } ) ,
816
+ let url = URL ( string: link)
817
+ else {
774
818
return nil
775
819
}
776
820
777
- guard let rel = fields. first ( where: { $0. hasPrefix ( " rel= " ) } ) . flatMap ( { parseLinkFieldValue ( $0) } ) , let kind = RegistryClient . AlternativeLocationLink. Kind ( rawValue: rel) else {
821
+ guard let rel = fields. first ( where: { $0. hasPrefix ( " rel= " ) } ) . flatMap ( { parseLinkFieldValue ( $0) } ) ,
822
+ let kind = RegistryClient . AlternativeLocationLink. Kind ( rawValue: rel)
823
+ else {
778
824
return nil
779
825
}
780
826
@@ -785,12 +831,12 @@ private extension HTTPClientHeaders {
785
831
}
786
832
}
787
833
788
- private extension HTTPClientHeaders {
834
+ extension HTTPClientHeaders {
789
835
/*
790
836
<http://packages.example.com/mona/LinkedList/1.1.1/Package.swift?swift-version=4>; rel="alternate"; filename="
[email protected] "; swift-tools-version="4.0"
791
837
*/
792
- func parseManifestLinks( ) throws -> [ RegistryClient . ManifestLink ] {
793
- return try self . get ( " Link " ) . map { header -> [ RegistryClient . ManifestLink ] in
838
+ fileprivate func parseManifestLinks( ) throws -> [ RegistryClient . ManifestLink ] {
839
+ try self . get ( " Link " ) . map { header -> [ RegistryClient . ManifestLink ] in
794
840
let linkLines = header. split ( separator: " , " ) . map ( String . init) . map { $0. spm_chuzzle ( ) ?? $0 }
795
841
return try linkLines. compactMap { linkLine in
796
842
try parseManifestLinkLine ( linkLine)
@@ -807,19 +853,26 @@ private extension HTTPClientHeaders {
807
853
return nil
808
854
}
809
855
810
- guard let link = fields. first ( where: { $0. hasPrefix ( " < " ) } ) . map ( { String ( $0. dropFirst ( ) . dropLast ( ) ) } ) , let url = URL ( string: link) else {
856
+ guard let link = fields. first ( where: { $0. hasPrefix ( " < " ) } ) . map ( { String ( $0. dropFirst ( ) . dropLast ( ) ) } ) ,
857
+ let url = URL ( string: link)
858
+ else {
811
859
return nil
812
860
}
813
861
814
- guard let rel = fields. first ( where: { $0. hasPrefix ( " rel= " ) } ) . flatMap ( { parseLinkFieldValue ( $0) } ) , rel == " alternate " else {
862
+ guard let rel = fields. first ( where: { $0. hasPrefix ( " rel= " ) } ) . flatMap ( { parseLinkFieldValue ( $0) } ) ,
863
+ rel == " alternate "
864
+ else {
815
865
return nil
816
866
}
817
867
818
- guard let filename = fields. first ( where: { $0. hasPrefix ( " filename= " ) } ) . flatMap ( { parseLinkFieldValue ( $0) } ) else {
868
+ guard let filename = fields. first ( where: { $0. hasPrefix ( " filename= " ) } ) . flatMap ( { parseLinkFieldValue ( $0) } )
869
+ else {
819
870
return nil
820
871
}
821
872
822
- guard let toolsVersion = fields. first ( where: { $0. hasPrefix ( " swift-tools-version= " ) } ) . flatMap ( { parseLinkFieldValue ( $0) } ) else {
873
+ guard let toolsVersion = fields. first ( where: { $0. hasPrefix ( " swift-tools-version= " ) } )
874
+ . flatMap ( { parseLinkFieldValue ( $0) } )
875
+ else {
823
876
return nil
824
877
}
825
878
@@ -835,8 +888,8 @@ private extension HTTPClientHeaders {
835
888
}
836
889
}
837
890
838
- private extension HTTPClientHeaders {
839
- func parseLinkFieldValue( _ field: String ) -> String ? {
891
+ extension HTTPClientHeaders {
892
+ private func parseLinkFieldValue( _ field: String ) -> String ? {
840
893
let parts = field. split ( separator: " = " )
841
894
. map ( String . init)
842
895
. map { $0. spm_chuzzle ( ) ?? $0 }
@@ -852,8 +905,8 @@ private extension HTTPClientHeaders {
852
905
// MARK: - Serialization
853
906
854
907
// marked public for cross module visibility
855
- public extension RegistryClient {
856
- enum Serialization {
908
+ extension RegistryClient {
909
+ public enum Serialization {
857
910
public struct PackageMetadata : Codable {
858
911
public let releases : [ String : Release ]
859
912
@@ -937,16 +990,16 @@ public extension RegistryClient {
937
990
938
991
// MARK: - Utilities
939
992
940
- private extension AbsolutePath {
941
- func withExtension( _ extension: String ) -> AbsolutePath {
993
+ extension AbsolutePath {
994
+ fileprivate func withExtension( _ extension: String ) -> AbsolutePath {
942
995
guard !self . isRoot else { return self }
943
996
let `extension` = `extension`. spm_dropPrefix ( " . " )
944
997
return self . parentDirectory. appending ( component: " \( basename) . \( `extension`) " )
945
998
}
946
999
}
947
1000
948
- private extension URLComponents {
949
- mutating func appendPathComponents( _ components: String ... ) {
1001
+ extension URLComponents {
1002
+ fileprivate mutating func appendPathComponents( _ components: String ... ) {
950
1003
path += ( path. last == " / " ? " " : " / " ) + components. joined ( separator: " / " )
951
1004
}
952
1005
}
0 commit comments