Skip to content

Commit d59db9c

Browse files
committed
fix failing test
1 parent 6a76886 commit d59db9c

File tree

9 files changed

+125
-42
lines changed

9 files changed

+125
-42
lines changed

Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,7 @@ let package:Package = .init(
565565
.executableTarget(name: "UnidocDatabaseTests", dependencies:
566566
[
567567
.target(name: "UnidocDatabase"),
568+
.target(name: "GitHubClient"),
568569
.target(name: "SymbolGraphBuilder"),
569570
.target(name: "SymbolGraphTesting"),
570571
.product(name: "MongoTesting", package: "swift-mongodb"),

Sources/SymbolGraphBuilder/Builds/Toolchain.swift

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@ struct Toolchain
1111
public
1212
let version:AnyVersion
1313
public
14+
let tagname:String
15+
public
1416
let triple:Triple
1517

16-
@inlinable public
17-
init(version:AnyVersion, triple:Triple)
18+
private
19+
init(version:AnyVersion, tagname:String, triple:Triple)
1820
{
1921
self.version = version
22+
self.tagname = tagname
2023
self.triple = triple
2124
}
2225
}
@@ -65,9 +68,38 @@ extension Toolchain
6568
throw ToolchainError.malformedSplash
6669
}
6770

71+
// Swift version 5.8-dev (LLVM 07d14852a049e40, Swift 613b3223d9ec5f6)
72+
// Target: x86_64-unknown-linux-gnu
73+
if toolchain.count > 4
74+
{
75+
throw ToolchainError.developmentSnapshotNotSupported
76+
}
77+
78+
let parenthesized:Substring = toolchain[3]
79+
80+
guard parenthesized.startIndex < parenthesized.endIndex
81+
else
82+
{
83+
throw ToolchainError.malformedSplash
84+
}
85+
86+
let i:String.Index = parenthesized.index(after: parenthesized.startIndex)
87+
let j:String.Index = parenthesized.index(before: parenthesized.endIndex)
88+
89+
guard i < j,
90+
case ("(", ")") = (parenthesized[parenthesized.startIndex], parenthesized[j])
91+
else
92+
{
93+
throw ToolchainError.malformedSplash
94+
}
95+
6896
if let triple:Triple = .init(triple[1])
6997
{
70-
self.init(version: .init(toolchain[2]), triple: triple)
98+
99+
self.init(
100+
version: .init(toolchain[2]),
101+
tagname: .init(parenthesized[i ..< j]),
102+
triple: triple)
71103
}
72104
else
73105
{
@@ -133,7 +165,9 @@ extension Toolchain
133165
triple: self.triple,
134166
pretty: pretty)
135167

136-
let metadata:SymbolGraphMetadata = .swift(self.version, triple: self.triple,
168+
let metadata:SymbolGraphMetadata = .swift(self.version,
169+
tagname: self.tagname,
170+
triple: self.triple,
137171
products:
138172
[
139173
.init(name: "__stdlib__", type: .library(.automatic),

Sources/SymbolGraphBuilder/Builds/ToolchainError.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import ModuleGraphs
33
public
44
enum ToolchainError:Error, Equatable, Sendable
55
{
6+
case developmentSnapshotNotSupported
67
case malformedSplash
78
case malformedTriple
89
case unsupportedTriple(Triple)
@@ -14,6 +15,8 @@ extension ToolchainError:CustomStringConvertible
1415
{
1516
switch self
1617
{
18+
case .developmentSnapshotNotSupported:
19+
return "Development snapshots are not supported"
1720
case .malformedSplash:
1821
return "Failed to parse 'swift --version' output (splash is clipped or malformed)"
1922
case .malformedTriple:

Sources/SymbolGraphs/Metadata/SymbolGraphMetadata.Commit.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ extension SymbolGraphMetadata
55
@frozen public
66
struct Commit:Equatable, Sendable
77
{
8-
/// The SHA-1 hash of the commit.
8+
/// The SHA-1 hash of the commit, nil if unknown. If the hash is unknown, the refname
9+
/// **must** point to a permanent tag.
910
public
10-
var hash:SHA1
11+
var hash:SHA1?
1112
/// The git ref used to check out the original package sources, if the
1213
/// relevant symbol graph was generated for a source-controlled SPM package.
1314
/// This is an **exact** string; `v1.2.3` and `1.2.3` are not equivalent.
@@ -18,7 +19,7 @@ extension SymbolGraphMetadata
1819
var refname:String
1920

2021
@inlinable public
21-
init(_ hash:SHA1, refname:String)
22+
init(_ hash:SHA1?, refname:String)
2223
{
2324
self.hash = hash
2425
self.refname = refname

Sources/SymbolGraphs/Metadata/SymbolGraphMetadata.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct SymbolGraphMetadata:Equatable, Sendable
1515
var package:PackageIdentifier
1616
/// A git commit to associate with the relevant symbol graph.
1717
///
18-
/// This is nil for standard library symbol graphs, and local package symbol graphs.
18+
/// This is nil for local package symbol graphs.
1919
public
2020
var commit:Commit?
2121
/// The swift target triple of the documentation artifacts this symbol graph was compiled
@@ -81,7 +81,10 @@ struct SymbolGraphMetadata:Equatable, Sendable
8181
extension SymbolGraphMetadata
8282
{
8383
public static
84-
func swift(_ swift:AnyVersion, triple:Triple, products:[ProductDetails]) -> Self
84+
func swift(_ swift:AnyVersion,
85+
tagname:String,
86+
triple:Triple,
87+
products:[ProductDetails]) -> Self
8588
{
8689
let display:String
8790
switch swift.canonical
@@ -95,7 +98,7 @@ extension SymbolGraphMetadata
9598

9699
return .init(
97100
package: .swift,
98-
commit: nil,
101+
commit: .init(nil, refname: tagname),
99102
triple: triple,
100103
swift: swift,
101104
products: products,

Sources/UnidocDatabase/Packages/PackageDatabase.Editions.swift

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,29 +99,32 @@ extension PackageDatabase.Editions
9999
func register(
100100
package:Int32,
101101
refname:String,
102-
sha1:SHA1,
102+
sha1:SHA1?,
103103
with session:Mongo.Session) async throws -> Placement
104104
{
105105
let placement:Placement = try await self.place(
106106
package: package,
107107
refname: refname,
108108
with: session)
109109

110-
let edition:Unidoc.Zone = .init(package: package, version: placement.cell)
110+
let edition:PackageEdition = .init(id: .init(
111+
package: package,
112+
version: placement.cell),
113+
name: refname,
114+
sha1: sha1)
111115

112116
switch placement.sha1
113117
{
114-
case nil, sha1?:
115-
let edition:PackageEdition = .init(id: edition,
116-
name: refname,
117-
sha1: sha1)
118-
118+
case nil:
119119
// This can fail if we race with another process.
120120
try await self.insert(edition, with: session)
121121

122+
case sha1:
123+
try await self.update(edition, with: session)
124+
122125
case _?:
123126
try await self.update(field: PackageEdition[.lost],
124-
of: edition,
127+
of: edition.id,
125128
to: true,
126129
with: session)
127130
}

Sources/UnidocDatabase/Packages/PackageDatabase.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,17 @@ extension PackageDatabase
8282

8383
version = placement.cell
8484
}
85+
else if case .swift = docs.metadata.package,
86+
let tagname:String = docs.metadata.commit?.refname
87+
{
88+
let placement:Editions.Placement = try await self.editions.register(
89+
package: placement.cell,
90+
refname: tagname,
91+
sha1: nil,
92+
with: session)
93+
94+
version = placement.cell
95+
}
8596
else
8697
{
8798
version = -1

Sources/UnidocDatabase/Packages/PackageEdition.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ struct PackageEdition:Identifiable
1515
let name:String
1616
/// The SHA-1 hash of the git commit associated with this edition.
1717
public
18-
let sha1:SHA1
18+
let sha1:SHA1?
1919
/// Indicates if the repository host has published a tag of the same name with a different
2020
/// ``sha1`` hash.
2121
public
2222
let lost:Bool
2323

2424
@inlinable public
25-
init(id:Unidoc.Zone, name:String, sha1:SHA1, lost:Bool = false)
25+
init(id:Unidoc.Zone, name:String, sha1:SHA1?, lost:Bool = false)
2626
{
2727
self.id = id
2828
self.name = name
@@ -67,7 +67,7 @@ extension PackageEdition:BSONDocumentDecodable
6767
{
6868
self.init(id: try bson[.id].decode(),
6969
name: try bson[.name].decode(),
70-
sha1: try bson[.sha1].decode(),
70+
sha1: try bson[.sha1]?.decode(),
7171
lost: try bson[.lost]?.decode() ?? false)
7272
}
7373
}

Sources/UnidocDatabaseTests/PackageVersions.swift

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,64 +20,91 @@ struct PackageVersions:MongoTestBattery
2020

2121
do
2222
{
23-
let tests:TestGroup = tests ! "InsertMaster"
23+
let tests:TestGroup = tests ! "InsertVersionedSwift"
24+
2425
docs = .init(
25-
metadata: .swift("master", triple: triple, products: []),
26+
metadata: .init(
27+
package: .swift,
28+
commit: .init(nil, refname: "swift-5.8.1-RELEASE"),
29+
triple: triple,
30+
swift: .stable(.release(.v(5, 8, 1))),
31+
products: []),
2632
graph: empty)
2733

2834
tests.expect(try await database.store(docs: docs, with: session) ==? .init(
29-
id: .init(package: .swift, version: "master", triple: triple),
35+
id: .init(package: .swift, version: "5.8.1", triple: triple),
3036
edition: .init(package: 0, version: 0),
3137
type: .insert))
3238
}
3339
do
3440
{
35-
let tests:TestGroup = tests ! "InsertVersioned"
36-
docs.metadata.swift = .stable(.release(.v(1, 2, 3)))
41+
let tests:TestGroup = tests ! "InsertLocal"
42+
43+
docs.metadata.package = "swift-not-named-swift"
44+
docs.metadata.commit = nil
3745

3846
tests.expect(try await database.store(docs: docs, with: session) ==? .init(
39-
id: .init(package: .swift, version: "1.2.3", triple: triple),
40-
edition: .init(package: 0, version: 1),
47+
id: .init(package: "swift-not-named-swift", version: "0.0.0", triple: triple),
48+
edition: .init(package: 1, version: -1),
4149
type: .insert))
4250
}
4351
do
4452
{
45-
let tests:TestGroup = tests ! "InsertMain"
46-
docs.metadata.swift = "main"
53+
let tests:TestGroup = tests ! "InsertVersioned"
54+
55+
docs.metadata.commit = .init(0xffffffffffffffffffffffffffffffffffffffff,
56+
refname: "1.2.3")
4757

4858
tests.expect(try await database.store(docs: docs, with: session) ==? .init(
49-
id: .init(package: .swift, version: "main", triple: triple),
50-
edition: .init(package: 0, version: 2),
59+
id: .init(package: "swift-not-named-swift", version: "1.2.3", triple: triple),
60+
edition: .init(package: 1, version: 0),
5161
type: .insert))
5262
}
5363
do
5464
{
55-
let tests:TestGroup = tests ! "InsertVersionless"
56-
docs.metadata.swift = nil
65+
let tests:TestGroup = tests ! "InsertMaster"
66+
67+
docs.metadata.commit = .init(0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee,
68+
refname: "master")
5769

5870
tests.expect(try await database.store(docs: docs, with: session) ==? .init(
59-
id: .init(package: .swift, version: "0.0.0", triple: triple),
60-
edition: .init(package: 0, version: 3),
71+
id: .init(package: "swift-not-named-swift", version: "master", triple: triple),
72+
edition: .init(package: 1, version: 1),
6173
type: .insert))
6274
}
6375
do
76+
{
77+
let tests:TestGroup = tests ! "UpdateLocal"
78+
79+
docs.metadata.commit = nil
80+
81+
tests.expect(try await database.store(docs: docs, with: session) ==? .init(
82+
id: .init(package: "swift-not-named-swift", version: "0.0.0", triple: triple),
83+
edition: .init(package: 1, version: -1),
84+
type: .update))
85+
}
86+
do
6487
{
6588
let tests:TestGroup = tests ! "UpdateMaster"
66-
docs.metadata.swift = "master"
89+
90+
docs.metadata.commit = .init(0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee,
91+
refname: "master")
6792

6893
tests.expect(try await database.store(docs: docs, with: session) ==? .init(
69-
id: .init(package: .swift, version: "master", triple: triple),
70-
edition: .init(package: 0, version: 0),
94+
id: .init(package: "swift-not-named-swift", version: "master", triple: triple),
95+
edition: .init(package: 1, version: 1),
7196
type: .update))
7297
}
7398
do
7499
{
75100
let tests:TestGroup = tests ! "UpdateVersioned"
76-
docs.metadata.swift = .stable(.release(.v(1, 2, 3)))
101+
102+
docs.metadata.commit = .init(0xffffffffffffffffffffffffffffffffffffffff,
103+
refname: "1.2.3")
77104

78105
tests.expect(try await database.store(docs: docs, with: session) ==? .init(
79-
id: .init(package: .swift, version: "1.2.3", triple: triple),
80-
edition: .init(package: 0, version: 1),
106+
id: .init(package: "swift-not-named-swift", version: "1.2.3", triple: triple),
107+
edition: .init(package: 1, version: 0),
81108
type: .update))
82109
}
83110
}

0 commit comments

Comments
 (0)